@prestyj/cli 4.3.160 → 4.3.164

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 (63) hide show
  1. package/dist/cli.d.ts +1 -1
  2. package/dist/cli.js +7 -1
  3. package/dist/cli.js.map +1 -1
  4. package/dist/core/language-detector.d.ts +32 -0
  5. package/dist/core/language-detector.d.ts.map +1 -0
  6. package/dist/core/language-detector.js +191 -0
  7. package/dist/core/language-detector.js.map +1 -0
  8. package/dist/core/language-detector.test.d.ts +2 -0
  9. package/dist/core/language-detector.test.d.ts.map +1 -0
  10. package/dist/core/language-detector.test.js +109 -0
  11. package/dist/core/language-detector.test.js.map +1 -0
  12. package/dist/core/prompt-commands.d.ts.map +1 -1
  13. package/dist/core/prompt-commands.js +93 -0
  14. package/dist/core/prompt-commands.js.map +1 -1
  15. package/dist/core/setup-history.d.ts +13 -0
  16. package/dist/core/setup-history.d.ts.map +1 -0
  17. package/dist/core/setup-history.js +71 -0
  18. package/dist/core/setup-history.js.map +1 -0
  19. package/dist/core/setup-history.test.d.ts +2 -0
  20. package/dist/core/setup-history.test.d.ts.map +1 -0
  21. package/dist/core/setup-history.test.js +74 -0
  22. package/dist/core/setup-history.test.js.map +1 -0
  23. package/dist/core/style-packs/index.d.ts +19 -0
  24. package/dist/core/style-packs/index.d.ts.map +1 -0
  25. package/dist/core/style-packs/index.js +70 -0
  26. package/dist/core/style-packs/index.js.map +1 -0
  27. package/dist/core/style-packs/packs.d.ts +18 -0
  28. package/dist/core/style-packs/packs.d.ts.map +1 -0
  29. package/dist/core/style-packs/packs.js +229 -0
  30. package/dist/core/style-packs/packs.js.map +1 -0
  31. package/dist/core/verify-commands.d.ts +35 -0
  32. package/dist/core/verify-commands.d.ts.map +1 -0
  33. package/dist/core/verify-commands.js +209 -0
  34. package/dist/core/verify-commands.js.map +1 -0
  35. package/dist/core/verify-commands.test.d.ts +2 -0
  36. package/dist/core/verify-commands.test.d.ts.map +1 -0
  37. package/dist/core/verify-commands.test.js +85 -0
  38. package/dist/core/verify-commands.test.js.map +1 -0
  39. package/dist/system-prompt.d.ts +2 -1
  40. package/dist/system-prompt.d.ts.map +1 -1
  41. package/dist/system-prompt.js +32 -5
  42. package/dist/system-prompt.js.map +1 -1
  43. package/dist/tools/prompt-hints.js +1 -1
  44. package/dist/tools/prompt-hints.js.map +1 -1
  45. package/dist/ui/App.d.ts +23 -1
  46. package/dist/ui/App.d.ts.map +1 -1
  47. package/dist/ui/App.js +227 -15
  48. package/dist/ui/App.js.map +1 -1
  49. package/dist/ui/pixel.test.js +1 -1
  50. package/dist/ui/pixel.test.js.map +1 -1
  51. package/dist/ui/render.d.ts +8 -0
  52. package/dist/ui/render.d.ts.map +1 -1
  53. package/dist/ui/render.js +2 -0
  54. package/dist/ui/render.js.map +1 -1
  55. package/dist/ui/theme/dark-ansi.json +2 -1
  56. package/dist/ui/theme/dark-daltonized.json +2 -1
  57. package/dist/ui/theme/dark.json +2 -1
  58. package/dist/ui/theme/light-ansi.json +2 -1
  59. package/dist/ui/theme/light-daltonized.json +2 -1
  60. package/dist/ui/theme/light.json +2 -1
  61. package/dist/ui/theme/theme.d.ts +1 -0
  62. package/dist/ui/theme/theme.d.ts.map +1 -1
  63. package/package.json +3 -3
@@ -1,4 +1,5 @@
1
1
  import { type Skill } from "./core/skills.js";
2
+ import type { LanguageId } from "./core/language-detector.js";
2
3
  /**
3
4
  * Build the system prompt dynamically based on cwd and context.
4
5
  *
@@ -6,5 +7,5 @@ import { type Skill } from "./core/skills.js";
6
7
  * Pass `tools.map(t => t.name)` from the session so the prompt reflects
7
8
  * exactly what the model can call. Defaults to the full built-in set.
8
9
  */
9
- export declare function buildSystemPrompt(cwd: string, skills?: Skill[], planMode?: boolean, approvedPlanPath?: string, toolNames?: readonly string[]): Promise<string>;
10
+ export declare function buildSystemPrompt(cwd: string, skills?: Skill[], planMode?: boolean, approvedPlanPath?: string, toolNames?: readonly string[], activeLanguages?: Set<LanguageId>): Promise<string>;
10
11
  //# sourceMappingURL=system-prompt.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"system-prompt.d.ts","sourceRoot":"","sources":["../src/system-prompt.ts"],"names":[],"mappings":"AAGA,OAAO,EAAyB,KAAK,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAKrE;;;;;;GAMG;AACH,wBAAsB,iBAAiB,CACrC,GAAG,EAAE,MAAM,EACX,MAAM,CAAC,EAAE,KAAK,EAAE,EAChB,QAAQ,CAAC,EAAE,OAAO,EAClB,gBAAgB,CAAC,EAAE,MAAM,EACzB,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,GAC5B,OAAO,CAAC,MAAM,CAAC,CA0LjB"}
1
+ {"version":3,"file":"system-prompt.d.ts","sourceRoot":"","sources":["../src/system-prompt.ts"],"names":[],"mappings":"AAGA,OAAO,EAAyB,KAAK,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAErE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAM9D;;;;;;GAMG;AACH,wBAAsB,iBAAiB,CACrC,GAAG,EAAE,MAAM,EACX,MAAM,CAAC,EAAE,KAAK,EAAE,EAChB,QAAQ,CAAC,EAAE,OAAO,EAClB,gBAAgB,CAAC,EAAE,MAAM,EACzB,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,EAC7B,eAAe,CAAC,EAAE,GAAG,CAAC,UAAU,CAAC,GAChC,OAAO,CAAC,MAAM,CAAC,CAqNjB"}
@@ -3,6 +3,8 @@ import path from "node:path";
3
3
  import { isEyesActive, readJournal } from "@prestyj/eyes";
4
4
  import { formatSkillsForPrompt } from "./core/skills.js";
5
5
  import { TOOL_PROMPT_HINTS, DEFAULT_TOOL_NAMES } from "./tools/prompt-hints.js";
6
+ import { renderStylePacksSection } from "./core/style-packs/index.js";
7
+ import { detectVerifyCommands, renderVerifySection } from "./core/verify-commands.js";
6
8
  const CONTEXT_FILES = ["AGENTS.md", "CLAUDE.md", ".cursorrules", "CONVENTIONS.md"];
7
9
  /**
8
10
  * Build the system prompt dynamically based on cwd and context.
@@ -11,7 +13,7 @@ const CONTEXT_FILES = ["AGENTS.md", "CLAUDE.md", ".cursorrules", "CONVENTIONS.md
11
13
  * Pass `tools.map(t => t.name)` from the session so the prompt reflects
12
14
  * exactly what the model can call. Defaults to the full built-in set.
13
15
  */
14
- export async function buildSystemPrompt(cwd, skills, planMode, approvedPlanPath, toolNames) {
16
+ export async function buildSystemPrompt(cwd, skills, planMode, approvedPlanPath, toolNames, activeLanguages) {
15
17
  const sections = [];
16
18
  // 1. Identity
17
19
  sections.push(`You are EZ Coder by Nolan Grout — a coding agent that works directly in the user's codebase. ` +
@@ -37,7 +39,8 @@ export async function buildSystemPrompt(cwd, skills, planMode, approvedPlanPath,
37
39
  `- **Just do it.** Routine follow-up (build, migrate, seed, re-run) is yours — don't ask.\n` +
38
40
  `- **Ask first for destructive actions**: deleting files, force-push, dropping data, killing processes, \`rm -rf\`, \`--hard\`, \`--force\`.\n` +
39
41
  `- **Investigate unexpected state** (unfamiliar files, branches, locks) — may be the user's in-progress work.\n` +
40
- `- **Honor CLAUDE.md / AGENTS.md**they override defaults.\n` +
42
+ `- **Precedence when rules conflict** (highest first): CLAUDE.md / AGENTS.md → existing patterns in the file/module being edited → Language Style Packs → defaults in this prompt. Apply pack conventions to new code; mirror existing patterns when extending old code. Library names in packs are illustrative use what the project already imports.\n` +
43
+ `- **Verify after meaningful edits.** When a Verification section is present, run the relevant commands for the language(s) you touched. Fix failures before reporting completion.\n` +
41
44
  `- **Untracked files → \`.gitignore\`**: artifacts, configs, secrets, logs, scratch, \`.env\`, caches.\n` +
42
45
  `- **Never fake verification.** If you didn't run the check or it failed, say so. Don't invent results.`);
43
46
  // 2b. Plan mode
@@ -79,8 +82,13 @@ export async function buildSystemPrompt(cwd, skills, planMode, approvedPlanPath,
79
82
  sections.push(`## Research & Verification\n\n` +
80
83
  `Your training data may be outdated. Do not assume — verify.\n\n` +
81
84
  `- **Docs first**: \`web_search\` → \`web_fetch\`.\n` +
82
- `- **Real code second**: \`mcp__kencode-search__searchCode\` — literal-text or RE2-regex search across 2M+ public repos. ` +
83
- `**Not semantic** query the actual code (\`useState(\`, \`import { z } from "zod"\`), NOT phrases like "react hooks tutorial".\n` +
85
+ `- **Real code second**: \`mcp__kencode-search__searchCode\` — literal-text or RE2-regex search across 2M+ public repos. **Not semantic.**\n` +
86
+ ` - **Concept query recipe.** If you only have a concept ("karaoke captions", "spring animation"), DO NOT search the concept. Anchor on a literal token a matching file would contain:\n` +
87
+ ` 1. A library import — \`from "remotion"\`, \`import { spring }\`, \`from "@remotion/captions"\`\n` +
88
+ ` 2. A known identifier/prop/hook — \`useVideoConfig\`, \`interpolate(\`, \`<Sequence\`, \`SubtitlePage\`\n` +
89
+ ` 3. A unique config key — \`"defaultExport":\`, \`assetsInclude:\`\n` +
90
+ ` Bad: \`karaoke word animation subtitle\` → zero hits, every time. Good: \`from "@remotion/captions"\` + \`peek: true\` → real files; then narrow with \`repo\` + \`path\` and read them.\n` +
91
+ ` - **Filename + topic ≠ query.** \`Page.tsx tiktok\` won't match. Use \`path: "Page.tsx"\` + \`repo: "remotion-dev"\` + a literal token in \`query\`.\n` +
84
92
  ` - Filters: \`language: ["TypeScript"]\`, \`repo: "owner/name"\` (substring), \`path: "src/components/"\` (substring), \`matchCase\`, \`useRegexp\`.\n` +
85
93
  ` - Workflow: \`peek: true\` first → paths + match counts only (cheap triage). Then call again narrowed by \`repo\` + \`path\` for full snippets. Paginate with \`offset\`.\n` +
86
94
  ` - Defaults exclude tests, \`node_modules\`, vendored, build, and generated files — pass \`includeTests: true\` or \`includeVendored: true\` to widen.\n` +
@@ -132,7 +140,26 @@ export async function buildSystemPrompt(cwd, skills, planMode, approvedPlanPath,
132
140
  dir = parent;
133
141
  }
134
142
  if (contextParts.length > 0) {
135
- sections.push(`## Project Context\n\n${contextParts.join("\n\n")}`);
143
+ sections.push(`## Project Context\n\n` +
144
+ `**Highest precedence** — the files below override anything stated earlier ` +
145
+ `in this prompt (How to Talk / How to Work / Code Quality / Style Packs).\n\n` +
146
+ contextParts.join("\n\n"));
147
+ }
148
+ // 6b. Language Style Packs — injected when the language detector has
149
+ // identified the project's active languages. See `core/language-detector.ts`
150
+ // and the swap logic in `ui/App.tsx`.
151
+ if (activeLanguages && activeLanguages.size > 0) {
152
+ const stylePacks = renderStylePacksSection(activeLanguages, cwd);
153
+ if (stylePacks)
154
+ sections.push(stylePacks);
155
+ // 6c. Verification — detected commands for the active languages, so the
156
+ // agent can close the feedback loop after pack-influenced edits. Without
157
+ // this anchor, packs are advisory; with it, the model has concrete
158
+ // commands to run and verify against.
159
+ const verifyCmds = detectVerifyCommands(cwd, activeLanguages);
160
+ const verifySection = renderVerifySection(verifyCmds);
161
+ if (verifySection)
162
+ sections.push(verifySection);
136
163
  }
137
164
  // 7. Eyes — open improvement signals from past probe use (gated on .ezcoder/eyes/manifest.json)
138
165
  if (isEyesActive(cwd)) {
@@ -1 +1 @@
1
- {"version":3,"file":"system-prompt.js","sourceRoot":"","sources":["../src/system-prompt.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"system-prompt.js","sourceRoot":"","sources":["../src/system-prompt.ts"],"names":[],"mappings":"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"}
@@ -19,7 +19,7 @@ export const TOOL_PROMPT_HINTS = {
19
19
  tasks: "Manage the Ctrl+T task pane (add/list/done/remove). Only when the user explicitly asks. Do NOT auto-run.",
20
20
  subagent: "Delegate focused, isolated subtasks (research, parallel exploration).",
21
21
  skill: "Invoke a named skill for specialized instructions.",
22
- "mcp__kencode-search__searchCode": 'Literal-text or RE2-regex search across 2M+ public repos. NOT semantic — query the actual code (`useState(`), not "react hooks". Filters: `language: ["TypeScript"]`, `repo: "owner/name"`, `path` (substring). Workflow: `peek: true` → paths+counts for cheap triage; call again narrowed by `repo` + `path` for full snippets. Defaults exclude tests/vendored/generated — set `includeTests` or `includeVendored` to widen. RE2: no lookahead/lookbehind/backrefs; multi-line needs `(?s)`.',
22
+ "mcp__kencode-search__searchCode": 'Literal-text or RE2-regex search across 2M+ public repos. NOT semantic. Have only a concept? Anchor on a literal token a matching file would contain a library import (`from "remotion"`), a known identifier/hook/prop (`useVideoConfig`, `<Sequence`), or a config key. Filename + topic in `query` does NOT work — put filenames in `path`, topics in `repo`. Filters: `language: ["TypeScript"]`, `repo: "owner/name"`, `path: "src/components/"`. Workflow: `peek: true` → paths+counts; then narrow with `repo` + `path` for full snippets. Defaults exclude tests/vendored/generated — set `includeTests` or `includeVendored` to widen. RE2: no lookahead/lookbehind/backrefs; multi-line needs `(?s)`.',
23
23
  enter_plan: "Enter plan mode for read-only research + planning on complex multi-file tasks.",
24
24
  exit_plan: "Submit your plan for user review and exit plan mode.",
25
25
  };
@@ -1 +1 @@
1
- {"version":3,"file":"prompt-hints.js","sourceRoot":"","sources":["../../src/tools/prompt-hints.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAA2B;IACvD,IAAI,EAAE,uDAAuD;IAC7D,KAAK,EAAE,wFAAwF;IAC/F,IAAI,EAAE,qKAAqK;IAC3K,IAAI,EAAE,6FAA6F;IACnG,IAAI,EAAE,8EAA8E;IACpF,IAAI,EAAE,kEAAkE;IACxE,EAAE,EAAE,0BAA0B;IAC9B,SAAS,EAAE,oDAAoD;IAC/D,UAAU,EAAE,qDAAqD;IACjE,WAAW,EAAE,kDAAkD;IAC/D,SAAS,EAAE,kCAAkC;IAC7C,KAAK,EACH,0GAA0G;IAC5G,QAAQ,EAAE,uEAAuE;IACjF,KAAK,EAAE,oDAAoD;IAC3D,iCAAiC,EAC/B,ieAAie;IACne,UAAU,EAAE,gFAAgF;IAC5F,SAAS,EAAE,sDAAsD;CAClE,CAAC;AAEF,oEAAoE;AACpE,MAAM,CAAC,MAAM,kBAAkB,GAAsB;IACnD,MAAM;IACN,OAAO;IACP,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,IAAI;IACJ,WAAW;IACX,aAAa;IACb,WAAW;IACX,OAAO;IACP,UAAU;IACV,OAAO;IACP,iCAAiC;IACjC,YAAY;IACZ,WAAW;CACZ,CAAC"}
1
+ {"version":3,"file":"prompt-hints.js","sourceRoot":"","sources":["../../src/tools/prompt-hints.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAA2B;IACvD,IAAI,EAAE,uDAAuD;IAC7D,KAAK,EAAE,wFAAwF;IAC/F,IAAI,EAAE,qKAAqK;IAC3K,IAAI,EAAE,6FAA6F;IACnG,IAAI,EAAE,8EAA8E;IACpF,IAAI,EAAE,kEAAkE;IACxE,EAAE,EAAE,0BAA0B;IAC9B,SAAS,EAAE,oDAAoD;IAC/D,UAAU,EAAE,qDAAqD;IACjE,WAAW,EAAE,kDAAkD;IAC/D,SAAS,EAAE,kCAAkC;IAC7C,KAAK,EACH,0GAA0G;IAC5G,QAAQ,EAAE,uEAAuE;IACjF,KAAK,EAAE,oDAAoD;IAC3D,iCAAiC,EAC/B,mrBAAmrB;IACrrB,UAAU,EAAE,gFAAgF;IAC5F,SAAS,EAAE,sDAAsD;CAClE,CAAC;AAEF,oEAAoE;AACpE,MAAM,CAAC,MAAM,kBAAkB,GAAsB;IACnD,MAAM;IACN,OAAO;IACP,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,IAAI;IACJ,WAAW;IACX,aAAa;IACb,WAAW;IACX,OAAO;IACP,UAAU;IACV,OAAO;IACP,iCAAiC;IACjC,YAAY;IACZ,WAAW;CACZ,CAAC"}
package/dist/ui/App.d.ts CHANGED
@@ -3,6 +3,7 @@ import type { AgentTool } from "@prestyj/agent";
3
3
  import type { PasteInfo } from "./components/InputArea.js";
4
4
  import { type SubAgentInfo } from "./components/SubAgentPanel.js";
5
5
  import type { ProcessManager } from "../core/process-manager.js";
6
+ import { type LanguageId } from "../core/language-detector.js";
6
7
  import type { Skill } from "../core/skills.js";
7
8
  import { type PlanStep } from "../utils/plan-steps.js";
8
9
  import type { MCPClientManager } from "../core/mcp/index.js";
@@ -56,6 +57,23 @@ interface InfoItem {
56
57
  text: string;
57
58
  id: string;
58
59
  }
60
+ interface StylePackItem {
61
+ kind: "style_pack";
62
+ /** Newly-added language ids in this injection. Rendered via LANGUAGE_DISPLAY_NAMES. */
63
+ added: readonly LanguageId[];
64
+ /** Show the one-time /setup hint. Only true for the first badge in a session. */
65
+ showSetupHint: boolean;
66
+ id: string;
67
+ }
68
+ /**
69
+ * Shown once per session when initial language detection finds no packs —
70
+ * keeps `/setup` discoverable in dirs that don't look like a project root
71
+ * (parent folders, scratch dirs, etc.).
72
+ */
73
+ interface SetupHintItem {
74
+ kind: "setup_hint";
75
+ id: string;
76
+ }
59
77
  interface UpdateNoticeItem {
60
78
  kind: "update_notice";
61
79
  text: string;
@@ -142,7 +160,7 @@ export interface ToolGroupItem {
142
160
  tools: ToolGroupTool[];
143
161
  id: string;
144
162
  }
145
- export type CompletedItem = UserItem | TaskItem | AssistantItem | ToolStartItem | ToolDoneItem | ServerToolStartItem | ServerToolDoneItem | ErrorItem | InfoItem | UpdateNoticeItem | QueuedItem | CompactingItem | CompactedItem | DurationItem | BannerItem | SubAgentGroupItem | ToolGroupItem | PlanTransitionItem | TombstoneItem | StepDoneItem;
163
+ export type CompletedItem = UserItem | TaskItem | AssistantItem | ToolStartItem | ToolDoneItem | ServerToolStartItem | ServerToolDoneItem | ErrorItem | InfoItem | StylePackItem | SetupHintItem | UpdateNoticeItem | QueuedItem | CompactingItem | CompactedItem | DurationItem | BannerItem | SubAgentGroupItem | ToolGroupItem | PlanTransitionItem | TombstoneItem | StepDoneItem;
146
164
  export interface AppProps {
147
165
  provider: Provider;
148
166
  model: string;
@@ -239,6 +257,10 @@ export interface AppProps {
239
257
  prompt: string;
240
258
  infoText?: string;
241
259
  };
260
+ /** Run-all chain flags — mirrored from React state so they survive the
261
+ * unmount/remount that startTask / startPixelFix trigger via resetUI. */
262
+ runAllTasks?: boolean;
263
+ runAllPixel?: boolean;
242
264
  };
243
265
  }
244
266
  export declare function App(props: AppProps): import("react/jsx-runtime").JSX.Element;
@@ -1 +1 @@
1
- {"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../../src/ui/App.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../../src/ui/App.tsx"],"names":[],"mappings":"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"}
package/dist/ui/App.js CHANGED
@@ -46,8 +46,11 @@ import { SettingsManager } from "../core/settings-manager.js";
46
46
  import { shouldCompact, compact } from "../core/compaction/compactor.js";
47
47
  import { estimateConversationTokens } from "../core/compaction/token-estimator.js";
48
48
  import { PROMPT_COMMANDS, getPromptCommand } from "../core/prompt-commands.js";
49
+ import { isFirstTimeSetup, markSetupAudited, getAnnouncedLanguages, markLanguagesAnnounced, } from "../core/setup-history.js";
49
50
  import { loadCustomCommands } from "../core/custom-commands.js";
50
51
  import { buildSystemPrompt } from "../system-prompt.js";
52
+ import { detectLanguages, LANGUAGE_DISPLAY_NAMES, } from "../core/language-detector.js";
53
+ import { detectVerifyCommands } from "../core/verify-commands.js";
51
54
  import { extractPlanSteps, findCompletedMarkers, markStepsCompleted, segmentDisplayText, stripDoneMarkers, } from "../utils/plan-steps.js";
52
55
  import { getMCPServers } from "../core/mcp/index.js";
53
56
  import { trimFlushedItems, flushOnTurnText, flushOnTurnEnd, flushOverflow, } from "./live-item-flush.js";
@@ -230,7 +233,7 @@ const THINKING_BORDER_COLORS = ["#60a5fa", "#818cf8", "#a78bfa", "#818cf8", "#60
230
233
  function getTaskCount(cwd) {
231
234
  try {
232
235
  const hash = createHash("sha256").update(cwd).digest("hex").slice(0, 16);
233
- const data = readFileSync(join(homedir(), ".gg-tasks", "projects", hash, "tasks.json"), "utf-8");
236
+ const data = readFileSync(join(homedir(), ".ezcoder-tasks", "projects", hash, "tasks.json"), "utf-8");
234
237
  const tasks = JSON.parse(data);
235
238
  return tasks.filter((t) => t.status !== "done").length;
236
239
  }
@@ -241,7 +244,7 @@ function getTaskCount(cwd) {
241
244
  function getNextPendingTask(cwd) {
242
245
  try {
243
246
  const hash = createHash("sha256").update(cwd).digest("hex").slice(0, 16);
244
- const data = readFileSync(join(homedir(), ".gg-tasks", "projects", hash, "tasks.json"), "utf-8");
247
+ const data = readFileSync(join(homedir(), ".ezcoder-tasks", "projects", hash, "tasks.json"), "utf-8");
245
248
  const tasks = JSON.parse(data);
246
249
  const pending = tasks.find((t) => t.status === "pending");
247
250
  if (!pending)
@@ -259,7 +262,7 @@ function getNextPendingTask(cwd) {
259
262
  function markTaskInProgress(cwd, taskId) {
260
263
  try {
261
264
  const hash = createHash("sha256").update(cwd).digest("hex").slice(0, 16);
262
- const filePath = join(homedir(), ".gg-tasks", "projects", hash, "tasks.json");
265
+ const filePath = join(homedir(), ".ezcoder-tasks", "projects", hash, "tasks.json");
263
266
  const data = readFileSync(filePath, "utf-8");
264
267
  const tasks = JSON.parse(data);
265
268
  const updated = tasks.map((t) => (t.id === taskId ? { ...t, status: "in-progress" } : t));
@@ -317,8 +320,13 @@ export function App(props) {
317
320
  const [taskCount, setTaskCount] = useState(() => getTaskCount(props.cwd));
318
321
  const [eyesCount, setEyesCount] = useState(() => isEyesActive(props.cwd) ? journalCount({ status: "open" }, props.cwd) : undefined);
319
322
  const [updatePending, setUpdatePending] = useState(() => getPendingUpdate(props.version) !== null);
320
- const [runAllTasks, setRunAllTasks] = useState(false);
321
- const runAllTasksRef = useRef(false);
323
+ // Seed run-all flags from sessionStore so the chain survives the
324
+ // unmount/remount that startTask / startPixelFix trigger via resetUI.
325
+ // Without this, the remounted App has runAllTasks=false and onDone
326
+ // never picks up the next task. (Regression from 0246c6d — unmount/
327
+ // remount across all panes.)
328
+ const [runAllTasks, setRunAllTasks] = useState(() => props.sessionStore?.runAllTasks ?? false);
329
+ const runAllTasksRef = useRef(runAllTasks);
322
330
  const startTaskRef = useRef(() => { });
323
331
  const runAllPixelRef = useRef(false);
324
332
  const currentPixelFixRef = useRef(null);
@@ -349,6 +357,26 @@ export function App(props) {
349
357
  const lastActualTokensTimestampRef = useRef(0);
350
358
  /** Timestamp of last compaction — used for time-based cooldown and staleness detection. */
351
359
  const lastCompactionTimeRef = useRef(0);
360
+ /**
361
+ * Languages whose style packs are currently injected into the system prompt.
362
+ * Grown by `maybeInjectLanguagePacks` after `write`/`bash` tool results when
363
+ * the language detector sees new marker files. Reset on `chdir` (pixel-fix).
364
+ * Only grows within a session; we never strip packs once injected (cheaper
365
+ * than invalidating prompt caching, and stale guidance is harmless).
366
+ */
367
+ const injectedLanguagesRef = useRef(new Set());
368
+ /**
369
+ * True until the first style-pack badge is pushed. Used to gate the
370
+ * one-time "/setup" hint so users learn the slash command without being
371
+ * spammed on every subsequent pack swap.
372
+ */
373
+ const setupHintShownRef = useRef(false);
374
+ /**
375
+ * Callback that fires `/setup` programmatically. Assigned later in the
376
+ * component once `agentLoop` is in scope. Called from the initial
377
+ * language-detection path when this cwd has never been audited before.
378
+ */
379
+ const triggerAutoSetupRef = useRef(async () => { });
352
380
  const getId = () => String(nextIdRef.current++);
353
381
  // Two-phase flush: items waiting to be moved to Static history after the
354
382
  // live area has been cleared and Ink has committed the smaller output.
@@ -432,10 +460,97 @@ export function App(props) {
432
460
  props.planModeRef.current = planMode;
433
461
  }
434
462
  }, [planMode, props.planModeRef]);
463
+ /**
464
+ * Unified "apply detection result" pipeline. Called from three sites:
465
+ * 1. Initial mount (existing project at startup).
466
+ * 2. After every `write`/`bash` tool result (reactive to new manifests).
467
+ * 3. Before every user submit (catches external changes between turns,
468
+ * and ensures non-writing prompts still surface the badge).
469
+ *
470
+ * No-op when no new languages were added vs `injectedLanguagesRef.current`.
471
+ * The set-growth gate keeps this safe to call from every hot path.
472
+ */
473
+ const applyLanguageDetectionRef = useRef(async () => { });
474
+ applyLanguageDetectionRef.current = async (source) => {
475
+ const cwd = cwdRef.current;
476
+ const detected = detectLanguages(cwd);
477
+ const added = [];
478
+ for (const id of detected) {
479
+ if (!injectedLanguagesRef.current.has(id))
480
+ added.push(id);
481
+ }
482
+ if (added.length === 0) {
483
+ // No new packs to inject. The empty-detection hint + auto-run are
484
+ // first-time-per-cwd only — once the user has been shown the box and
485
+ // /setup has had a chance to run, re-showing on every session is noise.
486
+ // The with-packs path below is gated the same way via
487
+ // getAnnouncedLanguages / markLanguagesAnnounced: badge fires once per
488
+ // (cwd, language) and stays silent on subsequent sessions / /clear.
489
+ if (source === "initial" &&
490
+ !setupHintShownRef.current &&
491
+ injectedLanguagesRef.current.size === 0 &&
492
+ isFirstTimeSetup(cwd)) {
493
+ setupHintShownRef.current = true;
494
+ markSetupAudited(cwd);
495
+ log("INFO", "language", `No style packs detected for ${cwd}`, { source });
496
+ setLiveItems((prev) => [...prev, { kind: "setup_hint", id: getId() }]);
497
+ // /setup handles the empty / parent-folder / scratch-dir case via
498
+ // its brand-new-empty-project branch in the prompt template.
499
+ void triggerAutoSetupRef.current();
500
+ }
501
+ return;
502
+ }
503
+ injectedLanguagesRef.current = detected;
504
+ try {
505
+ const newPrompt = await buildSystemPrompt(cwd, props.skills, planMode, approvedPlanPathRef.current, undefined, detected);
506
+ if (messagesRef.current[0]?.role === "system") {
507
+ messagesRef.current[0] = { role: "system", content: newPrompt };
508
+ }
509
+ const verifyCmds = detectVerifyCommands(cwd, detected);
510
+ const tag = source === "initial" ? "Initial style packs" : "Style pack(s) loaded";
511
+ log("INFO", "language", `${tag}: ${added.join(", ")}`, {
512
+ source,
513
+ active: [...detected].join(","),
514
+ verify_count: String(verifyCmds.length),
515
+ verify: verifyCmds.map((c) => `${c.language}:${c.label}=${c.command}`).join(" | "),
516
+ });
517
+ // The badge is purely user-facing notification ("hey, this pack just
518
+ // turned on"). The system prompt is already updated above — that's the
519
+ // load-bearing part. We persist the announced set per-cwd so /clear,
520
+ // restart, and new sessions stay quiet for packs the user has seen.
521
+ const alreadyAnnounced = new Set(getAnnouncedLanguages(cwd));
522
+ const toAnnounce = added.filter((id) => !alreadyAnnounced.has(id));
523
+ if (toAnnounce.length > 0) {
524
+ markLanguagesAnnounced(cwd, toAnnounce);
525
+ const showSetupHint = !setupHintShownRef.current;
526
+ setupHintShownRef.current = true;
527
+ setLiveItems((prev) => [
528
+ ...prev,
529
+ { kind: "style_pack", added: toAnnounce, showSetupHint, id: getId() },
530
+ ]);
531
+ }
532
+ // First-time-per-project auto-run. Fires only on the initial mount
533
+ // detection path — not on tool/input triggers — so we don't surprise
534
+ // users mid-session. Persisted across sessions via setup-history.json.
535
+ if (source === "initial" && isFirstTimeSetup(cwd)) {
536
+ markSetupAudited(cwd);
537
+ void triggerAutoSetupRef.current();
538
+ }
539
+ }
540
+ catch (err) {
541
+ log("WARN", "language", `Detection apply failed (${source}): ${err.message}`);
542
+ }
543
+ };
544
+ // Initial language detection — runs once on mount so existing projects with
545
+ // marker files (package.json, Cargo.toml, etc.) get their style packs from
546
+ // turn 1, with a visible badge.
547
+ useEffect(() => {
548
+ void applyLanguageDetectionRef.current("initial");
549
+ }, []);
435
550
  // Rebuild system prompt when plan mode changes
436
551
  useEffect(() => {
437
552
  void (async () => {
438
- const newPrompt = await buildSystemPrompt(props.cwd, props.skills, planMode, approvedPlanPathRef.current);
553
+ const newPrompt = await buildSystemPrompt(props.cwd, props.skills, planMode, approvedPlanPathRef.current, undefined, injectedLanguagesRef.current);
439
554
  if (messagesRef.current[0]?.role === "system") {
440
555
  messagesRef.current[0] = {
441
556
  role: "system",
@@ -514,6 +629,29 @@ export function App(props) {
514
629
  }
515
630
  persistedIndexRef.current = allMsgs.length;
516
631
  }, []);
632
+ /**
633
+ * Run the language detector against the current cwd. If the detected set is a
634
+ * strict superset of what's already injected, rebuild the system prompt with
635
+ * the expanded set and swap `messagesRef.current[0]`.
636
+ *
637
+ * Called from `onToolEnd` after `write`/`bash` succeeds — these are the only
638
+ * tools that can introduce new marker files (package.json, Cargo.toml, etc.).
639
+ * Other tool kinds skip detection entirely to avoid wasted filesystem stats.
640
+ *
641
+ * No restart required: the system prompt is mutated in place, same mechanism
642
+ * already used for plan mode + pixel-fix chdir.
643
+ *
644
+ * Stored in a ref so `onToolEnd` (whose useCallback dep array is intentionally
645
+ * empty to keep agent-loop options stable) can call the freshest version.
646
+ */
647
+ const maybeInjectLanguagePacksRef = useRef(async () => { });
648
+ maybeInjectLanguagePacksRef.current = async (toolName, isError) => {
649
+ if (isError)
650
+ return;
651
+ if (toolName !== "write" && toolName !== "bash")
652
+ return;
653
+ await applyLanguageDetectionRef.current("tool");
654
+ };
517
655
  // ── Compaction ─────────────────────────────────────────
518
656
  // Load settings for auto-compaction + buddy
519
657
  const settingsRef = useRef(null);
@@ -680,7 +818,7 @@ export function App(props) {
680
818
  approvedPlanPathRef.current = undefined;
681
819
  // Rebuild system prompt to remove the completed plan from context
682
820
  void (async () => {
683
- const newPrompt = await buildSystemPrompt(props.cwd, props.skills, planMode, undefined);
821
+ const newPrompt = await buildSystemPrompt(props.cwd, props.skills, planMode, undefined, undefined, injectedLanguagesRef.current);
684
822
  if (messagesRef.current[0]?.role === "system") {
685
823
  messagesRef.current[0] = { role: "system", content: newPrompt };
686
824
  }
@@ -921,6 +1059,10 @@ export function App(props) {
921
1059
  });
922
1060
  }, []),
923
1061
  onToolEnd: useCallback((toolCallId, name, result, isError, durationMs, details) => {
1062
+ // Language-pack detection — gated on `write`/`bash` inside the
1063
+ // helper; cheap to call unconditionally. Fire-and-forget; the next
1064
+ // LLM turn picks up the swapped system prompt automatically.
1065
+ void maybeInjectLanguagePacksRef.current(name, isError);
924
1066
  const level = isError ? "ERROR" : "INFO";
925
1067
  log(level, "tool", `Tool call ended: ${name}`, {
926
1068
  id: toolCallId,
@@ -1189,6 +1331,12 @@ export function App(props) {
1189
1331
  log("WARN", "agent", "Agent run aborted by user");
1190
1332
  setRunAllTasks(false);
1191
1333
  setRunAllPixel(false);
1334
+ // Mirror immediately — the useEffect that syncs sessionStore
1335
+ // won't run if we unmount before the next render commit.
1336
+ if (props.sessionStore) {
1337
+ props.sessionStore.runAllTasks = false;
1338
+ props.sessionStore.runAllPixel = false;
1339
+ }
1192
1340
  currentPixelFixRef.current = null;
1193
1341
  setDoneStatus(null);
1194
1342
  setLiveItems((prev) => {
@@ -1261,6 +1409,44 @@ export function App(props) {
1261
1409
  setLiveItems([userItem]);
1262
1410
  }, []),
1263
1411
  });
1412
+ // First-time-per-project auto-run of /setup. Bound after `agentLoop` is in
1413
+ // scope so the ref closure can dispatch to it. Called from the initial
1414
+ // language-detection path when `isFirstTimeSetup(cwd)` is true. Pushes a
1415
+ // notice item explaining what's happening, then runs the audit prompt.
1416
+ triggerAutoSetupRef.current = async () => {
1417
+ const setupCmd = getPromptCommand("setup");
1418
+ if (!setupCmd) {
1419
+ log("WARN", "setup", "Auto-setup skipped — /setup command not found in registry.");
1420
+ return;
1421
+ }
1422
+ log("INFO", "setup", `Auto-running /setup (first session for ${cwdRef.current})`);
1423
+ setLiveItems((prev) => [
1424
+ ...prev,
1425
+ {
1426
+ kind: "info",
1427
+ text: "First time in this project — auto-running /setup to audit hygiene, tooling, and style-pack alignment. " +
1428
+ "Press Esc to cancel.",
1429
+ id: getId(),
1430
+ },
1431
+ { kind: "user", text: "/setup", id: getId() },
1432
+ ]);
1433
+ setLastUserMessage("/setup");
1434
+ setDoneStatus(null);
1435
+ try {
1436
+ await agentLoop.run(setupCmd.prompt);
1437
+ }
1438
+ catch (err) {
1439
+ const msg = err instanceof Error ? err.message : String(err);
1440
+ const isAbort = msg.includes("aborted") || msg.includes("abort");
1441
+ log(isAbort ? "INFO" : "ERROR", "setup", `Auto-setup ended: ${msg}`);
1442
+ setLiveItems((prev) => [
1443
+ ...prev,
1444
+ isAbort
1445
+ ? { kind: "info", text: "Auto-setup cancelled.", id: getId() }
1446
+ : { kind: "error", message: msg, id: getId() },
1447
+ ]);
1448
+ }
1449
+ };
1264
1450
  // Phase 2 of the two-phase flush: after onDone clears liveItems (phase 1)
1265
1451
  // and Ink renders the smaller live area (updating its internal line
1266
1452
  // counter), this effect pushes the stashed items into Static history.
@@ -1328,6 +1514,11 @@ export function App(props) {
1328
1514
  else {
1329
1515
  const truncated = trimmed.length > 100 ? trimmed.slice(0, 100) + "..." : trimmed;
1330
1516
  log("INFO", "input", `User input: ${truncated}${inputImages.length > 0 ? ` (+${inputImages.length} image${inputImages.length > 1 ? "s" : ""})` : ""}`);
1517
+ // Re-detect on every user submit — cheap (fs stats only). Catches
1518
+ // external changes between turns and ensures non-writing prompts still
1519
+ // surface the badge when packs are newly applicable. No-op if the set
1520
+ // has not grown.
1521
+ void applyLanguageDetectionRef.current("input");
1331
1522
  }
1332
1523
  // Handle /model directly — open inline selector
1333
1524
  if (trimmed === "/model" || trimmed === "/m") {
@@ -1359,7 +1550,7 @@ export function App(props) {
1359
1550
  if (trimmed === "/clear") {
1360
1551
  if (props.resetUI) {
1361
1552
  void (async () => {
1362
- const newPrompt = await buildSystemPrompt(props.cwd, props.skills, planMode, undefined);
1553
+ const newPrompt = await buildSystemPrompt(props.cwd, props.skills, planMode, undefined, undefined, injectedLanguagesRef.current);
1363
1554
  props.resetUI?.({
1364
1555
  wipeSession: true,
1365
1556
  messages: [{ role: "system", content: newPrompt }],
@@ -1378,7 +1569,7 @@ export function App(props) {
1378
1569
  planStepsRef.current = [];
1379
1570
  setPlanSteps([]);
1380
1571
  void (async () => {
1381
- const newPrompt = await buildSystemPrompt(props.cwd, props.skills, planMode, undefined);
1572
+ const newPrompt = await buildSystemPrompt(props.cwd, props.skills, planMode, undefined, undefined, injectedLanguagesRef.current);
1382
1573
  messagesRef.current = [{ role: "system", content: newPrompt }];
1383
1574
  persistedIndexRef.current = messagesRef.current.length;
1384
1575
  })();
@@ -1441,7 +1632,7 @@ export function App(props) {
1441
1632
  setPlanSteps([]);
1442
1633
  // Rebuild system prompt without the plan
1443
1634
  void (async () => {
1444
- const newPrompt = await buildSystemPrompt(props.cwd, props.skills, planMode, undefined);
1635
+ const newPrompt = await buildSystemPrompt(props.cwd, props.skills, planMode, undefined, undefined, injectedLanguagesRef.current);
1445
1636
  if (messagesRef.current[0]?.role === "system") {
1446
1637
  messagesRef.current[0] = { role: "system", content: newPrompt };
1447
1638
  }
@@ -1823,6 +2014,13 @@ export function App(props) {
1823
2014
  return (_jsx(UserMessage, { text: item.text, imageCount: item.imageCount, pasteInfo: item.pasteInfo }, item.id));
1824
2015
  case "task":
1825
2016
  return (_jsx(Box, { marginTop: 1, children: _jsxs(Text, { wrap: "wrap", children: [_jsx(Text, { color: theme.success, bold: true, children: "▶ " }), _jsx(Text, { color: theme.textDim, children: "Task: " }), _jsx(Text, { color: theme.success, children: item.title })] }) }, item.id));
2017
+ case "style_pack": {
2018
+ const names = item.added.map((id) => LANGUAGE_DISPLAY_NAMES[id]);
2019
+ const headerLabel = item.added.length > 1 ? "STYLE PACKS ACTIVE" : "STYLE PACK ACTIVE";
2020
+ return (_jsxs(Box, { marginTop: 1, flexShrink: 1, flexDirection: "column", borderStyle: "round", borderColor: theme.language, paddingX: 1, children: [_jsxs(Text, { wrap: "wrap", children: [_jsx(Text, { color: theme.language, bold: true, children: "◆ " }), _jsx(Text, { color: theme.language, bold: true, children: headerLabel })] }), _jsx(Text, { color: theme.text, bold: true, wrap: "wrap", children: names.join(", ") }), item.showSetupHint && (_jsx(Box, { marginTop: 1, children: _jsxs(Text, { wrap: "wrap", children: [_jsx(Text, { color: theme.textMuted, children: "Tip: run " }), _jsx(Text, { color: theme.language, bold: true, children: "/setup" }), _jsx(Text, { color: theme.textMuted, children: " to audit this project against the active pack(s)" })] }) }))] }, item.id));
2021
+ }
2022
+ case "setup_hint":
2023
+ return (_jsxs(Box, { marginTop: 1, flexShrink: 1, flexDirection: "column", borderStyle: "round", borderColor: theme.language, paddingX: 1, children: [_jsxs(Text, { wrap: "wrap", children: [_jsx(Text, { color: theme.language, bold: true, children: "◆ " }), _jsx(Text, { color: theme.language, bold: true, children: "NO STYLE PACKS DETECTED" })] }), _jsx(Text, { color: theme.textMuted, wrap: "wrap", children: "This directory has no recognized language manifest at its root." }), _jsx(Box, { marginTop: 1, children: _jsxs(Text, { wrap: "wrap", children: [_jsx(Text, { color: theme.textMuted, children: "Tip: run " }), _jsx(Text, { color: theme.language, bold: true, children: "/setup" }), _jsx(Text, { color: theme.textMuted, children: " to audit project hygiene or bootstrap a new project from scratch" })] }) })] }, item.id));
1826
2024
  case "assistant":
1827
2025
  return (_jsx(AssistantMessage, { text: item.text, thinking: item.thinking, thinkingMs: item.thinkingMs, showThinking: props.showThinking, planMode: item.planMode }, item.id));
1828
2026
  case "tool_start":
@@ -1947,7 +2145,11 @@ export function App(props) {
1947
2145
  startTaskRef.current = startTask;
1948
2146
  useEffect(() => {
1949
2147
  runAllTasksRef.current = runAllTasks;
1950
- }, [runAllTasks]);
2148
+ // Mirror into sessionStore so the flag survives unmount/remount
2149
+ // when startTask triggers resetUI for the NEXT task in the chain.
2150
+ if (props.sessionStore)
2151
+ props.sessionStore.runAllTasks = runAllTasks;
2152
+ }, [runAllTasks, props.sessionStore]);
1951
2153
  const startPixelFix = useCallback((errorId) => {
1952
2154
  void (async () => {
1953
2155
  try {
@@ -1973,7 +2175,15 @@ export function App(props) {
1973
2175
  if (props.rebuildToolsForCwd) {
1974
2176
  setCurrentTools(props.rebuildToolsForCwd(prep.projectPath));
1975
2177
  }
1976
- const newSystemPrompt = await buildSystemPrompt(prep.projectPath, props.skills, false, undefined);
2178
+ // Pixel-fix swaps the project root reset injected packs so the
2179
+ // new project re-detects from scratch on the next tool call. Also
2180
+ // reset the setup-hint flag so the new project's first badge re-
2181
+ // surfaces the tip (different project, may need the reminder).
2182
+ injectedLanguagesRef.current = new Set();
2183
+ setupHintShownRef.current = false;
2184
+ const detectedForPixelFix = detectLanguages(prep.projectPath);
2185
+ injectedLanguagesRef.current = detectedForPixelFix;
2186
+ const newSystemPrompt = await buildSystemPrompt(prep.projectPath, props.skills, false, undefined, undefined, detectedForPixelFix);
1977
2187
  // Now that the cwd swap is committed, reset chat. Doing this BEFORE
1978
2188
  // the chdir would print a banner with the old cwd, then bumping
1979
2189
  // staticKey would print a second banner with the new cwd — leaving
@@ -2015,10 +2225,12 @@ export function App(props) {
2015
2225
  })();
2016
2226
  }, [props.cwd, stdout, agentLoop, currentProvider, currentModel]);
2017
2227
  startPixelFixRef.current = startPixelFix;
2018
- const [runAllPixel, setRunAllPixel] = useState(false);
2228
+ const [runAllPixel, setRunAllPixel] = useState(() => props.sessionStore?.runAllPixel ?? false);
2019
2229
  useEffect(() => {
2020
2230
  runAllPixelRef.current = runAllPixel;
2021
- }, [runAllPixel]);
2231
+ if (props.sessionStore)
2232
+ props.sessionStore.runAllPixel = runAllPixel;
2233
+ }, [runAllPixel, props.sessionStore]);
2022
2234
  const isTaskView = overlay === "tasks";
2023
2235
  const isSkillsView = overlay === "skills";
2024
2236
  const isPlanView = overlay === "plan";
@@ -2115,7 +2327,7 @@ export function App(props) {
2115
2327
  const planContent = await import("node:fs/promises").then(({ readFile }) => readFile(planPath, "utf-8"));
2116
2328
  const steps = extractPlanSteps(planContent);
2117
2329
  // Build the new system prompt with the approved plan baked in.
2118
- const newPrompt = await buildSystemPrompt(props.cwd, props.skills, false, planPath);
2330
+ const newPrompt = await buildSystemPrompt(props.cwd, props.skills, false, planPath, undefined, injectedLanguagesRef.current);
2119
2331
  // Create a new session file BEFORE remount so the new tree
2120
2332
  // picks it up via sessionStore.sessionPath.
2121
2333
  let newSessionPath;