@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.
- package/dist/bin/yf.d.ts.map +1 -1
- package/dist/bin/yf.js +27 -0
- package/dist/bin/yf.js.map +1 -1
- package/dist/chat/claude.d.ts +22 -15
- package/dist/chat/claude.d.ts.map +1 -1
- package/dist/chat/claude.js +75 -22
- package/dist/chat/claude.js.map +1 -1
- package/dist/chat/panel.d.ts.map +1 -1
- package/dist/chat/panel.js +791 -17
- package/dist/chat/panel.js.map +1 -1
- package/dist/chat/server.js +734 -32
- package/dist/chat/server.js.map +1 -1
- package/dist/chat/spec_extract.d.ts.map +1 -1
- package/dist/chat/spec_extract.js +39 -0
- package/dist/chat/spec_extract.js.map +1 -1
- package/dist/chat/tools/audit_consumers.d.ts +66 -0
- package/dist/chat/tools/audit_consumers.d.ts.map +1 -0
- package/dist/chat/tools/audit_consumers.js +231 -0
- package/dist/chat/tools/audit_consumers.js.map +1 -0
- package/dist/chat/tools/git.js +4 -4
- package/dist/chat/tools/github.js +3 -3
- package/dist/chat/tools/keys.d.ts +9 -0
- package/dist/chat/tools/keys.d.ts.map +1 -0
- package/dist/chat/tools/keys.js +194 -0
- package/dist/chat/tools/keys.js.map +1 -0
- package/dist/chat/tools/lifecycle.js +3 -3
- package/dist/chat/tools/manual.js +1 -1
- package/dist/chat/tools/reader.js +8 -8
- package/dist/chat/tools/workflow.d.ts +45 -0
- package/dist/chat/tools/workflow.d.ts.map +1 -0
- package/dist/chat/tools/workflow.js +404 -0
- package/dist/chat/tools/workflow.js.map +1 -0
- package/dist/chat/tools.d.ts.map +1 -1
- package/dist/chat/tools.js +31 -4
- package/dist/chat/tools.js.map +1 -1
- package/dist/commands/approve.d.ts +32 -0
- package/dist/commands/approve.d.ts.map +1 -0
- package/dist/commands/approve.js +198 -0
- package/dist/commands/approve.js.map +1 -0
- package/dist/commands/block.d.ts +28 -0
- package/dist/commands/block.d.ts.map +1 -0
- package/dist/commands/block.js +189 -0
- package/dist/commands/block.js.map +1 -0
- package/dist/commands/bootstrap.d.ts +35 -0
- package/dist/commands/bootstrap.d.ts.map +1 -0
- package/dist/commands/bootstrap.js +205 -0
- package/dist/commands/bootstrap.js.map +1 -0
- package/dist/commands/chat.d.ts +3 -0
- package/dist/commands/chat.d.ts.map +1 -1
- package/dist/commands/chat.js +46 -1
- package/dist/commands/chat.js.map +1 -1
- package/dist/commands/clarify.d.ts +30 -0
- package/dist/commands/clarify.d.ts.map +1 -0
- package/dist/commands/clarify.js +671 -0
- package/dist/commands/clarify.js.map +1 -0
- package/dist/commands/discover.d.ts +30 -0
- package/dist/commands/discover.d.ts.map +1 -0
- package/dist/commands/discover.js +178 -0
- package/dist/commands/discover.js.map +1 -0
- package/dist/commands/doctor.js +94 -42
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/keys_setup.d.ts +53 -0
- package/dist/commands/keys_setup.d.ts.map +1 -0
- package/dist/commands/keys_setup.js +487 -0
- package/dist/commands/keys_setup.js.map +1 -0
- package/dist/commands/legacy-audit.d.ts +34 -0
- package/dist/commands/legacy-audit.d.ts.map +1 -0
- package/dist/commands/legacy-audit.js +270 -0
- package/dist/commands/legacy-audit.js.map +1 -0
- package/dist/commands/license.d.ts.map +1 -1
- package/dist/commands/license.js +41 -0
- package/dist/commands/license.js.map +1 -1
- package/dist/commands/operate.d.ts +22 -0
- package/dist/commands/operate.d.ts.map +1 -0
- package/dist/commands/operate.js +523 -0
- package/dist/commands/operate.js.map +1 -0
- package/dist/commands/spec.d.ts +38 -0
- package/dist/commands/spec.d.ts.map +1 -0
- package/dist/commands/spec.js +256 -0
- package/dist/commands/spec.js.map +1 -0
- package/dist/commands/support.d.ts +22 -0
- package/dist/commands/support.d.ts.map +1 -0
- package/dist/commands/support.js +143 -0
- package/dist/commands/support.js.map +1 -0
- package/dist/commands/triage.d.ts +34 -0
- package/dist/commands/triage.d.ts.map +1 -0
- package/dist/commands/triage.js +228 -0
- package/dist/commands/triage.js.map +1 -0
- package/dist/commands/vault-inventory.d.ts +30 -0
- package/dist/commands/vault-inventory.d.ts.map +1 -0
- package/dist/commands/vault-inventory.js +214 -0
- package/dist/commands/vault-inventory.js.map +1 -0
- package/dist/commands/vault.d.ts.map +1 -1
- package/dist/commands/vault.js +5 -0
- package/dist/commands/vault.js.map +1 -1
- package/dist/commands/voice.js +1 -1
- package/dist/commands/voice.js.map +1 -1
- package/dist/commands/workflow-coverage.d.ts +30 -0
- package/dist/commands/workflow-coverage.d.ts.map +1 -0
- package/dist/commands/workflow-coverage.js +138 -0
- package/dist/commands/workflow-coverage.js.map +1 -0
- package/dist/core/keys_envelope.d.ts +13 -0
- package/dist/core/keys_envelope.d.ts.map +1 -1
- package/dist/core/keys_envelope.js.map +1 -1
- package/dist/deploy/adapter.d.ts +93 -0
- package/dist/deploy/adapter.d.ts.map +1 -0
- package/dist/deploy/adapter.js +42 -0
- package/dist/deploy/adapter.js.map +1 -0
- package/dist/deploy/aws_adapter.d.ts +28 -0
- package/dist/deploy/aws_adapter.d.ts.map +1 -0
- package/dist/deploy/aws_adapter.js +98 -0
- package/dist/deploy/aws_adapter.js.map +1 -0
- package/dist/deploy/cloudflare.d.ts +24 -0
- package/dist/deploy/cloudflare.d.ts.map +1 -0
- package/dist/deploy/cloudflare.js +169 -0
- package/dist/deploy/cloudflare.js.map +1 -0
- package/dist/license/hito4_client.d.ts +17 -1
- package/dist/license/hito4_client.d.ts.map +1 -1
- package/dist/license/hito4_client.js +71 -10
- package/dist/license/hito4_client.js.map +1 -1
- package/dist/license/index.d.ts.map +1 -1
- package/dist/license/index.js +7 -0
- package/dist/license/index.js.map +1 -1
- package/dist/license/sync.d.ts +54 -0
- package/dist/license/sync.d.ts.map +1 -0
- package/dist/license/sync.js +131 -0
- package/dist/license/sync.js.map +1 -0
- package/dist/support/reports.d.ts +31 -0
- package/dist/support/reports.d.ts.map +1 -0
- package/dist/support/reports.js +162 -0
- package/dist/support/reports.js.map +1 -0
- package/dist/telemetry/usage.d.ts +67 -0
- package/dist/telemetry/usage.d.ts.map +1 -0
- package/dist/telemetry/usage.js +208 -0
- package/dist/telemetry/usage.js.map +1 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +1 -1
- package/dist/version.js.map +1 -1
- package/dist/voice/intents.d.ts +1 -1
- package/dist/voice/intents.js +0 -0
- package/dist/voice/providers/google.d.ts +9 -0
- package/dist/voice/providers/google.d.ts.map +1 -1
- package/dist/voice/providers/google.js +204 -28
- package/dist/voice/providers/google.js.map +1 -1
- package/dist/voice/router.d.ts +10 -0
- package/dist/voice/router.d.ts.map +1 -1
- package/dist/voice/router.js +39 -20
- package/dist/voice/router.js.map +1 -1
- package/dist/voice/types.d.ts +5 -2
- package/dist/voice/types.d.ts.map +1 -1
- package/dist/voice/types.js.map +1 -1
- package/dist/workflow/state.d.ts +190 -0
- package/dist/workflow/state.d.ts.map +1 -0
- package/dist/workflow/state.js +119 -0
- package/dist/workflow/state.js.map +1 -0
- package/package.json +13 -15
- package/templates/nextjs-app/README.md +48 -0
- package/templates/nextjs-app/next.config.js +8 -0
- package/templates/nextjs-app/package.json +33 -0
- package/templates/nextjs-app/src/app/globals.css +43 -0
- package/templates/nextjs-app/src/app/layout.tsx +29 -0
- package/templates/nextjs-app/src/app/page.tsx +63 -0
- package/templates/nextjs-app/src/nac/manifest.ts +36 -0
- package/templates/nextjs-app/tsconfig.json +21 -0
- package/templates/nextjs-app/yujin.forge.json +11 -0
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `yf spec rfp|arch|design` -- Phase III of PRODUCT_WORKFLOW.md
|
|
3
|
+
* (steps 10, 11, 12).
|
|
4
|
+
*
|
|
5
|
+
* Generates the three foundational documents that Phase IV gates
|
|
6
|
+
* on:
|
|
7
|
+
*
|
|
8
|
+
* yf spec rfp step 10 -- consolidated RFP / PRD
|
|
9
|
+
* yf spec arch step 11 -- technological architecture
|
|
10
|
+
* yf spec design step 12 -- solution design (per block)
|
|
11
|
+
*
|
|
12
|
+
* Each command:
|
|
13
|
+
* 1. Verifies Phase II is complete (functional + 4 NFR rounds +
|
|
14
|
+
* blocks). For RFP, all 6 are required. For arch + design,
|
|
15
|
+
* RFP must be done too.
|
|
16
|
+
* 2. Reads the markdown clarification docs from
|
|
17
|
+
* docs/clarification/0X_<round>.md.
|
|
18
|
+
* 3. Calls Claude with the document-specific generation prompt.
|
|
19
|
+
* 4. Writes the result to docs/project_<doc>.md.
|
|
20
|
+
* 5. Persists workflow.specs.<doc> with version, doc_path,
|
|
21
|
+
* sha256.
|
|
22
|
+
*
|
|
23
|
+
* Per HITO_4_STRATEGIC_ASSETS.md sec 1, the Tier-1 strategic
|
|
24
|
+
* prompts for these flows are eventually moving server-side to
|
|
25
|
+
* prompts.yujin.app. Today they live client-side as a stub --
|
|
26
|
+
* the system prompt is generic; a follow-up commit replaces it
|
|
27
|
+
* with the curated server-side endpoint when the Yujin server
|
|
28
|
+
* exposes them.
|
|
29
|
+
*
|
|
30
|
+
* ASCII-only.
|
|
31
|
+
*/
|
|
32
|
+
import path from 'node:path';
|
|
33
|
+
import { promises as fs } from 'node:fs';
|
|
34
|
+
import { createHash } from 'node:crypto';
|
|
35
|
+
import { c, header } from '../ui/colors.js';
|
|
36
|
+
import { ClaudeClient } from '../chat/claude.js';
|
|
37
|
+
import { readWorkflow, patchWorkflowGroup, } from '../workflow/state.js';
|
|
38
|
+
const DOC_FILENAME = {
|
|
39
|
+
rfp: 'project_rfp.md',
|
|
40
|
+
arch: 'project_architecture.md',
|
|
41
|
+
design: 'project_design.md',
|
|
42
|
+
};
|
|
43
|
+
const DOC_TITLE = {
|
|
44
|
+
rfp: 'RFP / PRD',
|
|
45
|
+
arch: 'Architecture',
|
|
46
|
+
design: 'Solution Design',
|
|
47
|
+
};
|
|
48
|
+
const CLARIFICATION_FILES = [
|
|
49
|
+
'04_functional.md',
|
|
50
|
+
'05_quantitative.md',
|
|
51
|
+
'06_structural.md',
|
|
52
|
+
'07_governance.md',
|
|
53
|
+
'08_operational.md',
|
|
54
|
+
'09_blocks.md',
|
|
55
|
+
];
|
|
56
|
+
async function readAllClarification(projectRoot) {
|
|
57
|
+
const dir = path.join(projectRoot, 'docs', 'clarification');
|
|
58
|
+
const parts = [];
|
|
59
|
+
for (const name of CLARIFICATION_FILES) {
|
|
60
|
+
try {
|
|
61
|
+
const text = await fs.readFile(path.join(dir, name), 'utf-8');
|
|
62
|
+
parts.push('===== ' + name + ' =====\n' + text);
|
|
63
|
+
}
|
|
64
|
+
catch { /* skip missing files */ }
|
|
65
|
+
}
|
|
66
|
+
return parts.join('\n\n');
|
|
67
|
+
}
|
|
68
|
+
function buildSystemPromptFor(kind) {
|
|
69
|
+
/* TODO(HITO-4): move these to prompts.yujin.app endpoints. */
|
|
70
|
+
const common = [
|
|
71
|
+
'You are Yujin Forge generating a foundational project document.',
|
|
72
|
+
'Read the supplied clarification rounds + workflow state and emit',
|
|
73
|
+
'a single, well-structured markdown document.',
|
|
74
|
+
'Output ASCII-only. Use sections + lists, NOT free prose.',
|
|
75
|
+
'Do not invent facts not present in the clarification rounds. If',
|
|
76
|
+
'something is missing, write "TBD: <what the user must define>".',
|
|
77
|
+
].join(' ');
|
|
78
|
+
switch (kind) {
|
|
79
|
+
case 'rfp':
|
|
80
|
+
return common + '\n\nDocument type: **RFP / PRD**. Structure:\n'
|
|
81
|
+
+ '1. Vision + objetivo del producto\n'
|
|
82
|
+
+ '2. Personas + user stories\n'
|
|
83
|
+
+ '3. Killer features + MVP slice\n'
|
|
84
|
+
+ '4. Bloques + orden\n'
|
|
85
|
+
+ '5. NFR cuantitativas (volumetria, paralelismo, complejidad)\n'
|
|
86
|
+
+ '6. NFR estructurales (persistencia, middleware, modelo objeto)\n'
|
|
87
|
+
+ '7. NFR de gobernanza (compliance, audit, retention)\n'
|
|
88
|
+
+ '8. NFR de operacion (i18n, a11y, monitoring, costos)\n'
|
|
89
|
+
+ '9. Acceptance criteria por bloque\n';
|
|
90
|
+
case 'arch':
|
|
91
|
+
return common + '\n\nDocument type: **Technological architecture**.\n'
|
|
92
|
+
+ 'Structure (driven by NFR decisions from clarification step 5+6+8):\n'
|
|
93
|
+
+ '1. Stack elegido + justificacion\n'
|
|
94
|
+
+ '2. Layering (frontend / backend / data / async)\n'
|
|
95
|
+
+ '3. Topologia de deployment (single instance / multi-region / serverless / edge)\n'
|
|
96
|
+
+ '4. Estrategia async (sync only / queue + workers / event bus / saga)\n'
|
|
97
|
+
+ '5. Persistence model + ERD inicial textual\n'
|
|
98
|
+
+ '6. Middleware stack (concretado del step 6)\n'
|
|
99
|
+
+ '7. Security model (auth, authz, encryption, secrets)\n'
|
|
100
|
+
+ '8. Observability (logs, metrics, traces, alertas del step 8)\n'
|
|
101
|
+
+ '9. Compliance hooks (per step 7 decisions)\n'
|
|
102
|
+
+ '10. Costos esperados (modelado de step 8)\n';
|
|
103
|
+
case 'design':
|
|
104
|
+
return common + '\n\nDocument type: **Solution design per block**.\n'
|
|
105
|
+
+ 'For each block in workflow.clarification.blocks, write a section with:\n'
|
|
106
|
+
+ '1. Data model (tables + relaciones + indices)\n'
|
|
107
|
+
+ '2. API contracts (endpoints + payloads + responses + errores)\n'
|
|
108
|
+
+ '3. Screens / pages (wireframes ascii o links a figma)\n'
|
|
109
|
+
+ '4. State machines (si aplica per step 5)\n'
|
|
110
|
+
+ '5. Sequence diagrams (las 2-3 secuencias mas complejas, textuales)\n'
|
|
111
|
+
+ '6. Edge cases identificados + estrategia\n'
|
|
112
|
+
+ '7. Test cases obligatorios (e2e + structural)\n'
|
|
113
|
+
+ '8. NAC-3 attributes (preview del manifest)\n';
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
function sha256(text) {
|
|
117
|
+
return createHash('sha256').update(text, 'utf-8').digest('hex');
|
|
118
|
+
}
|
|
119
|
+
async function runSpec(kind, opts) {
|
|
120
|
+
header('Yujin Forge -- spec ' + kind);
|
|
121
|
+
console.log('');
|
|
122
|
+
const projectRoot = opts.cwd ? path.resolve(opts.cwd) : process.cwd();
|
|
123
|
+
const wf = await readWorkflow(projectRoot);
|
|
124
|
+
/* Pre-requisites. */
|
|
125
|
+
const cl = wf.clarification;
|
|
126
|
+
if (!cl?.functional || !cl?.nfr_quantitative || !cl?.nfr_structural
|
|
127
|
+
|| !cl?.nfr_governance || !cl?.nfr_operational || !cl?.blocks) {
|
|
128
|
+
console.log(c.error('Clarification (Phase II) incompleta. Falta al menos una ronda.'));
|
|
129
|
+
console.log(c.dim('Corre: ') + c.code('yf clarify functional') + c.dim(' ... seguir hasta blocks.'));
|
|
130
|
+
process.exitCode = 1;
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
if ((kind === 'arch' || kind === 'design') && !wf.specs?.rfp) {
|
|
134
|
+
console.log(c.error('RFP debe estar generado primero.'));
|
|
135
|
+
console.log(c.dim('Corre: ') + c.code('yf spec rfp'));
|
|
136
|
+
process.exitCode = 1;
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
const existing = wf.specs?.[kind];
|
|
140
|
+
if (existing && !opts.yes) {
|
|
141
|
+
console.log(c.warn('Ya existe ') + c.brand(DOC_FILENAME[kind])
|
|
142
|
+
+ c.warn(' (version ' + existing.version + ').'));
|
|
143
|
+
console.log(c.dim('Para regenerar, corre con ') + c.code('--yes'));
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
/* Build the context. */
|
|
147
|
+
const clarificationDump = await readAllClarification(projectRoot);
|
|
148
|
+
if (clarificationDump.trim() === '') {
|
|
149
|
+
console.log(c.error('No se encontraron docs en docs/clarification/. Re-corre las rondas.'));
|
|
150
|
+
process.exitCode = 1;
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
/* If generating arch or design, also feed the RFP. */
|
|
154
|
+
let priorDocs = '';
|
|
155
|
+
if (kind === 'arch' || kind === 'design') {
|
|
156
|
+
try {
|
|
157
|
+
const rfpText = await fs.readFile(path.join(projectRoot, 'docs', wf.specs.rfp.doc_path.replace(/^docs\//, '')), 'utf-8');
|
|
158
|
+
priorDocs += '\n\n===== EXISTING RFP =====\n' + rfpText;
|
|
159
|
+
}
|
|
160
|
+
catch { /* may not exist if doc_path was relative differently */ }
|
|
161
|
+
}
|
|
162
|
+
if (kind === 'design' && wf.specs?.arch) {
|
|
163
|
+
try {
|
|
164
|
+
const archText = await fs.readFile(path.join(projectRoot, 'docs', wf.specs.arch.doc_path.replace(/^docs\//, '')), 'utf-8');
|
|
165
|
+
priorDocs += '\n\n===== EXISTING ARCHITECTURE =====\n' + archText;
|
|
166
|
+
}
|
|
167
|
+
catch { /* skip */ }
|
|
168
|
+
}
|
|
169
|
+
const userMessage = [
|
|
170
|
+
'Project root: ' + projectRoot,
|
|
171
|
+
'Tier: ' + (wf.tier ?? 'unknown'),
|
|
172
|
+
'Intent: ' + JSON.stringify(wf.intent ?? {}, null, 2),
|
|
173
|
+
'',
|
|
174
|
+
'===== CLARIFICATION ROUNDS =====',
|
|
175
|
+
clarificationDump,
|
|
176
|
+
priorDocs,
|
|
177
|
+
'',
|
|
178
|
+
'Generate the document now. Output the FULL markdown body only.',
|
|
179
|
+
'No preamble, no chatter, no closing remarks. Start with the first',
|
|
180
|
+
'H2 / heading and end with the last content line.',
|
|
181
|
+
].join('\n');
|
|
182
|
+
console.log(c.dim('Llamando Claude para generar ' + DOC_FILENAME[kind] + ' ...'));
|
|
183
|
+
console.log(c.dim('(prompt strategic asset; en HITO 4 esto se mueve a prompts.yujin.app)'));
|
|
184
|
+
console.log('');
|
|
185
|
+
const claude = new ClaudeClient();
|
|
186
|
+
let body;
|
|
187
|
+
try {
|
|
188
|
+
const resp = await claude.chat({
|
|
189
|
+
system: buildSystemPromptFor(kind),
|
|
190
|
+
messages: [{ role: 'user', content: userMessage }],
|
|
191
|
+
maxTokens: 8192,
|
|
192
|
+
});
|
|
193
|
+
body = resp.text.trim();
|
|
194
|
+
if (body === '')
|
|
195
|
+
throw new Error('Claude returned empty body');
|
|
196
|
+
}
|
|
197
|
+
catch (err) {
|
|
198
|
+
console.error(c.error('Generacion fallo: ') + String(err instanceof Error ? err.message : err));
|
|
199
|
+
process.exitCode = 1;
|
|
200
|
+
return;
|
|
201
|
+
}
|
|
202
|
+
const docsDir = path.join(projectRoot, 'docs');
|
|
203
|
+
await fs.mkdir(docsDir, { recursive: true });
|
|
204
|
+
const filePath = path.join(docsDir, DOC_FILENAME[kind]);
|
|
205
|
+
const previousVersion = existing?.version ?? 0;
|
|
206
|
+
const newVersion = previousVersion + 1;
|
|
207
|
+
const stamp = new Date().toISOString();
|
|
208
|
+
const header_md = '# ' + DOC_TITLE[kind] + ' -- ' + (wf.intent?.operation ?? 'project') + '\n\n'
|
|
209
|
+
+ '*Version ' + newVersion + ' generated by Yujin Forge on ' + stamp + '.*\n'
|
|
210
|
+
+ '*Tier: ' + wf.tier + '. To re-generate: `yf spec ' + kind + ' --yes`.*\n\n';
|
|
211
|
+
const full = header_md + body + '\n';
|
|
212
|
+
await fs.writeFile(filePath, full, 'utf-8');
|
|
213
|
+
const sha = sha256(full);
|
|
214
|
+
const relPath = path.relative(projectRoot, filePath);
|
|
215
|
+
await patchWorkflowGroup(projectRoot, 'specs', {
|
|
216
|
+
[kind]: {
|
|
217
|
+
done_at: stamp,
|
|
218
|
+
version: newVersion,
|
|
219
|
+
doc_path: relPath,
|
|
220
|
+
sha256: sha,
|
|
221
|
+
},
|
|
222
|
+
});
|
|
223
|
+
console.log(c.success('Generado: ') + c.brand(relPath) + c.dim(' (' + full.length + ' chars, sha256:' + sha.slice(0, 12) + '...)'));
|
|
224
|
+
console.log('');
|
|
225
|
+
switch (kind) {
|
|
226
|
+
case 'rfp':
|
|
227
|
+
console.log(c.dim('Siguiente: ') + c.code('yf spec arch'));
|
|
228
|
+
break;
|
|
229
|
+
case 'arch':
|
|
230
|
+
console.log(c.dim('Siguiente: ') + c.code('yf spec design'));
|
|
231
|
+
break;
|
|
232
|
+
case 'design':
|
|
233
|
+
console.log(c.dim('Phase III completa. Siguiente: ') + c.code('yf approve rfp arch design'));
|
|
234
|
+
break;
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
export function registerSpecCommand(program) {
|
|
238
|
+
const spec = program.command('spec')
|
|
239
|
+
.description('Phase III steps 10-12: generate RFP + Architecture + Solution Design.');
|
|
240
|
+
for (const kind of ['rfp', 'arch', 'design']) {
|
|
241
|
+
spec.command(kind)
|
|
242
|
+
.description('Generate the ' + DOC_TITLE[kind] + ' doc into docs/' + DOC_FILENAME[kind])
|
|
243
|
+
.option('--cwd <path>', 'project root (default: current directory)')
|
|
244
|
+
.option('--yes', 'overwrite existing version')
|
|
245
|
+
.action(async (opts) => {
|
|
246
|
+
try {
|
|
247
|
+
await runSpec(kind, opts);
|
|
248
|
+
}
|
|
249
|
+
catch (err) {
|
|
250
|
+
console.error(c.error(err instanceof Error ? err.message : String(err)));
|
|
251
|
+
process.exitCode = 1;
|
|
252
|
+
}
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
//# sourceMappingURL=spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spec.js","sourceRoot":"","sources":["../../src/commands/spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `yf support <verb>` -- inspect the runtime error reports
|
|
3
|
+
* collected by the panel.
|
|
4
|
+
*
|
|
5
|
+
* Subcommands:
|
|
6
|
+
* yf support reports [--limit N] [--json]
|
|
7
|
+
* -- list the most recent reports.
|
|
8
|
+
* yf support reports tail
|
|
9
|
+
* -- print only the last entry (handy after a bug).
|
|
10
|
+
* yf support reports clear
|
|
11
|
+
* -- wipe the JSONL + rotated copy. Asks confirmation.
|
|
12
|
+
*
|
|
13
|
+
* Per SQ Sec 15: Pablo never has to open the JSONL with a
|
|
14
|
+
* text editor or remember its path. `yf support reports tail`
|
|
15
|
+
* is the new "podes pegarme el log" -- except Forge already
|
|
16
|
+
* has the log.
|
|
17
|
+
*
|
|
18
|
+
* ASCII-only.
|
|
19
|
+
*/
|
|
20
|
+
import type { Command } from 'commander';
|
|
21
|
+
export declare function registerSupportCommand(program: Command): void;
|
|
22
|
+
//# sourceMappingURL=support.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"support.d.ts","sourceRoot":"","sources":["../../src/commands/support.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAmGzC,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAkC7D"}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import prompts from 'prompts';
|
|
2
|
+
import { promises as fs } from 'node:fs';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { c, header } from '../ui/colors.js';
|
|
5
|
+
import { configDir } from '../license/index.js';
|
|
6
|
+
import { readReports } from '../support/reports.js';
|
|
7
|
+
function formatReport(r, indent = ' ') {
|
|
8
|
+
const lines = [];
|
|
9
|
+
const levelTag = r.level === 'error' ? c.error('ERR')
|
|
10
|
+
: r.level === 'warn' ? c.warn('WRN')
|
|
11
|
+
: c.dim('INF');
|
|
12
|
+
lines.push(indent + c.dim(r.ts) + ' ' + levelTag + ' '
|
|
13
|
+
+ c.brand(r.source) + ' -- ' + r.message);
|
|
14
|
+
if (r.url)
|
|
15
|
+
lines.push(indent + ' ' + c.dim('url: ') + r.url
|
|
16
|
+
+ (r.line !== undefined ? ':' + r.line : '')
|
|
17
|
+
+ (r.col !== undefined ? ':' + r.col : ''));
|
|
18
|
+
if (r.view)
|
|
19
|
+
lines.push(indent + ' ' + c.dim('view: ') + r.view);
|
|
20
|
+
if (r.request_trail && r.request_trail.length > 0) {
|
|
21
|
+
lines.push(indent + ' ' + c.dim('trail:'));
|
|
22
|
+
for (const t of r.request_trail) {
|
|
23
|
+
lines.push(indent + ' ' + t.method + ' ' + t.url
|
|
24
|
+
+ (t.status !== undefined ? ' -> ' + t.status : ''));
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
if (r.stack) {
|
|
28
|
+
const stackLines = r.stack.split('\n').slice(0, 5);
|
|
29
|
+
lines.push(indent + ' ' + c.dim('stack:'));
|
|
30
|
+
for (const sl of stackLines)
|
|
31
|
+
lines.push(indent + ' ' + sl);
|
|
32
|
+
}
|
|
33
|
+
return lines;
|
|
34
|
+
}
|
|
35
|
+
async function runList(opts) {
|
|
36
|
+
let reports = await readReports();
|
|
37
|
+
if (opts.level)
|
|
38
|
+
reports = reports.filter((r) => r.level === opts.level);
|
|
39
|
+
if (opts.source)
|
|
40
|
+
reports = reports.filter((r) => r.source === opts.source);
|
|
41
|
+
const limit = typeof opts.limit === 'number' && opts.limit > 0 ? opts.limit : 50;
|
|
42
|
+
const slice = reports.slice(-limit);
|
|
43
|
+
if (opts.json) {
|
|
44
|
+
process.stdout.write(JSON.stringify(slice, null, 2) + '\n');
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
header('Yujin Forge -- support reports');
|
|
48
|
+
console.log('');
|
|
49
|
+
console.log(c.dim(' File: ') + path.join(configDir(), 'support_reports.jsonl'));
|
|
50
|
+
console.log(c.dim(' Total stored: ') + reports.length
|
|
51
|
+
+ (slice.length < reports.length ? c.dim(' (showing last ' + slice.length + ')') : ''));
|
|
52
|
+
console.log('');
|
|
53
|
+
if (slice.length === 0) {
|
|
54
|
+
console.log(c.dim(' No reports stored yet. The panel writes here when an error fires.'));
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
for (const r of slice) {
|
|
58
|
+
for (const ln of formatReport(r))
|
|
59
|
+
console.log(ln);
|
|
60
|
+
console.log('');
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
async function runTail() {
|
|
64
|
+
const reports = await readReports();
|
|
65
|
+
if (reports.length === 0) {
|
|
66
|
+
console.log(c.dim('No reports stored.'));
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
const last = reports[reports.length - 1];
|
|
70
|
+
header('Yujin Forge -- last support report');
|
|
71
|
+
console.log('');
|
|
72
|
+
for (const ln of formatReport(last))
|
|
73
|
+
console.log(ln);
|
|
74
|
+
}
|
|
75
|
+
async function runClear(opts) {
|
|
76
|
+
const file = path.join(configDir(), 'support_reports.jsonl');
|
|
77
|
+
const rotated = file + '.1';
|
|
78
|
+
if (!opts.yes) {
|
|
79
|
+
const r = await prompts({
|
|
80
|
+
type: 'confirm', name: 'go',
|
|
81
|
+
message: 'Delete every stored support report? (cannot be undone)',
|
|
82
|
+
initial: false,
|
|
83
|
+
});
|
|
84
|
+
if (!r.go) {
|
|
85
|
+
console.log(c.dim('Cancelled.'));
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
for (const p of [file, rotated]) {
|
|
90
|
+
try {
|
|
91
|
+
await fs.unlink(p);
|
|
92
|
+
}
|
|
93
|
+
catch { /* ok */ }
|
|
94
|
+
}
|
|
95
|
+
console.log(c.success('Support reports cleared.'));
|
|
96
|
+
}
|
|
97
|
+
export function registerSupportCommand(program) {
|
|
98
|
+
const cmd = program.command('support')
|
|
99
|
+
.description('Inspect the runtime error reports collected from the chat panel.');
|
|
100
|
+
/* `yf support reports` family. Nesting matches the user mental
|
|
101
|
+
* model -- `reports` is the noun, `list/tail/clear` are verbs. */
|
|
102
|
+
const reports = cmd.command('reports')
|
|
103
|
+
.description('Manage the runtime error reports captured by the chat panel.');
|
|
104
|
+
reports.command('list', { isDefault: true })
|
|
105
|
+
.description('List collected support reports (newest last). Default verb when no subcommand given.')
|
|
106
|
+
.option('--limit <n>', 'max rows to print (default 50)', (v) => parseInt(v, 10))
|
|
107
|
+
.option('--level <level>', 'filter by level (error | warn | info)')
|
|
108
|
+
.option('--source <source>', 'filter by source (window.onerror | fetch | unhandled | panel)')
|
|
109
|
+
.option('--json', 'emit JSON array instead of human-readable rows')
|
|
110
|
+
.action(async (opts) => {
|
|
111
|
+
try {
|
|
112
|
+
await runList(opts);
|
|
113
|
+
}
|
|
114
|
+
catch (err) {
|
|
115
|
+
console.error(c.error(err instanceof Error ? err.message : String(err)));
|
|
116
|
+
process.exitCode = 1;
|
|
117
|
+
}
|
|
118
|
+
});
|
|
119
|
+
reports.command('tail')
|
|
120
|
+
.description('Print only the most recent support report.')
|
|
121
|
+
.action(async () => {
|
|
122
|
+
try {
|
|
123
|
+
await runTail();
|
|
124
|
+
}
|
|
125
|
+
catch (err) {
|
|
126
|
+
console.error(c.error(err instanceof Error ? err.message : String(err)));
|
|
127
|
+
process.exitCode = 1;
|
|
128
|
+
}
|
|
129
|
+
});
|
|
130
|
+
reports.command('clear')
|
|
131
|
+
.description('Wipe the stored support reports.')
|
|
132
|
+
.option('--yes', 'skip the confirmation prompt')
|
|
133
|
+
.action(async (opts) => {
|
|
134
|
+
try {
|
|
135
|
+
await runClear(opts);
|
|
136
|
+
}
|
|
137
|
+
catch (err) {
|
|
138
|
+
console.error(c.error(err instanceof Error ? err.message : String(err)));
|
|
139
|
+
process.exitCode = 1;
|
|
140
|
+
}
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=support.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"support.js","sourceRoot":"","sources":["../../src/commands/support.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `yf triage` -- Phase I step 1 of PRODUCT_WORKFLOW.md.
|
|
3
|
+
*
|
|
4
|
+
* Asks the user 5 questions, classifies the project into one of
|
|
5
|
+
* three complexity tiers (Simple / Medium / Full), and persists
|
|
6
|
+
* the decision to yujin.forge.json::workflow. The result drives
|
|
7
|
+
* which subsequent phases apply (see PRODUCT_WORKFLOW.md sec 1).
|
|
8
|
+
*
|
|
9
|
+
* Questions:
|
|
10
|
+
* 1. Output type (landing / blog / CRUD app / SaaS / regulated system)
|
|
11
|
+
* 2. Volumetria 12m (numeric: expected concurrent users at 12 months)
|
|
12
|
+
* 3. Industry context (general / health / finance / education / government)
|
|
13
|
+
* 4. Region (LATAM / US / EU / global)
|
|
14
|
+
* 5. Team maintaining (solo / pair / team)
|
|
15
|
+
*
|
|
16
|
+
* Classification rules:
|
|
17
|
+
* Simple = output in {landing, blog, demo} OR volumetria < 50 AND
|
|
18
|
+
* industry = general AND team = solo
|
|
19
|
+
* Full = industry in {health, finance, government} OR volumetria > 5000
|
|
20
|
+
* OR output = regulated_system OR (region = EU AND volumetria > 100)
|
|
21
|
+
* Medium = everything else
|
|
22
|
+
*
|
|
23
|
+
* User can override the auto-tier in the final confirmation.
|
|
24
|
+
*
|
|
25
|
+
* ASCII-only.
|
|
26
|
+
*/
|
|
27
|
+
import type { Command } from 'commander';
|
|
28
|
+
export interface TriageOptions {
|
|
29
|
+
cwd?: string;
|
|
30
|
+
yes?: boolean;
|
|
31
|
+
}
|
|
32
|
+
export declare function runTriage(opts: TriageOptions): Promise<void>;
|
|
33
|
+
export declare function registerTriageCommand(program: Command): void;
|
|
34
|
+
//# sourceMappingURL=triage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"triage.d.ts","sourceRoot":"","sources":["../../src/commands/triage.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAUzC,MAAM,WAAW,aAAa;IAC5B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAsED,wBAAsB,SAAS,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CA6HlE;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAc5D"}
|