@nac3/forge-cli 0.2.0-alpha.3 → 0.2.0-alpha.31

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 (166) hide show
  1. package/dist/bin/yf.d.ts.map +1 -1
  2. package/dist/bin/yf.js +27 -0
  3. package/dist/bin/yf.js.map +1 -1
  4. package/dist/chat/claude.d.ts +22 -15
  5. package/dist/chat/claude.d.ts.map +1 -1
  6. package/dist/chat/claude.js +75 -22
  7. package/dist/chat/claude.js.map +1 -1
  8. package/dist/chat/panel.d.ts.map +1 -1
  9. package/dist/chat/panel.js +791 -17
  10. package/dist/chat/panel.js.map +1 -1
  11. package/dist/chat/server.js +734 -32
  12. package/dist/chat/server.js.map +1 -1
  13. package/dist/chat/spec_extract.d.ts.map +1 -1
  14. package/dist/chat/spec_extract.js +39 -0
  15. package/dist/chat/spec_extract.js.map +1 -1
  16. package/dist/chat/tools/audit_consumers.d.ts +66 -0
  17. package/dist/chat/tools/audit_consumers.d.ts.map +1 -0
  18. package/dist/chat/tools/audit_consumers.js +231 -0
  19. package/dist/chat/tools/audit_consumers.js.map +1 -0
  20. package/dist/chat/tools/git.js +4 -4
  21. package/dist/chat/tools/github.js +3 -3
  22. package/dist/chat/tools/keys.d.ts +9 -0
  23. package/dist/chat/tools/keys.d.ts.map +1 -0
  24. package/dist/chat/tools/keys.js +194 -0
  25. package/dist/chat/tools/keys.js.map +1 -0
  26. package/dist/chat/tools/lifecycle.js +3 -3
  27. package/dist/chat/tools/manual.js +1 -1
  28. package/dist/chat/tools/reader.js +8 -8
  29. package/dist/chat/tools/workflow.d.ts +45 -0
  30. package/dist/chat/tools/workflow.d.ts.map +1 -0
  31. package/dist/chat/tools/workflow.js +404 -0
  32. package/dist/chat/tools/workflow.js.map +1 -0
  33. package/dist/chat/tools.d.ts.map +1 -1
  34. package/dist/chat/tools.js +31 -4
  35. package/dist/chat/tools.js.map +1 -1
  36. package/dist/commands/approve.d.ts +32 -0
  37. package/dist/commands/approve.d.ts.map +1 -0
  38. package/dist/commands/approve.js +198 -0
  39. package/dist/commands/approve.js.map +1 -0
  40. package/dist/commands/block.d.ts +28 -0
  41. package/dist/commands/block.d.ts.map +1 -0
  42. package/dist/commands/block.js +189 -0
  43. package/dist/commands/block.js.map +1 -0
  44. package/dist/commands/bootstrap.d.ts +35 -0
  45. package/dist/commands/bootstrap.d.ts.map +1 -0
  46. package/dist/commands/bootstrap.js +205 -0
  47. package/dist/commands/bootstrap.js.map +1 -0
  48. package/dist/commands/chat.d.ts +3 -0
  49. package/dist/commands/chat.d.ts.map +1 -1
  50. package/dist/commands/chat.js +46 -1
  51. package/dist/commands/chat.js.map +1 -1
  52. package/dist/commands/clarify.d.ts +30 -0
  53. package/dist/commands/clarify.d.ts.map +1 -0
  54. package/dist/commands/clarify.js +671 -0
  55. package/dist/commands/clarify.js.map +1 -0
  56. package/dist/commands/discover.d.ts +30 -0
  57. package/dist/commands/discover.d.ts.map +1 -0
  58. package/dist/commands/discover.js +178 -0
  59. package/dist/commands/discover.js.map +1 -0
  60. package/dist/commands/doctor.js +94 -42
  61. package/dist/commands/doctor.js.map +1 -1
  62. package/dist/commands/keys_setup.d.ts +53 -0
  63. package/dist/commands/keys_setup.d.ts.map +1 -0
  64. package/dist/commands/keys_setup.js +487 -0
  65. package/dist/commands/keys_setup.js.map +1 -0
  66. package/dist/commands/legacy-audit.d.ts +34 -0
  67. package/dist/commands/legacy-audit.d.ts.map +1 -0
  68. package/dist/commands/legacy-audit.js +270 -0
  69. package/dist/commands/legacy-audit.js.map +1 -0
  70. package/dist/commands/license.d.ts.map +1 -1
  71. package/dist/commands/license.js +41 -0
  72. package/dist/commands/license.js.map +1 -1
  73. package/dist/commands/operate.d.ts +22 -0
  74. package/dist/commands/operate.d.ts.map +1 -0
  75. package/dist/commands/operate.js +523 -0
  76. package/dist/commands/operate.js.map +1 -0
  77. package/dist/commands/spec.d.ts +38 -0
  78. package/dist/commands/spec.d.ts.map +1 -0
  79. package/dist/commands/spec.js +256 -0
  80. package/dist/commands/spec.js.map +1 -0
  81. package/dist/commands/support.d.ts +22 -0
  82. package/dist/commands/support.d.ts.map +1 -0
  83. package/dist/commands/support.js +143 -0
  84. package/dist/commands/support.js.map +1 -0
  85. package/dist/commands/triage.d.ts +34 -0
  86. package/dist/commands/triage.d.ts.map +1 -0
  87. package/dist/commands/triage.js +228 -0
  88. package/dist/commands/triage.js.map +1 -0
  89. package/dist/commands/vault-inventory.d.ts +30 -0
  90. package/dist/commands/vault-inventory.d.ts.map +1 -0
  91. package/dist/commands/vault-inventory.js +214 -0
  92. package/dist/commands/vault-inventory.js.map +1 -0
  93. package/dist/commands/vault.d.ts.map +1 -1
  94. package/dist/commands/vault.js +5 -0
  95. package/dist/commands/vault.js.map +1 -1
  96. package/dist/commands/voice.js +1 -1
  97. package/dist/commands/voice.js.map +1 -1
  98. package/dist/commands/workflow-coverage.d.ts +30 -0
  99. package/dist/commands/workflow-coverage.d.ts.map +1 -0
  100. package/dist/commands/workflow-coverage.js +138 -0
  101. package/dist/commands/workflow-coverage.js.map +1 -0
  102. package/dist/core/keys_envelope.d.ts +13 -0
  103. package/dist/core/keys_envelope.d.ts.map +1 -1
  104. package/dist/core/keys_envelope.js.map +1 -1
  105. package/dist/deploy/adapter.d.ts +93 -0
  106. package/dist/deploy/adapter.d.ts.map +1 -0
  107. package/dist/deploy/adapter.js +42 -0
  108. package/dist/deploy/adapter.js.map +1 -0
  109. package/dist/deploy/aws_adapter.d.ts +28 -0
  110. package/dist/deploy/aws_adapter.d.ts.map +1 -0
  111. package/dist/deploy/aws_adapter.js +98 -0
  112. package/dist/deploy/aws_adapter.js.map +1 -0
  113. package/dist/deploy/cloudflare.d.ts +24 -0
  114. package/dist/deploy/cloudflare.d.ts.map +1 -0
  115. package/dist/deploy/cloudflare.js +169 -0
  116. package/dist/deploy/cloudflare.js.map +1 -0
  117. package/dist/license/hito4_client.d.ts +17 -1
  118. package/dist/license/hito4_client.d.ts.map +1 -1
  119. package/dist/license/hito4_client.js +71 -10
  120. package/dist/license/hito4_client.js.map +1 -1
  121. package/dist/license/index.d.ts.map +1 -1
  122. package/dist/license/index.js +7 -0
  123. package/dist/license/index.js.map +1 -1
  124. package/dist/license/sync.d.ts +54 -0
  125. package/dist/license/sync.d.ts.map +1 -0
  126. package/dist/license/sync.js +131 -0
  127. package/dist/license/sync.js.map +1 -0
  128. package/dist/support/reports.d.ts +31 -0
  129. package/dist/support/reports.d.ts.map +1 -0
  130. package/dist/support/reports.js +162 -0
  131. package/dist/support/reports.js.map +1 -0
  132. package/dist/telemetry/usage.d.ts +67 -0
  133. package/dist/telemetry/usage.d.ts.map +1 -0
  134. package/dist/telemetry/usage.js +208 -0
  135. package/dist/telemetry/usage.js.map +1 -0
  136. package/dist/version.d.ts +1 -1
  137. package/dist/version.d.ts.map +1 -1
  138. package/dist/version.js +1 -1
  139. package/dist/version.js.map +1 -1
  140. package/dist/voice/intents.d.ts +1 -1
  141. package/dist/voice/intents.js +0 -0
  142. package/dist/voice/providers/google.d.ts +9 -0
  143. package/dist/voice/providers/google.d.ts.map +1 -1
  144. package/dist/voice/providers/google.js +204 -28
  145. package/dist/voice/providers/google.js.map +1 -1
  146. package/dist/voice/router.d.ts +10 -0
  147. package/dist/voice/router.d.ts.map +1 -1
  148. package/dist/voice/router.js +39 -20
  149. package/dist/voice/router.js.map +1 -1
  150. package/dist/voice/types.d.ts +5 -2
  151. package/dist/voice/types.d.ts.map +1 -1
  152. package/dist/voice/types.js.map +1 -1
  153. package/dist/workflow/state.d.ts +190 -0
  154. package/dist/workflow/state.d.ts.map +1 -0
  155. package/dist/workflow/state.js +119 -0
  156. package/dist/workflow/state.js.map +1 -0
  157. package/package.json +13 -15
  158. package/templates/nextjs-app/README.md +48 -0
  159. package/templates/nextjs-app/next.config.js +8 -0
  160. package/templates/nextjs-app/package.json +33 -0
  161. package/templates/nextjs-app/src/app/globals.css +43 -0
  162. package/templates/nextjs-app/src/app/layout.tsx +29 -0
  163. package/templates/nextjs-app/src/app/page.tsx +63 -0
  164. package/templates/nextjs-app/src/nac/manifest.ts +36 -0
  165. package/templates/nextjs-app/tsconfig.json +21 -0
  166. package/templates/nextjs-app/yujin.forge.json +11 -0
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Chat tool surface for the PRODUCT_WORKFLOW.md state machine.
3
+ *
4
+ * Three tools that let Forge drive the entire 18-step methodology
5
+ * from inside the chat panel, without the user dropping to the CLI:
6
+ *
7
+ * forge_workflow_state(scope?) read workflow state (full or scoped)
8
+ * forge_workflow_set(group, patch) persist a patch under workflow.<group>
9
+ * forge_workflow_run_step(step) run an autonomous step
10
+ * (legacy_audit, coverage, manual_generate,
11
+ * handoff, metrics) without prompts
12
+ *
13
+ * Design notes:
14
+ * - State write goes through the same module the CLI verbs use
15
+ * (`src/workflow/state.ts`), so a chat session and a CLI session
16
+ * see the same yujin.forge.json.
17
+ * - `forge_workflow_run_step` only handles steps that do NOT
18
+ * require the user to answer questions (legacy_audit reads the
19
+ * project; coverage greps tests; manual_generate emits markdown
20
+ * from existing state). Interactive steps (triage, discover,
21
+ * clarify, approve) stay CLI-driven OR are driven by Forge
22
+ * asking the user in chat + calling forge_workflow_set with the
23
+ * collected answers.
24
+ * - Per SQ Sec 14, Forge calls forge_audit_consumers before any
25
+ * structural commit; this surface is read-mostly + persistence-
26
+ * safe so it does not trip that rule.
27
+ *
28
+ * ASCII-only.
29
+ */
30
+ import type { ToolContext, ToolResult, ToolSpec } from '../tools.js';
31
+ export declare const WORKFLOW_STATE_SPEC: ToolSpec;
32
+ export declare function runWorkflowState(args: {
33
+ scope?: string;
34
+ }, ctx: ToolContext): Promise<ToolResult>;
35
+ export declare const WORKFLOW_SET_SPEC: ToolSpec;
36
+ export declare function runWorkflowSet(args: {
37
+ group?: string;
38
+ patch?: Record<string, unknown>;
39
+ top_level?: boolean;
40
+ }, ctx: ToolContext): Promise<ToolResult>;
41
+ export declare const WORKFLOW_RUN_STEP_SPEC: ToolSpec;
42
+ export declare function runWorkflowRunStep(args: {
43
+ step?: string;
44
+ }, ctx: ToolContext): Promise<ToolResult>;
45
+ //# sourceMappingURL=workflow.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow.d.ts","sourceRoot":"","sources":["../../../src/chat/tools/workflow.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAYrE,eAAO,MAAM,mBAAmB,EAAE,QAqBjC,CAAC;AAEF,wBAAsB,gBAAgB,CACpC,IAAI,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,EACxB,GAAG,EAAE,WAAW,GACf,OAAO,CAAC,UAAU,CAAC,CA+BrB;AAMD,eAAO,MAAM,iBAAiB,EAAE,QAkC/B,CAAC;AAWF,wBAAsB,cAAc,CAClC,IAAI,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAAC,SAAS,CAAC,EAAE,OAAO,CAAA;CAAE,EAC9E,GAAG,EAAE,WAAW,GACf,OAAO,CAAC,UAAU,CAAC,CA4DrB;AAMD,eAAO,MAAM,sBAAsB,EAAE,QAwBpC,CAAC;AAEF,wBAAsB,kBAAkB,CACtC,IAAI,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,EACvB,GAAG,EAAE,WAAW,GACf,OAAO,CAAC,UAAU,CAAC,CA0ErB"}
@@ -0,0 +1,404 @@
1
+ /**
2
+ * Chat tool surface for the PRODUCT_WORKFLOW.md state machine.
3
+ *
4
+ * Three tools that let Forge drive the entire 18-step methodology
5
+ * from inside the chat panel, without the user dropping to the CLI:
6
+ *
7
+ * forge_workflow_state(scope?) read workflow state (full or scoped)
8
+ * forge_workflow_set(group, patch) persist a patch under workflow.<group>
9
+ * forge_workflow_run_step(step) run an autonomous step
10
+ * (legacy_audit, coverage, manual_generate,
11
+ * handoff, metrics) without prompts
12
+ *
13
+ * Design notes:
14
+ * - State write goes through the same module the CLI verbs use
15
+ * (`src/workflow/state.ts`), so a chat session and a CLI session
16
+ * see the same yujin.forge.json.
17
+ * - `forge_workflow_run_step` only handles steps that do NOT
18
+ * require the user to answer questions (legacy_audit reads the
19
+ * project; coverage greps tests; manual_generate emits markdown
20
+ * from existing state). Interactive steps (triage, discover,
21
+ * clarify, approve) stay CLI-driven OR are driven by Forge
22
+ * asking the user in chat + calling forge_workflow_set with the
23
+ * collected answers.
24
+ * - Per SQ Sec 14, Forge calls forge_audit_consumers before any
25
+ * structural commit; this surface is read-mostly + persistence-
26
+ * safe so it does not trip that rule.
27
+ *
28
+ * ASCII-only.
29
+ */
30
+ import path from 'node:path';
31
+ import { readWorkflow, writeWorkflow, patchWorkflowGroup, } from '../../workflow/state.js';
32
+ /* =========================================================================
33
+ * forge_workflow_state
34
+ * ========================================================================= */
35
+ export const WORKFLOW_STATE_SPEC = {
36
+ name: 'forge_workflow_state',
37
+ description: 'Read the project workflow state from yujin.forge.json. Returns '
38
+ + 'the full workflow object by default. Optionally filter by '
39
+ + 'scope (one of: tier, intent, legacy_audit, vault_inventory, '
40
+ + 'clarification, specs, approvals, bootstrap, blocks_progress, '
41
+ + 'deploy, postlaunch, iterations). Use this at the START of '
42
+ + 'every chat turn to know where the user is in the 18-step '
43
+ + 'methodology + decide what to ask next. Pure read.',
44
+ input_schema: {
45
+ type: 'object',
46
+ properties: {
47
+ scope: {
48
+ type: 'string',
49
+ description: 'Optional: return only this group of the workflow state.',
50
+ },
51
+ },
52
+ required: [],
53
+ },
54
+ requires_approval: false,
55
+ };
56
+ export async function runWorkflowState(args, ctx) {
57
+ const wf = await readWorkflow(ctx.projectRoot);
58
+ if (args.scope) {
59
+ const val = wf[args.scope];
60
+ return {
61
+ tool: WORKFLOW_STATE_SPEC.name,
62
+ is_error: false,
63
+ result: { scope: args.scope, value: val ?? null },
64
+ display: 'state[' + args.scope + ']: ' + (val ? 'present' : 'empty'),
65
+ };
66
+ }
67
+ /* Summary of completion for the display string. */
68
+ const phases = {
69
+ phase_i: Boolean(wf.tier && wf.intent),
70
+ phase_ii: Boolean(wf.clarification?.functional && wf.clarification?.nfr_quantitative
71
+ && wf.clarification?.nfr_structural && wf.clarification?.nfr_governance
72
+ && wf.clarification?.nfr_operational && wf.clarification?.blocks),
73
+ phase_iii: Boolean(wf.specs?.rfp && wf.specs?.arch && wf.specs?.design),
74
+ phase_iv: Boolean(wf.approvals?.rfp && wf.approvals?.arch && wf.approvals?.design),
75
+ phase_v: Boolean(wf.bootstrap),
76
+ phase_vi: Boolean(wf.deploy),
77
+ };
78
+ const completedPhases = Object.values(phases).filter(Boolean).length;
79
+ return {
80
+ tool: WORKFLOW_STATE_SPEC.name,
81
+ is_error: false,
82
+ result: { workflow: wf, phases },
83
+ display: 'workflow state read; phases complete: ' + completedPhases + '/6',
84
+ };
85
+ }
86
+ /* =========================================================================
87
+ * forge_workflow_set
88
+ * ========================================================================= */
89
+ export const WORKFLOW_SET_SPEC = {
90
+ name: 'forge_workflow_set',
91
+ description: 'Persist a patch under workflow.<group> in yujin.forge.json. '
92
+ + 'Use this when you have collected the answers for a workflow '
93
+ + 'step conversationally (triage answers, discover answers, a '
94
+ + 'clarification round summary, an approval decision) and need '
95
+ + 'to commit them to disk so the next session inherits the '
96
+ + 'progress. The patch is merged into the existing group; you '
97
+ + 'do not need to send the whole group. Valid groups: tier '
98
+ + '(use top-level patch, see args), tier_reason, '
99
+ + 'tier_decided_at, intent, legacy_audit, vault_inventory, '
100
+ + 'clarification, specs, approvals, bootstrap, blocks_progress, '
101
+ + 'deploy, postlaunch.',
102
+ input_schema: {
103
+ type: 'object',
104
+ properties: {
105
+ group: {
106
+ type: 'string',
107
+ description: 'Which workflow group to patch.',
108
+ },
109
+ patch: {
110
+ type: 'object',
111
+ description: 'Partial object merged into the group (any keys).',
112
+ },
113
+ top_level: {
114
+ type: 'boolean',
115
+ description: 'If true, patch is merged at workflow.<key> top level '
116
+ + '(used for tier / tier_reason / tier_decided_at). Default false.',
117
+ },
118
+ },
119
+ required: ['group', 'patch'],
120
+ },
121
+ requires_approval: false,
122
+ };
123
+ const VALID_GROUPS = new Set([
124
+ 'intent', 'legacy_audit', 'vault_inventory', 'clarification',
125
+ 'specs', 'approvals', 'bootstrap', 'deploy', 'postlaunch',
126
+ ]);
127
+ const VALID_TOP_LEVEL = new Set([
128
+ 'tier', 'tier_reason', 'tier_decided_at', 'blocks_progress', 'iterations',
129
+ ]);
130
+ export async function runWorkflowSet(args, ctx) {
131
+ const group = String(args.group ?? '').trim();
132
+ if (group === '') {
133
+ return {
134
+ tool: WORKFLOW_SET_SPEC.name,
135
+ is_error: true,
136
+ result: { error: 'group required' },
137
+ display: 'bad input: no group',
138
+ };
139
+ }
140
+ if (!args.patch || typeof args.patch !== 'object') {
141
+ return {
142
+ tool: WORKFLOW_SET_SPEC.name,
143
+ is_error: true,
144
+ result: { error: 'patch (object) required' },
145
+ display: 'bad input: no patch',
146
+ };
147
+ }
148
+ if (args.top_level || VALID_TOP_LEVEL.has(group)) {
149
+ /* Top-level patch (tier / tier_reason / tier_decided_at /
150
+ * blocks_progress / iterations). */
151
+ if (!VALID_TOP_LEVEL.has(group) && !args.top_level) {
152
+ return {
153
+ tool: WORKFLOW_SET_SPEC.name,
154
+ is_error: true,
155
+ result: { error: 'group "' + group + '" must be patched as a sub-group; see VALID_GROUPS' },
156
+ display: 'invalid top-level group',
157
+ };
158
+ }
159
+ const top = { [group]: args.patch[group] ?? args.patch };
160
+ const next = await writeWorkflow(ctx.projectRoot, top);
161
+ return {
162
+ tool: WORKFLOW_SET_SPEC.name,
163
+ is_error: false,
164
+ result: { workflow: next },
165
+ display: 'set workflow.' + group,
166
+ };
167
+ }
168
+ if (!VALID_GROUPS.has(group)) {
169
+ return {
170
+ tool: WORKFLOW_SET_SPEC.name,
171
+ is_error: true,
172
+ result: { error: 'group "' + group + '" not in [' + [...VALID_GROUPS].join(', ') + ']' },
173
+ display: 'invalid group',
174
+ };
175
+ }
176
+ const next = await patchWorkflowGroup(ctx.projectRoot, group, args.patch);
177
+ return {
178
+ tool: WORKFLOW_SET_SPEC.name,
179
+ is_error: false,
180
+ result: { workflow: next },
181
+ display: 'patched workflow.' + group + ' (+' + Object.keys(args.patch).length + ' keys)',
182
+ };
183
+ }
184
+ /* =========================================================================
185
+ * forge_workflow_run_step
186
+ * ========================================================================= */
187
+ export const WORKFLOW_RUN_STEP_SPEC = {
188
+ name: 'forge_workflow_run_step',
189
+ description: 'Run an autonomous workflow step that does NOT need user '
190
+ + 'questions. Reads the project + writes the state. Valid steps:\n'
191
+ + ' - legacy_audit: scan repo for framework + NAC-3 readiness\n'
192
+ + ' - coverage: check NAC-3 structural coverage 100%\n'
193
+ + ' - manual_generate: write docs/manual.<lang>.md per locale\n'
194
+ + ' - handoff: write docs/HANDOFF.md from current state\n'
195
+ + ' - metrics: write docs/observability.md checklist\n'
196
+ + 'Returns the persisted state slice + a human display string. '
197
+ + 'Use this after collecting any prerequisite answers via '
198
+ + 'forge_workflow_set.',
199
+ input_schema: {
200
+ type: 'object',
201
+ properties: {
202
+ step: {
203
+ type: 'string',
204
+ description: 'One of: legacy_audit | coverage | manual_generate | handoff | metrics',
205
+ },
206
+ },
207
+ required: ['step'],
208
+ },
209
+ requires_approval: false,
210
+ };
211
+ export async function runWorkflowRunStep(args, ctx) {
212
+ const step = String(args.step ?? '').trim();
213
+ switch (step) {
214
+ case 'legacy_audit': {
215
+ const { runLegacyAudit } = await import('../../commands/legacy-audit.js');
216
+ await runLegacyAudit({ cwd: ctx.projectRoot });
217
+ const wf = await readWorkflow(ctx.projectRoot);
218
+ return {
219
+ tool: WORKFLOW_RUN_STEP_SPEC.name,
220
+ is_error: false,
221
+ result: { step, legacy_audit: wf.legacy_audit ?? null },
222
+ display: 'legacy_audit done; readiness=' + (wf.legacy_audit?.nac3_readiness ?? '?') + '%',
223
+ };
224
+ }
225
+ case 'coverage': {
226
+ const { runCoverage } = await import('../../commands/workflow-coverage.js');
227
+ /* runCoverage prints to stdout + sets exit code. We do not
228
+ * read its return because the function returns void. Instead
229
+ * we re-derive coverage from manifest + tests directly here
230
+ * for the structured result. */
231
+ const before = process.exitCode;
232
+ await runCoverage({ cwd: ctx.projectRoot, ifFailingExit1: false });
233
+ const after = process.exitCode;
234
+ process.exitCode = before;
235
+ return {
236
+ tool: WORKFLOW_RUN_STEP_SPEC.name,
237
+ is_error: false,
238
+ result: { step, coverage_failed: after === 1 },
239
+ display: 'coverage run; failed=' + (after === 1),
240
+ };
241
+ }
242
+ case 'manual_generate': {
243
+ const mod = await import('../../commands/operate.js');
244
+ /* operate.ts does not export the verb fns directly. We
245
+ * re-invoke the underlying flow via state inspection +
246
+ * manual writes -- avoiding a CLI parser re-entry. */
247
+ const { runManualGenerateFromTool } = await __compatLayer();
248
+ const docs = await runManualGenerateFromTool(ctx.projectRoot);
249
+ void mod; /* silence unused import */
250
+ return {
251
+ tool: WORKFLOW_RUN_STEP_SPEC.name,
252
+ is_error: false,
253
+ result: { step, docs },
254
+ display: 'manual_generate wrote ' + docs.length + ' file(s)',
255
+ };
256
+ }
257
+ case 'handoff': {
258
+ const { runHandoffFromTool } = await __compatLayer();
259
+ const docPath = await runHandoffFromTool(ctx.projectRoot);
260
+ return {
261
+ tool: WORKFLOW_RUN_STEP_SPEC.name,
262
+ is_error: false,
263
+ result: { step, doc_path: docPath },
264
+ display: 'handoff doc written at ' + docPath,
265
+ };
266
+ }
267
+ case 'metrics': {
268
+ const { runMetricsFromTool } = await __compatLayer();
269
+ const docPath = await runMetricsFromTool(ctx.projectRoot);
270
+ return {
271
+ tool: WORKFLOW_RUN_STEP_SPEC.name,
272
+ is_error: false,
273
+ result: { step, doc_path: docPath },
274
+ display: 'observability checklist written at ' + docPath,
275
+ };
276
+ }
277
+ default:
278
+ return {
279
+ tool: WORKFLOW_RUN_STEP_SPEC.name,
280
+ is_error: true,
281
+ result: { error: 'unknown step "' + step + '"' },
282
+ display: 'unknown step',
283
+ };
284
+ }
285
+ }
286
+ let _compat = null;
287
+ async function __compatLayer() {
288
+ if (_compat)
289
+ return _compat;
290
+ const { promises: fs } = await import('node:fs');
291
+ _compat = {
292
+ async runManualGenerateFromTool(projectRoot) {
293
+ const wf = await readWorkflow(projectRoot);
294
+ const blocks = wf.clarification?.blocks?.blocks ?? [];
295
+ const opSummary = wf.clarification?.nfr_operational?.summary ?? '';
296
+ const localesMatch = opSummary.match(/(\d+) locales/);
297
+ const localesCount = localesMatch ? parseInt(localesMatch[1] ?? '1', 10) : 1;
298
+ const locales = localesCount > 1 ? ['es', 'en'] : ['es'];
299
+ const dir = path.join(projectRoot, 'docs', 'manual');
300
+ await fs.mkdir(dir, { recursive: true });
301
+ const stamp = new Date().toISOString();
302
+ const written = [];
303
+ for (const lang of locales) {
304
+ const fp = path.join(dir, 'manual.' + lang + '.md');
305
+ const blocksList = blocks
306
+ .map((b) => '- **' + b.name + '** (' + b.id + '): ' + (b.mvp ? 'MVP' : 'optional'))
307
+ .join('\n');
308
+ const body = [
309
+ '# Manual de usuario (' + lang + ')',
310
+ '',
311
+ '*Generado por forge_workflow_run_step el ' + stamp + '.*',
312
+ '',
313
+ '## Que hace esta app',
314
+ '',
315
+ (wf.clarification?.functional?.summary ?? 'TBD'),
316
+ '',
317
+ '## Funcionalidades',
318
+ '',
319
+ blocksList,
320
+ '',
321
+ '## Como empezar',
322
+ '',
323
+ 'TBD: completar el quick-start una vez que la primera version este live.',
324
+ ].join('\n');
325
+ await fs.writeFile(fp, body, 'utf-8');
326
+ written.push(path.relative(projectRoot, fp));
327
+ }
328
+ await patchWorkflowGroup(projectRoot, 'postlaunch', {
329
+ manual_at: stamp,
330
+ dashboards_at: wf.postlaunch?.dashboards_at ?? '',
331
+ feedback_channel: wf.postlaunch?.feedback_channel ?? '',
332
+ });
333
+ return written;
334
+ },
335
+ async runHandoffFromTool(projectRoot) {
336
+ const wf = await readWorkflow(projectRoot);
337
+ const stamp = new Date().toISOString();
338
+ const fp = path.join(projectRoot, 'docs', 'HANDOFF.md');
339
+ await fs.mkdir(path.dirname(fp), { recursive: true });
340
+ const body = [
341
+ '# Handoff package',
342
+ '',
343
+ '*Generado por forge_workflow_run_step el ' + stamp + '.*',
344
+ '*Tier: ' + (wf.tier ?? 'unknown') + '*',
345
+ '',
346
+ '## Que es esta app',
347
+ '',
348
+ (wf.clarification?.functional?.summary ?? 'TBD'),
349
+ '',
350
+ '## Decisiones de arquitectura',
351
+ '',
352
+ '- Persistencia: ver ' + (wf.clarification?.nfr_structural?.doc_path ?? 'TBD'),
353
+ '- Compliance: ver ' + (wf.clarification?.nfr_governance?.doc_path ?? 'TBD'),
354
+ '- Observability: ver ' + (wf.clarification?.nfr_operational?.doc_path ?? 'TBD'),
355
+ '',
356
+ '## Credenciales activas',
357
+ '',
358
+ ...Object.entries(wf.vault_inventory?.families ?? {})
359
+ .map(([fam, st]) => '- **' + fam + '**: ' + st),
360
+ '',
361
+ '## Bloques + estado',
362
+ '',
363
+ ...((wf.clarification?.blocks?.blocks ?? []).map((b) => {
364
+ const pp = (wf.blocks_progress ?? []).find((x) => x.block_id === b.id);
365
+ return '- **' + b.name + '** (' + b.id + '): ' + (pp?.status ?? 'pending');
366
+ })),
367
+ ].join('\n');
368
+ await fs.writeFile(fp, body, 'utf-8');
369
+ return path.relative(projectRoot, fp);
370
+ },
371
+ async runMetricsFromTool(projectRoot) {
372
+ const wf = await readWorkflow(projectRoot);
373
+ const stamp = new Date().toISOString();
374
+ const opSummary = wf.clarification?.nfr_operational?.summary ?? '';
375
+ const checklist = [
376
+ '# Observability dashboards setup',
377
+ '',
378
+ '*Generado por forge_workflow_run_step el ' + stamp + '.*',
379
+ '',
380
+ '## A configurar manualmente:',
381
+ '- Error rate dashboard + alerta umbral.',
382
+ '- Latency p95 dashboard.',
383
+ '- Cost-per-day tracker.',
384
+ '- Free-tier limit watchdog.',
385
+ '- Custom KPI: ' + (wf.clarification?.functional?.summary ?? 'TBD'),
386
+ '',
387
+ '## Settings extraidas',
388
+ '',
389
+ opSummary || '_(operational clarification vacio)_',
390
+ ].join('\n');
391
+ const fp = path.join(projectRoot, 'docs', 'observability.md');
392
+ await fs.mkdir(path.dirname(fp), { recursive: true });
393
+ await fs.writeFile(fp, checklist, 'utf-8');
394
+ await patchWorkflowGroup(projectRoot, 'postlaunch', {
395
+ manual_at: wf.postlaunch?.manual_at ?? '',
396
+ dashboards_at: stamp,
397
+ feedback_channel: wf.postlaunch?.feedback_channel ?? 'TBD',
398
+ });
399
+ return path.relative(projectRoot, fp);
400
+ },
401
+ };
402
+ return _compat;
403
+ }
404
+ //# sourceMappingURL=workflow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow.js","sourceRoot":"","sources":["../../../src/chat/tools/workflow.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/chat/tools.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAqDH,wDAAwD;AACxD,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE;QACZ,IAAI,EAAE,QAAQ,CAAC;QACf,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,WAAW,CAAC,EAAE,MAAM,CAAC;YAAC,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,EAAE,CAAA;SAAE,CAAC,CAAC;QACxG,QAAQ,EAAE,MAAM,EAAE,CAAC;KACpB,CAAC;IACF,gEAAgE;IAChE,iBAAiB,EAAE,OAAO,CAAC;CAC5B;AAED,MAAM,WAAW,WAAW;IAC1B,qDAAqD;IACrD,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,UAAU;IACzB,oEAAoE;IACpE,IAAI,EAAE,MAAM,CAAC;IACb,6DAA6D;IAC7D,MAAM,EAAE,OAAO,CAAC;IAChB;;gDAE4C;IAC5C,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,mDAAmD;IACnD,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAMD,eAAO,MAAM,kBAAkB,EAAE,QAchC,CAAC;AAEF,wBAAsB,eAAe,CAAC,IAAI,EAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CA+C3G;AAMD,eAAO,MAAM,gBAAgB,EAAE,QAkB9B,CAAC;AAEF,MAAM,WAAW,OAAO;IACtB,4DAA4D;IAC5D,OAAO,EAAE,MAAM,CAAC;IAChB,iDAAiD;IACjD,OAAO,EAAE,MAAM,CAAC;IAChB,sDAAsD;IACtD,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAsB,iBAAiB,CACrC,IAAI,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,EAC7C,GAAG,EAAE,WAAW,GACf,OAAO,CAAC,UAAU,CAAC,CAmDrB;AAED;;0BAE0B;AAC1B,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,GAAE,MAAU,GAAG,OAAO,EAAE,CAkClF;AAoBD,eAAO,MAAM,eAAe,EAAE,QAsB7B,CAAC;AAOF,wBAAsB,YAAY,CAChC,IAAI,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,EAC5D,GAAG,EAAE,WAAW,GACf,OAAO,CAAC,UAAU,CAAC,CAkErB;AASD;;;0BAG0B;AAC1B,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,CAAC,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,GAAG,IAAI,CAUhG;AAMD,eAAO,MAAM,cAAc,EAAE,QAkB5B,CAAC;AAKF,wBAAsB,WAAW,CAC/B,IAAI,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,EAC1C,GAAG,EAAE,WAAW,GACf,OAAO,CAAC,UAAU,CAAC,CAiGrB;AAaD,eAAO,MAAM,gBAAgB,EAAE,QAAQ,EAqCtC,CAAC;AAEF;oEACoE;AACpE,wBAAsB,YAAY,CAChC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,GAAG,EAAE,WAAW,GACf,OAAO,CAAC,UAAU,CAAC,CAwDrB"}
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/chat/tools.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAuEH,wDAAwD;AACxD,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE;QACZ,IAAI,EAAE,QAAQ,CAAC;QACf,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,WAAW,CAAC,EAAE,MAAM,CAAC;YAAC,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,EAAE,CAAA;SAAE,CAAC,CAAC;QACxG,QAAQ,EAAE,MAAM,EAAE,CAAC;KACpB,CAAC;IACF,gEAAgE;IAChE,iBAAiB,EAAE,OAAO,CAAC;CAC5B;AAED,MAAM,WAAW,WAAW;IAC1B,qDAAqD;IACrD,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,UAAU;IACzB,oEAAoE;IACpE,IAAI,EAAE,MAAM,CAAC;IACb,6DAA6D;IAC7D,MAAM,EAAE,OAAO,CAAC;IAChB;;gDAE4C;IAC5C,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,mDAAmD;IACnD,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAMD,eAAO,MAAM,kBAAkB,EAAE,QAchC,CAAC;AAEF,wBAAsB,eAAe,CAAC,IAAI,EAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CA+C3G;AAMD,eAAO,MAAM,gBAAgB,EAAE,QAkB9B,CAAC;AAEF,MAAM,WAAW,OAAO;IACtB,4DAA4D;IAC5D,OAAO,EAAE,MAAM,CAAC;IAChB,iDAAiD;IACjD,OAAO,EAAE,MAAM,CAAC;IAChB,sDAAsD;IACtD,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAsB,iBAAiB,CACrC,IAAI,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,EAC7C,GAAG,EAAE,WAAW,GACf,OAAO,CAAC,UAAU,CAAC,CAmDrB;AAED;;0BAE0B;AAC1B,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,GAAE,MAAU,GAAG,OAAO,EAAE,CAkClF;AAoBD,eAAO,MAAM,eAAe,EAAE,QAsB7B,CAAC;AAOF,wBAAsB,YAAY,CAChC,IAAI,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,EAC5D,GAAG,EAAE,WAAW,GACf,OAAO,CAAC,UAAU,CAAC,CAkErB;AASD;;;0BAG0B;AAC1B,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,CAAC,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,GAAG,IAAI,CAUhG;AAMD,eAAO,MAAM,cAAc,EAAE,QAkB5B,CAAC;AAKF,wBAAsB,WAAW,CAC/B,IAAI,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,EAC1C,GAAG,EAAE,WAAW,GACf,OAAO,CAAC,UAAU,CAAC,CAiGrB;AAaD,eAAO,MAAM,gBAAgB,EAAE,QAAQ,EAiDtC,CAAC;AAEF;oEACoE;AACpE,wBAAsB,YAAY,CAChC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,GAAG,EAAE,WAAW,GACf,OAAO,CAAC,UAAU,CAAC,CAoErB"}
@@ -34,6 +34,9 @@ import { promises as fs } from 'node:fs';
34
34
  import path from 'node:path';
35
35
  import { CREATE_GITHUB_REPO_SPEC, CLONE_REPO_SPEC, BRANCH_STATUS_SPEC, runCreateGithubRepo, runCloneRepo, runBranchStatus, } from './tools/github.js';
36
36
  import { GIT_COMMIT_SPEC, GIT_PUSH_SPEC, GIT_PULL_SPEC, GIT_LOG_SPEC, runGitCommit, runGitPush, runGitPull, runGitLog, } from './tools/git.js';
37
+ import { AUDIT_CONSUMERS_SPEC, runAuditConsumers, } from './tools/audit_consumers.js';
38
+ import { WORKFLOW_STATE_SPEC, WORKFLOW_SET_SPEC, WORKFLOW_RUN_STEP_SPEC, runWorkflowState, runWorkflowSet, runWorkflowRunStep, } from './tools/workflow.js';
39
+ import { GET_BYOK_STATUS_SPEC, SET_BYOK_KEY_SPEC, runGetByokStatus, runSetByokKey, } from './tools/keys.js';
37
40
  import { RUN_APP_SPEC, STOP_APP_SPEC, RESTART_APP_SPEC, runApp, stopApp, restartApp, } from './tools/lifecycle.js';
38
41
  import { READER_OPEN_SPEC, READER_LIST_DOCS_SPEC, READER_READ_SECTION_SPEC, READER_NEXT_BLOCK_SPEC, READER_SEARCH_SPEC, READER_BOOKMARK_SET_SPEC, READER_BOOKMARK_JUMP_SPEC, READER_RECAP_SPEC, runReaderOpen, runReaderListDocuments, runReaderReadSection, runReaderNextBlock, runReaderSearch, runReaderBookmarkSet, runReaderBookmarkJump, runReaderRecap, } from './tools/reader.js';
39
42
  import { MANUAL_OPEN_SPEC, runManualOpen, } from './tools/manual.js';
@@ -41,7 +44,7 @@ import { MANUAL_OPEN_SPEC, runManualOpen, } from './tools/manual.js';
41
44
  * forge.read_manifest
42
45
  * ============================================================ */
43
46
  export const READ_MANIFEST_SPEC = {
44
- name: 'forge.read_manifest',
47
+ name: 'forge_read_manifest',
45
48
  description: 'Read the NAC-3 manifest from the active project. Returns the manifest JSON (plugin_slug, version, elements array). Optionally filter to a specific plugin slug via the `plugin_slug` argument.',
46
49
  input_schema: {
47
50
  type: 'object',
@@ -105,7 +108,7 @@ export async function runReadManifest(args, ctx) {
105
108
  * forge.consult_nac_spec
106
109
  * ============================================================ */
107
110
  export const CONSULT_NAC_SPEC = {
108
- name: 'forge.consult_nac_spec',
111
+ name: 'forge_consult_nac_spec',
109
112
  description: 'Search the NAC-3 specification (docs/SPEC.md in the project) for paragraphs matching a free-text query. Returns up to 5 matches with their section headings + snippet. Useful when the chat needs to ground its answer in the canonical contract.',
110
113
  input_schema: {
111
114
  type: 'object',
@@ -231,7 +234,7 @@ function clampMax(n) {
231
234
  * forge.list_files
232
235
  * ============================================================ */
233
236
  export const LIST_FILES_SPEC = {
234
- name: 'forge.list_files',
237
+ name: 'forge_list_files',
235
238
  description: 'List source files under a directory of the active project. Bounded read-only walk with a hard cap on file count + a glob filter for the basename. Useful when the chat needs to know what is in the project before opening anything.',
236
239
  input_schema: {
237
240
  type: 'object',
@@ -358,7 +361,7 @@ export function compileBasenameGlob(glob) {
358
361
  * forge.read_file
359
362
  * ============================================================ */
360
363
  export const READ_FILE_SPEC = {
361
- name: 'forge.read_file',
364
+ name: 'forge_read_file',
362
365
  description: 'Read a single source file from the active project. Path must be relative to the project root and stay within it. Refuses binary files (NUL byte detection) and files larger than max_bytes (default 64KB). Use forge.list_files first when you do not already know the path.',
363
366
  input_schema: {
364
367
  type: 'object',
@@ -523,6 +526,18 @@ export const FORGE_TOOL_SPECS = [
523
526
  /* Manual tool (Fase F.7 / F.8 -- 10-language HTML manuals
524
527
  resolved by user language). Read-only, requires_approval=false. */
525
528
  MANUAL_OPEN_SPEC,
529
+ /* Producer/Consumer audit tool (SQ Sec X "Producer/Consumer
530
+ Symmetry"). Forge calls this BEFORE any commit that touches a
531
+ shared data structure. Read-only grep. */
532
+ AUDIT_CONSUMERS_SPEC,
533
+ /* PRODUCT_WORKFLOW.md state machine. Three tools that let Forge
534
+ drive the 18-step methodology from chat without CLI dropdowns. */
535
+ WORKFLOW_STATE_SPEC,
536
+ WORKFLOW_SET_SPEC,
537
+ WORKFLOW_RUN_STEP_SPEC,
538
+ /* BYOK key management -- LEMA YUJIN, todo por voz desde el chat. */
539
+ GET_BYOK_STATUS_SPEC,
540
+ SET_BYOK_KEY_SPEC,
526
541
  /* More tools land in follow-up commits per the docstring. */
527
542
  ];
528
543
  /** Dispatch a tool by name with the args Anthropic returned. Returns
@@ -575,6 +590,18 @@ export async function runForgeTool(name, args, ctx) {
575
590
  return runReaderRecap(args);
576
591
  case MANUAL_OPEN_SPEC.name:
577
592
  return runManualOpen(args, ctx);
593
+ case AUDIT_CONSUMERS_SPEC.name:
594
+ return runAuditConsumers(args, ctx);
595
+ case WORKFLOW_STATE_SPEC.name:
596
+ return runWorkflowState(args, ctx);
597
+ case WORKFLOW_SET_SPEC.name:
598
+ return runWorkflowSet(args, ctx);
599
+ case WORKFLOW_RUN_STEP_SPEC.name:
600
+ return runWorkflowRunStep(args, ctx);
601
+ case GET_BYOK_STATUS_SPEC.name:
602
+ return runGetByokStatus(args, ctx);
603
+ case SET_BYOK_KEY_SPEC.name:
604
+ return runSetByokKey(args, ctx);
578
605
  default:
579
606
  return {
580
607
  tool: name,