@nac3/forge-cli 0.2.0-alpha.59z.123 → 0.2.0-alpha.59z.158

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 (154) hide show
  1. package/dist/agents/bridge.d.ts +69 -0
  2. package/dist/agents/bridge.d.ts.map +1 -0
  3. package/dist/agents/bridge.js +295 -0
  4. package/dist/agents/bridge.js.map +1 -0
  5. package/dist/agents/cli_real.d.ts +38 -0
  6. package/dist/agents/cli_real.d.ts.map +1 -0
  7. package/dist/agents/cli_real.js +46 -0
  8. package/dist/agents/cli_real.js.map +1 -0
  9. package/dist/agents/config_schema.d.ts +1 -1
  10. package/dist/agents/config_schema.d.ts.map +1 -1
  11. package/dist/agents/config_schema.js +16 -0
  12. package/dist/agents/config_schema.js.map +1 -1
  13. package/dist/agents/defaults.d.ts.map +1 -1
  14. package/dist/agents/defaults.js.map +1 -1
  15. package/dist/agents/delegate.d.ts +36 -0
  16. package/dist/agents/delegate.d.ts.map +1 -0
  17. package/dist/agents/delegate.js +68 -0
  18. package/dist/agents/delegate.js.map +1 -0
  19. package/dist/agents/iterative_step.d.ts +95 -0
  20. package/dist/agents/iterative_step.d.ts.map +1 -0
  21. package/dist/agents/iterative_step.js +249 -0
  22. package/dist/agents/iterative_step.js.map +1 -0
  23. package/dist/agents/llm_step.d.ts +50 -0
  24. package/dist/agents/llm_step.d.ts.map +1 -0
  25. package/dist/agents/llm_step.js +28 -0
  26. package/dist/agents/llm_step.js.map +1 -0
  27. package/dist/agents/real_step_factory.d.ts +95 -0
  28. package/dist/agents/real_step_factory.d.ts.map +1 -0
  29. package/dist/agents/real_step_factory.js +51 -0
  30. package/dist/agents/real_step_factory.js.map +1 -0
  31. package/dist/agents/runner.d.ts +14 -0
  32. package/dist/agents/runner.d.ts.map +1 -1
  33. package/dist/agents/runner.js +10 -1
  34. package/dist/agents/runner.js.map +1 -1
  35. package/dist/agents/runtime.d.ts +115 -0
  36. package/dist/agents/runtime.d.ts.map +1 -0
  37. package/dist/agents/runtime.js +429 -0
  38. package/dist/agents/runtime.js.map +1 -0
  39. package/dist/agents/system_prompt.d.ts +36 -0
  40. package/dist/agents/system_prompt.d.ts.map +1 -0
  41. package/dist/agents/system_prompt.js +101 -0
  42. package/dist/agents/system_prompt.js.map +1 -0
  43. package/dist/agents/types.d.ts +12 -1
  44. package/dist/agents/types.d.ts.map +1 -1
  45. package/dist/agents/types.js.map +1 -1
  46. package/dist/bin/yf.d.ts.map +1 -1
  47. package/dist/bin/yf.js +9 -0
  48. package/dist/bin/yf.js.map +1 -1
  49. package/dist/chat/claude_cli.d.ts +42 -0
  50. package/dist/chat/claude_cli.d.ts.map +1 -0
  51. package/dist/chat/claude_cli.js +299 -0
  52. package/dist/chat/claude_cli.js.map +1 -0
  53. package/dist/chat/graph_snapshot.d.ts +38 -0
  54. package/dist/chat/graph_snapshot.d.ts.map +1 -0
  55. package/dist/chat/graph_snapshot.js +159 -0
  56. package/dist/chat/graph_snapshot.js.map +1 -0
  57. package/dist/chat/ingest_session.d.ts +24 -4
  58. package/dist/chat/ingest_session.d.ts.map +1 -1
  59. package/dist/chat/ingest_session.js +139 -4
  60. package/dist/chat/ingest_session.js.map +1 -1
  61. package/dist/chat/panel.d.ts.map +1 -1
  62. package/dist/chat/panel.js +1358 -0
  63. package/dist/chat/panel.js.map +1 -1
  64. package/dist/chat/server.d.ts +21 -0
  65. package/dist/chat/server.d.ts.map +1 -1
  66. package/dist/chat/server.js +904 -4
  67. package/dist/chat/server.js.map +1 -1
  68. package/dist/chat/tools/nac3_invoke.d.ts +5 -0
  69. package/dist/chat/tools/nac3_invoke.d.ts.map +1 -1
  70. package/dist/chat/tools/nac3_invoke.js +1 -0
  71. package/dist/chat/tools/nac3_invoke.js.map +1 -1
  72. package/dist/chat/tools.d.ts.map +1 -1
  73. package/dist/chat/tools.js +12 -0
  74. package/dist/chat/tools.js.map +1 -1
  75. package/dist/commands/agent.d.ts +12 -1
  76. package/dist/commands/agent.d.ts.map +1 -1
  77. package/dist/commands/agent.js +92 -1
  78. package/dist/commands/agent.js.map +1 -1
  79. package/dist/commands/chat.d.ts +10 -0
  80. package/dist/commands/chat.d.ts.map +1 -1
  81. package/dist/commands/chat.js +12 -1
  82. package/dist/commands/chat.js.map +1 -1
  83. package/dist/commands/director.d.ts +37 -0
  84. package/dist/commands/director.d.ts.map +1 -0
  85. package/dist/commands/director.js +290 -0
  86. package/dist/commands/director.js.map +1 -0
  87. package/dist/core/pilot_setup.d.ts +14 -1
  88. package/dist/core/pilot_setup.d.ts.map +1 -1
  89. package/dist/core/pilot_setup.js +62 -1
  90. package/dist/core/pilot_setup.js.map +1 -1
  91. package/dist/design/yujin_design_resolver.d.ts +77 -0
  92. package/dist/design/yujin_design_resolver.d.ts.map +1 -0
  93. package/dist/design/yujin_design_resolver.js +113 -0
  94. package/dist/design/yujin_design_resolver.js.map +1 -0
  95. package/dist/docs/doctrine/default-design-system.md +120 -0
  96. package/dist/docs/doctrine/language-sovereignty.md +143 -0
  97. package/dist/docs/doctrine/testing-policy.md +211 -0
  98. package/dist/nac3/approval_queue.d.ts +8 -0
  99. package/dist/nac3/approval_queue.d.ts.map +1 -1
  100. package/dist/nac3/approval_queue.js.map +1 -1
  101. package/dist/nac3/internal_manifest.d.ts.map +1 -1
  102. package/dist/nac3/internal_manifest.js +178 -0
  103. package/dist/nac3/internal_manifest.js.map +1 -1
  104. package/dist/office/excel.d.ts +22 -0
  105. package/dist/office/excel.d.ts.map +1 -1
  106. package/dist/office/excel.js +82 -0
  107. package/dist/office/excel.js.map +1 -1
  108. package/dist/qa/brain_matrix/fixtures/scenario_a11y_focus_after_open.json +22 -0
  109. package/dist/qa/brain_matrix/fixtures/scenario_a11y_label_unlabeled_button.json +26 -0
  110. package/dist/qa/brain_matrix/fixtures/scenario_agent_director_consults_workflow_before_dispatch.json +42 -0
  111. package/dist/qa/brain_matrix/fixtures/scenario_analyst_extracts_then_returns.json +28 -0
  112. package/dist/qa/brain_matrix/fixtures/scenario_coder_consults_nac_spec_before_writing.json +28 -0
  113. package/dist/qa/brain_matrix/fixtures/scenario_default_design_system_override_shadcn.json +45 -0
  114. package/dist/qa/brain_matrix/fixtures/scenario_default_design_system_use_card_template.json +44 -0
  115. package/dist/qa/brain_matrix/fixtures/scenario_director_delegates_to_analyst.json +26 -0
  116. package/dist/qa/brain_matrix/fixtures/scenario_director_no_self_delegation.json +20 -0
  117. package/dist/qa/brain_matrix/fixtures/scenario_director_terminal_done_marker.json +19 -0
  118. package/dist/qa/brain_matrix/fixtures/scenario_doctrine_discover_default_design_system.json +50 -0
  119. package/dist/qa/brain_matrix/fixtures/scenario_doctrine_discover_language_sovereignty.json +53 -0
  120. package/dist/qa/brain_matrix/fixtures/scenario_doctrine_discover_testing_policy.json +55 -0
  121. package/dist/qa/brain_matrix/fixtures/scenario_language_sovereignty_not_conducive_spa_python.json +61 -0
  122. package/dist/qa/brain_matrix/fixtures/scenario_language_sovereignty_user_picks_python.json +48 -0
  123. package/dist/qa/brain_matrix/fixtures/scenario_mcp_invoke_destructive_pauses_for_r8.json +42 -0
  124. package/dist/qa/brain_matrix/fixtures/scenario_mcp_invoke_happy_path_writes_pizarron.json +76 -0
  125. package/dist/qa/brain_matrix/fixtures/scenario_mcp_invoke_network_timeout_graceful.json +41 -0
  126. package/dist/qa/brain_matrix/fixtures/scenario_no_hardcoded_color_use_token.json +47 -0
  127. package/dist/qa/brain_matrix/fixtures/scenario_office_excel_update_cell_picks_right_verb.json +26 -0
  128. package/dist/qa/brain_matrix/fixtures/scenario_scaffolder_destructive_pauses_for_approval.json +23 -0
  129. package/dist/qa/brain_matrix/fixtures/scenario_sumie_icon_pick_from_catalog.json +56 -0
  130. package/dist/qa/brain_matrix/fixtures/scenario_tester_uses_shell_exec_only.json +27 -0
  131. package/dist/version.d.ts +1 -1
  132. package/dist/version.js +1 -1
  133. package/dist/workflow/graph.d.ts +59 -0
  134. package/dist/workflow/graph.d.ts.map +1 -0
  135. package/dist/workflow/graph.js +137 -0
  136. package/dist/workflow/graph.js.map +1 -0
  137. package/dist/workflow/state.d.ts +34 -0
  138. package/dist/workflow/state.d.ts.map +1 -1
  139. package/dist/workflow/state.js.map +1 -1
  140. package/docs/doctrine/default-design-system.md +120 -0
  141. package/docs/doctrine/language-sovereignty.md +143 -0
  142. package/docs/doctrine/testing-policy.md +211 -0
  143. package/package.json +102 -100
  144. package/src/i18n/catalogs/ar.json +20 -1
  145. package/src/i18n/catalogs/de.json +20 -1
  146. package/src/i18n/catalogs/en.json +20 -21
  147. package/src/i18n/catalogs/es.json +20 -21
  148. package/src/i18n/catalogs/fr.json +20 -1
  149. package/src/i18n/catalogs/hi.json +20 -1
  150. package/src/i18n/catalogs/it.json +20 -1
  151. package/src/i18n/catalogs/ja.json +20 -1
  152. package/src/i18n/catalogs/pt.json +20 -1
  153. package/src/i18n/catalogs/zh.json +20 -1
  154. package/templates/sumi-context.template.md +57 -0
@@ -0,0 +1,37 @@
1
+ /**
2
+ * `yf director <spec>` (Director closure pendiente 2).
3
+ *
4
+ * Single-entry CLI that combines:
5
+ * 1. Spec ingest (read file -> recordIngest).
6
+ * 2. Director dispatch (via runAgent + factory or stub).
7
+ *
8
+ * Without --real: ingests + reports doc_id (smoke).
9
+ * With --real: also dispatches the live LLM step.
10
+ *
11
+ * Supported file formats: txt + md as plain UTF-8. Other formats
12
+ * (pdf, docx) follow-up via the reader registry.
13
+ *
14
+ * ASCII-only.
15
+ */
16
+ import type { Command } from 'commander';
17
+ import { type StepFn } from '../agents/runner.js';
18
+ import type { AgentDefinition } from '../agents/types.js';
19
+ import { type Runtime } from '../agents/runtime.js';
20
+ export interface RegisterDirectorCommandDeps {
21
+ makeRealStep?: (opts: {
22
+ def: AgentDefinition;
23
+ trigger_reason: string;
24
+ project_root: string;
25
+ project_name: string;
26
+ forge_version: string;
27
+ /** Yuemail-dogfood fix #7: pass a Runtime so the Director's
28
+ * yujin.agent.delegate calls reach delegateToAgent + dispatch
29
+ * the target agent. Without this, the delegate callback in
30
+ * real_step_factory.ts stays undefined and every delegate
31
+ * invocation falls back to runNac3Invoke, which has no
32
+ * handler for agent.delegate and returns err. */
33
+ runtime?: Runtime;
34
+ }) => Promise<StepFn>;
35
+ }
36
+ export declare function registerDirectorCommand(program: Command, deps?: RegisterDirectorCommandDeps): void;
37
+ //# sourceMappingURL=director.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"director.d.ts","sourceRoot":"","sources":["../../src/commands/director.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKzC,OAAO,EAAY,KAAK,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAE5D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAE1D,OAAO,EAAiB,KAAK,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAEnE,MAAM,WAAW,2BAA2B;IAC1C,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE;QACpB,GAAG,EAAa,eAAe,CAAC;QAChC,cAAc,EAAE,MAAM,CAAC;QACvB,YAAY,EAAI,MAAM,CAAC;QACvB,YAAY,EAAI,MAAM,CAAC;QACvB,aAAa,EAAG,MAAM,CAAC;QACvB;;;;;0DAKkD;QAClD,OAAO,CAAC,EAAQ,OAAO,CAAC;KACzB,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;CACvB;AAsED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,GAAE,2BAAgC,GAAG,IAAI,CAgNtG"}
@@ -0,0 +1,290 @@
1
+ import { promises as fs } from 'node:fs';
2
+ import path from 'node:path';
3
+ import crypto from 'node:crypto';
4
+ import { getAgentDefinition } from '../agents/store.js';
5
+ import { runAgent } from '../agents/runner.js';
6
+ import { recordIngest } from '../chat/ingest_session.js';
7
+ import { createRuntime } from '../agents/runtime.js';
8
+ function fileExtToFormat(filename) {
9
+ const ext = path.extname(filename).toLowerCase();
10
+ if (ext === '.md' || ext === '.markdown')
11
+ return 'markdown';
12
+ if (ext === '.txt')
13
+ return 'markdown'; /* parse as markdown */
14
+ if (ext === '.pdf')
15
+ return 'pdf';
16
+ if (ext === '.docx')
17
+ return 'docx';
18
+ return 'markdown'; /* best-effort default */
19
+ }
20
+ function buildDocFromText(filename, text) {
21
+ /* deterministic doc_id from file content -- 8-char sha1 hex slug. */
22
+ const hash = crypto.createHash('sha1').update(filename + ':' + text).digest('hex').slice(0, 12);
23
+ const slug = path.basename(filename).replace(/[^a-zA-Z0-9._-]/g, '-').slice(0, 60);
24
+ const id = slug + '-' + hash;
25
+ /* Split into sections per top-level heading. Fallback: one
26
+ * section with the whole text as a single paragraph block. */
27
+ const lines = text.split(/\r?\n/);
28
+ const sections = [];
29
+ let curHeading = '';
30
+ let curLevel = 0;
31
+ let curBlocks = [];
32
+ let sectionIdx = 0;
33
+ function flush() {
34
+ if (curBlocks.length === 0 && !curHeading)
35
+ return;
36
+ sections.push({
37
+ id: 'sec-' + sectionIdx,
38
+ heading: curHeading,
39
+ level: curLevel,
40
+ blocks: curBlocks.length > 0
41
+ ? curBlocks.map((b) => ({ kind: 'paragraph', text: b }))
42
+ : [],
43
+ });
44
+ sectionIdx += 1;
45
+ curHeading = '';
46
+ curLevel = 0;
47
+ curBlocks = [];
48
+ }
49
+ for (const l of lines) {
50
+ const m = /^(#{1,6})\s+(.+)$/.exec(l.trim());
51
+ if (m) {
52
+ flush();
53
+ curHeading = m[2].trim();
54
+ curLevel = m[1].length;
55
+ continue;
56
+ }
57
+ if (l.trim().length > 0) {
58
+ curBlocks.push(l.trim());
59
+ }
60
+ else if (curBlocks.length > 0) {
61
+ /* blank line -> next paragraph boundary; leave for next non-blank. */
62
+ }
63
+ }
64
+ flush();
65
+ if (sections.length === 0) {
66
+ sections.push({
67
+ id: 'sec-0', heading: '', level: 0,
68
+ blocks: [{ kind: 'paragraph', text }],
69
+ });
70
+ }
71
+ return {
72
+ id,
73
+ filename: path.basename(filename),
74
+ format: fileExtToFormat(filename),
75
+ bytes: Buffer.byteLength(text, 'utf-8'),
76
+ title: sections[0].heading || path.basename(filename),
77
+ sections,
78
+ };
79
+ }
80
+ export function registerDirectorCommand(program, deps = {}) {
81
+ program.command('director')
82
+ .description('Single-entry orchestrator: ingest a spec + dispatch the Director. Default is a smoke run (ingest only). Pass --real to fire the live LLM step.')
83
+ .argument('<spec>', 'path to a spec file (.md / .txt; pdf/docx follow-up)')
84
+ .option('--reason <r>', 'override the auto-generated trigger reason')
85
+ .option('--real', 'use the real LLM step (slice 15e factory) -- requires anthropic_api_key')
86
+ .option('--json', 'emit JSON instead of human-readable summary')
87
+ .action(async (specPath, opts) => {
88
+ /* Step 1: read + ingest the spec. */
89
+ let text;
90
+ try {
91
+ text = await fs.readFile(path.resolve(specPath), 'utf-8');
92
+ }
93
+ catch (err) {
94
+ const msg = err instanceof Error ? err.message : String(err);
95
+ console.error('Failed to read spec at ' + JSON.stringify(specPath) + ': ' + msg);
96
+ process.exitCode = 1;
97
+ return;
98
+ }
99
+ const doc = buildDocFromText(specPath, text);
100
+ const session = recordIngest(doc);
101
+ /* Yuemail-dogfood fix #17: include the spec content in the
102
+ * Director's trigger_reason so the LLM has the actual
103
+ * requirements in its first turn. Without this, the
104
+ * Director only sees "spec doc_id=..." + the CLI --reason
105
+ * flag and starts asking the operator for a spec instead
106
+ * of delegating. The doc_id reference is kept in the
107
+ * header so the Director can quote it when delegating. */
108
+ const userReason = opts.reason || '';
109
+ const triggerReason = '## Task: orchestrate the implementation of the following spec.\n'
110
+ + (userReason ? ('Operator note: ' + userReason + '\n\n') : '\n')
111
+ + 'Spec doc_id: ' + session.doc_id + '\n'
112
+ + 'Spec path: ' + specPath + '\n\n'
113
+ + '--- BEGIN SPEC ---\n'
114
+ + text
115
+ + '\n--- END SPEC ---\n\n'
116
+ + 'Per your YUEMAIL-DOGFOOD MANDATE: your first tool call MUST be '
117
+ + 'yujin.agent.delegate({to_slug:"analyst", payload:<the spec above + "extract structured plan + tdd_first flag">, tokens_used:<n>}). '
118
+ + 'Do NOT ask the operator for a spec -- it is included verbatim above.';
119
+ /* Step 2: ensure the Director is registered. */
120
+ const def = await getAgentDefinition('director');
121
+ if (!def) {
122
+ console.error('Director agent is not installed. Run `yf agent install --defaults` first.');
123
+ process.exitCode = 1;
124
+ return;
125
+ }
126
+ /* Step 3: dispatch the Director. */
127
+ let stepFn;
128
+ let runtimeForDelegate;
129
+ if (opts.real) {
130
+ /* Yuemail-dogfood fix #7 + #12 + #13: construct a
131
+ * Runtime up-front so yujin.agent.delegate has a
132
+ * dispatcher to call. The default runner adapter inside
133
+ * runtime.ts passes (slug, reason) to runAgent, which
134
+ * expects (def, opts) -- so sub-agents end up running
135
+ * with a broken adapter, the run fails immediately, and
136
+ * the Director sees ok=false from the delegate.
137
+ *
138
+ * Fix #12: inject a runner that, given a slug, loads
139
+ * the agent definition + builds a real LLM step via
140
+ * makeRealStep + runs the agent through runAgent with
141
+ * the correct shape. This is what makes a delegated
142
+ * Analyst / Coder / Tester / Scaffolder run with the
143
+ * actual Claude API instead of a no-op stub.
144
+ *
145
+ * Fix #13: actually CALL start() on the runtime. The
146
+ * initial Fix #7 comment said "no start() needed for
147
+ * one-shot CLI" which was wrong: runtime.ts:325 and
148
+ * :413 throw "runtime not started -- call start() first"
149
+ * inside dispatchAgent + dispatchAgentSoft if running is
150
+ * false. Without start(), every delegate raises that
151
+ * error and the Director falls back to inline. */
152
+ const projectCwd = process.cwd();
153
+ runtimeForDelegate = createRuntime({
154
+ runner: async (subSlug, subReason) => {
155
+ const subDef = await getAgentDefinition(subSlug);
156
+ if (!subDef) {
157
+ throw new Error('delegate target agent not installed: ' + subSlug);
158
+ }
159
+ const { makeRealStep } = await import('../agents/cli_real.js');
160
+ const subStep = await makeRealStep({
161
+ def: subDef,
162
+ trigger_reason: subReason,
163
+ project_root: projectCwd,
164
+ project_name: 'Director CLI (delegate)',
165
+ forge_version: 'cli',
166
+ /* The sub-agent does not own a sub-runtime; it
167
+ * is a leaf in this dispatch path. If a sub-
168
+ * agent itself invokes agent.delegate, that
169
+ * call will go through runtime.dispatchAgent
170
+ * on the SAME runtime instance -- so the
171
+ * director's runtime is sufficient for the
172
+ * whole tree. */
173
+ runtime: runtimeForDelegate,
174
+ });
175
+ const { runAgent } = await import('../agents/runner.js');
176
+ return runAgent(subDef, {
177
+ trigger_kind: 'manual',
178
+ trigger_reason: subReason,
179
+ step: subStep,
180
+ persist: true,
181
+ /* Cap sub-agents at 20 iterations -- same as the
182
+ * Director itself. Prevents a single delegated
183
+ * worker from runawaying the budget. */
184
+ max_iterations: 50,
185
+ });
186
+ },
187
+ });
188
+ /* Yuemail-dogfood fix #13: start the runtime BEFORE the
189
+ * director step is built. runtime.ts gates dispatchAgent
190
+ * on `running` and throws "runtime not started" if it
191
+ * is invoked before start(). The dispatch loop is on a
192
+ * setTimeout that unrefs itself, so node will still
193
+ * exit cleanly when stop() is called at the end. */
194
+ runtimeForDelegate.start();
195
+ const builder = deps.makeRealStep ?? (async (args) => {
196
+ const { makeRealStep } = await import('../agents/cli_real.js');
197
+ return makeRealStep({
198
+ def: args.def,
199
+ trigger_reason: args.trigger_reason,
200
+ project_root: args.project_root,
201
+ project_name: args.project_name,
202
+ forge_version: args.forge_version,
203
+ ...(args.runtime ? { runtime: args.runtime } : {}),
204
+ /* Yuemail-dogfood fix #18: 8192 cap for the Director.
205
+ * The spec inlined in trigger_reason (~9 KB) + graph
206
+ * snapshot + R-strict mandate + system prompt easily
207
+ * burn the 4096 default on a single turn of textual
208
+ * acknowledgement before the LLM emits its first
209
+ * tool_use block. Sub-agents stay at the default. */
210
+ max_tokens: 8192,
211
+ });
212
+ });
213
+ try {
214
+ stepFn = await builder({
215
+ def, trigger_reason: triggerReason,
216
+ project_root: process.cwd(), project_name: 'Director CLI', forge_version: 'cli',
217
+ ...(runtimeForDelegate ? { runtime: runtimeForDelegate } : {}),
218
+ });
219
+ }
220
+ catch (err) {
221
+ const msg = err instanceof Error ? err.message : String(err);
222
+ console.error('Failed to build real LLM step: ' + msg);
223
+ if (err && typeof err === 'object' && err.code === 'no_claude_key') {
224
+ console.error('');
225
+ console.error('Tip: run `yf keys setup --provider anthropic --key <KEY>` to load a key.');
226
+ }
227
+ process.exitCode = 1;
228
+ return;
229
+ }
230
+ }
231
+ else {
232
+ stepFn = async () => ({
233
+ text: 'cli stub: ingest of "' + session.doc_id + '" recorded. Pass --real to dispatch Claude.',
234
+ tokens_in: 0, tokens_out: 0, tool_calls: 0, done: true,
235
+ });
236
+ }
237
+ const run = await runAgent(def, {
238
+ trigger_kind: 'manual',
239
+ trigger_reason: triggerReason,
240
+ step: stepFn,
241
+ persist: true,
242
+ /* alpha.59z.156 E2E lesson -- the runner default
243
+ * max_iterations=100 lets a chatty Director burn ~200k
244
+ * tokens / >$5 before any human notices. Cap at 20 for
245
+ * the CLI single-entry path; users running through the
246
+ * panel keep the original 100 via runtime.dispatchAgent
247
+ * which doesn't override this.
248
+ *
249
+ * Yuemail-dogfood fix #19: cap raised from 20 -> 40.
250
+ * Sprint #10 exit-2'd at iter 20 with 27 tool calls and
251
+ * an in-flight scaffolder roundtrip. A full TDD cycle
252
+ * needs ~5 delegates per slice (analyst once + 3 slices
253
+ * x [coder, scaffolder, tester]) so 20 is a hair short.
254
+ * 40 still bounds blast radius -- at ~$0.4/iter via fix
255
+ * #20 loop discipline, max sprint cost is ~$16. */
256
+ max_iterations: 40,
257
+ });
258
+ if (opts.json) {
259
+ console.log(JSON.stringify({ doc_id: session.doc_id, run }, null, 2));
260
+ process.exitCode = run.status === 'succeeded' ? 0 : 2;
261
+ return;
262
+ }
263
+ console.log('Spec ingested:');
264
+ console.log(' Doc ID: ' + session.doc_id);
265
+ console.log(' Title: ' + doc.title);
266
+ console.log(' Sections: ' + doc.sections.length);
267
+ console.log(' Bytes: ' + doc.bytes);
268
+ console.log('');
269
+ console.log('Director run:');
270
+ console.log(' Run ID: ' + run.id);
271
+ console.log(' Status: ' + run.status + (run.kill_reason ? ' (' + run.kill_reason + ')' : ''));
272
+ console.log(' Trigger: ' + run.trigger_reason);
273
+ console.log(' Tokens: in=' + run.tokens_in + ' out=' + run.tokens_out);
274
+ console.log(' Tool calls: ' + run.tool_calls);
275
+ if (run.last_reply_summary) {
276
+ console.log(' Last reply: ' + run.last_reply_summary);
277
+ }
278
+ /* Yuemail-dogfood fix #13: stop the runtime we started so
279
+ * node can exit cleanly without waiting for the (unref'd)
280
+ * tick timer to drain. Best-effort -- never throw. */
281
+ if (runtimeForDelegate) {
282
+ try {
283
+ await runtimeForDelegate.stop();
284
+ }
285
+ catch { /* ignore */ }
286
+ }
287
+ process.exitCode = run.status === 'succeeded' ? 0 : 2;
288
+ });
289
+ }
290
+ //# sourceMappingURL=director.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"director.js","sourceRoot":"","sources":["../../src/commands/director.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,22 @@
1
+ export declare function detectExistingProject(projectRoot: string): Promise<boolean>;
1
2
  export interface PilotSetupState {
2
3
  pilot_completed: boolean;
3
4
  target_pending: boolean;
4
5
  mode_pending: boolean;
5
6
  }
6
- /** Read the current pilot setup state. */
7
+ /** Read the current pilot setup state.
8
+ *
9
+ * Three branches:
10
+ * 1. `yujin.forge.json` exists -> trust the persisted `pilot_completed`.
11
+ * 2. No `yujin.forge.json`, but workspace IS an existing project (has
12
+ * `package.json`/`Cargo.toml`/etc) -> auto-skip warmup
13
+ * (`pilot_completed: true`). The user is opening Forge against a
14
+ * real codebase and wants Forge to start by discovering it, not
15
+ * by asking target/mode.
16
+ * 3. No `yujin.forge.json` and workspace is empty / greenfield ->
17
+ * trigger the warmup prompt (`pilot_completed: false`). This is
18
+ * the `yf new` path.
19
+ */
7
20
  export declare function readPilotState(projectRoot: string): Promise<PilotSetupState>;
8
21
  /** Mark Pilot setup as completed (also bumps the persisted
9
22
  * yujin.forge.json with default values if any are missing). */
@@ -1 +1 @@
1
- {"version":3,"file":"pilot_setup.d.ts","sourceRoot":"","sources":["../../src/core/pilot_setup.ts"],"names":[],"mappings":"AAwBA,MAAM,WAAW,eAAe;IAC9B,eAAe,EAAE,OAAO,CAAC;IACzB,cAAc,EAAG,OAAO,CAAC;IACzB,YAAY,EAAK,OAAO,CAAC;CAC1B;AAED,0CAA0C;AAC1C,wBAAsB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAgBlF;AAED;gEACgE;AAChE,wBAAsB,kBAAkB,CACtC,WAAW,EAAE,MAAM,EACnB,QAAQ,GAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAO,GAChD,OAAO,CAAC,IAAI,CAAC,CAef;AAED;;gCAEgC;AAChC,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM,CAqBlE;AAED;;;;;;2DAM2D;AAC3D,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,eAAe,EACtB,WAAW,EAAE,MAAM,GAClB;IAAE,QAAQ,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,UAAU,GAAG,WAAW,GAAG,SAAS,CAAA;CAAE,CAkBrE"}
1
+ {"version":3,"file":"pilot_setup.d.ts","sourceRoot":"","sources":["../../src/core/pilot_setup.ts"],"names":[],"mappings":"AAyDA,wBAAsB,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAUjF;AAED,MAAM,WAAW,eAAe;IAC9B,eAAe,EAAE,OAAO,CAAC;IACzB,cAAc,EAAG,OAAO,CAAC;IACzB,YAAY,EAAK,OAAO,CAAC;CAC1B;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAqBlF;AAED;gEACgE;AAChE,wBAAsB,kBAAkB,CACtC,WAAW,EAAE,MAAM,EACnB,QAAQ,GAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAO,GAChD,OAAO,CAAC,IAAI,CAAC,CAef;AAED;;gCAEgC;AAChC,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM,CAqBlE;AAED;;;;;;2DAM2D;AAC3D,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,eAAe,EACtB,WAAW,EAAE,MAAM,GAClB;IAAE,QAAQ,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,UAAU,GAAG,WAAW,GAAG,SAAS,CAAA;CAAE,CAkBrE"}
@@ -20,7 +20,63 @@
20
20
  import { promises as fs } from 'node:fs';
21
21
  import path from 'node:path';
22
22
  const CONFIG = 'yujin.forge.json';
23
- /** Read the current pilot setup state. */
23
+ /** Heuristic: detect whether `projectRoot` already contains an
24
+ * existing project. If it does, we skip the first-run Pilot setup
25
+ * (target/mode questions) because they are not relevant when the
26
+ * user is opening Forge against an existing codebase (bug fix,
27
+ * refactor, deploy, code review, doc gen, etc).
28
+ *
29
+ * An "existing project" is detected by the presence of ANY of the
30
+ * common dependency manifest files. Greenfield workspaces (empty
31
+ * dir or just a prompt.txt) do NOT match, so they still get the
32
+ * pilot setup -- preserving the F-series default for `yf new`.
33
+ *
34
+ * Added 2026-06-06 after the behavior-matrix run revealed that
35
+ * cloned existing repos were being misclassified as greenfield and
36
+ * intercepted by the warmup template, yielding "warmup-only" turns
37
+ * where Forge promised to read the codebase but only asked the two
38
+ * questions instead. */
39
+ const PROJECT_INDICATORS = [
40
+ 'package.json',
41
+ 'pyproject.toml',
42
+ 'requirements.txt',
43
+ 'Cargo.toml',
44
+ 'go.mod',
45
+ 'composer.json',
46
+ 'Gemfile',
47
+ 'mix.exs',
48
+ 'pom.xml',
49
+ 'build.gradle',
50
+ 'build.gradle.kts',
51
+ 'CMakeLists.txt',
52
+ 'Makefile',
53
+ 'pubspec.yaml',
54
+ ];
55
+ export async function detectExistingProject(projectRoot) {
56
+ for (const indicator of PROJECT_INDICATORS) {
57
+ try {
58
+ await fs.access(path.join(projectRoot, indicator));
59
+ return true;
60
+ }
61
+ catch {
62
+ /* try next */
63
+ }
64
+ }
65
+ return false;
66
+ }
67
+ /** Read the current pilot setup state.
68
+ *
69
+ * Three branches:
70
+ * 1. `yujin.forge.json` exists -> trust the persisted `pilot_completed`.
71
+ * 2. No `yujin.forge.json`, but workspace IS an existing project (has
72
+ * `package.json`/`Cargo.toml`/etc) -> auto-skip warmup
73
+ * (`pilot_completed: true`). The user is opening Forge against a
74
+ * real codebase and wants Forge to start by discovering it, not
75
+ * by asking target/mode.
76
+ * 3. No `yujin.forge.json` and workspace is empty / greenfield ->
77
+ * trigger the warmup prompt (`pilot_completed: false`). This is
78
+ * the `yf new` path.
79
+ */
24
80
  export async function readPilotState(projectRoot) {
25
81
  try {
26
82
  const raw = await fs.readFile(path.join(projectRoot, CONFIG), 'utf-8');
@@ -36,6 +92,11 @@ export async function readPilotState(projectRoot) {
36
92
  };
37
93
  }
38
94
  catch {
95
+ /* No config file. Decide between greenfield and existing-project. */
96
+ const existing = await detectExistingProject(projectRoot);
97
+ if (existing) {
98
+ return { pilot_completed: true, target_pending: false, mode_pending: false };
99
+ }
39
100
  return { pilot_completed: false, target_pending: true, mode_pending: true };
40
101
  }
41
102
  }
@@ -1 +1 @@
1
- {"version":3,"file":"pilot_setup.js","sourceRoot":"","sources":["../../src/core/pilot_setup.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"pilot_setup.js","sourceRoot":"","sources":["../../src/core/pilot_setup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,77 @@
1
+ export interface DesignManifest {
2
+ name: string;
3
+ version: string;
4
+ description: string;
5
+ tokens: {
6
+ file: string;
7
+ format: string;
8
+ css: string;
9
+ count: number;
10
+ };
11
+ components: {
12
+ dir: string;
13
+ index: string;
14
+ count: number;
15
+ format: string;
16
+ };
17
+ icons: {
18
+ sumie: {
19
+ dir: string;
20
+ index: string;
21
+ count: number;
22
+ format: string;
23
+ tags: string[];
24
+ };
25
+ kanji: {
26
+ wordmarks: Record<string, string>;
27
+ single_chars: Record<string, string>;
28
+ };
29
+ };
30
+ fonts: {
31
+ primary: {
32
+ family: string;
33
+ source: string;
34
+ url: string;
35
+ };
36
+ japanese: {
37
+ family: string;
38
+ source: string;
39
+ url: string;
40
+ };
41
+ monospace: {
42
+ family: string;
43
+ source: string;
44
+ url: string;
45
+ };
46
+ policy: string;
47
+ };
48
+ }
49
+ export interface ComponentTemplate {
50
+ slug: string;
51
+ category: string;
52
+ nac3_id: string;
53
+ description: string;
54
+ html: string;
55
+ css: string;
56
+ variants: string[];
57
+ props: string[];
58
+ token_refs: string[];
59
+ sumie_icon_hint: string | null;
60
+ }
61
+ export interface SumieIcon {
62
+ slug: string;
63
+ tags: string[];
64
+ file: string;
65
+ }
66
+ export interface ResolverOpts {
67
+ /** Override the package root for tests. */
68
+ dir?: string;
69
+ }
70
+ export declare function getManifest(opts?: ResolverOpts): Promise<DesignManifest | null>;
71
+ export declare function listTemplates(opts?: ResolverOpts): Promise<ComponentTemplate[]>;
72
+ export declare function getTemplate(slug: string, opts?: ResolverOpts): Promise<ComponentTemplate | null>;
73
+ export declare function getTokens(opts?: ResolverOpts): Promise<unknown | null>;
74
+ export declare function listSumie(filterTag: string | null, opts?: ResolverOpts): Promise<SumieIcon[]>;
75
+ export declare function getSumieSvg(slug: string, opts?: ResolverOpts): Promise<string | null>;
76
+ export declare function _resetDesignCacheForTests(): void;
77
+ //# sourceMappingURL=yujin_design_resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"yujin_design_resolver.d.ts","sourceRoot":"","sources":["../../src/design/yujin_design_resolver.ts"],"names":[],"mappings":"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"}