id3-cli 0.9.1

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 (114) hide show
  1. package/README.ja-JP.md +769 -0
  2. package/README.ko-KR.md +769 -0
  3. package/README.md +769 -0
  4. package/README.tr-TR.md +769 -0
  5. package/README.zh-CN.md +769 -0
  6. package/dist/bin/cli.d.ts +2 -0
  7. package/dist/bin/cli.js +40 -0
  8. package/dist/bin/cli.js.map +1 -0
  9. package/dist/scripts/build-hooks.d.ts +1 -0
  10. package/dist/scripts/build-hooks.js +58 -0
  11. package/dist/scripts/build-hooks.js.map +1 -0
  12. package/dist/src/hooks/auto-audit.d.ts +4 -0
  13. package/dist/src/hooks/auto-audit.js +47 -0
  14. package/dist/src/hooks/auto-audit.js.map +1 -0
  15. package/dist/src/hooks/claude-pretool-entry.d.ts +1 -0
  16. package/dist/src/hooks/claude-pretool-entry.js +36 -0
  17. package/dist/src/hooks/claude-pretool-entry.js.map +1 -0
  18. package/dist/src/hooks/claude-stop-entry.d.ts +1 -0
  19. package/dist/src/hooks/claude-stop-entry.js +7 -0
  20. package/dist/src/hooks/claude-stop-entry.js.map +1 -0
  21. package/dist/src/hooks/post-commit-entry.d.ts +1 -0
  22. package/dist/src/hooks/post-commit-entry.js +7 -0
  23. package/dist/src/hooks/post-commit-entry.js.map +1 -0
  24. package/dist/src/hooks/pre-commit-entry.d.ts +1 -0
  25. package/dist/src/hooks/pre-commit-entry.js +16 -0
  26. package/dist/src/hooks/pre-commit-entry.js.map +1 -0
  27. package/dist/src/hooks/rule-check.d.ts +8 -0
  28. package/dist/src/hooks/rule-check.js +101 -0
  29. package/dist/src/hooks/rule-check.js.map +1 -0
  30. package/dist/src/hooks/schema-drift.d.ts +17 -0
  31. package/dist/src/hooks/schema-drift.js +151 -0
  32. package/dist/src/hooks/schema-drift.js.map +1 -0
  33. package/dist/src/hooks/shared.d.ts +43 -0
  34. package/dist/src/hooks/shared.js +98 -0
  35. package/dist/src/hooks/shared.js.map +1 -0
  36. package/dist/src/init.d.ts +20 -0
  37. package/dist/src/init.js +193 -0
  38. package/dist/src/init.js.map +1 -0
  39. package/dist/src/preview/mockup-generator.d.ts +56 -0
  40. package/dist/src/preview/mockup-generator.js +402 -0
  41. package/dist/src/preview/mockup-generator.js.map +1 -0
  42. package/dist/src/preview/renderer.d.ts +30 -0
  43. package/dist/src/preview/renderer.js +145 -0
  44. package/dist/src/preview/renderer.js.map +1 -0
  45. package/dist/src/preview/server.d.ts +9 -0
  46. package/dist/src/preview/server.js +55 -0
  47. package/dist/src/preview/server.js.map +1 -0
  48. package/dist/src/preview/ui-auditor.d.ts +27 -0
  49. package/dist/src/preview/ui-auditor.js +141 -0
  50. package/dist/src/preview/ui-auditor.js.map +1 -0
  51. package/dist/src/preview/ui-gate.d.ts +66 -0
  52. package/dist/src/preview/ui-gate.js +210 -0
  53. package/dist/src/preview/ui-gate.js.map +1 -0
  54. package/dist/src/utils/ascii.d.ts +7 -0
  55. package/dist/src/utils/ascii.js +41 -0
  56. package/dist/src/utils/ascii.js.map +1 -0
  57. package/dist/src/utils/fs.d.ts +6 -0
  58. package/dist/src/utils/fs.js +39 -0
  59. package/dist/src/utils/fs.js.map +1 -0
  60. package/dist/templates/hooks/iddd-auto-audit.js +121 -0
  61. package/dist/templates/hooks/iddd-schema-drift.js +279 -0
  62. package/dist/templates/hooks/post-commit +121 -0
  63. package/dist/templates/hooks/pre-commit +348 -0
  64. package/package.json +37 -0
  65. package/templates/.agents/skills/.gitkeep +0 -0
  66. package/templates/.claude/hooks/.gitkeep +0 -0
  67. package/templates/.claude/hooks/hook-config.json +34 -0
  68. package/templates/.claude/skills/.gitkeep +0 -0
  69. package/templates/.codex/.gitkeep +0 -0
  70. package/templates/.codex/hooks.json +40 -0
  71. package/templates/.iddd/commit-count +1 -0
  72. package/templates/.iddd/preview/.gitkeep +0 -0
  73. package/templates/AGENTS.md +204 -0
  74. package/templates/CLAUDE.md +215 -0
  75. package/templates/README.md +476 -0
  76. package/templates/docs/.gitkeep +0 -0
  77. package/templates/docs/business-rules.md +14 -0
  78. package/templates/docs/domain-glossary.md +8 -0
  79. package/templates/docs/info-debt.md +17 -0
  80. package/templates/docs/model-changelog.md +12 -0
  81. package/templates/hooks/.gitkeep +0 -0
  82. package/templates/hooks/iddd-auto-audit.js +121 -0
  83. package/templates/hooks/iddd-schema-drift.js +279 -0
  84. package/templates/hooks/post-commit +121 -0
  85. package/templates/hooks/pre-commit +348 -0
  86. package/templates/skills/id3-design-information/SKILL.md +170 -0
  87. package/templates/skills/id3-design-information/references/phase2-procedure.md +241 -0
  88. package/templates/skills/id3-design-ui/.gitkeep +0 -0
  89. package/templates/skills/id3-design-ui/SKILL.md +200 -0
  90. package/templates/skills/id3-design-ui/references/.gitkeep +0 -0
  91. package/templates/skills/id3-design-ui/references/step1-structure-derivation.md +177 -0
  92. package/templates/skills/id3-design-ui/references/step2-visual-contract.md +257 -0
  93. package/templates/skills/id3-design-ui/references/step3-gate-and-mockup.md +177 -0
  94. package/templates/skills/id3-design-ui/references/step4-implementation.md +244 -0
  95. package/templates/skills/id3-identify-entities/SKILL.md +239 -0
  96. package/templates/skills/id3-identify-entities/references/.gitkeep +0 -0
  97. package/templates/skills/id3-identify-entities/references/phase0-brownfield.md +377 -0
  98. package/templates/skills/id3-identify-entities/references/phase1-greenfield.md +319 -0
  99. package/templates/skills/id3-info-audit/.gitkeep +0 -0
  100. package/templates/skills/id3-info-audit/SKILL.md +191 -0
  101. package/templates/skills/id3-preview/.gitkeep +0 -0
  102. package/templates/skills/id3-preview/SKILL.md +168 -0
  103. package/templates/skills/id3-spawn-team/.gitkeep +0 -0
  104. package/templates/skills/id3-spawn-team/SKILL.md +213 -0
  105. package/templates/specs/.gitkeep +0 -0
  106. package/templates/specs/data-model.md +26 -0
  107. package/templates/specs/entity-catalog.md +22 -0
  108. package/templates/specs/ui-design-contract.md +54 -0
  109. package/templates/specs/ui-inventory.md +24 -0
  110. package/templates/specs/ui-structure.md +32 -0
  111. package/templates/src/.gitkeep +0 -0
  112. package/templates/steering/.gitkeep +0 -0
  113. package/templates/steering/data-conventions.md +42 -0
  114. package/templates/steering/product.md +38 -0
@@ -0,0 +1,55 @@
1
+ import { createServer } from 'node:http';
2
+ import { readFile } from 'node:fs/promises';
3
+ import { join } from 'node:path';
4
+ import { box } from '../utils/ascii.js';
5
+ export async function startPreviewServer(previewDir) {
6
+ return new Promise((resolve) => {
7
+ const server = createServer(async (req, res) => {
8
+ const urlPath = req.url?.replace(/^\//, '') || 'index';
9
+ const filePath = join(previewDir, `${urlPath}.html`);
10
+ try {
11
+ const content = await readFile(filePath, 'utf-8');
12
+ res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
13
+ res.end(content);
14
+ }
15
+ catch {
16
+ // Try listing available files
17
+ const { readdir } = await import('node:fs/promises');
18
+ try {
19
+ const files = (await readdir(previewDir))
20
+ .filter((f) => f.endsWith('.html'))
21
+ .map((f) => f.replace('.html', ''));
22
+ const links = files
23
+ .map((f) => `<li><a href="/${f}">${f}</a></li>`)
24
+ .join('');
25
+ res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
26
+ res.end(`<!DOCTYPE html><html><body><h1>IDDD Preview</h1><ul>${links}</ul></body></html>`);
27
+ }
28
+ catch {
29
+ res.writeHead(404);
30
+ res.end('Not found');
31
+ }
32
+ }
33
+ });
34
+ server.listen(0, () => {
35
+ const actualPort = server.address()?.port;
36
+ resolve({
37
+ port: actualPort,
38
+ close: () => server.close(),
39
+ });
40
+ });
41
+ });
42
+ }
43
+ export function printPreviewReady(port, files) {
44
+ const lines = files.map((f) => `${f.name.padEnd(10)} http://localhost:${port}/${f.name.toLowerCase()}`);
45
+ const filePaths = files.map((f) => `File: ${f.path}`);
46
+ const content = [
47
+ ...lines,
48
+ '',
49
+ ...filePaths,
50
+ '',
51
+ 'Press Enter to close server...',
52
+ ].join('\n');
53
+ console.log(box(content, { title: '📊 Preview Ready' }));
54
+ }
55
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/preview/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAe,MAAM,WAAW,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAC;AAOxC,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,UAAkB;IAElB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,MAAM,GAAW,YAAY,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;YACrD,MAAM,OAAO,GAAG,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,OAAO,CAAC;YACvD,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,EAAE,GAAG,OAAO,OAAO,CAAC,CAAC;YAErD,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;gBAClD,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,0BAA0B,EAAE,CAAC,CAAC;gBACnE,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACnB,CAAC;YAAC,MAAM,CAAC;gBACP,8BAA8B;gBAC9B,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;gBACrD,IAAI,CAAC;oBACH,MAAM,KAAK,GAAG,CAAC,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC;yBACtC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;yBAClC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;oBACtC,MAAM,KAAK,GAAG,KAAK;yBAChB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,KAAK,CAAC,WAAW,CAAC;yBAC/C,IAAI,CAAC,EAAE,CAAC,CAAC;oBACZ,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,0BAA0B,EAAE,CAAC,CAAC;oBACnE,GAAG,CAAC,GAAG,CACL,uDAAuD,KAAK,qBAAqB,CAClF,CAAC;gBACJ,CAAC;gBAAC,MAAM,CAAC;oBACP,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;oBACnB,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;gBACvB,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE;YACpB,MAAM,UAAU,GAAI,MAAM,CAAC,OAAO,EAAU,EAAE,IAAI,CAAC;YACnD,OAAO,CAAC;gBACN,IAAI,EAAE,UAAU;gBAChB,KAAK,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE;aAC5B,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,IAAY,EACZ,KAA4C;IAE5C,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CACrB,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,qBAAqB,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAC/E,CAAC;IACF,MAAM,SAAS,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAEtD,MAAM,OAAO,GAAG;QACd,GAAG,KAAK;QACR,EAAE;QACF,GAAG,SAAS;QACZ,EAAE;QACF,gCAAgC;KACjC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEb,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,kBAAkB,EAAE,CAAC,CAAC,CAAC;AAC3D,CAAC"}
@@ -0,0 +1,27 @@
1
+ export interface PillarScore {
2
+ pillar: string;
3
+ score: number;
4
+ total: number;
5
+ implemented: number;
6
+ violations: number;
7
+ findings: string[];
8
+ }
9
+ export interface AuditIssue {
10
+ pillar: string;
11
+ score: number;
12
+ finding: string;
13
+ suggestion: string;
14
+ }
15
+ export interface UiAuditReport {
16
+ scores: PillarScore[];
17
+ averageScore: number;
18
+ verdict: 'PASS' | 'FAIL';
19
+ topIssues: AuditIssue[];
20
+ }
21
+ export declare function scorePillar(type: string, data: {
22
+ total: number;
23
+ implemented: number;
24
+ violations: number;
25
+ }): number;
26
+ export declare function generateAuditReport(scores: PillarScore[]): UiAuditReport;
27
+ export declare function renderUiAuditHtml(report: UiAuditReport): string;
@@ -0,0 +1,141 @@
1
+ import { escapeHtml } from './renderer.js';
2
+ // ── Scoring logic ─────────────────────────────────────
3
+ export function scorePillar(type, data) {
4
+ const { total, implemented, violations } = data;
5
+ // For structure-type pillars: use percentage
6
+ if (type === 'structure' || type === 'traceability') {
7
+ const pct = total > 0 ? (implemented / total) * 100 : 0;
8
+ if (pct >= 100)
9
+ return 4;
10
+ if (pct >= 90)
11
+ return 3;
12
+ if (pct >= 70)
13
+ return 2;
14
+ return 1;
15
+ }
16
+ // For detail pillars (spacing, typography, color, copywriting, registry): use violation count
17
+ if (violations === 0)
18
+ return 4;
19
+ if (violations <= 2)
20
+ return 3;
21
+ if (violations <= 5)
22
+ return 2;
23
+ return 1;
24
+ }
25
+ // ── Report generation ─────────────────────────────────
26
+ export function generateAuditReport(scores) {
27
+ const totalScore = scores.reduce((sum, s) => sum + s.score, 0);
28
+ const averageScore = scores.length > 0 ? totalScore / scores.length : 0;
29
+ const verdict = averageScore >= 3.0 ? 'PASS' : 'FAIL';
30
+ // Top 3 issues: sort by score ascending (worst first), pick those with findings
31
+ const issuesWithFindings = scores
32
+ .filter(s => s.findings.length > 0 && s.score < 4)
33
+ .sort((a, b) => a.score - b.score);
34
+ const topIssues = issuesWithFindings.slice(0, 3).map(s => ({
35
+ pillar: s.pillar,
36
+ score: s.score,
37
+ finding: s.findings[0],
38
+ suggestion: `Resolve ${s.violations} violation(s) in ${s.pillar} to improve score from ${s.score} to ${Math.min(s.score + 1, 4)}`,
39
+ }));
40
+ return { scores, averageScore: Math.round(averageScore * 100) / 100, verdict, topIssues };
41
+ }
42
+ // ── Audit HTML dashboard ──────────────────────────────
43
+ function scoreColor(score) {
44
+ if (score === 4)
45
+ return '#22c55e';
46
+ if (score === 3)
47
+ return '#eab308';
48
+ if (score === 2)
49
+ return '#f97316';
50
+ return '#ef4444';
51
+ }
52
+ function scoreLabel(score) {
53
+ if (score === 4)
54
+ return 'Excellent';
55
+ if (score === 3)
56
+ return 'Good';
57
+ if (score === 2)
58
+ return 'Needs Work';
59
+ return 'Critical';
60
+ }
61
+ export function renderUiAuditHtml(report) {
62
+ const pillarCards = report.scores
63
+ .map(s => {
64
+ const color = scoreColor(s.score);
65
+ const label = scoreLabel(s.score);
66
+ const findings = s.findings.length > 0
67
+ ? `<ul class="findings">${s.findings.map(f => `<li>${escapeHtml(f)}</li>`).join('')}</ul>`
68
+ : '<p class="no-issues">No issues</p>';
69
+ return ` <div class="pillar-card">
70
+ <div class="pillar-score" style="color: ${color};">${s.score}/4</div>
71
+ <div class="pillar-name">${escapeHtml(s.pillar)}</div>
72
+ <div class="pillar-label" style="color: ${color};">${label}</div>
73
+ <div class="pillar-stats">${s.implemented}/${s.total} implemented, ${s.violations} violation(s)</div>
74
+ ${findings}
75
+ </div>`;
76
+ })
77
+ .join('\n');
78
+ const topIssueRows = report.topIssues
79
+ .map((issue, i) => ` <tr>
80
+ <td>${i + 1}</td>
81
+ <td>${escapeHtml(issue.pillar)}</td>
82
+ <td style="color: ${scoreColor(issue.score)};">${issue.score}/4</td>
83
+ <td>${escapeHtml(issue.finding)}</td>
84
+ <td>${escapeHtml(issue.suggestion)}</td>
85
+ </tr>`)
86
+ .join('\n');
87
+ const verdictColor = report.verdict === 'PASS' ? '#22c55e' : '#ef4444';
88
+ return `<!DOCTYPE html>
89
+ <html lang="en">
90
+ <head>
91
+ <meta charset="UTF-8">
92
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
93
+ <title>IDDD UI Audit Report</title>
94
+ <style>
95
+ :root { --bg: #ffffff; --text: #1a1a2e; --card: #f8f9fa; --border: #dee2e6; }
96
+ @media (prefers-color-scheme: dark) {
97
+ :root { --bg: #1a1a2e; --text: #e0e0e0; --card: #16213e; --border: #334155; }
98
+ }
99
+ body { font-family: -apple-system, system-ui, sans-serif; background: var(--bg); color: var(--text); margin: 0; padding: 2rem; }
100
+ h1 { font-size: 1.5rem; }
101
+ .verdict { font-size: 2rem; font-weight: bold; margin: 1rem 0; }
102
+ .average { font-size: 1.2rem; color: #6c757d; margin-bottom: 1.5rem; }
103
+ .pillars { display: grid; grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); gap: 1rem; margin: 1.5rem 0; }
104
+ .pillar-card { background: var(--card); border: 1px solid var(--border); border-radius: 8px; padding: 1rem; }
105
+ .pillar-score { font-size: 1.8rem; font-weight: bold; }
106
+ .pillar-name { font-weight: 600; margin-top: 0.25rem; }
107
+ .pillar-label { font-size: 0.85rem; margin-top: 0.15rem; }
108
+ .pillar-stats { font-size: 0.8rem; color: #6c757d; margin-top: 0.5rem; }
109
+ .findings { font-size: 0.85rem; margin-top: 0.5rem; padding-left: 1.2rem; }
110
+ .no-issues { font-size: 0.85rem; color: #22c55e; margin-top: 0.5rem; }
111
+ h2 { margin-top: 2rem; font-size: 1.2rem; }
112
+ table { width: 100%; border-collapse: collapse; margin-top: 0.5rem; }
113
+ th, td { padding: 0.5rem; border: 1px solid var(--border); text-align: left; }
114
+ th { background: var(--card); font-weight: 600; }
115
+ .meta { font-size: 0.85rem; color: #6c757d; margin-top: 2rem; }
116
+ </style>
117
+ </head>
118
+ <body>
119
+ <h1>IDDD UI Audit Report</h1>
120
+ <div class="verdict" style="color: ${verdictColor};">${report.verdict}</div>
121
+ <div class="average">Average Score: ${report.averageScore}/4.00</div>
122
+
123
+ <div class="pillars">
124
+ ${pillarCards}
125
+ </div>
126
+
127
+ <h2>Top Issues</h2>
128
+ <table>
129
+ <thead>
130
+ <tr><th>#</th><th>Pillar</th><th>Score</th><th>Finding</th><th>Suggestion</th></tr>
131
+ </thead>
132
+ <tbody>
133
+ ${topIssueRows}
134
+ </tbody>
135
+ </table>
136
+
137
+ <p class="meta">Generated by IDDD Phase 2.5 UI Audit -- ${new Date().toISOString().split('T')[0]}</p>
138
+ </body>
139
+ </html>`;
140
+ }
141
+ //# sourceMappingURL=ui-auditor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui-auditor.js","sourceRoot":"","sources":["../../../src/preview/ui-auditor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,66 @@
1
+ export interface ScreenEntry {
2
+ name: string;
3
+ url: string;
4
+ entity: string;
5
+ pattern: string;
6
+ priority: string;
7
+ source: string;
8
+ }
9
+ export interface TraceabilityEntry {
10
+ entity: string;
11
+ screens: Record<string, string>;
12
+ }
13
+ export interface UiStructureData {
14
+ screens: ScreenEntry[];
15
+ entityCoverage: string;
16
+ traceabilityMatrix: TraceabilityEntry[];
17
+ }
18
+ export interface SpacingToken {
19
+ token: string;
20
+ value: string;
21
+ usage: string;
22
+ }
23
+ export interface TypographyToken {
24
+ token: string;
25
+ size: string;
26
+ weight: string;
27
+ lineHeight: string;
28
+ usage: string;
29
+ }
30
+ export interface ColorToken {
31
+ token: string;
32
+ light: string;
33
+ dark: string;
34
+ usage: string;
35
+ }
36
+ export interface CopywritingPattern {
37
+ pattern: string;
38
+ template: string;
39
+ example: string;
40
+ }
41
+ export interface ComponentMapEntry {
42
+ widget: string;
43
+ component: string;
44
+ importPath: string;
45
+ }
46
+ export interface UiDesignContractData {
47
+ framework: string;
48
+ spacing: SpacingToken[];
49
+ typography: TypographyToken[];
50
+ colors: ColorToken[];
51
+ copywriting: CopywritingPattern[];
52
+ componentMapping: ComponentMapEntry[];
53
+ }
54
+ export interface PillarResult {
55
+ name: string;
56
+ status: 'PASS' | 'BLOCKED';
57
+ details: string;
58
+ }
59
+ export interface GateResult {
60
+ verdict: 'PASS' | 'BLOCKED';
61
+ pillars: PillarResult[];
62
+ }
63
+ export declare function parseUiStructure(markdown: string): UiStructureData;
64
+ export declare function parseUiDesignContract(markdown: string): UiDesignContractData;
65
+ export declare function runSevenPillarGate(structure: UiStructureData, contract: UiDesignContractData, entityNames: string[]): GateResult;
66
+ export declare function renderGateResultMarkdown(result: GateResult): string;
@@ -0,0 +1,210 @@
1
+ // ── Types ──────────────────────────────────────────────
2
+ // ── Markdown parsers ──────────────────────────────────
3
+ function parseMarkdownTable(markdown, headerPattern) {
4
+ const lines = markdown.split('\n');
5
+ const rows = [];
6
+ let inTable = false;
7
+ for (const line of lines) {
8
+ const trimmed = line.trim();
9
+ if (!inTable && headerPattern.test(trimmed)) {
10
+ inTable = true;
11
+ continue;
12
+ }
13
+ if (inTable && trimmed.startsWith('|') && trimmed.includes('---')) {
14
+ continue; // separator row
15
+ }
16
+ if (inTable && trimmed.startsWith('|')) {
17
+ const cells = trimmed.split('|').slice(1, -1).map(c => c.trim());
18
+ // Skip placeholder rows (first cell is a template marker)
19
+ if (cells[0]?.startsWith('_('))
20
+ continue;
21
+ rows.push(cells);
22
+ }
23
+ else if (inTable && !trimmed.startsWith('|')) {
24
+ break; // end of table
25
+ }
26
+ }
27
+ return rows;
28
+ }
29
+ export function parseUiStructure(markdown) {
30
+ // Extract entity coverage from frontmatter
31
+ const coverageMatch = markdown.match(/entity_coverage:\s*"([^"]+)"/);
32
+ const entityCoverage = coverageMatch ? coverageMatch[1] : '0/0 (0%)';
33
+ // Parse Screen Inventory table
34
+ const screenRows = parseMarkdownTable(markdown, /^\|\s*Screen\s*\|/);
35
+ const screens = screenRows.map(row => ({
36
+ name: row[0] || '',
37
+ url: row[1] || '',
38
+ entity: row[2] || '',
39
+ pattern: row[3] || '',
40
+ priority: row[4] || '',
41
+ source: row[5] || '',
42
+ }));
43
+ // Parse Traceability Matrix table
44
+ const traceRows = parseMarkdownTable(markdown, /^\|\s*Entity\s*\|\s*List\s*\|/);
45
+ const traceabilityMatrix = traceRows.map(row => {
46
+ const screens = {};
47
+ const headers = ['List', 'Detail', 'Create', 'Edit', 'Dashboard'];
48
+ for (let i = 0; i < headers.length; i++) {
49
+ const val = row[i + 1];
50
+ if (val && val !== '-' && val !== '') {
51
+ screens[headers[i]] = val;
52
+ }
53
+ }
54
+ return { entity: row[0] || '', screens };
55
+ });
56
+ return { screens, entityCoverage, traceabilityMatrix };
57
+ }
58
+ export function parseUiDesignContract(markdown) {
59
+ // Extract framework from frontmatter
60
+ const fwMatch = markdown.match(/framework:\s*"([^"]+)"/);
61
+ const framework = fwMatch ? fwMatch[1] : '';
62
+ // Parse Spacing table
63
+ const spacingRows = parseMarkdownTable(markdown, /^\|\s*Token\s*\|\s*Value\s*\|\s*Usage\s*\|/);
64
+ const spacing = spacingRows.map(row => ({
65
+ token: row[0] || '',
66
+ value: row[1] || '',
67
+ usage: row[2] || '',
68
+ }));
69
+ // Parse Typography table
70
+ const typographyRows = parseMarkdownTable(markdown, /^\|\s*Token\s*\|\s*Size\s*\|/);
71
+ const typography = typographyRows.map(row => ({
72
+ token: row[0] || '',
73
+ size: row[1] || '',
74
+ weight: row[2] || '',
75
+ lineHeight: row[3] || '',
76
+ usage: row[4] || '',
77
+ }));
78
+ // Parse Colors table
79
+ const colorRows = parseMarkdownTable(markdown, /^\|\s*Token\s*\|\s*Light\s*\|/);
80
+ const colors = colorRows.map(row => ({
81
+ token: row[0] || '',
82
+ light: row[1] || '',
83
+ dark: row[2] || '',
84
+ usage: row[3] || '',
85
+ }));
86
+ // Parse Copywriting table
87
+ const copyRows = parseMarkdownTable(markdown, /^\|\s*Pattern\s*\|\s*Template\s*\|/);
88
+ const copywriting = copyRows.map(row => ({
89
+ pattern: row[0] || '',
90
+ template: row[1] || '',
91
+ example: row[2] || '',
92
+ }));
93
+ // Parse Component Mapping table
94
+ const compRows = parseMarkdownTable(markdown, /^\|\s*Widget\s*\|\s*Component\s*\|/);
95
+ const componentMapping = compRows.map(row => ({
96
+ widget: row[0] || '',
97
+ component: row[1] || '',
98
+ importPath: row[2] || '',
99
+ }));
100
+ return { framework, spacing, typography, colors, copywriting, componentMapping };
101
+ }
102
+ // ── 7-Pillar Gate ─────────────────────────────────────
103
+ const GENERIC_TERMS = ['submit', 'click here', 'click', 'go', 'ok', 'press'];
104
+ const SPACING_SCALE = [0, 1, 2, 4, 6, 8, 12, 16, 20, 24, 32, 40, 48, 56, 64, 80, 96, 128];
105
+ export function runSevenPillarGate(structure, contract, entityNames) {
106
+ const pillars = [];
107
+ // Pillar 1: Structure Completeness
108
+ const tracedEntities = new Set(structure.traceabilityMatrix.map(t => t.entity));
109
+ const missingEntities = entityNames.filter(e => !tracedEntities.has(e));
110
+ const coverageMatch = structure.entityCoverage.match(/(\d+)\/(\d+)/);
111
+ const coveragePct = coverageMatch ? (parseInt(coverageMatch[1]) / parseInt(coverageMatch[2])) * 100 : 0;
112
+ const structurePass = coveragePct >= 100 && missingEntities.length === 0;
113
+ pillars.push({
114
+ name: 'Structure Completeness',
115
+ status: structurePass ? 'PASS' : 'BLOCKED',
116
+ details: structurePass
117
+ ? `All ${entityNames.length} entities have at least 1 screen mapping`
118
+ : `Entity coverage: ${structure.entityCoverage}. Missing: ${missingEntities.join(', ')}`,
119
+ });
120
+ // Pillar 2: Spacing
121
+ const spacingValues = contract.spacing.map(s => {
122
+ const num = parseInt(s.value);
123
+ return isNaN(num) ? -1 : num;
124
+ });
125
+ const badSpacing = spacingValues.filter(v => v >= 0 && !SPACING_SCALE.includes(v));
126
+ const spacingPass = badSpacing.length === 0 && contract.spacing.length > 0;
127
+ pillars.push({
128
+ name: 'Spacing',
129
+ status: spacingPass ? 'PASS' : 'BLOCKED',
130
+ details: spacingPass
131
+ ? `All ${contract.spacing.length} spacing values are on the 4px/8px scale`
132
+ : `Non-standard spacing values found: ${badSpacing.join(', ')}px`,
133
+ });
134
+ // Pillar 3: Typography
135
+ const uniqueSizes = new Set(contract.typography.map(t => t.size));
136
+ const uniqueWeights = new Set(contract.typography.map(t => t.weight));
137
+ const typoPass = uniqueSizes.size <= 4 && uniqueWeights.size <= 2 && contract.typography.length > 0;
138
+ pillars.push({
139
+ name: 'Typography',
140
+ status: typoPass ? 'PASS' : 'BLOCKED',
141
+ details: typoPass
142
+ ? `${uniqueSizes.size} sizes, ${uniqueWeights.size} weights (within limits)`
143
+ : `${uniqueSizes.size} sizes (max 4), ${uniqueWeights.size} weights (max 2)`,
144
+ });
145
+ // Pillar 4: Color
146
+ const hasAccent = contract.colors.some(c => c.token.toLowerCase().includes('accent'));
147
+ const semanticColors = contract.colors.filter(c => ['error', 'warning', 'success', 'info'].some(s => c.token.toLowerCase().includes(s)));
148
+ const accentCount = contract.colors.filter(c => c.token.toLowerCase().includes('accent')).length;
149
+ const colorPass = hasAccent && accentCount <= 2 && contract.colors.length > 0;
150
+ pillars.push({
151
+ name: 'Color',
152
+ status: colorPass ? 'PASS' : 'BLOCKED',
153
+ details: colorPass
154
+ ? `Accent defined (${accentCount}), ${semanticColors.length} semantic colors`
155
+ : hasAccent ? `Too many accent colors: ${accentCount} (max 2)` : 'No accent color defined',
156
+ });
157
+ // Pillar 5: Copywriting
158
+ const allTemplates = contract.copywriting.map(c => c.template.toLowerCase());
159
+ const genericFound = allTemplates.filter(t => GENERIC_TERMS.some(g => t === g || t.startsWith(g + ' ')));
160
+ const hasRequiredPatterns = contract.copywriting.length >= 3; // CTA, Empty State, Error minimum
161
+ const copyPass = genericFound.length === 0 && hasRequiredPatterns;
162
+ pillars.push({
163
+ name: 'Copywriting',
164
+ status: copyPass ? 'PASS' : 'BLOCKED',
165
+ details: copyPass
166
+ ? `${contract.copywriting.length} patterns defined, no generic terms`
167
+ : genericFound.length > 0
168
+ ? `Generic terms found: ${genericFound.join(', ')}`
169
+ : `Only ${contract.copywriting.length} patterns (need >= 3)`,
170
+ });
171
+ // Pillar 6: Component Registry
172
+ const registryPass = contract.componentMapping.length > 0;
173
+ pillars.push({
174
+ name: 'Component Registry',
175
+ status: registryPass ? 'PASS' : 'BLOCKED',
176
+ details: registryPass
177
+ ? `${contract.componentMapping.length} widget->component mappings defined`
178
+ : 'No widget->component mappings defined',
179
+ });
180
+ // Pillar 7: Traceability
181
+ const traceEntities = new Set(structure.traceabilityMatrix.map(t => t.entity));
182
+ const untracedEntities = entityNames.filter(e => !traceEntities.has(e));
183
+ const tracePass = untracedEntities.length === 0 && structure.screens.length > 0;
184
+ pillars.push({
185
+ name: 'Traceability',
186
+ status: tracePass ? 'PASS' : 'BLOCKED',
187
+ details: tracePass
188
+ ? `All ${entityNames.length} entities have traceability entries`
189
+ : `Missing traceability for: ${untracedEntities.join(', ')}`,
190
+ });
191
+ const verdict = pillars.every(p => p.status === 'PASS') ? 'PASS' : 'BLOCKED';
192
+ return { verdict, pillars };
193
+ }
194
+ // ── Gate result report renderer ───────────────────────
195
+ export function renderGateResultMarkdown(result) {
196
+ const lines = [
197
+ '# UI Gate Result',
198
+ '',
199
+ `**Verdict: ${result.verdict}**`,
200
+ '',
201
+ '| # | Pillar | Status | Details |',
202
+ '|---|--------|--------|---------|',
203
+ ];
204
+ result.pillars.forEach((p, i) => {
205
+ const icon = p.status === 'PASS' ? 'PASS' : 'BLOCKED';
206
+ lines.push(`| ${i + 1} | ${p.name} | ${icon} | ${p.details} |`);
207
+ });
208
+ return lines.join('\n');
209
+ }
210
+ //# sourceMappingURL=ui-gate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui-gate.js","sourceRoot":"","sources":["../../../src/preview/ui-gate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export interface BoxOptions {
2
+ title?: string;
3
+ width?: number;
4
+ padding?: number;
5
+ }
6
+ export declare function box(content: string, options?: BoxOptions): string;
7
+ export declare function banner(version: string): string;
@@ -0,0 +1,41 @@
1
+ export function box(content, options = {}) {
2
+ const { title, width = 47, padding = 1 } = options;
3
+ const lines = content.split('\n');
4
+ const innerWidth = width - 2; // borders
5
+ const padStr = ' '.repeat(padding);
6
+ const result = [];
7
+ // top border
8
+ if (title) {
9
+ const titleStr = ` ${title} `;
10
+ const remaining = innerWidth - titleStr.length - 1;
11
+ result.push(` ┌─${titleStr}${'─'.repeat(Math.max(0, remaining))}┐`);
12
+ }
13
+ else {
14
+ result.push(` ┌${'─'.repeat(innerWidth)}┐`);
15
+ }
16
+ // padding line
17
+ result.push(` │${' '.repeat(innerWidth)}│`);
18
+ // content lines
19
+ for (const line of lines) {
20
+ const padded = `${padStr}${line}`;
21
+ const spaces = innerWidth - padded.length;
22
+ result.push(` │${padded}${' '.repeat(Math.max(0, spaces))}│`);
23
+ }
24
+ // padding line
25
+ result.push(` │${' '.repeat(innerWidth)}│`);
26
+ // bottom border
27
+ result.push(` └${'─'.repeat(innerWidth)}┘`);
28
+ return result.join('\n');
29
+ }
30
+ export function banner(version) {
31
+ const content = [
32
+ '╦╔╦╗╔╦╗╔╦╗ IDDD',
33
+ '║ ║║ ║║ ║║',
34
+ '╩═╩╝═╩╝═╩╝',
35
+ '',
36
+ 'Information Design-Driven Development',
37
+ `v${version}`,
38
+ ].join('\n');
39
+ return box(content);
40
+ }
41
+ //# sourceMappingURL=ascii.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ascii.js","sourceRoot":"","sources":["../../../src/utils/ascii.ts"],"names":[],"mappings":"AAMA,MAAM,UAAU,GAAG,CAAC,OAAe,EAAE,UAAsB,EAAE;IAC3D,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,EAAE,EAAE,OAAO,GAAG,CAAC,EAAE,GAAG,OAAO,CAAC;IACnD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,UAAU,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,UAAU;IAExC,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAEnC,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,aAAa;IACb,IAAI,KAAK,EAAE,CAAC;QACV,MAAM,QAAQ,GAAG,IAAI,KAAK,GAAG,CAAC;QAC9B,MAAM,SAAS,GAAG,UAAU,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;QACnD,MAAM,CAAC,IAAI,CAAC,OAAO,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC;IACvE,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IAC/C,CAAC;IAED,eAAe;IACf,MAAM,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IAE7C,gBAAgB;IAChB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,GAAG,MAAM,GAAG,IAAI,EAAE,CAAC;QAClC,MAAM,MAAM,GAAG,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC;QAC1C,MAAM,CAAC,IAAI,CAAC,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC;IACjE,CAAC;IAED,eAAe;IACf,MAAM,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IAE7C,gBAAgB;IAChB,MAAM,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IAE7C,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,OAAe;IACpC,MAAM,OAAO,GAAG;QACd,kBAAkB;QAClB,YAAY;QACZ,YAAY;QACZ,EAAE;QACF,uCAAuC;QACvC,IAAI,OAAO,EAAE;KACd,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEb,OAAO,GAAG,CAAC,OAAO,CAAC,CAAC;AACtB,CAAC"}
@@ -0,0 +1,6 @@
1
+ export declare function fileExists(filePath: string): Promise<boolean>;
2
+ export interface CopyOptions {
3
+ overwrite?: boolean;
4
+ }
5
+ export declare function copyDir(src: string, dest: string, options?: CopyOptions): Promise<void>;
6
+ export declare function createSymlink(target: string, linkPath: string): Promise<void>;
@@ -0,0 +1,39 @@
1
+ import { copyFile, mkdir, readdir, symlink, access } from 'node:fs/promises';
2
+ import { join, relative, dirname } from 'node:path';
3
+ export async function fileExists(filePath) {
4
+ try {
5
+ await access(filePath);
6
+ return true;
7
+ }
8
+ catch {
9
+ return false;
10
+ }
11
+ }
12
+ export async function copyDir(src, dest, options = {}) {
13
+ const { overwrite = false } = options;
14
+ await mkdir(dest, { recursive: true });
15
+ const entries = await readdir(src, { withFileTypes: true });
16
+ for (const entry of entries) {
17
+ const srcPath = join(src, entry.name);
18
+ const destPath = join(dest, entry.name);
19
+ if (entry.isDirectory()) {
20
+ await copyDir(srcPath, destPath, options);
21
+ }
22
+ else {
23
+ if (!overwrite && (await fileExists(destPath))) {
24
+ continue;
25
+ }
26
+ await mkdir(dirname(destPath), { recursive: true });
27
+ await copyFile(srcPath, destPath);
28
+ }
29
+ }
30
+ }
31
+ export async function createSymlink(target, linkPath) {
32
+ if (await fileExists(linkPath)) {
33
+ return;
34
+ }
35
+ await mkdir(dirname(linkPath), { recursive: true });
36
+ const rel = relative(dirname(linkPath), target);
37
+ await symlink(rel, linkPath);
38
+ }
39
+ //# sourceMappingURL=fs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs.js","sourceRoot":"","sources":["../../../src/utils/fs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAQ,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AACnF,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpD,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,QAAgB;IAC/C,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;QACvB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAMD,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,GAAW,EACX,IAAY,EACZ,UAAuB,EAAE;IAEzB,MAAM,EAAE,SAAS,GAAG,KAAK,EAAE,GAAG,OAAO,CAAC;IACtC,MAAM,KAAK,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAEvC,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5D,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAExC,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,MAAM,OAAO,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC5C,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,SAAS,IAAI,CAAC,MAAM,UAAU,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;gBAC/C,SAAS;YACX,CAAC;YACD,MAAM,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACpD,MAAM,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,MAAc,EACd,QAAgB;IAEhB,IAAI,MAAM,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC/B,OAAO;IACT,CAAC;IACD,MAAM,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACpD,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,CAAC;IAChD,MAAM,OAAO,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;AAC/B,CAAC"}