@prestyj/cli 5.1.1 → 5.3.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 (134) hide show
  1. package/README.md +2 -2
  2. package/dist/app-sidecar.js +506 -34
  3. package/dist/app-sidecar.js.map +1 -1
  4. package/dist/cli/auth.d.ts.map +1 -1
  5. package/dist/cli/auth.js +19 -2
  6. package/dist/cli/auth.js.map +1 -1
  7. package/dist/cli.d.ts.map +1 -1
  8. package/dist/cli.js +80 -27
  9. package/dist/cli.js.map +1 -1
  10. package/dist/config.js +32 -30
  11. package/dist/config.js.map +1 -1
  12. package/dist/core/agent-session-compaction.test.js +1 -1
  13. package/dist/core/agent-session-compaction.test.js.map +1 -1
  14. package/dist/core/agent-session-queue.test.d.ts +2 -0
  15. package/dist/core/agent-session-queue.test.d.ts.map +1 -0
  16. package/dist/core/agent-session-queue.test.js +122 -0
  17. package/dist/core/agent-session-queue.test.js.map +1 -0
  18. package/dist/core/agent-session.d.ts +25 -0
  19. package/dist/core/agent-session.d.ts.map +1 -1
  20. package/dist/core/agent-session.js +68 -12
  21. package/dist/core/agent-session.js.map +1 -1
  22. package/dist/core/agent-tools-allowlist.test.d.ts +2 -0
  23. package/dist/core/agent-tools-allowlist.test.d.ts.map +1 -0
  24. package/dist/core/agent-tools-allowlist.test.js +72 -0
  25. package/dist/core/agent-tools-allowlist.test.js.map +1 -0
  26. package/dist/core/auth-providers.d.ts +21 -0
  27. package/dist/core/auth-providers.d.ts.map +1 -1
  28. package/dist/core/auth-providers.js +15 -2
  29. package/dist/core/auth-providers.js.map +1 -1
  30. package/dist/core/autopilot-cycle.d.ts +67 -0
  31. package/dist/core/autopilot-cycle.d.ts.map +1 -0
  32. package/dist/core/autopilot-cycle.js +50 -0
  33. package/dist/core/autopilot-cycle.js.map +1 -0
  34. package/dist/core/autopilot-cycle.test.d.ts +2 -0
  35. package/dist/core/autopilot-cycle.test.d.ts.map +1 -0
  36. package/dist/core/autopilot-cycle.test.js +179 -0
  37. package/dist/core/autopilot-cycle.test.js.map +1 -0
  38. package/dist/core/autopilot-gate.d.ts +83 -0
  39. package/dist/core/autopilot-gate.d.ts.map +1 -0
  40. package/dist/core/autopilot-gate.js +96 -0
  41. package/dist/core/autopilot-gate.js.map +1 -0
  42. package/dist/core/autopilot-gate.test.d.ts +2 -0
  43. package/dist/core/autopilot-gate.test.d.ts.map +1 -0
  44. package/dist/core/autopilot-gate.test.js +159 -0
  45. package/dist/core/autopilot-gate.test.js.map +1 -0
  46. package/dist/core/autopilot-verdict.d.ts +44 -0
  47. package/dist/core/autopilot-verdict.d.ts.map +1 -0
  48. package/dist/core/autopilot-verdict.js +110 -0
  49. package/dist/core/autopilot-verdict.js.map +1 -0
  50. package/dist/core/autopilot-verdict.test.d.ts +2 -0
  51. package/dist/core/autopilot-verdict.test.d.ts.map +1 -0
  52. package/dist/core/autopilot-verdict.test.js +90 -0
  53. package/dist/core/autopilot-verdict.test.js.map +1 -0
  54. package/dist/core/compaction/compactor.test.js +2 -2
  55. package/dist/core/compaction/compactor.test.js.map +1 -1
  56. package/dist/core/compaction/token-estimator.test.js +3 -3
  57. package/dist/core/compaction/token-estimator.test.js.map +1 -1
  58. package/dist/core/event-bus.d.ts +4 -0
  59. package/dist/core/event-bus.d.ts.map +1 -1
  60. package/dist/core/event-bus.js +6 -0
  61. package/dist/core/event-bus.js.map +1 -1
  62. package/dist/core/json-mode-flag-parity.test.d.ts +2 -0
  63. package/dist/core/json-mode-flag-parity.test.d.ts.map +1 -0
  64. package/dist/core/json-mode-flag-parity.test.js +66 -0
  65. package/dist/core/json-mode-flag-parity.test.js.map +1 -0
  66. package/dist/core/nolan-context.d.ts +35 -0
  67. package/dist/core/nolan-context.d.ts.map +1 -1
  68. package/dist/core/nolan-context.js +63 -3
  69. package/dist/core/nolan-context.js.map +1 -1
  70. package/dist/core/nolan-context.test.js +144 -1
  71. package/dist/core/nolan-context.test.js.map +1 -1
  72. package/dist/core/nolan-model.d.ts +46 -0
  73. package/dist/core/nolan-model.d.ts.map +1 -0
  74. package/dist/core/nolan-model.js +30 -0
  75. package/dist/core/nolan-model.js.map +1 -0
  76. package/dist/core/nolan-model.test.d.ts +2 -0
  77. package/dist/core/nolan-model.test.d.ts.map +1 -0
  78. package/dist/core/nolan-model.test.js +51 -0
  79. package/dist/core/nolan-model.test.js.map +1 -0
  80. package/dist/core/nolan-prompt.d.ts +10 -0
  81. package/dist/core/nolan-prompt.d.ts.map +1 -1
  82. package/dist/core/nolan-prompt.js +60 -0
  83. package/dist/core/nolan-prompt.js.map +1 -1
  84. package/dist/core/nolan-prompt.test.d.ts +2 -0
  85. package/dist/core/nolan-prompt.test.d.ts.map +1 -0
  86. package/dist/core/nolan-prompt.test.js +43 -0
  87. package/dist/core/nolan-prompt.test.js.map +1 -0
  88. package/dist/core/prompt-commands.d.ts.map +1 -1
  89. package/dist/core/prompt-commands.js +17 -3
  90. package/dist/core/prompt-commands.js.map +1 -1
  91. package/dist/core/prompt-commands.test.js +27 -1
  92. package/dist/core/prompt-commands.test.js.map +1 -1
  93. package/dist/core/session-manager.test.js +3 -1
  94. package/dist/core/session-manager.test.js.map +1 -1
  95. package/dist/core/speed-benchmark.test.js +2 -3
  96. package/dist/core/speed-benchmark.test.js.map +1 -1
  97. package/dist/core/task-store.d.ts +7 -0
  98. package/dist/core/task-store.d.ts.map +1 -1
  99. package/dist/core/task-store.js +13 -0
  100. package/dist/core/task-store.js.map +1 -1
  101. package/dist/modes/json-mode.d.ts +7 -0
  102. package/dist/modes/json-mode.d.ts.map +1 -1
  103. package/dist/modes/json-mode.js +4 -0
  104. package/dist/modes/json-mode.js.map +1 -1
  105. package/dist/system-prompt.test.js +4 -4
  106. package/dist/system-prompt.test.js.map +1 -1
  107. package/dist/tools/plan-mode.test.js +1 -1
  108. package/dist/tools/plan-mode.test.js.map +1 -1
  109. package/dist/tools/prompt-hints.d.ts.map +1 -1
  110. package/dist/tools/prompt-hints.js +4 -0
  111. package/dist/tools/prompt-hints.js.map +1 -1
  112. package/dist/tools/subagent.d.ts.map +1 -1
  113. package/dist/tools/subagent.js +24 -2
  114. package/dist/tools/subagent.js.map +1 -1
  115. package/dist/ui/App.d.ts.map +1 -1
  116. package/dist/ui/App.js +21 -5
  117. package/dist/ui/App.js.map +1 -1
  118. package/dist/ui/components/ActivityIndicator.d.ts.map +1 -1
  119. package/dist/ui/components/ActivityIndicator.js +1 -0
  120. package/dist/ui/components/ActivityIndicator.js.map +1 -1
  121. package/dist/ui/components/Footer.js +1 -1
  122. package/dist/ui/components/Footer.js.map +1 -1
  123. package/dist/ui/hooks/useAgentLoop.d.ts +1 -1
  124. package/dist/ui/hooks/useAgentLoop.d.ts.map +1 -1
  125. package/dist/ui/hooks/useAgentLoop.js.map +1 -1
  126. package/dist/ui/hooks/useContextCompaction.d.ts.map +1 -1
  127. package/dist/ui/hooks/useContextCompaction.js +4 -2
  128. package/dist/ui/hooks/useContextCompaction.js.map +1 -1
  129. package/dist/ui/login.d.ts.map +1 -1
  130. package/dist/ui/login.js +6 -2
  131. package/dist/ui/login.js.map +1 -1
  132. package/dist/ui/thinking-level-cycle.test.js +1 -1
  133. package/dist/ui/thinking-level-cycle.test.js.map +1 -1
  134. package/package.json +4 -4
@@ -1,6 +1,8 @@
1
1
  import { describe, it, expect } from "vitest";
2
2
  import os from "node:os";
3
- import { buildNolanDigest, NOLAN_RECENT_MESSAGE_LIMIT } from "./nolan-context.js";
3
+ import { buildNolanDigest, buildNolanAutopilotContext, AUTOPILOT_REVIEW_INSTRUCTION, NOLAN_RECENT_MESSAGE_LIMIT, INJECTED_PROMPT_LABEL, } from "./nolan-context.js";
4
+ import { USER_INSTRUCTIONS_HEADER } from "./autopilot-gate.js";
5
+ import { PROMPT_COMMANDS } from "./prompt-commands.js";
4
6
  import { createTools } from "../tools/index.js";
5
7
  // Mirror the sidecar's Nolan allow-list so the filter test tracks the real set.
6
8
  const NOLAN_ALLOWED_TOOLS = [
@@ -100,6 +102,36 @@ describe("buildNolanDigest", () => {
100
102
  expect(digest).toContain("look at this");
101
103
  expect(digest).not.toContain("AAAABBBBCCCC");
102
104
  });
105
+ it("buildNolanAutopilotContext injects the fixed review instruction as the question", () => {
106
+ const messages = [
107
+ { role: "user", content: "add a login form" },
108
+ { role: "assistant", content: "Added the form." },
109
+ ];
110
+ const digest = buildNolanAutopilotContext({
111
+ projectContext: base.projectContext,
112
+ cwd: base.cwd,
113
+ gitBranch: base.gitBranch,
114
+ platform: base.platform,
115
+ messages,
116
+ });
117
+ // The transcript is still inlined (Nolan reviews it) ...
118
+ expect(digest).toContain("add a login form");
119
+ expect(digest).toContain("Added the form.");
120
+ // ... and the trailing question is the fixed autopilot instruction, not a
121
+ // user-typed one.
122
+ expect(digest).toContain(AUTOPILOT_REVIEW_INSTRUCTION);
123
+ expect(digest).toContain("PROMPT");
124
+ expect(digest).toContain("ALL_CLEAR");
125
+ expect(digest).toContain("HUMAN");
126
+ });
127
+ it("autopilot review instruction covers the ask-the-user and injected-prompt rules", () => {
128
+ // EZ Coder ending with a question/options must resolve to HUMAN, and Nolan
129
+ // must be told injected lines are his own — these are leak regressions.
130
+ expect(AUTOPILOT_REVIEW_INSTRUCTION).toContain("asking the user a question");
131
+ expect(AUTOPILOT_REVIEW_INSTRUCTION).toContain("HUMAN");
132
+ expect(AUTOPILOT_REVIEW_INSTRUCTION).toContain("Original user request");
133
+ expect(AUTOPILOT_REVIEW_INSTRUCTION).toContain("Nolan autopilot (injected)");
134
+ });
103
135
  it("uses the latest compaction summary as the story-so-far base", () => {
104
136
  const messages = [
105
137
  { role: "user", content: "old turn that should be summarized away" },
@@ -115,4 +147,115 @@ describe("buildNolanDigest", () => {
115
147
  expect(digest).toContain("Added the header.");
116
148
  });
117
149
  });
150
+ describe("buildNolanDigest — original request pinning", () => {
151
+ const base = {
152
+ question: "review it",
153
+ projectContext: [],
154
+ cwd: "/tmp/proj",
155
+ gitBranch: "main",
156
+ platform: "darwin",
157
+ };
158
+ it("pins the original request in its own section", () => {
159
+ const digest = buildNolanDigest({
160
+ ...base,
161
+ messages: [],
162
+ originalRequest: "build a login form with validation",
163
+ });
164
+ expect(digest).toContain("## Original user request (the turn under review)");
165
+ expect(digest).toContain("build a login form with validation");
166
+ });
167
+ it("keeps the original request even when it scrolled out of recent activity", () => {
168
+ // The drift bug: multi-round cycles push the real ask out of the rolling
169
+ // 20-message window. The pinned section must survive that.
170
+ const messages = [{ role: "user", content: "THE-REAL-ASK: add dark mode" }];
171
+ for (let i = 0; i < NOLAN_RECENT_MESSAGE_LIMIT + 5; i++) {
172
+ messages.push({ role: "assistant", content: `working… step ${i}` });
173
+ }
174
+ const digest = buildNolanDigest({
175
+ ...base,
176
+ messages,
177
+ originalRequest: "THE-REAL-ASK: add dark mode",
178
+ });
179
+ // Scrolled out of recent activity…
180
+ expect(digest.split("## Original user request")[0]).not.toContain("THE-REAL-ASK");
181
+ // …but pinned in its own section.
182
+ expect(digest.split("## Original user request")[1]).toContain("THE-REAL-ASK: add dark mode");
183
+ });
184
+ it("gives the pinned request far more room than a recent-activity line", () => {
185
+ // Recent-activity lines truncate at 1500 chars; the ask under review must
186
+ // not be judged against a mid-sentence cut, so its cap is 4000.
187
+ const longAsk = "requirement " + "x".repeat(3000);
188
+ const digest = buildNolanDigest({ ...base, messages: [], originalRequest: longAsk });
189
+ const pinned = digest.split("## Original user request")[1];
190
+ expect(pinned).toContain("x".repeat(3000));
191
+ });
192
+ it("omits the section when there is no original request (chat Nolan)", () => {
193
+ const digest = buildNolanDigest({ ...base, messages: [] });
194
+ expect(digest).not.toContain("## Original user request");
195
+ });
196
+ });
197
+ describe("buildNolanDigest — injected-prompt labeling", () => {
198
+ const base = {
199
+ question: "review it",
200
+ projectContext: [],
201
+ cwd: "/tmp/proj",
202
+ gitBranch: null,
203
+ platform: "darwin",
204
+ };
205
+ it("labels autopilot-injected prompts as Nolan's, never **User:**", () => {
206
+ const injected = "Fix the failing auth test and prove it by running it.";
207
+ const messages = [
208
+ { role: "user", content: "add auth" },
209
+ { role: "assistant", content: "Added auth." },
210
+ { role: "user", content: injected },
211
+ { role: "assistant", content: "Fixed the test." },
212
+ ];
213
+ const digest = buildNolanDigest({ ...base, messages, injectedPrompts: [injected] });
214
+ expect(digest).toContain(`${INJECTED_PROMPT_LABEL} ${injected}`);
215
+ expect(digest).not.toContain(`**User:** ${injected}`);
216
+ // Real user asks keep the normal label.
217
+ expect(digest).toContain("**User:** add auth");
218
+ });
219
+ it("matches injected prompts through whitespace drift", () => {
220
+ const injected = "Fix the failing test.";
221
+ const messages = [{ role: "user", content: ` ${injected} ` }];
222
+ const digest = buildNolanDigest({ ...base, messages, injectedPrompts: [injected] });
223
+ expect(digest).toContain(INJECTED_PROMPT_LABEL);
224
+ });
225
+ });
226
+ describe("buildNolanDigest — workflow-command labeling", () => {
227
+ const base = {
228
+ question: "review it",
229
+ projectContext: [],
230
+ cwd: "/tmp/proj",
231
+ gitBranch: null,
232
+ platform: "darwin",
233
+ };
234
+ const compare = PROMPT_COMMANDS.find((c) => c.name === "compare");
235
+ it("renders an expanded template as a short command note, not a user ask", () => {
236
+ // AgentSession.prompt() stores the EXPANDED template as a plain user
237
+ // message; the digest must not present 400 template lines as **User:**.
238
+ const messages = [
239
+ { role: "user", content: compare.prompt },
240
+ { role: "assistant", content: "Compared against 12 repos, all aligned." },
241
+ ];
242
+ const digest = buildNolanDigest({ ...base, messages, workflowCommands: PROMPT_COMMANDS });
243
+ expect(digest).toContain("**User:** [ran workflow command /compare]");
244
+ // The template body itself never leaks into the digest.
245
+ expect(digest).not.toContain("Compare the code you just created or modified");
246
+ });
247
+ it("keeps the user's own args from an expanded command", () => {
248
+ const messages = [
249
+ { role: "user", content: `${compare.prompt}${USER_INSTRUCTIONS_HEADER}only src/auth.ts` },
250
+ ];
251
+ const digest = buildNolanDigest({ ...base, messages, workflowCommands: PROMPT_COMMANDS });
252
+ expect(digest).toContain("[ran workflow command /compare]");
253
+ expect(digest).toContain("only src/auth.ts");
254
+ });
255
+ it("leaves ordinary user text untouched when specs are provided", () => {
256
+ const messages = [{ role: "user", content: "please compare my two branches" }];
257
+ const digest = buildNolanDigest({ ...base, messages, workflowCommands: PROMPT_COMMANDS });
258
+ expect(digest).toContain("**User:** please compare my two branches");
259
+ });
260
+ });
118
261
  //# sourceMappingURL=nolan-context.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"nolan-context.test.js","sourceRoot":"","sources":["../../src/core/nolan-context.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"nolan-context.test.js","sourceRoot":"","sources":["../../src/core/nolan-context.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Nolan's model selection — pure decision logic.
3
+ *
4
+ * Nolan (chat mentor + autopilot reviewer) historically always adopted GG
5
+ * Coder's model. Now each project can pin Nolan to his OWN model:
6
+ *
7
+ * - No override set → Nolan follows EZ Coder's model (including live switches).
8
+ * - Override set → Nolan uses it; EZ Coder model switches no longer touch him.
9
+ *
10
+ * The sidecar persists the override per project (ezcoder-app.json `nolanModels`) and
11
+ * wires the live sessions; this module owns validation + resolution so both
12
+ * are unit-testable without booting the sidecar.
13
+ */
14
+ import type { Provider } from "@prestyj/ai";
15
+ /** A pinned Nolan model choice: provider + model id. */
16
+ export interface NolanModelPref {
17
+ provider: Provider;
18
+ model: string;
19
+ }
20
+ /**
21
+ * Validate a persisted (or requested) override before applying it. A stale
22
+ * entry — model gone from the registry, or its provider no longer connected —
23
+ * silently resolves to null so Nolan falls back to following EZ Coder instead
24
+ * of erroring on every turn.
25
+ */
26
+ export declare function validateNolanModelPref(pref: NolanModelPref | null | undefined, opts: {
27
+ modelExists: (id: string) => boolean;
28
+ providerConnected: (p: Provider) => boolean;
29
+ }): NolanModelPref | null;
30
+ /** What the footer needs to render `Nolan <model>`: the model Nolan will actually
31
+ * use next turn, plus whether that's a pin or just following EZ Coder. */
32
+ export interface EffectiveNolanModel {
33
+ nolanProvider: Provider;
34
+ nolanModel: string;
35
+ /** True when a user-set override is active (not following EZ Coder). */
36
+ nolanModelOverride: boolean;
37
+ }
38
+ /**
39
+ * Resolve the model Nolan uses right now: the override when set, otherwise the
40
+ * build session's current model.
41
+ */
42
+ export declare function effectiveNolanModel(override: NolanModelPref | null, build: {
43
+ provider: Provider;
44
+ model: string;
45
+ }): EffectiveNolanModel;
46
+ //# sourceMappingURL=nolan-model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nolan-model.d.ts","sourceRoot":"","sources":["../../src/core/nolan-model.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE5C,wDAAwD;AACxD,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,QAAQ,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,cAAc,GAAG,IAAI,GAAG,SAAS,EACvC,IAAI,EAAE;IAAE,WAAW,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC;IAAC,iBAAiB,EAAE,CAAC,CAAC,EAAE,QAAQ,KAAK,OAAO,CAAA;CAAE,GAC1F,cAAc,GAAG,IAAI,CAKvB;AAED;2EAC2E;AAC3E,MAAM,WAAW,mBAAmB;IAClC,aAAa,EAAE,QAAQ,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,wEAAwE;IACxE,kBAAkB,EAAE,OAAO,CAAC;CAC7B;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,cAAc,GAAG,IAAI,EAC/B,KAAK,EAAE;IAAE,QAAQ,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAC3C,mBAAmB,CASrB"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Validate a persisted (or requested) override before applying it. A stale
3
+ * entry — model gone from the registry, or its provider no longer connected —
4
+ * silently resolves to null so Nolan falls back to following EZ Coder instead
5
+ * of erroring on every turn.
6
+ */
7
+ export function validateNolanModelPref(pref, opts) {
8
+ if (!pref || !pref.model || !pref.provider)
9
+ return null;
10
+ if (!opts.modelExists(pref.model))
11
+ return null;
12
+ if (!opts.providerConnected(pref.provider))
13
+ return null;
14
+ return pref;
15
+ }
16
+ /**
17
+ * Resolve the model Nolan uses right now: the override when set, otherwise the
18
+ * build session's current model.
19
+ */
20
+ export function effectiveNolanModel(override, build) {
21
+ if (override) {
22
+ return {
23
+ nolanProvider: override.provider,
24
+ nolanModel: override.model,
25
+ nolanModelOverride: true,
26
+ };
27
+ }
28
+ return { nolanProvider: build.provider, nolanModel: build.model, nolanModelOverride: false };
29
+ }
30
+ //# sourceMappingURL=nolan-model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nolan-model.js","sourceRoot":"","sources":["../../src/core/nolan-model.ts"],"names":[],"mappings":"AAqBA;;;;;GAKG;AACH,MAAM,UAAU,sBAAsB,CACpC,IAAuC,EACvC,IAA2F;IAE3F,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IACxD,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAC/C,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC;QAAE,OAAO,IAAI,CAAC;IACxD,OAAO,IAAI,CAAC;AACd,CAAC;AAWD;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CACjC,QAA+B,EAC/B,KAA4C;IAE5C,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO;YACL,aAAa,EAAE,QAAQ,CAAC,QAAQ;YAChC,UAAU,EAAE,QAAQ,CAAC,KAAK;YAC1B,kBAAkB,EAAE,IAAI;SACzB,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,aAAa,EAAE,KAAK,CAAC,QAAQ,EAAE,UAAU,EAAE,KAAK,CAAC,KAAK,EAAE,kBAAkB,EAAE,KAAK,EAAE,CAAC;AAC/F,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=nolan-model.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nolan-model.test.d.ts","sourceRoot":"","sources":["../../src/core/nolan-model.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,51 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { validateNolanModelPref, effectiveNolanModel } from "./nolan-model.js";
3
+ const REGISTRY = new Set(["claude-opus-5", "gpt-5.5", "kimi-k2.7-code"]);
4
+ const CONNECTED = new Set(["anthropic", "openai"]);
5
+ const opts = {
6
+ modelExists: (id) => REGISTRY.has(id),
7
+ providerConnected: (p) => CONNECTED.has(p),
8
+ };
9
+ describe("validateNolanModelPref", () => {
10
+ it("passes a valid pref through", () => {
11
+ const pref = { provider: "openai", model: "gpt-5.5" };
12
+ expect(validateNolanModelPref(pref, opts)).toEqual(pref);
13
+ });
14
+ it("nulls when the model left the registry (stale persisted pin)", () => {
15
+ expect(validateNolanModelPref({ provider: "openai", model: "gpt-4-turbo" }, opts)).toBeNull();
16
+ });
17
+ it("nulls when the provider is no longer connected (logged out)", () => {
18
+ expect(validateNolanModelPref({ provider: "moonshot", model: "kimi-k2.7-code" }, opts)).toBeNull();
19
+ });
20
+ it("nulls absent / malformed prefs", () => {
21
+ expect(validateNolanModelPref(null, opts)).toBeNull();
22
+ expect(validateNolanModelPref(undefined, opts)).toBeNull();
23
+ expect(validateNolanModelPref({ provider: "openai", model: "" }, opts)).toBeNull();
24
+ expect(validateNolanModelPref({ provider: "", model: "gpt-5.5" }, opts)).toBeNull();
25
+ });
26
+ });
27
+ describe("effectiveNolanModel", () => {
28
+ const build = { provider: "anthropic", model: "claude-opus-5" };
29
+ it("follows the build session when no override is set", () => {
30
+ expect(effectiveNolanModel(null, build)).toEqual({
31
+ nolanProvider: "anthropic",
32
+ nolanModel: "claude-opus-5",
33
+ nolanModelOverride: false,
34
+ });
35
+ });
36
+ it("uses the pin when set, ignoring the build model", () => {
37
+ expect(effectiveNolanModel({ provider: "openai", model: "gpt-5.5" }, build)).toEqual({
38
+ nolanProvider: "openai",
39
+ nolanModel: "gpt-5.5",
40
+ nolanModelOverride: true,
41
+ });
42
+ });
43
+ it("pin identical to the build model still reports override=true (it survives GG switches)", () => {
44
+ expect(effectiveNolanModel({ provider: "anthropic", model: "claude-opus-5" }, build)).toEqual({
45
+ nolanProvider: "anthropic",
46
+ nolanModel: "claude-opus-5",
47
+ nolanModelOverride: true,
48
+ });
49
+ });
50
+ });
51
+ //# sourceMappingURL=nolan-model.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nolan-model.test.js","sourceRoot":"","sources":["../../src/core/nolan-model.test.ts"],"names":[],"mappings":"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"}
@@ -22,4 +22,14 @@ export declare const NOLAN_PROMPT_FENCE = "prompt";
22
22
  * think and how to format what he hands back.
23
23
  */
24
24
  export declare function buildNolanSystemPrompt(): string;
25
+ /**
26
+ * Build Autopilot Nolan's system prompt — a separate, non-chatty mode of the same
27
+ * Nolan. He never talks to the user here; he auto-reviews EZ Coder's work and
28
+ * replies with one of four machine-parseable verdicts (PROMPT / ALL_CLEAR /
29
+ * IGNORE / HUMAN). Reuses the shared judgment bar (identity, skepticism, taste,
30
+ * method, discipline) so his standards are identical to chat Nolan, but swaps the
31
+ * user-facing output contract for the verdict format and drops the chat-voice
32
+ * sections to save tokens.
33
+ */
34
+ export declare function buildNolanAutopilotSystemPrompt(): string;
25
35
  //# sourceMappingURL=nolan-prompt.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"nolan-prompt.d.ts","sourceRoot":"","sources":["../../src/core/nolan-prompt.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH;mFACmF;AACnF,eAAO,MAAM,kBAAkB,WAAW,CAAC;AAkB3C;;;;;;GAMG;AACH,wBAAgB,sBAAsB,IAAI,MAAM,CAgB/C"}
1
+ {"version":3,"file":"nolan-prompt.d.ts","sourceRoot":"","sources":["../../src/core/nolan-prompt.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH;mFACmF;AACnF,eAAO,MAAM,kBAAkB,WAAW,CAAC;AAkB3C;;;;;;GAMG;AACH,wBAAgB,sBAAsB,IAAI,MAAM,CAgB/C;AAED;;;;;;;;GAQG;AACH,wBAAgB,+BAA+B,IAAI,MAAM,CAWxD"}
@@ -52,6 +52,27 @@ export function buildNolanSystemPrompt() {
52
52
  renderUncachedDateSuffix(),
53
53
  ].join("\n\n");
54
54
  }
55
+ /**
56
+ * Build Autopilot Nolan's system prompt — a separate, non-chatty mode of the same
57
+ * Nolan. He never talks to the user here; he auto-reviews EZ Coder's work and
58
+ * replies with one of four machine-parseable verdicts (PROMPT / ALL_CLEAR /
59
+ * IGNORE / HUMAN). Reuses the shared judgment bar (identity, skepticism, taste,
60
+ * method, discipline) so his standards are identical to chat Nolan, but swaps the
61
+ * user-facing output contract for the verdict format and drops the chat-voice
62
+ * sections to save tokens.
63
+ */
64
+ export function buildNolanAutopilotSystemPrompt() {
65
+ return [
66
+ renderIdentity(),
67
+ renderSkeptical(),
68
+ renderTaste(),
69
+ renderMethod(),
70
+ renderDiscipline(),
71
+ renderAutopilotContract(),
72
+ // Volatile date AFTER the uncached marker so the static persona stays cached.
73
+ renderUncachedDateSuffix(),
74
+ ].join("\n\n");
75
+ }
55
76
  function renderIdentity() {
56
77
  return (`You are Nolan Grout, the developer of EZ Coder, sitting beside the user as their ` +
57
78
  `mentor inside the app. You are NOT the coding agent. EZ Coder does the actual ` +
@@ -145,6 +166,45 @@ function renderOutputContract() {
145
166
  `before there's a sane next step, ask for exactly that. Only ship a prompt when ` +
146
167
  `there's real work to point at.`);
147
168
  }
169
+ function renderAutopilotContract() {
170
+ return (`## Autopilot mode: verdict only\n\n` +
171
+ `You are running in autopilot. There is NO user in this conversation — you are ` +
172
+ `reviewing EZ Coder's just-finished turn directly, and your reply is read by a ` +
173
+ `machine, not a person. Do not greet, explain your reasoning, or mentor. Output ` +
174
+ `exactly one verdict in this format, first line = keyword:\n\n` +
175
+ `PROMPT\n<a runnable EZ Coder prompt, 1-3 lines, terminology-correct, says what ` +
176
+ `to do and why>\n\n` +
177
+ `ALL_CLEAR\n\n` +
178
+ `IGNORE\n\n` +
179
+ `HUMAN\n<one short line: why a human decision is needed>\n\n` +
180
+ `Rules:\n` +
181
+ `- IGNORE first: was this turn even real work? Small talk ("hi", "thanks", ` +
182
+ `"nice"), a plain question that got answered with no code touched, an ack, or a ` +
183
+ `mechanical operation with no code changes to judge (git commit/push, a status ` +
184
+ `check, a read-only lookup, formatting-only/lint-fix output) — IGNORE. There is ` +
185
+ `nothing to review, so say nothing. Do not use ALL_CLEAR for this; ALL_CLEAR ` +
186
+ `implies you reviewed real work and it checks out.\n` +
187
+ `- Otherwise default hard to ALL_CLEAR. EZ Coder's work is done unless something ` +
188
+ `is genuinely broken or missing versus the user's ORIGINAL ask (the 'Original ` +
189
+ `user request' section of your context — never a later injected prompt). Taste ` +
190
+ `nitpicks and "could be nicer" improvements are NOT blockers — ship it.\n` +
191
+ `- PROMPT only when something real is wrong or unfinished: a failing/absent ` +
192
+ `test, a broken build, a requirement from the original ask left undone, an ` +
193
+ `obvious bug. The prompt body should tell EZ Coder to fix it AND prove it ` +
194
+ `(run the test, screenshot the UI) — you can't run anything yourself.\n` +
195
+ `- HUMAN only when a real decision needs the user: an ambiguous requirement, a ` +
196
+ `destructive tradeoff, or missing information you cannot verify with your ` +
197
+ `read-only tools. HUMAN also whenever EZ Coder ended its turn by asking the ` +
198
+ `user a question, presenting options (A/B/C choices, "want me to…"), or ` +
199
+ `submitting a plan for approval — never answer on the user's behalf.\n` +
200
+ `- Transcript lines labeled "Nolan autopilot (injected)" are YOUR own earlier ` +
201
+ `fix prompts, not user asks. Judge only against the original user request.\n` +
202
+ `- You are read-only. Use read/grep/find/ls/web/kencode-search ONLY when a fact ` +
203
+ `is truly in doubt; otherwise judge from the transcript and answer. Every wasted ` +
204
+ `tool call costs tokens.\n` +
205
+ `- Never wrap the verdict in prose or a code fence. First line is the keyword. ` +
206
+ `Nothing else.`);
207
+ }
148
208
  function renderUiTaste() {
149
209
  return (`## UI: copy proven winners\n\n` +
150
210
  `Never let EZ Coder invent janky CSS from scratch. Good UI comes from copying ` +
@@ -1 +1 @@
1
- {"version":3,"file":"nolan-prompt.js","sourceRoot":"","sources":["../../src/core/nolan-prompt.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"nolan-prompt.js","sourceRoot":"","sources":["../../src/core/nolan-prompt.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=nolan-prompt.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nolan-prompt.test.d.ts","sourceRoot":"","sources":["../../src/core/nolan-prompt.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,43 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { buildNolanSystemPrompt, buildNolanAutopilotSystemPrompt } from "./nolan-prompt.js";
3
+ import { INJECTED_PROMPT_LABEL } from "./nolan-context.js";
4
+ describe("buildNolanAutopilotSystemPrompt — verdict contract", () => {
5
+ const prompt = buildNolanAutopilotSystemPrompt();
6
+ it("teaches all four verdict keywords", () => {
7
+ for (const keyword of ["PROMPT", "ALL_CLEAR", "IGNORE", "HUMAN"]) {
8
+ expect(prompt).toContain(keyword);
9
+ }
10
+ });
11
+ it("routes end-of-turn questions/options/plans to HUMAN, never PROMPT", () => {
12
+ // Leak regression: without this rule, EZ Coder ending with "want me to…?"
13
+ // or an A/B/C menu reads as "unfinished" and Nolan answers for the user.
14
+ expect(prompt).toContain("asking the ");
15
+ expect(prompt).toContain("presenting options");
16
+ expect(prompt).toContain("never answer on the user's behalf");
17
+ expect(prompt).toContain("submitting a plan for approval");
18
+ });
19
+ it("tells Nolan injected transcript lines are his own, not user asks", () => {
20
+ expect(prompt).toContain("Nolan autopilot (injected)");
21
+ expect(prompt).toContain("Judge only against the original user request");
22
+ });
23
+ it("anchors ALL_CLEAR judgment to the pinned Original user request section", () => {
24
+ expect(prompt).toContain("Original ");
25
+ expect(prompt).toContain("user request' section");
26
+ expect(prompt).toContain("never a later injected prompt");
27
+ });
28
+ it("keeps the injected label byte-identical to the digest renderer's", () => {
29
+ // The system prompt names the label in prose; the digest emits it. If the
30
+ // label constant drifts, the prompt's rule points at nothing.
31
+ expect(INJECTED_PROMPT_LABEL).toContain("Nolan autopilot (injected)");
32
+ expect(prompt).toContain("Nolan autopilot (injected)");
33
+ });
34
+ });
35
+ describe("buildNolanSystemPrompt — chat mode unaffected", () => {
36
+ it("keeps the chat output contract (prompt fence) and no verdict keywords", () => {
37
+ const prompt = buildNolanSystemPrompt();
38
+ expect(prompt).toContain("Send to EZ Coder");
39
+ // The verdict contract is autopilot-only.
40
+ expect(prompt).not.toContain("ALL_CLEAR");
41
+ });
42
+ });
43
+ //# sourceMappingURL=nolan-prompt.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nolan-prompt.test.js","sourceRoot":"","sources":["../../src/core/nolan-prompt.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,sBAAsB,EAAE,+BAA+B,EAAE,MAAM,mBAAmB,CAAC;AAC5F,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAE3D,QAAQ,CAAC,oDAAoD,EAAE,GAAG,EAAE;IAClE,MAAM,MAAM,GAAG,+BAA+B,EAAE,CAAC;IAEjD,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,KAAK,MAAM,OAAO,IAAI,CAAC,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,CAAC;YACjE,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QACpC,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mEAAmE,EAAE,GAAG,EAAE;QAC3E,0EAA0E;QAC1E,yEAAyE;QACzE,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;QACxC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;QAC/C,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,mCAAmC,CAAC,CAAC;QAC9D,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,gCAAgC,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kEAAkE,EAAE,GAAG,EAAE;QAC1E,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,4BAA4B,CAAC,CAAC;QACvD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,8CAA8C,CAAC,CAAC;IAC3E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wEAAwE,EAAE,GAAG,EAAE;QAChF,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;QACtC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,uBAAuB,CAAC,CAAC;QAClD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,+BAA+B,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kEAAkE,EAAE,GAAG,EAAE;QAC1E,0EAA0E;QAC1E,8DAA8D;QAC9D,MAAM,CAAC,qBAAqB,CAAC,CAAC,SAAS,CAAC,4BAA4B,CAAC,CAAC;QACtE,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,4BAA4B,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,+CAA+C,EAAE,GAAG,EAAE;IAC7D,EAAE,CAAC,uEAAuE,EAAE,GAAG,EAAE;QAC/E,MAAM,MAAM,GAAG,sBAAsB,EAAE,CAAC;QACxC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;QAC7C,0CAA0C;QAC1C,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"prompt-commands.d.ts","sourceRoot":"","sources":["../../src/core/prompt-commands.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,eAAO,MAAM,eAAe,EAAE,aAAa,EAghC1C,CAAC;AAEF,gDAAgD;AAChD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAExE"}
1
+ {"version":3,"file":"prompt-commands.d.ts","sourceRoot":"","sources":["../../src/core/prompt-commands.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;CAChB;AAmBD,eAAO,MAAM,eAAe,EAAE,aAAa,EAghC1C,CAAC;AAEF,gDAAgD;AAChD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAExE"}
@@ -2,6 +2,20 @@
2
2
  * Prompt-template commands — slash commands that inject detailed prompts
3
3
  * into the agent loop. Each command maps to a full prompt the agent executes.
4
4
  */
5
+ /**
6
+ * True when this process is the ezcoder-app sidecar (Tauri spawns it with
7
+ * `GG_APP_PORT` set, even to "0" — plain `ezcoder` CLI never sets it). Used
8
+ * to phrase user-facing notices (restart / task-list pointers) in terms of
9
+ * the desktop app's UI instead of CLI keybinds, since most users are on the
10
+ * app now and it has no terminal keybinds at all.
11
+ */
12
+ const IS_GG_APP = process.env.GG_APP_PORT !== undefined;
13
+ const TASKS_ADDED_NOTICE = IS_GG_APP
14
+ ? 'Tasks added. Click the "Tasks" button to open the task list and run them.'
15
+ : "Tasks added. Press Ctrl+T to open the task list and run them.";
16
+ const CLAUDE_MD_RESTART_NOTICE = IS_GG_APP
17
+ ? '> ⚠️ CLAUDE.md was created/updated. GG App loads it fresh per session, so start a **New Session** (click "+ New") before continuing. Without a new session, I won\'t see the new context.'
18
+ : "> ⚠️ CLAUDE.md was created/updated. ezcoder loads it at startup, so **exit and restart ezcoder** (`/quit` then run `ezcoder` again) before continuing. Without a restart, I won't see the new context.";
5
19
  export const PROMPT_COMMANDS = [
6
20
  {
7
21
  name: "goal",
@@ -650,7 +664,7 @@ After the report, ask:
650
664
 
651
665
  **Do not start fixing until the user picks.**
652
666
 
653
- If the user chooses A, B, or C, do not fix directly. Instead, add one task per selected finding or tightly coupled finding group using the \`tasks\` tool (action=add), ordered by severity, exploitability, and dependency. Each task needs a short title and a standalone prompt that includes the finding ID, vulnerability scenario, affected local files/anchors, concrete remediation, instructions to compare security-sensitive implementation details with kencode search or authoritative docs before editing, project verification commands, and instructions to compare the final fix with kencode search or authoritative docs again before completing the task. After adding the tasks, tell the user exactly: "Tasks added. Press Ctrl+T to open the task list and run them." Do not begin executing them unless the user explicitly says so.
667
+ If the user chooses A, B, or C, do not fix directly. Instead, add one task per selected finding or tightly coupled finding group using the \`tasks\` tool (action=add), ordered by severity, exploitability, and dependency. Each task needs a short title and a standalone prompt that includes the finding ID, vulnerability scenario, affected local files/anchors, concrete remediation, instructions to compare security-sensitive implementation details with kencode search or authoritative docs before editing, project verification commands, and instructions to compare the final fix with kencode search or authoritative docs again before completing the task. After adding the tasks, tell the user exactly: "${TASKS_ADDED_NOTICE}" Do not begin executing them unless the user explicitly says so.
654
668
 
655
669
  ## Threat reference (May 2026)
656
670
 
@@ -759,7 +773,7 @@ Keep total file under 100 lines. If updating, preserve any custom sections the u
759
773
 
760
774
  End your reply with this exact notice so the user doesn't miss it:
761
775
 
762
- > ⚠️ CLAUDE.md was created/updated. ezcoder loads it at startup, so **exit and restart ezcoder** (\`/quit\` then run \`ezcoder\` again) before continuing. Without a restart, I won't see the new context.`,
776
+ ${CLAUDE_MD_RESTART_NOTICE}`,
763
777
  },
764
778
  {
765
779
  name: "setup-commit",
@@ -1034,7 +1048,7 @@ Which (if any) would you like me to fix? Options:
1034
1048
  ## Rules
1035
1049
 
1036
1050
  - **Report only.** No edits, no installs, no commits without explicit user confirmation after the report.
1037
- - **Task handoff for fixes.** If the user chooses A, B, or C, do not fix directly. Add one task per selected gap or tightly coupled gap group using the \`tasks\` tool (action=add). Each task needs a short title and a standalone prompt that includes the gap, affected files/configs, safe-additive constraints, implementation instructions, project verification commands, and instructions to verify relevant tool/config semantics against official docs before completing the task. Use kencode search only for code-level examples, not as proof of scaffolding requirements. After adding the tasks, tell the user exactly: "Tasks added. Press Ctrl+T to open the task list and run them." Do not begin executing them unless the user explicitly says so.
1051
+ - **Task handoff for fixes.** If the user chooses A, B, or C, do not fix directly. Add one task per selected gap or tightly coupled gap group using the \`tasks\` tool (action=add). Each task needs a short title and a standalone prompt that includes the gap, affected files/configs, safe-additive constraints, implementation instructions, project verification commands, and instructions to verify relevant tool/config semantics against official docs before completing the task. Use kencode search only for code-level examples, not as proof of scaffolding requirements. After adding the tasks, tell the user exactly: "${TASKS_ADDED_NOTICE}" Do not begin executing them unless the user explicitly says so.
1038
1052
  - **No code refactors recommended.** This audit is about scaffolding/tooling, not code review. Use \`/scan\` or \`/verify\` for code-level findings.
1039
1053
  - **No dependency installations in the report.** Listing them as observations is fine; recommending installation is not — that's the user's call.
1040
1054
  - **Skip empty categories.** If a category has no findings, omit it.
@@ -1 +1 @@
1
- {"version":3,"file":"prompt-commands.js","sourceRoot":"","sources":["../../src/core/prompt-commands.ts"],"names":[],"mappings":"AAAA;;;GAGG;AASH,MAAM,CAAC,MAAM,eAAe,GAAoB;IAC9C;QACE,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,CAAC,GAAG,CAAC;QACd,WAAW,EAAE,sDAAsD;QACnE,sEAAsE;QACtE,yIAAyI;QACzI,MAAM,EACJ,qJAAqJ;KACxJ;IACD;QACE,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,EAAE;QACX,WAAW,EAAE,mCAAmC;QAChD,MAAM,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;0KA4E8J;KACvK;IACD;QACE,IAAI,EAAE,aAAa;QACnB,OAAO,EAAE,CAAC,OAAO,CAAC;QAClB,WAAW,EAAE,oDAAoD;QACjE,MAAM,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mHA8FuG;KAChH;IACD;QACE,IAAI,EAAE,YAAY;QAClB,OAAO,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC;QACrB,WAAW,EAAE,oEAAoE;QACjF,MAAM,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6LAqFiL;KAC1L;IACD;QACE,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,CAAC,QAAQ,CAAC;QACnB,WAAW,EAAE,4DAA4D;QACzE,MAAM,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mHA0GuG;KAChH;IACD;QACE,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,CAAC,QAAQ,EAAE,UAAU,CAAC;QAC/B,WAAW,EAAE,iFAAiF;QAC9F,MAAM,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mHA0GuG;KAChH;IACD;QACE,IAAI,EAAE,cAAc;QACpB,OAAO,EAAE,CAAC,IAAI,CAAC;QACf,WAAW,EAAE,8BAA8B;QAC3C,MAAM,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qEAsLyD;KAClE;IACD;QACE,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,EAAE;QACX,WAAW,EAAE,+CAA+C;QAC5D,MAAM,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2MA2D+L;KACxM;IACD;QACE,IAAI,EAAE,cAAc;QACpB,OAAO,EAAE,EAAE;QACX,WAAW,EAAE,4BAA4B;QACzC,MAAM,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mLA0DuK;KAChL;IACD;QACE,IAAI,EAAE,SAAS;QACf,OAAO,EAAE,EAAE;QACX,WAAW,EAAE,yBAAyB;QACtC,MAAM,EAAE;;;;;;;;;;;;;;;;;iFAiBqE;KAC9E;IACD;QACE,IAAI,EAAE,cAAc;QACpB,OAAO,EAAE,EAAE;QACX,WAAW,EAAE,yBAAyB;QACtC,MAAM,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gLA6FoK;KAC7K;IACD;QACE,IAAI,EAAE,OAAO;QACb,OAAO,EAAE,CAAC,eAAe,CAAC;QAC1B,WAAW,EAAE,qBAAqB;QAClC,MAAM,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6JAwFiJ;KAC1J;CACF,CAAC;AAEF,gDAAgD;AAChD,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,OAAO,eAAe,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,IAAI,IAAI,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;AACxF,CAAC"}
1
+ {"version":3,"file":"prompt-commands.js","sourceRoot":"","sources":["../../src/core/prompt-commands.ts"],"names":[],"mappings":"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"}