@knightcodeai/cli 0.17.3 → 0.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (281) hide show
  1. package/CHANGELOG.md +1293 -0
  2. package/README.md +2 -2
  3. package/dist/bundle/chunks/anthropic-messages-A2IH2IY3.js +6 -0
  4. package/dist/bundle/chunks/anthropic.js +101 -0
  5. package/dist/bundle/chunks/azure-openai-responses-XZILQZOG.js +2 -0
  6. package/dist/bundle/chunks/bedrock-converse-stream.js +89 -0
  7. package/dist/bundle/chunks/chunk-4CRI7BMY.js +2 -0
  8. package/dist/bundle/chunks/chunk-57BPR4HF.js +2 -0
  9. package/dist/bundle/chunks/chunk-A5LJINMT.js +2 -0
  10. package/dist/bundle/chunks/chunk-AANBXVWQ.js +2 -0
  11. package/dist/bundle/chunks/chunk-ACHHEROF.js +7 -0
  12. package/dist/bundle/chunks/chunk-AFR2OW6S.js +108 -0
  13. package/dist/bundle/chunks/chunk-AHB7JV5B.js +2 -0
  14. package/dist/bundle/chunks/chunk-B2FT7RH5.js +2 -0
  15. package/dist/bundle/chunks/chunk-BRKUE2MD.js +2 -0
  16. package/dist/bundle/chunks/chunk-DKOURXGU.js +2 -0
  17. package/dist/bundle/chunks/chunk-DVFCXHT4.js +2 -0
  18. package/dist/bundle/chunks/chunk-EPYT326Y.js +30 -0
  19. package/dist/bundle/chunks/chunk-ETOMYYZC.js +2 -0
  20. package/dist/bundle/chunks/chunk-FA32X2UJ.js +7 -0
  21. package/dist/bundle/chunks/chunk-FHM6KUY3.js +44 -0
  22. package/dist/bundle/chunks/chunk-FO7CEQB3.js +11 -0
  23. package/dist/bundle/chunks/chunk-GHVXUCGU.js +130 -0
  24. package/dist/bundle/chunks/chunk-HHWP56PR.js +2 -0
  25. package/dist/bundle/chunks/chunk-HSL72VZI.js +2 -0
  26. package/dist/bundle/chunks/chunk-HUQB436V.js +2 -0
  27. package/dist/bundle/chunks/chunk-HWXGL4YB.js +2 -0
  28. package/dist/bundle/chunks/chunk-KQKUEQJA.js +6 -0
  29. package/dist/bundle/chunks/chunk-M5GCRGV6.js +1333 -0
  30. package/dist/bundle/chunks/chunk-MB4QRS7Y.js +9 -0
  31. package/dist/bundle/chunks/chunk-MXIWLMNT.js +8 -0
  32. package/dist/bundle/chunks/chunk-N6VDWLND.js +2 -0
  33. package/dist/bundle/chunks/chunk-NCIBB66G.js +2 -0
  34. package/dist/bundle/chunks/chunk-NDQ5OW6U.js +2 -0
  35. package/dist/bundle/chunks/chunk-NNCIIYD6.js +2 -0
  36. package/dist/bundle/chunks/chunk-O6JSP6YG.js +6 -0
  37. package/dist/bundle/chunks/chunk-OFST7FDG.js +2 -0
  38. package/dist/bundle/chunks/chunk-SPAUY3RD.js +12 -0
  39. package/dist/bundle/chunks/chunk-U5XE4RWR.js +2 -0
  40. package/dist/bundle/chunks/chunk-UZWP3NHW.js +2 -0
  41. package/dist/bundle/chunks/chunk-V5ANFNKF.js +11 -0
  42. package/dist/bundle/chunks/chunk-VJJ6J35N.js +20 -0
  43. package/dist/bundle/chunks/chunk-XIRAUXOE.js +58 -0
  44. package/dist/bundle/chunks/chunk-ZW7FVRHT.js +31 -0
  45. package/dist/bundle/chunks/cli-6ZTWO6GL.js +51 -0
  46. package/dist/bundle/chunks/cloudflare-workers-ai-system-one-6E2UM7IG.js +2 -0
  47. package/dist/bundle/chunks/codemode-worker.js +478 -0
  48. package/dist/bundle/chunks/dist-DKI7Q6GY.js +13 -0
  49. package/dist/bundle/chunks/easter-egg-3d-FDCGDUF3.js +2 -0
  50. package/dist/bundle/chunks/execute-VSDU5VSN.js +499 -0
  51. package/dist/bundle/chunks/github-copilot.js +2 -0
  52. package/dist/bundle/chunks/google-generative-ai-CSWR3ORZ.js +2 -0
  53. package/dist/bundle/chunks/google-vertex-QIDRFOFB.js +2 -0
  54. package/dist/bundle/chunks/image-resize-worker.js +2 -0
  55. package/dist/bundle/chunks/jiti-loader-BXVX3Y2R.js +21 -0
  56. package/dist/bundle/chunks/jiti-static-loader-NNBCFAO5.js +2 -0
  57. package/dist/bundle/chunks/kimi-coding.js +2 -0
  58. package/dist/bundle/chunks/knightcode-messages-3GNOTMSI.js +8 -0
  59. package/dist/bundle/chunks/lib-IHWMWJDR.js +9 -0
  60. package/dist/bundle/chunks/llama-cpp-classify-HRPRKOZA.js +22 -0
  61. package/dist/bundle/chunks/meta.js +2 -0
  62. package/dist/bundle/chunks/mistral-conversations-46TK5OBA.js +5 -0
  63. package/dist/bundle/chunks/multipart-parser-VTTMF2EO.js +3 -0
  64. package/dist/bundle/chunks/node-7S3GFMOZ.js +16 -0
  65. package/dist/bundle/chunks/node-MAEICQNS.js +2 -0
  66. package/dist/bundle/chunks/openai-chatgpt.js +101 -0
  67. package/dist/bundle/chunks/openai-codex-responses-IT7VEKUU.js +10 -0
  68. package/dist/bundle/chunks/openai-codex.js +101 -0
  69. package/dist/bundle/chunks/openai-completions-LOKIW33V.js +7 -0
  70. package/dist/bundle/chunks/openai-decisions-4F3LWHMG.js +5 -0
  71. package/dist/bundle/chunks/openai-responses-OK36GJXP.js +3 -0
  72. package/dist/bundle/chunks/openrouter-images-ZI7LLZ4Y.js +2 -0
  73. package/dist/bundle/chunks/openrouter.js +101 -0
  74. package/dist/bundle/chunks/radius.js +101 -0
  75. package/dist/bundle/chunks/runtime-RMPIV5AR.js +2 -0
  76. package/dist/bundle/chunks/src-ETRMT73D.js +4 -0
  77. package/dist/bundle/chunks/typesafe-system-one-J2CJBWEH.js +2 -0
  78. package/dist/bundle/chunks/virtual-modules-EGJP3AJA.js +2 -0
  79. package/dist/bundle/chunks/xai.js +2 -0
  80. package/dist/bundle/cli-runtime.js +3 -0
  81. package/dist/bundle/cli.js +5 -0
  82. package/dist/bundle/native/darwin/prebuilds/darwin-arm64/darwin-platform.node +0 -0
  83. package/dist/bundle/native/darwin/prebuilds/darwin-x64/darwin-platform.node +0 -0
  84. package/dist/bundle/native/linux/prebuilds/linux-arm64/linux-platform-x11.node +0 -0
  85. package/dist/bundle/native/linux/prebuilds/linux-x64/linux-platform-x11.node +0 -0
  86. package/dist/bundle/native/win32/prebuilds/win32-arm64/win32-platform.node +0 -0
  87. package/dist/bundle/native/win32/prebuilds/win32-x64/win32-platform.node +0 -0
  88. package/dist/core/export-html/template.css +1015 -0
  89. package/dist/core/export-html/template.html +55 -0
  90. package/dist/core/export-html/template.js +1929 -0
  91. package/dist/core/export-html/vendor/highlight.min.js +1213 -0
  92. package/dist/core/export-html/vendor/marked.min.js +78 -0
  93. package/dist/modes/interactive/theme/dark.json +74 -0
  94. package/dist/modes/interactive/theme/light.json +74 -0
  95. package/dist/modes/interactive/theme/system-theme.ts +579 -0
  96. package/dist/modes/interactive/theme/theme-controller.ts +253 -0
  97. package/dist/modes/interactive/theme/theme-schema.ts +145 -0
  98. package/dist/modes/interactive/theme/theme-tokens.ts +145 -0
  99. package/dist/modes/interactive/theme/theme.ts +1076 -0
  100. package/docs/app-server.md +479 -0
  101. package/docs/app-server.schema.json +8128 -0
  102. package/docs/cli-integration.md +106 -0
  103. package/docs/cli.md +393 -0
  104. package/docs/codemode.md +230 -0
  105. package/docs/compaction.md +463 -0
  106. package/docs/configuration.md +48 -0
  107. package/docs/containerization.md +143 -0
  108. package/docs/custom-provider.md +173 -0
  109. package/docs/desktop.md +73 -0
  110. package/docs/docs.json +236 -0
  111. package/docs/environment-variables.md +138 -0
  112. package/docs/extensions.md +314 -0
  113. package/docs/how-knightcode-works.md +49 -0
  114. package/docs/images/doom-extension.png +0 -0
  115. package/docs/images/interactive-mode.png +0 -0
  116. package/docs/images/tree-view.png +0 -0
  117. package/docs/index.md +39 -0
  118. package/docs/json.md +226 -0
  119. package/docs/keybindings.md +197 -0
  120. package/docs/llama-cpp.md +121 -0
  121. package/docs/mcp.md +272 -0
  122. package/docs/message-types.md +279 -0
  123. package/docs/models-configuration.md +187 -0
  124. package/docs/models.md +221 -0
  125. package/docs/nvidia-rtx-llama-cpp.md +96 -0
  126. package/docs/packages.md +129 -0
  127. package/docs/plan-mode.md +121 -0
  128. package/docs/prompt-templates.md +59 -0
  129. package/docs/providers.md +282 -0
  130. package/docs/quickstart.md +128 -0
  131. package/docs/remote.md +87 -0
  132. package/docs/rpc-commands.md +860 -0
  133. package/docs/rpc-extension-ui.md +214 -0
  134. package/docs/rpc.md +193 -0
  135. package/docs/sdk.md +197 -0
  136. package/docs/security.md +99 -0
  137. package/docs/session-format.md +358 -0
  138. package/docs/sessions.md +135 -0
  139. package/docs/settings.md +220 -0
  140. package/docs/shell-aliases.md +93 -0
  141. package/docs/skills.md +93 -0
  142. package/docs/slash-commands.md +78 -0
  143. package/docs/terminal-setup.md +242 -0
  144. package/docs/termux.md +117 -0
  145. package/docs/themes.md +140 -0
  146. package/docs/tmux.md +55 -0
  147. package/docs/tui.md +125 -0
  148. package/docs/usage.md +167 -0
  149. package/docs/virtual-models.md +114 -0
  150. package/docs/windows.md +67 -0
  151. package/examples/README.md +36 -0
  152. package/examples/extensions/README.md +214 -0
  153. package/examples/extensions/auto-commit-on-exit.ts +55 -0
  154. package/examples/extensions/bash-spawn-hook.ts +30 -0
  155. package/examples/extensions/bookmark.ts +50 -0
  156. package/examples/extensions/border-status-editor.ts +151 -0
  157. package/examples/extensions/built-in-tool-renderer.ts +225 -0
  158. package/examples/extensions/claude-rules.ts +89 -0
  159. package/examples/extensions/commands.ts +72 -0
  160. package/examples/extensions/confirm-destructive.ts +60 -0
  161. package/examples/extensions/custom-compaction.ts +118 -0
  162. package/examples/extensions/custom-footer.ts +66 -0
  163. package/examples/extensions/custom-header.ts +73 -0
  164. package/examples/extensions/custom-provider-anthropic/index.ts +617 -0
  165. package/examples/extensions/custom-provider-anthropic/package-lock.json +24 -0
  166. package/examples/extensions/custom-provider-anthropic/package.json +19 -0
  167. package/examples/extensions/custom-provider-gitlab-duo/index.ts +399 -0
  168. package/examples/extensions/custom-provider-gitlab-duo/package.json +16 -0
  169. package/examples/extensions/custom-provider-gitlab-duo/test.ts +82 -0
  170. package/examples/extensions/debug-provider.ts +90 -0
  171. package/examples/extensions/dirty-repo-guard.ts +56 -0
  172. package/examples/extensions/doom-overlay/README.md +46 -0
  173. package/examples/extensions/doom-overlay/doom/build.sh +152 -0
  174. package/examples/extensions/doom-overlay/doom/doomgeneric_knightcode.c +72 -0
  175. package/examples/extensions/doom-overlay/doom-component.ts +132 -0
  176. package/examples/extensions/doom-overlay/doom-engine.ts +173 -0
  177. package/examples/extensions/doom-overlay/doom-keys.ts +104 -0
  178. package/examples/extensions/doom-overlay/index.ts +74 -0
  179. package/examples/extensions/doom-overlay/wad-finder.ts +55 -0
  180. package/examples/extensions/dynamic-resources/SKILL.md +8 -0
  181. package/examples/extensions/dynamic-resources/dynamic.json +75 -0
  182. package/examples/extensions/dynamic-resources/dynamic.md +5 -0
  183. package/examples/extensions/dynamic-resources/index.ts +15 -0
  184. package/examples/extensions/dynamic-tools.ts +74 -0
  185. package/examples/extensions/entry-renderer.ts +41 -0
  186. package/examples/extensions/event-bus.ts +43 -0
  187. package/examples/extensions/file-trigger.ts +41 -0
  188. package/examples/extensions/git-checkpoint.ts +53 -0
  189. package/examples/extensions/git-merge-and-resolve.ts +115 -0
  190. package/examples/extensions/github-issue-autocomplete.ts +185 -0
  191. package/examples/extensions/gondolin/index.ts +531 -0
  192. package/examples/extensions/gondolin/package-lock.json +185 -0
  193. package/examples/extensions/gondolin/package.json +19 -0
  194. package/examples/extensions/handoff.ts +190 -0
  195. package/examples/extensions/hello.ts +26 -0
  196. package/examples/extensions/hidden-thinking-label.ts +53 -0
  197. package/examples/extensions/inline-bash.ts +94 -0
  198. package/examples/extensions/input-transform-streaming.ts +39 -0
  199. package/examples/extensions/input-transform.ts +43 -0
  200. package/examples/extensions/interactive-shell.ts +196 -0
  201. package/examples/extensions/jev-router.ts +113 -0
  202. package/examples/extensions/mac-system-theme.ts +47 -0
  203. package/examples/extensions/message-renderer.ts +59 -0
  204. package/examples/extensions/minimal-mode.ts +353 -0
  205. package/examples/extensions/modal-editor.ts +85 -0
  206. package/examples/extensions/model-status.ts +31 -0
  207. package/examples/extensions/notify.ts +57 -0
  208. package/examples/extensions/overlay-qa-tests.ts +1450 -0
  209. package/examples/extensions/overlay-test.ts +153 -0
  210. package/examples/extensions/permission-gate.ts +34 -0
  211. package/examples/extensions/pirate.ts +47 -0
  212. package/examples/extensions/plan-mode/README.md +66 -0
  213. package/examples/extensions/plan-mode/index.ts +387 -0
  214. package/examples/extensions/plan-mode/utils.ts +168 -0
  215. package/examples/extensions/preset.ts +436 -0
  216. package/examples/extensions/project-trust.ts +64 -0
  217. package/examples/extensions/prompt-customizer.ts +49 -0
  218. package/examples/extensions/protected-paths.ts +30 -0
  219. package/examples/extensions/provider-payload.ts +18 -0
  220. package/examples/extensions/qna.ts +118 -0
  221. package/examples/extensions/question.ts +278 -0
  222. package/examples/extensions/questionnaire.ts +440 -0
  223. package/examples/extensions/rainbow-editor.ts +88 -0
  224. package/examples/extensions/reload-runtime.ts +37 -0
  225. package/examples/extensions/rpc-demo.ts +118 -0
  226. package/examples/extensions/sandbox/index.ts +321 -0
  227. package/examples/extensions/sandbox/package-lock.json +92 -0
  228. package/examples/extensions/sandbox/package.json +19 -0
  229. package/examples/extensions/send-user-message.ts +97 -0
  230. package/examples/extensions/session-name.ts +27 -0
  231. package/examples/extensions/shutdown-command.ts +63 -0
  232. package/examples/extensions/snake.ts +343 -0
  233. package/examples/extensions/space-invaders.ts +560 -0
  234. package/examples/extensions/ssh.ts +220 -0
  235. package/examples/extensions/status-line.ts +32 -0
  236. package/examples/extensions/structured-output.ts +65 -0
  237. package/examples/extensions/subagent/README.md +177 -0
  238. package/examples/extensions/subagent/agents/planner.md +37 -0
  239. package/examples/extensions/subagent/agents/reviewer.md +35 -0
  240. package/examples/extensions/subagent/agents/scout.md +50 -0
  241. package/examples/extensions/subagent/agents/worker.md +24 -0
  242. package/examples/extensions/subagent/agents.ts +157 -0
  243. package/examples/extensions/subagent/index.ts +1010 -0
  244. package/examples/extensions/subagent/prompts/implement-and-review.md +10 -0
  245. package/examples/extensions/subagent/prompts/implement.md +10 -0
  246. package/examples/extensions/subagent/prompts/scout-and-plan.md +9 -0
  247. package/examples/extensions/summarize.ts +199 -0
  248. package/examples/extensions/system-prompt-header.ts +17 -0
  249. package/examples/extensions/tic-tac-toe.ts +1004 -0
  250. package/examples/extensions/timed-confirm.ts +70 -0
  251. package/examples/extensions/titlebar-spinner.ts +58 -0
  252. package/examples/extensions/todo.ts +294 -0
  253. package/examples/extensions/tool-override.ts +144 -0
  254. package/examples/extensions/tools.ts +146 -0
  255. package/examples/extensions/trigger-compact.ts +50 -0
  256. package/examples/extensions/truncated-tool.ts +195 -0
  257. package/examples/extensions/widget-placement.ts +9 -0
  258. package/examples/extensions/with-deps/index.ts +32 -0
  259. package/examples/extensions/with-deps/package-lock.json +31 -0
  260. package/examples/extensions/with-deps/package.json +22 -0
  261. package/examples/extensions/working-indicator.ts +121 -0
  262. package/examples/extensions/working-message-test.ts +25 -0
  263. package/examples/rpc-client.ts +35 -0
  264. package/examples/rpc-extension-ui.ts +661 -0
  265. package/examples/sdk/01-minimal.ts +26 -0
  266. package/examples/sdk/02-custom-model.ts +49 -0
  267. package/examples/sdk/03-custom-prompt.ts +70 -0
  268. package/examples/sdk/04-skills.ts +55 -0
  269. package/examples/sdk/05-tools.ts +48 -0
  270. package/examples/sdk/06-extensions.ts +94 -0
  271. package/examples/sdk/07-context-files.ts +42 -0
  272. package/examples/sdk/08-prompt-templates.ts +51 -0
  273. package/examples/sdk/09-api-keys-and-oauth.ts +34 -0
  274. package/examples/sdk/10-settings.ts +53 -0
  275. package/examples/sdk/11-sessions.ts +52 -0
  276. package/examples/sdk/12-full-control.ts +74 -0
  277. package/examples/sdk/13-session-runtime.ts +67 -0
  278. package/examples/sdk/14-codemode-mcp.ts +61 -0
  279. package/examples/sdk/README.md +141 -0
  280. package/package.json +15 -15
  281. package/bin/knightcode +0 -62
package/docs/models.md ADDED
@@ -0,0 +1,221 @@
1
+ # Choose a Model
2
+
3
+ For a built-in provider, start with `/login`, then choose a model with `/model`. Use custom model configuration only when KnightCode does not already include the provider or endpoint you need.
4
+
5
+ ## Choose a connection
6
+
7
+ | What you have | Recommended setup |
8
+ |---|---|
9
+ | A supported subscription | Sign in through `/login` |
10
+ | A provider API key | Store it through `/login` or set its environment variable |
11
+ | A local GGUF model | Connect KnightCode to the llama.cpp router |
12
+ | An OpenAI-, Anthropic-, or Google-compatible endpoint | Add it to `models.json` |
13
+ | A provider with a custom protocol or authentication flow | Build or install a provider extension |
14
+
15
+ Browse the [model catalog](https://knightcode.dev/models) for current providers, model IDs, capabilities, context limits, and pricing. KnightCode starts with its bundled catalog and can overlay newer catalog data from knightcode.dev. Cached catalog data remains available offline; run `knightcode update --models` to force a refresh.
16
+
17
+ ## Authenticate
18
+
19
+ Run `/login` and select a provider. KnightCode stores credentials in [`auth.json`](configuration.md#agent-directory). Run `/logout` to remove stored credentials for a provider.
20
+
21
+ You can instead provide an API key through the provider's environment variable. This is useful in CI and other environments where KnightCode should not write credentials. [Providers](providers.md) lists the variables and provider-specific setup.
22
+
23
+ When several credential sources are configured, KnightCode uses a runtime `--api-key` first, then a stored `auth.json` credential, an `apiKey` from `models.json`, and finally the provider's environment variables or ambient cloud credentials. Provider extensions can define their own authentication behavior.
24
+
25
+ Keep `auth.json` and any credential commands private. Project settings and extensions can execute inside the KnightCode process after you trust a project. Review [Security](security.md) before loading configuration from an untrusted directory.
26
+
27
+ ## Select a model
28
+
29
+ Run `/model` to search available models. The picker shows models whose providers have usable authentication. Press `Ctrl+S` (or `Ctrl+D`, if your terminal swallows `Ctrl+S`) on a model to save it as the default for new sessions.
30
+
31
+ Run `/thinking` to select the thinking level for the current model. Press `Ctrl+S` or `Ctrl+D` there to save the startup level. KnightCode limits the choices to levels supported by the selected model.
32
+
33
+ `Ctrl+P` cycles through available models. Use `/scoped-models` to control that cycle and save the selection, or configure model patterns through [Settings](settings.md#model-cycling).
34
+
35
+ A session records model and thinking-level changes. Resuming the session restores them without changing defaults for new sessions.
36
+
37
+ ## Connect local models
38
+
39
+ KnightCode integrates directly with the llama.cpp router. The router discovers GGUF files and loads models on demand. KnightCode's `/llama` command manages the router, while `/model` selects one of its loaded models.
40
+
41
+ Follow [Local Models with llama.cpp](llama-cpp.md) for server startup, model layout, downloads, and connection troubleshooting.
42
+
43
+ For Ollama, LM Studio, vLLM, SGLang, and other compatible servers, [configure a compatible endpoint](#configure-a-compatible-endpoint) in `models.json`.
44
+
45
+ ## Configure a compatible endpoint
46
+
47
+ Use [`models.json`](configuration.md#agent-directory) when an endpoint speaks an API KnightCode already supports. This includes most Ollama, LM Studio, vLLM, SGLang, and proxy deployments.
48
+
49
+ ```json
50
+ {
51
+ "$schema": "https://knightcode.dev/schemas/models.schema.json",
52
+ "providers": {
53
+ "ollama": {
54
+ "baseUrl": "http://localhost:11434/v1",
55
+ "api": "openai-completions",
56
+ "apiKey": "ollama",
57
+ "models": [
58
+ { "id": "qwen2.5-coder:7b" }
59
+ ]
60
+ }
61
+ }
62
+ }
63
+ ```
64
+
65
+ The dummy key makes the model available to KnightCode; Ollama ignores it. For an authenticated endpoint, `apiKey` and header values can use `$NAME` or `${NAME}` environment interpolation, a literal value, or a leading `!command`. `$$` and `$!` produce a literal `$` and `!`. Commands in `models.json` run at request time and are not cached by KnightCode.
66
+
67
+ Opening `/model` reloads the file. A `models` entry adds or replaces a model with the same ID on that provider. Use `modelOverrides` to change metadata for an existing built-in or extension-provided model without replacing the provider's model list. Unknown override IDs are ignored.
68
+
69
+ To route a built-in provider through a proxy, set only its `baseUrl`. Its models and authentication stay unchanged:
70
+
71
+ ```json
72
+ {
73
+ "providers": {
74
+ "anthropic": { "baseUrl": "https://proxy.example.com/v1" }
75
+ }
76
+ }
77
+ ```
78
+
79
+ [Models Configuration](models-configuration.md) lists every field.
80
+
81
+ ### Describe model input and caching
82
+
83
+ Use `inputLimits.images.resize` to control how KnightCode encodes new image attachments, `read` results, and tool-result images before storing them in conversation history:
84
+
85
+ ```json
86
+ {
87
+ "id": "vision-model",
88
+ "input": ["text", "image"],
89
+ "inputLimits": {
90
+ "images": {
91
+ "resize": {
92
+ "maxWidth": 1568,
93
+ "maxHeight": 1568,
94
+ "maxBytes": 524288,
95
+ "jpegQuality": 75
96
+ }
97
+ }
98
+ }
99
+ }
100
+ ```
101
+
102
+ `maxBytes` limits the base64-encoded payload. Omitted resize fields use conservative defaults of 2000 by 2000 pixels, 4.5 MiB encoded, and JPEG quality 80. Images are encoded once; changing models does not rewrite historical images. The catalog can also describe hard request limits with `inputLimits.maxRequestBytes`, `images.maxPerMessage`, and `images.maxPerRequest`, but KnightCode does not yet rewrite or reject history based on them.
103
+
104
+ <a id="prompt-cache-lifetimes"></a>
105
+
106
+ Use `promptCache` to declare the provider's best-effort cache lifetime in seconds for the `short` or `long` retention tier:
107
+
108
+ ```json
109
+ { "id": "claude-sonnet-5", "promptCache": { "short": 300, "long": 3600 } }
110
+ ```
111
+
112
+ Choose the conservative end of any published range. A model without a lifetime for the active tier is not eligible for cache warming. A `modelOverrides` entry can set `inputLimits` or `promptCache` for a built-in or extension model, including a model accessed through a validated proxy. See [`cacheWarming`](settings.md#model-and-thinking).
113
+
114
+ ### Configure sampling by thinking level
115
+
116
+ OpenAI-compatible APIs support free-form `samplingParams` model defaults and `samplingParamsByThinkingLevel` overrides. The latter uses KnightCode thinking-level keys (`off`, `minimal`, `low`, `medium`, `high`, `xhigh`, and `max`), not provider values from `thinkingLevelMap`:
117
+
118
+ ```json
119
+ {
120
+ "id": "qwen-thinking-model",
121
+ "reasoning": true,
122
+ "samplingParams": {
123
+ "temperature": 1.0,
124
+ "top_p": 0.95
125
+ },
126
+ "samplingParamsByThinkingLevel": {
127
+ "off": {
128
+ "temperature": 0.7,
129
+ "top_p": 0.8
130
+ },
131
+ "high": {
132
+ "top_k": 20
133
+ }
134
+ }
135
+ }
136
+ ```
137
+
138
+ KnightCode first clamps unsupported thinking levels, then merges model `samplingParams`, the effective level's override, and request-level `samplingParams` in that order. Later values win per key. Missing levels inherit the model defaults. `modelOverrides` merges per-level entries per key with the base model. These fields apply only to `openai-completions`, `openai-responses`, and `azure-openai-responses`; other APIs ignore them.
139
+
140
+ Compatibility settings should describe verified differences in the endpoint's request or response behavior. Do not enable them based only on an endpoint advertising OpenAI or Anthropic compatibility.
141
+
142
+ ## Use classifier models
143
+
144
+ Classifier models do not chat. They answer typed questions about JSON state: pick one of several choices, answer yes or no, or give a score, each with probabilities. KnightCode includes TypeSafe's Jev model from these providers, Cloudflare's Clef and Clef Flash models from Workers AI, and OpenAI's GPT-6 Luna through the [Decisions API](https://developers.openai.com/api/docs/guides/decisions):
145
+
146
+ | Provider | Model IDs | Authentication |
147
+ |---|---|---|
148
+ | `typesafe` | `jev-latest` | `TYPESAFE_API_KEY` |
149
+ | `openrouter` | `typesafe/jev-1.13`, `~typesafe/jev-latest` | `OPENROUTER_API_KEY` or `/login` |
150
+ | `cloudflare-workers-ai` | `typesafe/jev`, `@cf/cloudflare/clef`, `@cf/cloudflare/clef-flash` | `CLOUDFLARE_API_KEY` and `CLOUDFLARE_ACCOUNT_ID` |
151
+ | `vercel-ai-gateway` | `typesafe-ai/jev` | `AI_GATEWAY_API_KEY` |
152
+ | `opencode` | `jev-1.13`, `jev-1.13-free` | `OPENCODE_API_KEY` |
153
+ | `openai` | `gpt-6-luna` | `OPENAI_API_KEY` |
154
+
155
+ A [llama.cpp router](llama-cpp.md#classification) lists decision models as native classifiers, and also lists each chat model as a classifier.
156
+
157
+ OpenAI's Decisions API needs an API key. ChatGPT sign-in does not work with it, so `gpt-6-luna` is not listed as available while `openai` is logged in through `/login`, even when `OPENAI_API_KEY` is set; log out of `openai` to use the key. GPT-6 Luna also judges images passed in `images` (see [Codemode](codemode.md#classify)); other classifier models return an error for them. The API rejects inputs above 922K tokens, but requests that run longer than about five seconds, currently above roughly 600K input tokens, fail with a gateway timeout.
158
+
159
+ Classifier models do not appear in `/model`. The [classifier gate](usage.md#classifier-gate) uses one to screen risky tool calls. The model reaches them through the [`codemode`](cli.md#enable-codemode) tool, which is off unless an MCP server turned it on. Enable it with `"defaultTools": ["+codemode"]` in [settings](settings.md#tools). Scripts then list classifier models with `models.getAvailableOfType("classifier")` and call `models.classify(model, { state, questions })`:
160
+
161
+ ```js
162
+ const jev = await models.getModelOfType("classifier", "typesafe", "jev-latest");
163
+ const result = await models.classify(jev, {
164
+ state: { message: "The change works, thanks." },
165
+ questions: {
166
+ approved: {
167
+ type: "bool",
168
+ instructions: "Does the user approve of the result?",
169
+ criteria: { true: "Approval", false: "No approval" },
170
+ },
171
+ },
172
+ });
173
+ return result.answers;
174
+ ```
175
+
176
+ [Codemode](codemode.md#classify) describes the question and answer types.
177
+
178
+ When the service reports token counts, as all System One services do, `result.usage` carries them with their cost. KnightCode adds the usage of a script's classifier calls to the `codemode` tool result, so it counts toward the session cost in the footer and `/session`. The cost uses the model's catalog price; models without one, such as TypeSafe's direct `jev-latest`, report tokens at no cost.
179
+
180
+ Extensions call classifiers through `ctx.modelRegistry.classify()`, without codemode. [Virtual models](virtual-models.md#route-requests) can use them to route requests; see the `jev-router.ts` example.
181
+
182
+ ## Use image models
183
+
184
+ Image models generate images from a prompt and optional input images. KnightCode lists OpenRouter's image models, such as `google/gemini-2.5-flash-image` and `black-forest-labs/flux.2-pro`, under the `openrouter` provider; they use the same `OPENROUTER_API_KEY` or `/login` credential as its chat models.
185
+
186
+ Like classifier models, image models do not appear in `/model`; the model reaches them through the [`codemode`](cli.md#enable-codemode) tool. Scripts list them with `models.getAvailableOfType("image")` and call `models.generateImages(model, { input })`. The result's `output` holds base64 image blocks, which `image()` attaches to the `codemode` result so the model sees them:
187
+
188
+ ```js
189
+ const painter = await models.getModelOfType("image", "openrouter", "google/gemini-2.5-flash-image");
190
+ const result = await models.generateImages(painter, {
191
+ input: [{ type: "text", text: "A red fox in the snow, watercolor" }],
192
+ });
193
+ if (result.stopReason !== "stop") return result.errorMessage;
194
+ for (const block of result.output) if (block.type === "image") image(block);
195
+ ```
196
+
197
+ `input` can also contain `{ type: "image", data, mimeType }` blocks to edit or use as references. KnightCode adds the usage of a script's image calls to the `codemode` tool result, like classifier calls. Generated images are not saved to disk. [Codemode](codemode.md#generate-images) describes the full API.
198
+
199
+ Extensions generate images through `ctx.modelRegistry.generateImages()`, without codemode.
200
+
201
+ ## Add a custom provider
202
+
203
+ Use an extension when the provider needs custom streaming, model discovery, or authentication behavior. See [Custom Providers](custom-provider.md) for the extension workflow.
204
+
205
+ ## Troubleshooting
206
+
207
+ ### A model does not appear
208
+
209
+ Confirm that its provider has usable authentication. Custom models can load from `models.json` but remain unavailable in `/model` until KnightCode can resolve credentials. For llama.cpp, only models currently loaded by the router appear.
210
+
211
+ ### Authentication works in one shell only
212
+
213
+ Check whether the key came from an environment variable rather than `auth.json`. Environment variables must be present in the process that starts KnightCode.
214
+
215
+ ### Sign-in opens a browser on a remote machine
216
+
217
+ Complete the provider's headless authentication flow when available. Some providers let you paste the final redirect URL or authorization code back into KnightCode. See [Authenticate interactively](providers.md#authenticate-interactively).
218
+
219
+ ### A compatible endpoint rejects requests
220
+
221
+ Check its API type and compatibility settings in `models.json`. The upstream server must support the corresponding request fields and behavior.
@@ -0,0 +1,96 @@
1
+ # Run KnightCode with NVIDIA RTX and llama.cpp
2
+
3
+ [NVIDIA Local AI Inference Recipes](https://nvidia.github.io/local-ai-inference-recipes/index.html) provides llama.cpp settings tuned for specific NVIDIA hardware and models. Each recipe gives a single-model `llama-server` command. KnightCode works with the llama.cpp router, which can serve and manage several models, so this guide converts the recipe command into a router preset.
4
+
5
+ The examples below use Windows PowerShell. See [Local Models with llama.cpp](llama-cpp.md) for KnightCode's complete router and model-management reference.
6
+
7
+ ## Before you begin
8
+
9
+ 1. Open the [recipe catalog](https://nvidia.github.io/local-ai-inference-recipes/index.html), select your hardware, operating system, and model, then choose **llama.cpp**. Check the prerequisites and memory requirements. Keep the recipe's launch command for the conversion below.
10
+ 2. Install llama.cpp with the recipe's setup instructions. The recipe's settings depend on its build, for example CUDA support or speculative decoding options.
11
+ 3. Run `llama-server --help` and check that it lists `--models-preset`. Without it, the build cannot load the recipe as a router preset. Use a newer build that still meets the recipe's requirements.
12
+ 4. Install KnightCode with the [Quickstart](quickstart.md). On native Windows, also see [Run KnightCode on Windows](windows.md).
13
+
14
+ ## Convert the recipe to a preset
15
+
16
+ A preset lists the settings for one or more models. Each section name becomes the model ID shown in KnightCode. Save the preset next to `llama-server`, or pass its full path when starting the router.
17
+
18
+ Convert each option from the recipe command into one preset line:
19
+
20
+ - Remove the leading dashes: `--ctx-size 65536` becomes `ctx-size = 65536`.
21
+ - Write options without a value as `true`: `--jinja` becomes `jinja = true`.
22
+ - Remove quotes and PowerShell line-continuation backticks around values.
23
+ - Leave out `--host` and `--port`. They belong on the router command line.
24
+ - Add `load-on-startup = true` so the router loads the model when it starts.
25
+ - Replace short model-file options with their long preset keys:
26
+
27
+ | Recipe option | Preset key |
28
+ |---|---|
29
+ | `-hf` | `hf-repo` |
30
+ | `-hff` | `hf-file` |
31
+ | `-hfrd` | `hf-repo-draft` |
32
+ | `--spec-draft-model` | `spec-draft-model` |
33
+
34
+ For example, this recipe command:
35
+
36
+ ```powershell
37
+ llama-server.exe -hf "unsloth/Qwen3.8-27B-GGUF" `
38
+ -hff "Qwen3.8-27B-UD-Q4_K_M.gguf" `
39
+ -hfrd "z-lab/Qwen3.8-27B-DFlash2-GGUF" `
40
+ --spec-draft-model "Qwen3.8-27B-DFlash2-Q4_K_M.gguf" `
41
+ --no-mmproj `
42
+ --host 127.0.0.1 `
43
+ --port 9931 `
44
+ --batch-size 4096 `
45
+ --ubatch-size 1024 `
46
+ --ctx-size 65536 `
47
+ --parallel 1 `
48
+ -ngl 999 `
49
+ --jinja `
50
+ --chat-template-kwargs '{"preserve_thinking":true}' `
51
+ --spec-type draft-dflash `
52
+ --spec-draft-n-max 7 `
53
+ --spec-draft-backend-sampling
54
+ ```
55
+
56
+ becomes `qwen3.8-27b.ini`:
57
+
58
+ ```ini
59
+ version = 1
60
+
61
+ [qwen3.8-27b]
62
+ load-on-startup = true
63
+ hf-repo = unsloth/Qwen3.8-27B-GGUF
64
+ hf-file = Qwen3.8-27B-UD-Q4_K_M.gguf
65
+ hf-repo-draft = z-lab/Qwen3.8-27B-DFlash2-GGUF
66
+ spec-draft-model = Qwen3.8-27B-DFlash2-Q4_K_M.gguf
67
+ no-mmproj = true
68
+ batch-size = 4096
69
+ ubatch-size = 1024
70
+ ctx-size = 65536
71
+ parallel = 1
72
+ ngl = 999
73
+ jinja = true
74
+ chat-template-kwargs = {"preserve_thinking":true}
75
+ spec-type = draft-dflash
76
+ spec-draft-n-max = 7
77
+ spec-draft-backend-sampling = true
78
+ ```
79
+
80
+ ## Start the router
81
+
82
+ Open PowerShell in the llama.cpp folder and run:
83
+
84
+ ```powershell
85
+ .\llama-server.exe --models-preset qwen3.8-27b.ini --host 127.0.0.1 --port 8080
86
+ ```
87
+
88
+ If the recipe requires a Hugging Face token, set `$env:HF_TOKEN` in the same PowerShell window before starting the router. On its first start, the router downloads the model files.
89
+
90
+ Use the [router health checks](llama-cpp.md#troubleshooting) to confirm that the server is ready. In Windows PowerShell, use `curl.exe` rather than `curl`, which PowerShell maps to a different command. The model is ready when `/models` lists `qwen3.8-27b` with the status `loaded`.
91
+
92
+ ## Use the model in KnightCode
93
+
94
+ Follow [Configure KnightCode](llama-cpp.md#configure-knightcode) and connect to `http://127.0.0.1:8080`. The preset section name is the model ID, so select `qwen3.8-27b` in `/model` for this example.
95
+
96
+ NVIDIA recipe memory settings assume that only the selected model uses the GPU. If `/llama` shows other loaded models, unload them before using the recipe model.
@@ -0,0 +1,129 @@
1
+ # KnightCode Packages
2
+
3
+ KnightCode packages install and distribute extensions, skills, prompt templates, and themes as one unit. Use a package when a customization should be shared through npm or git, or when several resources belong together.
4
+
5
+ A package is an ordinary directory or npm package. It can expose conventional resource directories, declare explicit paths under the `knightcode` key in `package.json`, and carry its own runtime dependencies.
6
+
7
+ ## Install and manage packages
8
+
9
+ Install from npm, git, or a local path:
10
+
11
+ ```bash
12
+ knightcode install npm:@example/knightcode-tools@1.0.0
13
+ knightcode install git:github.com/example/knightcode-tools@v1
14
+ knightcode install ./local-package
15
+ ```
16
+
17
+ `knightcode list` shows configured packages. Use `knightcode remove <source>` to remove one and `knightcode update --extensions` to reconcile package installations. See [Command Line](cli.md#package-commands) for every package command and option.
18
+
19
+ Personal installs are written to `~/.knightcode/agent/settings.json`. Add `--local` or `-l` to write the package declaration to `.knightcode/settings.json`. KnightCode reads declarations from that file only after project trust is granted.
20
+
21
+ Project packages are installed and loaded only after project trust is resolved. Packages can execute extension code and can include skills that instruct the model to run programs. Review third-party package source before installing it. Review project package declarations before granting project trust.
22
+
23
+ Use `--extension` or `-e` to try a package for one invocation without adding it to settings:
24
+
25
+ ```bash
26
+ knightcode -e npm:@example/knightcode-tools
27
+ ```
28
+
29
+ ## Choose a source
30
+
31
+ | Source | Example | Behavior |
32
+ |---|---|---|
33
+ | npm | `npm:@example/knightcode-tools@1.0.0` | Installed under the KnightCode npm directory |
34
+ | git | `git:github.com/example/knightcode-tools@v1` | Cloned and reconciled to the selected ref |
35
+ | URL | `https://github.com/example/knightcode-tools` | Treated as a git source |
36
+ | Local | `./knightcode-tools` | Loaded from the resolved path without copying |
37
+
38
+ Versioned npm specifications are pinned. Git tags and commits are also pinned; package updates reconcile the checkout but do not move a configured ref.
39
+
40
+ Relative local paths resolve from the settings file that contains them. A file path loads one extension. A directory follows normal package discovery rules.
41
+
42
+ ## Create a package
43
+
44
+ The simplest package uses conventional directories:
45
+
46
+ ```text
47
+ my-knightcode-package/
48
+ ├── package.json
49
+ ├── extensions/
50
+ ├── skills/
51
+ ├── prompts/
52
+ └── themes/
53
+ ```
54
+
55
+ Without a `knightcode` manifest, KnightCode discovers TypeScript and JavaScript extensions, skill directories, Markdown prompts, and JSON themes from those directories.
56
+
57
+ Use an explicit manifest when resources live elsewhere or need filtering:
58
+
59
+ ```json
60
+ {
61
+ "name": "my-knightcode-package",
62
+ "keywords": ["knightcode-package"],
63
+ "knightcode": {
64
+ "extensions": ["./src/extension.ts"],
65
+ "skills": ["./resources/skills"],
66
+ "prompts": ["./resources/prompts/*.md"],
67
+ "themes": ["./resources/themes/*.json"]
68
+ }
69
+ }
70
+ ```
71
+
72
+ Paths are relative to the package root. Arrays accept glob patterns and exclusions. List dot-prefixed or symlinked resource roots directly when traversal through a glob would not discover them.
73
+
74
+ The `knightcode-package` keyword makes an npm package eligible for discovery in the [KnightCode package gallery](https://knightcode.dev/packages). Optional `knightcode.image` and `knightcode.video` fields add gallery previews.
75
+
76
+ ## Declare dependencies
77
+
78
+ Put runtime packages imported by extensions in `dependencies`. KnightCode installs package dependencies when it installs an npm or git source.
79
+
80
+ KnightCode supplies these packages to extensions and skills:
81
+
82
+ - `@knightcode/ai`
83
+ - `@knightcode/agent`
84
+ - `@knightcodeai/cli`
85
+ - `@knightcode/tui`
86
+ - `typebox`
87
+
88
+ Declare the host-provided packages listed above in `peerDependencies` with a `"*"` range and do not bundle them. KnightCode suppresses automatic peer installation for managed npm packages and git packages installed with npm, pnpm, or Bun. Local packages are not installed or modified, so their dependency tree remains the package author's responsibility.
89
+
90
+ Do not list host-provided packages in `dependencies`. A physical copy can bypass KnightCode's extension module mapping in compiled ESM and create duplicate classes, registries, and initialization work. KnightCode reports an extension warning when it detects this manifest configuration. Other KnightCode packages used as dependencies must be included in the published tarball and referenced through their `node_modules` resource paths.
91
+
92
+ Installed packages load with separate module roots. Do not rely on two packages sharing one dependency instance or one package resolving another package’s undeclared dependency.
93
+
94
+ ## Select package resources
95
+
96
+ The object form in settings narrows which resources load from a package:
97
+
98
+ ```json
99
+ {
100
+ "packages": [
101
+ {
102
+ "source": "npm:@example/knightcode-tools",
103
+ "extensions": ["extensions/*.ts", "!extensions/legacy.ts"],
104
+ "skills": [],
105
+ "prompts": ["prompts/review.md"]
106
+ }
107
+ ]
108
+ }
109
+ ```
110
+
111
+ For each resource type:
112
+
113
+ - Omit the property to load everything allowed by the package.
114
+ - Use `[]` to load none of that type.
115
+ - Use `!pattern` to exclude glob matches.
116
+ - Use `+path` to include one exact allowed path.
117
+ - Use `-path` to exclude one exact path.
118
+
119
+ Filters narrow the package manifest. They do not expose resources that the package itself did not declare.
120
+
121
+ Run `knightcode config` to enable or disable discovered resources and knightcode's built-in extensions. It starts with personal configuration; press Tab to switch scope, or run `knightcode config --local` to start with project overrides.
122
+
123
+ ## Understand scope and identity
124
+
125
+ The same package can appear in personal and project settings. A project entry normally replaces the personal entry. With `autoload: false`, the project entry instead acts as a filtering delta over the personal package.
126
+
127
+ KnightCode identifies npm packages by package name, git packages by repository URL without the ref, and local packages by resolved absolute path. This prevents the same package from loading twice through equivalent declarations.
128
+
129
+ Use [Extensions](extensions.md), [Skills](skills.md), [Prompt Templates](prompt-templates.md), and [Themes](themes.md) to design each resource before packaging it.
@@ -0,0 +1,121 @@
1
+ # Plan mode
2
+
3
+ Plan mode separates investigation from implementation. Enter with `/plan`, or
4
+ send a task with `/plan <task>`. The model explores, asks about unresolved
5
+ trade-offs, and submits a complete Markdown plan. It cannot approve its own
6
+ plan. Sessions that never use planning gain no planning instructions or tool
7
+ declarations.
8
+
9
+ ## Commands
10
+
11
+ | Command | Behavior |
12
+ |---|---|
13
+ | `/plan` | Enter planning; when already planning, review the latest draft |
14
+ | `/plan <task>` | Enter if needed and run the task as a planning prompt |
15
+ | `/plan off` | Leave planning without discarding the draft |
16
+ | `/plan approve [N [note]]` | Approve the latest revision, or exactly revision N, and implement in this session; a note after N is passed to the model |
17
+ | `/plan approve fresh [N [note]]` | Approve and implement in a fresh CLI session linked to the planning transcript |
18
+ | `--plan` | Enter planning on initial startup only, including when initially opening a saved session |
19
+
20
+ All commands require an idle session without queued messages. Finish or
21
+ interrupt the current turn and resolve pending input first. An explicit revision
22
+ that is no longer current is refused; run `/plan` to review again.
23
+
24
+ Without a draft, `/plan` reports “No plan submitted yet; send a task to continue
25
+ planning.” It opens no picker and starts no model request. Approval without a
26
+ draft reports “No plan to approve.” Typing a message while planning requests a
27
+ revision; it is not approval.
28
+
29
+ ## What is enforced
30
+
31
+ Planning permits model-issued calls to `read`, `grep`, `find`, `ls`, `webfetch`,
32
+ `websearch`, `bash`, `powershell`, `ask_user`, and `submit_plan`. Entering plan
33
+ mode turns on `webfetch` and `websearch` unless they are turned off with
34
+ `/tools`; like the other planning tools, they stay on afterwards. Every other
35
+ tool is blocked, including file edits, MCP tools regardless of their read-only
36
+ hints, custom tools, subagents, codemode, and tool search. Nested tool calls
37
+ pass through the same gate. The planning instructions name only the tools the
38
+ session has.
39
+
40
+ Shell commands are not checked. The model is told to run only commands that
41
+ inspect, but a command can still change files. User-started `!` commands are
42
+ not gated.
43
+
44
+ This is not an operating-system sandbox. KnightCode still writes session data,
45
+ and installed extensions remain trusted code that can access files directly.
46
+ The planning gate runs before KnightCode's built-in classifier gate. User and project extensions load first, so their handlers may
47
+ run before it. Another extension registering `/plan`, `--plan`, or either
48
+ planning tool replaces the built-in implementation.
49
+
50
+ ## Questions, submission, and review
51
+
52
+ Questions offer two to four choices, recommended first, plus a free-text answer.
53
+ The TUI shows each option's description. RPC clients receive `select` and
54
+ `input` dialogs. Cancelling a question interrupts the run, like aborting it.
55
+ Without UI, the model takes the recommended choice and records the decision
56
+ under Assumptions.
57
+
58
+ A submitted plan contains the goal, specific changes and paths, verification
59
+ commands, and assumptions. Each submission replaces the complete draft and
60
+ increments its revision. Successful submission ends the run, including a mixed
61
+ tool-call batch; executable sibling calls are blocked. Queued user input is
62
+ preserved, not automatically run after submission.
63
+
64
+ The plan appears once in the transcript, in the submission's tool card. The TUI
65
+ then opens review below it, in the same picker as questions: Implement,
66
+ Implement in a fresh session, Keep planning, or Exit planning, plus **Revise the
67
+ plan**, which takes your feedback as the next planning message. Tab adds a note
68
+ to the highlighted choice; on an implement choice it is sent with the
69
+ approval, and on Keep planning it is sent as feedback. Escape keeps planning. Review does not open automatically on resume. Session replacement, tree navigation, or a new run cancels an open
70
+ picker. An action rechecks the shown revision before changing state.
71
+
72
+ RPC reports a submission notification; `/plan` opens its review selection.
73
+ JSON mode adds no extra output:
74
+ the submission tool-call events contain the Markdown.
75
+
76
+ ## Print mode
77
+
78
+ ```sh
79
+ knightcode -p --plan "Investigate the cache invalidation bug"
80
+ knightcode -p "/plan Investigate the cache invalidation bug"
81
+ knightcode --session <path-or-id> -p "/plan approve"
82
+ ```
83
+
84
+ A successful planning run prints exactly the submitted Markdown. There is no
85
+ automatic headless approval. Command-triggered planning and implementation wait
86
+ for the complete run before print mode exits. Notices and refusals use stderr,
87
+ not stdout.
88
+
89
+ Approval is saved before same-session implementation begins. If dispatch
90
+ fails, the approval remains saved. Fresh handoff seeds the approved draft in a
91
+ new session, preserves the selected model and reasoning level, and dispatches
92
+ the complete plan through the replacement session's input handlers. Cancelling
93
+ the switch leaves the original planning state untouched. The original
94
+ transcript remains resumable.
95
+
96
+ ## Persistence and configuration
97
+
98
+ Draft, mode, and approved revision follow the selected session branch. Exit and
99
+ approval retain the draft. Entering a new planning cycle clears approval while
100
+ retaining the previous draft; revisions continue on that branch. New sessions
101
+ start off. Resume, reload, fork, and tree navigation restore saved state rather
102
+ than reapplying `--plan`.
103
+
104
+ Planning activates `ask_user`, `submit_plan`, and any available `read`,
105
+ `grep`, `find`, and `ls` tools in one initialization checkpoint. The loadout is
106
+ kept after exit or approval. Later transitions append messages without rewriting
107
+ earlier instructions or changing the tool declarations.
108
+
109
+ `--tools` must allow both planning tools; `--exclude-tools` must not exclude
110
+ one, and `--no-tools` is incompatible. Codemode `only` mode with active codemode
111
+ is also incompatible because it hides the direct read tools. Use
112
+ `codemode.mode: "on"` instead. Entry refuses before changing state or tools.
113
+ Restoring incompatible or malformed planning state fails closed: startup or
114
+ reload reports an error and cannot make provider requests until corrected.
115
+ An incompatible tree target is cancelled before navigation.
116
+
117
+ Compaction appends a frozen recovery message containing the planning rules and
118
+ current draft, or the pinned approved plan. Overflow retries temporarily append
119
+ the same message at the request tail until it is persisted. Later revisions
120
+ never rewrite that recovery. See [Session File Format](session-format.md) for
121
+ the stored snapshots and messages.
@@ -0,0 +1,59 @@
1
+ # Prompt Templates
2
+
3
+ Prompt templates turn Markdown files into reusable `/` commands. Use one when you want to reuse the same prompt without adding executable behavior or a larger set of supporting instructions.
4
+
5
+ A template can accept arguments and appear in command completion. KnightCode can load templates from personal configuration, project configuration, an explicit path, or a KnightCode package. Project configuration loads only after project trust is granted.
6
+
7
+ ## Create a template
8
+
9
+ Create `~/.knightcode/agent/prompts/review.md`:
10
+
11
+ ```markdown
12
+ ---
13
+ description: Review staged git changes
14
+ argument-hint: "[focus]"
15
+ ---
16
+ Review the staged changes. Focus on ${1:-correctness, security, and error handling}.
17
+ ```
18
+
19
+ The filename becomes the command name, so this template is available as `/review`. The `description` appears in command completion. If it is omitted, KnightCode uses the first non-empty line.
20
+
21
+ `argument-hint` is optional. Use `<angle brackets>` for required arguments and `[square brackets]` for optional arguments.
22
+
23
+ Run `/reload` after adding or changing a template in an active session.
24
+
25
+ <a id="invoke-a-template"></a>
26
+
27
+ ## Use a template
28
+
29
+ Type the template command in the editor:
30
+
31
+ ```text
32
+ /review
33
+ /review concurrency
34
+ ```
35
+
36
+ KnightCode expands the template before the resulting text enters the agent. Extensions receive the raw input first through the `input` event unless an extension command with the same name handles it.
37
+
38
+ Templates support these substitutions:
39
+
40
+ | Syntax | Result |
41
+ |---|---|
42
+ | `$1`, `$2`, … | One positional argument |
43
+ | `$@` or `$ARGUMENTS` | All arguments joined with spaces |
44
+ | `${1:-default}` | First argument, or a default value |
45
+ | `${@:-default}` | All arguments, or a default value |
46
+ | `${@:N}` | Arguments starting at position `N` |
47
+ | `${@:N:L}` | `L` arguments starting at position `N` |
48
+
49
+ Arguments follow shell-like quoting, so `/review "API compatibility"` supplies one argument containing a space.
50
+
51
+ <a id="choose-where-it-loads"></a>
52
+
53
+ ## Add it to KnightCode
54
+
55
+ Place the template in your user or project prompt directory. Conventional prompt directories load direct `.md` children only.
56
+
57
+ Settings and packages can select nested Markdown files; a package manifest can narrow discovery with explicit paths and globs. See [Settings](settings.md#resources) and [KnightCode Packages](packages.md) for these options.
58
+
59
+ Project templates become commands in the editor after trust is granted. Review their content before trusting an unfamiliar project. See [Security](security.md#understand-project-trust).