packages feed

seihou-cli-0.4.0.0: src-exe/Seihou/CLI/NewPrompt.hs

module Seihou.CLI.NewPrompt
  ( handleNewPrompt,
  )
where

import Data.Text qualified as T
import Data.Text.IO qualified as TIO
import Seihou.CLI.Commands (NewPromptOpts (..))
import Seihou.CLI.SchemaVersion (schemaHash, schemaUrl)
import Seihou.CLI.Shared (logIO)
import Seihou.Core.Module (isValidModuleName)
import Seihou.Core.Scaffold (exampleAgentPromptMarkdown, promptDhall)
import Seihou.Core.Types (LogLevel (..))
import Seihou.Effect.Logger (logError)
import Seihou.Prelude
import System.Directory (createDirectoryIfMissing, doesDirectoryExist)
import System.Exit (exitFailure)

handleNewPrompt :: NewPromptOpts -> IO ()
handleNewPrompt nopts = do
  let name = nopts.newPromptName

  if not (isValidModuleName name)
    then do
      logIO LogNormal $ do
        logError $ "invalid prompt name '" <> name <> "'."
        logError "Prompt names must match [a-z][a-z0-9-]*."
      exitFailure
    else pure ()

  let outputDir = case nopts.newPromptPath of
        Just p -> p
        Nothing -> T.unpack name

  exists <- doesDirectoryExist outputDir
  if exists
    then do
      logIO LogNormal (logError $ "directory '" <> T.pack outputDir <> "' already exists.")
      exitFailure
    else pure ()

  createDirectoryIfMissing True (outputDir </> "files")

  let dhallContent = promptDhall name schemaUrl schemaHash
  writeFile (outputDir </> "prompt.dhall") (T.unpack dhallContent)
  TIO.putStrLn $ "Created " <> T.pack (outputDir </> "prompt.dhall")

  writeFile (outputDir </> "prompt.md") (T.unpack exampleAgentPromptMarkdown)
  TIO.putStrLn $ "Created " <> T.pack (outputDir </> "prompt.md")

  TIO.putStrLn $ "Created " <> T.pack (outputDir </> "files/")
  TIO.putStrLn $ "Prompt '" <> name <> "' created at " <> T.pack outputDir <> "/"