@miniidealab/openlogos 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,76 @@
1
+ import { readFileSync, writeFileSync, existsSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { readLocale, conventionsForAgentsMd } from '../i18n.js';
4
+ export function syncLogosProjectName(root, projectName) {
5
+ const yamlPath = join(root, 'logos', 'logos-project.yaml');
6
+ if (!existsSync(yamlPath))
7
+ return false;
8
+ const content = readFileSync(yamlPath, 'utf-8');
9
+ const updated = content.replace(/^(\s*name:\s*)"[^"]*"/m, `$1"${projectName}"`);
10
+ if (updated !== content) {
11
+ writeFileSync(yamlPath, updated);
12
+ return true;
13
+ }
14
+ return false;
15
+ }
16
+ export function sync() {
17
+ const root = process.cwd();
18
+ const configPath = join(root, 'logos', 'logos.config.json');
19
+ if (!existsSync(configPath)) {
20
+ console.error('Error: logos/logos.config.json not found.');
21
+ console.error('Run `openlogos init` first to initialize the project.');
22
+ process.exit(1);
23
+ }
24
+ console.log('\nSyncing project files...\n');
25
+ const config = JSON.parse(readFileSync(configPath, 'utf-8'));
26
+ const projectName = config.name || 'Unnamed Project';
27
+ const locale = readLocale(root);
28
+ const namesynced = syncLogosProjectName(root, projectName);
29
+ if (namesynced) {
30
+ console.log(` ✓ logos-project.yaml name synced to "${projectName}"`);
31
+ }
32
+ const content = `# AI Assistant Instructions
33
+
34
+ This project follows the **OpenLogos** methodology.
35
+ Read \`logos/logos-project.yaml\` first to understand the project resource index.
36
+
37
+ ## Project Context
38
+ - Config: \`logos/logos.config.json\`
39
+ - Resource Index: \`logos/logos-project.yaml\`
40
+
41
+ ## Methodology Rules
42
+ 1. Never write code without first completing the design documents
43
+ 2. Follow the Why → What → How progression
44
+ 3. All API designs must originate from scenario sequence diagrams
45
+ 4. All code changes must have corresponding API orchestration tests
46
+ 5. Use the Delta change workflow for iterations (see logos/changes/ directory)
47
+ 6. All generated test code must include an OpenLogos reporter (see spec/test-results.md)
48
+
49
+ ## Interaction Guidelines
50
+ When the user's request is vague or they ask "what should I do next":
51
+ 1. Scan \`logos/resources/\` to determine the current project phase
52
+ 2. Suggest the specific next step based on what's missing
53
+ 3. Provide a ready-to-use prompt the user can directly say
54
+ 4. Never start generating documents without confirming key information
55
+
56
+ Phase detection logic:
57
+ - \`logos/resources/prd/1-product-requirements/\` is empty → suggest Phase 1 (prd-writer)
58
+ - requirements exist but \`2-product-design/\` is empty → suggest Phase 2 (product-designer)
59
+ - design exists but \`3-technical-plan/1-architecture/\` is empty → suggest Phase 3 Step 0 (architecture-designer)
60
+ - architecture exists but \`3-technical-plan/2-scenario-implementation/\` is empty → suggest Phase 3 Step 1 (scenario-architect)
61
+ - scenarios exist but \`logos/resources/api/\` is empty → suggest Phase 3 Step 2 (api-designer + db-designer)
62
+ - API exists but \`logos/resources/test/\` is empty → suggest Phase 3 Step 3a (test-writer)
63
+ - test cases exist but \`logos/resources/scenario/\` is empty → suggest Phase 3 Step 3b (test-orchestrator, API projects only)
64
+ - All above exist → suggest Phase 3 Step 4 (code generation)
65
+ - code generated but \`logos/resources/verify/\` is empty → suggest Phase 3 Step 5 (run tests then \`openlogos verify\`)
66
+
67
+ ## Conventions
68
+ ${conventionsForAgentsMd(locale)}
69
+ `;
70
+ writeFileSync(join(root, 'AGENTS.md'), content);
71
+ console.log(' ✓ AGENTS.md updated');
72
+ writeFileSync(join(root, 'CLAUDE.md'), content);
73
+ console.log(' ✓ CLAUDE.md updated');
74
+ console.log('\nSync complete.\n');
75
+ }
76
+ //# sourceMappingURL=sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAClE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAEhE,MAAM,UAAU,oBAAoB,CAAC,IAAY,EAAE,WAAmB;IACpE,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,oBAAoB,CAAC,CAAC;IAC3D,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,KAAK,CAAC;IAExC,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAChD,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAC7B,wBAAwB,EACxB,MAAM,WAAW,GAAG,CACrB,CAAC;IAEF,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;QACxB,aAAa,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACjC,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,IAAI;IAClB,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC3B,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,mBAAmB,CAAC,CAAC;IAE5D,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,OAAO,CAAC,KAAK,CAAC,2CAA2C,CAAC,CAAC;QAC3D,OAAO,CAAC,KAAK,CAAC,uDAAuD,CAAC,CAAC;QACvE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;IAE5C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;IAC7D,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,IAAI,iBAAiB,CAAC;IACrD,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;IAEhC,MAAM,UAAU,GAAG,oBAAoB,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IAC3D,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,CAAC,GAAG,CAAC,0CAA0C,WAAW,GAAG,CAAC,CAAC;IACxE,CAAC;IAED,MAAM,OAAO,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAoChB,sBAAsB,CAAC,MAAM,CAAC;CAC/B,CAAC;IAEA,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,EAAE,OAAO,CAAC,CAAC;IAChD,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;IAErC,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,EAAE,OAAO,CAAC,CAAC;IAChD,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;IAErC,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;AACpC,CAAC"}
@@ -0,0 +1,30 @@
1
+ export interface TestResult {
2
+ id: string;
3
+ status: 'pass' | 'fail' | 'skip';
4
+ duration_ms?: number;
5
+ timestamp?: string;
6
+ error?: string;
7
+ scenario?: string;
8
+ }
9
+ export interface ChecklistItem {
10
+ checked: boolean;
11
+ text: string;
12
+ file: string;
13
+ }
14
+ export interface AcTraceEntry {
15
+ acId: string;
16
+ description: string;
17
+ linkedCaseIds: string[];
18
+ file: string;
19
+ }
20
+ export declare function parseJsonl(content: string): TestResult[];
21
+ export declare function extractDefinedIds(root: string): {
22
+ ids: string[];
23
+ utCount: number;
24
+ stCount: number;
25
+ };
26
+ export declare function extractChecklist(root: string): ChecklistItem[];
27
+ export declare function extractAcTrace(root: string): AcTraceEntry[];
28
+ export declare function generateReport(defined: string[], results: TestResult[], passed: TestResult[], failed: TestResult[], skipped: TestResult[], uncovered: string[], coveragePct: string, passRatePct: string, gateResult: 'PASS' | 'FAIL', checklist: ChecklistItem[], acTrace: AcTraceEntry[], _resultIds: Set<string>): string;
29
+ export declare function verify(): void;
30
+ //# sourceMappingURL=verify.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../src/commands/verify.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IACjC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAWD,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,EAAE,CAaxD;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,GAAG,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAuBnG;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,EAAE,CAgC9D;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,EAAE,CAoC3D;AAED,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,EAAE,EACjB,OAAO,EAAE,UAAU,EAAE,EACrB,MAAM,EAAE,UAAU,EAAE,EACpB,MAAM,EAAE,UAAU,EAAE,EACpB,OAAO,EAAE,UAAU,EAAE,EACrB,SAAS,EAAE,MAAM,EAAE,EACnB,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,GAAG,MAAM,EAC3B,SAAS,EAAE,aAAa,EAAE,EAC1B,OAAO,EAAE,YAAY,EAAE,EACvB,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,GACtB,MAAM,CA4FR;AAED,wBAAgB,MAAM,SA+IrB"}
@@ -0,0 +1,330 @@
1
+ import { existsSync, readFileSync, readdirSync, writeFileSync, mkdirSync } from 'node:fs';
2
+ import { join, dirname } from 'node:path';
3
+ import { readLocale, t } from '../i18n.js';
4
+ const DEFAULT_RESULT_PATH = 'logos/resources/verify/test-results.jsonl';
5
+ const TEST_CASES_DIR = 'logos/resources/test';
6
+ const REPORT_DIR = 'logos/resources/verify';
7
+ const ID_PATTERN = /\b(UT|ST)-S\d{2}-\d{2,3}\b/g;
8
+ const CHECKLIST_PATTERN = /^- \[([ x])\] (.+)$/gm;
9
+ const AC_TABLE_HEADER = /^## 四、验收条件追溯$/m;
10
+ const AC_ROW_PATTERN = /^\|\s*(S\d{2}-AC-\d{2,3})\s*\|([^|]*)\|([^|]*)\|/gm;
11
+ const LINE = '─'.repeat(50);
12
+ export function parseJsonl(content) {
13
+ const resultMap = new Map();
14
+ for (const line of content.split('\n')) {
15
+ const trimmed = line.trim();
16
+ if (!trimmed)
17
+ continue;
18
+ try {
19
+ const obj = JSON.parse(trimmed);
20
+ if (obj.id && obj.status) {
21
+ resultMap.set(obj.id, obj);
22
+ }
23
+ }
24
+ catch { /* skip malformed lines */ }
25
+ }
26
+ return Array.from(resultMap.values());
27
+ }
28
+ export function extractDefinedIds(root) {
29
+ const dir = join(root, TEST_CASES_DIR);
30
+ if (!existsSync(dir))
31
+ return { ids: [], utCount: 0, stCount: 0 };
32
+ const idSet = new Set();
33
+ try {
34
+ const files = readdirSync(dir, { recursive: true })
35
+ .map(f => String(f))
36
+ .filter(f => f.endsWith('-test-cases.md'));
37
+ for (const file of files) {
38
+ const content = readFileSync(join(dir, file), 'utf-8');
39
+ let match;
40
+ while ((match = ID_PATTERN.exec(content)) !== null) {
41
+ idSet.add(match[0]);
42
+ }
43
+ }
44
+ }
45
+ catch { /* directory read error */ }
46
+ const ids = Array.from(idSet).sort();
47
+ const utCount = ids.filter(id => id.startsWith('UT-')).length;
48
+ const stCount = ids.filter(id => id.startsWith('ST-')).length;
49
+ return { ids, utCount, stCount };
50
+ }
51
+ export function extractChecklist(root) {
52
+ const dir = join(root, TEST_CASES_DIR);
53
+ if (!existsSync(dir))
54
+ return [];
55
+ const items = [];
56
+ try {
57
+ const files = readdirSync(dir, { recursive: true })
58
+ .map(f => String(f))
59
+ .filter(f => f.endsWith('-test-cases.md'));
60
+ for (const file of files) {
61
+ const content = readFileSync(join(dir, file), 'utf-8');
62
+ const sectionStart = content.indexOf('## 三、覆盖度校验');
63
+ if (sectionStart === -1)
64
+ continue;
65
+ const sectionEnd = content.indexOf('\n## ', sectionStart + 1);
66
+ const section = sectionEnd === -1
67
+ ? content.slice(sectionStart)
68
+ : content.slice(sectionStart, sectionEnd);
69
+ let match;
70
+ const re = new RegExp(CHECKLIST_PATTERN.source, CHECKLIST_PATTERN.flags);
71
+ while ((match = re.exec(section)) !== null) {
72
+ items.push({
73
+ checked: match[1] === 'x',
74
+ text: match[2].trim(),
75
+ file,
76
+ });
77
+ }
78
+ }
79
+ }
80
+ catch { /* directory read error */ }
81
+ return items;
82
+ }
83
+ export function extractAcTrace(root) {
84
+ const dir = join(root, TEST_CASES_DIR);
85
+ if (!existsSync(dir))
86
+ return [];
87
+ const entries = [];
88
+ try {
89
+ const files = readdirSync(dir, { recursive: true })
90
+ .map(f => String(f))
91
+ .filter(f => f.endsWith('-test-cases.md'));
92
+ for (const file of files) {
93
+ const content = readFileSync(join(dir, file), 'utf-8');
94
+ if (!AC_TABLE_HEADER.test(content))
95
+ continue;
96
+ const sectionStart = content.search(AC_TABLE_HEADER);
97
+ const sectionEnd = content.indexOf('\n## ', sectionStart + 1);
98
+ const section = sectionEnd === -1
99
+ ? content.slice(sectionStart)
100
+ : content.slice(sectionStart, sectionEnd);
101
+ let match;
102
+ const re = new RegExp(AC_ROW_PATTERN.source, AC_ROW_PATTERN.flags);
103
+ while ((match = re.exec(section)) !== null) {
104
+ const acId = match[1].trim();
105
+ const description = match[2].trim();
106
+ const caseIdsRaw = match[3].trim();
107
+ const caseIdTest = /\b(UT|ST)-S\d{2}-\d{2,3}\b/;
108
+ const linkedCaseIds = caseIdsRaw
109
+ .split(/[,,]/)
110
+ .map(s => s.trim())
111
+ .filter(s => caseIdTest.test(s));
112
+ entries.push({ acId, description, linkedCaseIds, file });
113
+ }
114
+ }
115
+ }
116
+ catch { /* directory read error */ }
117
+ return entries;
118
+ }
119
+ export function generateReport(defined, results, passed, failed, skipped, uncovered, coveragePct, passRatePct, gateResult, checklist, acTrace, _resultIds) {
120
+ const now = new Date().toISOString().slice(0, 10);
121
+ let md = `# Acceptance Report\n\n> Generated by \`openlogos verify\` on ${now}\n\n`;
122
+ md += `## Summary\n\n`;
123
+ md += `| Metric | Value |\n|--------|-------|\n`;
124
+ md += `| Defined cases | ${defined.length} |\n`;
125
+ md += `| Executed cases | ${results.length} |\n`;
126
+ md += `| Passed | ${passed.length} |\n`;
127
+ md += `| Failed | ${failed.length} |\n`;
128
+ md += `| Skipped | ${skipped.length} |\n`;
129
+ md += `| Uncovered | ${uncovered.length} |\n`;
130
+ md += `| Coverage | ${coveragePct}% |\n`;
131
+ md += `| Pass rate | ${passRatePct}% |\n`;
132
+ md += `| **Gate 3.5** | **${gateResult}** |\n\n`;
133
+ if (failed.length > 0) {
134
+ md += `## Failed Cases\n\n`;
135
+ md += `| ID | Error |\n|----|-------|\n`;
136
+ for (const r of failed) {
137
+ const error = (r.error ?? 'unknown').replace(/\|/g, '\\|').replace(/\n/g, ' ');
138
+ md += `| ${r.id} | ${error} |\n`;
139
+ }
140
+ md += '\n';
141
+ }
142
+ if (uncovered.length > 0) {
143
+ md += `## Uncovered Cases\n\n`;
144
+ for (const id of uncovered) {
145
+ md += `- ${id}\n`;
146
+ }
147
+ md += '\n';
148
+ }
149
+ if (skipped.length > 0) {
150
+ md += `## Skipped Cases\n\n`;
151
+ for (const r of skipped) {
152
+ md += `- ${r.id}\n`;
153
+ }
154
+ md += '\n';
155
+ }
156
+ if (checklist.length > 0) {
157
+ const checked = checklist.filter(c => c.checked).length;
158
+ md += `## Design-time Coverage (Layer 1)\n\n`;
159
+ md += `> Parsed from the "三、覆盖度校验" checklist in test-cases.md. `;
160
+ md += `These assertions were made by AI at test-design time.\n\n`;
161
+ md += `| Status | Assertion | Source |\n|--------|-----------|--------|\n`;
162
+ for (const item of checklist) {
163
+ const icon = item.checked ? '✅' : '❌';
164
+ md += `| ${icon} | ${item.text} | ${item.file} |\n`;
165
+ }
166
+ md += `\n**${checked}/${checklist.length}** assertions confirmed.\n\n`;
167
+ }
168
+ if (acTrace.length > 0) {
169
+ const resultMap = new Map(results.map(r => [r.id, r]));
170
+ md += `## Acceptance Criteria Traceability (Layer 3)\n\n`;
171
+ md += `> Traces requirement acceptance criteria → test cases → runtime results.\n\n`;
172
+ md += `| AC ID | Description | Linked Cases | Runtime Status |\n`;
173
+ md += `|-------|-------------|-------------|----------------|\n`;
174
+ for (const ac of acTrace) {
175
+ const statuses = ac.linkedCaseIds.map(cid => {
176
+ const r = resultMap.get(cid);
177
+ if (!r)
178
+ return `${cid}:⚠️missing`;
179
+ if (r.status === 'pass')
180
+ return `${cid}:✅`;
181
+ if (r.status === 'fail')
182
+ return `${cid}:❌`;
183
+ return `${cid}:⏭️`;
184
+ });
185
+ const allPass = ac.linkedCaseIds.length > 0 && ac.linkedCaseIds.every(cid => {
186
+ const r = resultMap.get(cid);
187
+ return r?.status === 'pass';
188
+ });
189
+ const acStatus = ac.linkedCaseIds.length === 0
190
+ ? '⚠️ no linked cases'
191
+ : allPass ? '✅ PASS' : '❌ FAIL';
192
+ md += `| ${ac.acId} | ${ac.description} | ${statuses.join(', ')} | ${acStatus} |\n`;
193
+ }
194
+ const acPassed = acTrace.filter(ac => ac.linkedCaseIds.length > 0 && ac.linkedCaseIds.every(cid => {
195
+ const r = resultMap.get(cid);
196
+ return r?.status === 'pass';
197
+ })).length;
198
+ const acWithoutLinks = acTrace.filter(ac => ac.linkedCaseIds.length === 0).length;
199
+ md += `\n**${acPassed}/${acTrace.length}** acceptance criteria passed.`;
200
+ if (acWithoutLinks > 0) {
201
+ md += ` ⚠️ ${acWithoutLinks} criteria have no linked test cases.`;
202
+ }
203
+ md += '\n\n';
204
+ }
205
+ return md;
206
+ }
207
+ export function verify() {
208
+ const root = process.cwd();
209
+ const configPath = join(root, 'logos', 'logos.config.json');
210
+ if (!existsSync(configPath)) {
211
+ console.error('Error: logos/logos.config.json not found.');
212
+ console.error('Run `openlogos init` first to initialize the project.');
213
+ process.exit(1);
214
+ }
215
+ const locale = readLocale(root);
216
+ let resultPath = DEFAULT_RESULT_PATH;
217
+ try {
218
+ const config = JSON.parse(readFileSync(configPath, 'utf-8'));
219
+ if (config.verify?.result_path) {
220
+ resultPath = config.verify.result_path;
221
+ }
222
+ }
223
+ catch { /* use default */ }
224
+ console.log(`\n🔍 ${t(locale, 'verify.title')}\n`);
225
+ console.log(t(locale, 'verify.readingResults', { path: resultPath }));
226
+ console.log(t(locale, 'verify.readingCases'));
227
+ const fullResultPath = join(root, resultPath);
228
+ if (!existsSync(fullResultPath)) {
229
+ console.error(`\nError: ${t(locale, 'verify.noResults', { path: resultPath })}`);
230
+ process.exit(1);
231
+ }
232
+ const results = parseJsonl(readFileSync(fullResultPath, 'utf-8'));
233
+ const { ids: defined, utCount, stCount } = extractDefinedIds(root);
234
+ if (defined.length === 0) {
235
+ console.error(`\nError: ${t(locale, 'verify.noCases')}`);
236
+ process.exit(1);
237
+ }
238
+ const resultIds = new Set(results.map(r => r.id));
239
+ const passed = results.filter(r => r.status === 'pass');
240
+ const failed = results.filter(r => r.status === 'fail');
241
+ const skipped = results.filter(r => r.status === 'skip');
242
+ const uncovered = defined.filter(id => !resultIds.has(id));
243
+ const coveredCount = defined.filter(id => resultIds.has(id)).length;
244
+ const coveragePct = defined.length > 0
245
+ ? ((coveredCount / defined.length) * 100).toFixed(0)
246
+ : '0';
247
+ const passRatePct = results.length > 0
248
+ ? ((passed.length / results.length) * 100).toFixed(0)
249
+ : '0';
250
+ const checklist = extractChecklist(root);
251
+ const acTrace = extractAcTrace(root);
252
+ const checklistUnchecked = checklist.filter(c => !c.checked);
253
+ const resultMap = new Map(results.map(r => [r.id, r]));
254
+ const acFailed = acTrace.filter(ac => ac.linkedCaseIds.length === 0 ||
255
+ !ac.linkedCaseIds.every(cid => resultMap.get(cid)?.status === 'pass'));
256
+ const isPass = failed.length === 0 && uncovered.length === 0
257
+ && checklistUnchecked.length === 0 && acFailed.length === 0;
258
+ const gateResult = isPass ? 'PASS' : 'FAIL';
259
+ console.log(`\n${LINE}`);
260
+ console.log(`📊 ${t(locale, 'verify.summary')}`);
261
+ console.log(LINE);
262
+ console.log(` ${t(locale, 'verify.totalDefined', { count: String(defined.length), ut: String(utCount), st: String(stCount) })}`);
263
+ console.log(` ${t(locale, 'verify.totalExecuted', { count: String(results.length) })}`);
264
+ console.log(` ✅ ${t(locale, 'verify.passed', { count: String(passed.length) })}`);
265
+ console.log(` ❌ ${t(locale, 'verify.failed', { count: String(failed.length) })}`);
266
+ console.log(` ⏭️ ${t(locale, 'verify.skipped', { count: String(skipped.length) })}`);
267
+ console.log(LINE);
268
+ console.log(` ${t(locale, 'verify.coverage', { pct: coveragePct, covered: String(coveredCount), total: String(defined.length) })}`);
269
+ console.log(` ${t(locale, 'verify.passRate', { pct: passRatePct, passed: String(passed.length), total: String(results.length) })}`);
270
+ console.log(LINE);
271
+ if (failed.length > 0) {
272
+ console.log(`\n❌ ${t(locale, 'verify.failedCases')}`);
273
+ for (const r of failed) {
274
+ console.log(` ${r.id} ${r.error ?? ''}`);
275
+ }
276
+ }
277
+ if (uncovered.length > 0) {
278
+ console.log(`\n⚠️ ${t(locale, 'verify.uncoveredCases', { count: String(uncovered.length) })}`);
279
+ for (const id of uncovered) {
280
+ console.log(` ${id}`);
281
+ }
282
+ }
283
+ if (checklist.length > 0) {
284
+ const checked = checklist.filter(c => c.checked).length;
285
+ console.log(`\n📋 ${t(locale, 'verify.checklistTitle')}`);
286
+ console.log(` ${t(locale, 'verify.checklistSummary', { checked: String(checked), total: String(checklist.length) })}`);
287
+ if (checklistUnchecked.length > 0) {
288
+ console.log(` ⚠️ ${t(locale, 'verify.checklistUnchecked', { count: String(checklistUnchecked.length) })}`);
289
+ for (const item of checklistUnchecked) {
290
+ console.log(` - ${item.text} (${item.file})`);
291
+ }
292
+ }
293
+ }
294
+ if (acTrace.length > 0) {
295
+ const acPassed = acTrace.length - acFailed.length;
296
+ console.log(`\n🔗 ${t(locale, 'verify.acTitle')}`);
297
+ console.log(` ${t(locale, 'verify.acSummary', { passed: String(acPassed), total: String(acTrace.length) })}`);
298
+ if (acFailed.length > 0) {
299
+ console.log(` ⚠️ ${t(locale, 'verify.acFailed', { count: String(acFailed.length) })}`);
300
+ for (const ac of acFailed) {
301
+ const reason = ac.linkedCaseIds.length === 0 ? 'no linked cases' : 'case(s) not passing';
302
+ console.log(` ${ac.acId}: ${ac.description} (${reason})`);
303
+ }
304
+ }
305
+ }
306
+ const reportPath = join(root, REPORT_DIR, 'acceptance-report.md');
307
+ mkdirSync(dirname(reportPath), { recursive: true });
308
+ writeFileSync(reportPath, generateReport(defined, results, passed, failed, skipped, uncovered, coveragePct, passRatePct, gateResult, checklist, acTrace, resultIds));
309
+ if (isPass) {
310
+ console.log(`\n✅ ${t(locale, 'verify.gatePass')}`);
311
+ }
312
+ else if (failed.length > 0) {
313
+ console.log(`\n❌ ${t(locale, 'verify.gateFail')}`);
314
+ }
315
+ else if (uncovered.length > 0) {
316
+ console.log(`\n❌ ${t(locale, 'verify.gateFailCoverage')}`);
317
+ }
318
+ else if (checklistUnchecked.length > 0) {
319
+ console.log(`\n❌ ${t(locale, 'verify.gateFailChecklist')}`);
320
+ }
321
+ else {
322
+ console.log(`\n❌ ${t(locale, 'verify.gateFailAc')}`);
323
+ }
324
+ const relReportPath = 'logos/resources/verify/acceptance-report.md';
325
+ console.log(`\n📄 ${t(locale, 'verify.reportPath', { path: relReportPath })}\n`);
326
+ if (!isPass) {
327
+ process.exit(1);
328
+ }
329
+ }
330
+ //# sourceMappingURL=verify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify.js","sourceRoot":"","sources":["../../src/commands/verify.ts"],"names":[],"mappings":"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"}
package/dist/i18n.d.ts ADDED
@@ -0,0 +1,15 @@
1
+ export type Locale = 'en' | 'zh';
2
+ export declare function readLocale(root: string): Locale;
3
+ export declare function t(locale: Locale, key: string, vars?: Record<string, string>): string;
4
+ export declare const PHASE_KEYS: readonly ["phase.1", "phase.2", "phase.3-0", "phase.3-1", "phase.3-2-api", "phase.3-2-db", "phase.3-3a", "phase.3-3b", "phase.3-5"];
5
+ export declare const SUGGEST_KEYS: Record<string, string>;
6
+ export declare function proposalTemplate(locale: Locale, slug: string): string;
7
+ export declare function tasksTemplate(locale: Locale): string;
8
+ export declare function mergePromptTemplate(locale: Locale, slug: string, proposalContent: string, deltas: Array<{
9
+ relativePath: string;
10
+ deltaFullPath: string;
11
+ targetDir: string;
12
+ }>): string;
13
+ export declare function conventionsForYaml(locale: Locale): string;
14
+ export declare function conventionsForAgentsMd(locale: Locale): string;
15
+ //# sourceMappingURL=i18n.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"i18n.d.ts","sourceRoot":"","sources":["../src/i18n.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC;AAEjC,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAQ/C;AAmLD,wBAAgB,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAQpF;AAGD,eAAO,MAAM,UAAU,qIAIb,CAAC;AAEX,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAU/C,CAAC;AAIF,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAyCrE;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAuCpD;AAED,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,eAAe,EAAE,MAAM,EACvB,MAAM,EAAE,KAAK,CAAC;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,GAChF,MAAM,CA0ER;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CASzD;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAO7D"}