@bookedsolid/reagent 0.6.0 → 0.7.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.
Files changed (79) hide show
  1. package/agents/ai-platforms/ai-deepseek-specialist.md +83 -0
  2. package/agents/ai-platforms/ai-elevenlabs-specialist.md +75 -0
  3. package/agents/ai-platforms/ai-grok-specialist.md +71 -0
  4. package/agents/ai-platforms/ai-local-llm-specialist.md +95 -0
  5. package/agents/ai-platforms/ai-video-ai-specialist.md +103 -0
  6. package/agents/engineering/cto-advisory.md +44 -0
  7. package/agents/engineering/qa-engineer-automation.md +77 -0
  8. package/agents/engineering/qa-engineer-manual.md +48 -0
  9. package/agents/engineering/qa-lead.md +124 -0
  10. package/agents/engineering/security-engineer-appsec.md +47 -0
  11. package/agents/engineering/security-engineer-compliance.md +47 -0
  12. package/dist/cli/commands/catalyze/gap-detector.d.ts +6 -0
  13. package/dist/cli/commands/catalyze/gap-detector.d.ts.map +1 -0
  14. package/dist/cli/commands/catalyze/gap-detector.js +359 -0
  15. package/dist/cli/commands/catalyze/gap-detector.js.map +1 -0
  16. package/dist/cli/commands/catalyze/index.d.ts +15 -0
  17. package/dist/cli/commands/catalyze/index.d.ts.map +1 -0
  18. package/dist/cli/commands/catalyze/index.js +149 -0
  19. package/dist/cli/commands/catalyze/index.js.map +1 -0
  20. package/dist/cli/commands/catalyze/report-generator.d.ts +17 -0
  21. package/dist/cli/commands/catalyze/report-generator.d.ts.map +1 -0
  22. package/dist/cli/commands/catalyze/report-generator.js +290 -0
  23. package/dist/cli/commands/catalyze/report-generator.js.map +1 -0
  24. package/dist/cli/commands/catalyze/stack-analyzer.d.ts +6 -0
  25. package/dist/cli/commands/catalyze/stack-analyzer.d.ts.map +1 -0
  26. package/dist/cli/commands/catalyze/stack-analyzer.js +267 -0
  27. package/dist/cli/commands/catalyze/stack-analyzer.js.map +1 -0
  28. package/dist/cli/commands/catalyze/types.d.ts +40 -0
  29. package/dist/cli/commands/catalyze/types.d.ts.map +1 -0
  30. package/dist/cli/commands/catalyze/types.js +2 -0
  31. package/dist/cli/commands/catalyze/types.js.map +1 -0
  32. package/dist/cli/commands/init/agents.d.ts.map +1 -1
  33. package/dist/cli/commands/init/agents.js +9 -0
  34. package/dist/cli/commands/init/agents.js.map +1 -1
  35. package/dist/cli/commands/init/claude-hooks.d.ts.map +1 -1
  36. package/dist/cli/commands/init/claude-hooks.js +27 -0
  37. package/dist/cli/commands/init/claude-hooks.js.map +1 -1
  38. package/dist/cli/commands/init/commands.d.ts.map +1 -1
  39. package/dist/cli/commands/init/commands.js +9 -0
  40. package/dist/cli/commands/init/commands.js.map +1 -1
  41. package/dist/cli/commands/init/discord.d.ts +21 -0
  42. package/dist/cli/commands/init/discord.d.ts.map +1 -0
  43. package/dist/cli/commands/init/discord.js +87 -0
  44. package/dist/cli/commands/init/discord.js.map +1 -0
  45. package/dist/cli/commands/init/index.d.ts.map +1 -1
  46. package/dist/cli/commands/init/index.js +61 -17
  47. package/dist/cli/commands/init/index.js.map +1 -1
  48. package/dist/cli/commands/init/profiles.d.ts +39 -0
  49. package/dist/cli/commands/init/profiles.d.ts.map +1 -0
  50. package/dist/cli/commands/init/profiles.js +132 -0
  51. package/dist/cli/commands/init/profiles.js.map +1 -0
  52. package/dist/cli/index.js +27 -1
  53. package/dist/cli/index.js.map +1 -1
  54. package/dist/gateway/native-tools.d.ts.map +1 -1
  55. package/dist/gateway/native-tools.js +25 -0
  56. package/dist/gateway/native-tools.js.map +1 -1
  57. package/dist/pm/discord-notifier.d.ts +52 -0
  58. package/dist/pm/discord-notifier.d.ts.map +1 -0
  59. package/dist/pm/discord-notifier.js +122 -0
  60. package/dist/pm/discord-notifier.js.map +1 -0
  61. package/package.json +1 -1
  62. package/profiles/astro/README.md +44 -0
  63. package/profiles/astro/agents.txt +3 -0
  64. package/profiles/astro/gates.yaml +15 -0
  65. package/profiles/astro/hooks/astro-ssr-guard.sh +73 -0
  66. package/profiles/drupal/README.md +53 -0
  67. package/profiles/drupal/agents.txt +4 -0
  68. package/profiles/drupal/gates.yaml +15 -0
  69. package/profiles/drupal/hooks/drupal-coding-standards.sh +70 -0
  70. package/profiles/drupal/hooks/hook-update-guard.sh +65 -0
  71. package/profiles/lit-wc/README.md +48 -0
  72. package/profiles/lit-wc/agents.txt +4 -0
  73. package/profiles/lit-wc/gates.yaml +15 -0
  74. package/profiles/lit-wc/hooks/cem-integrity-gate.sh +48 -0
  75. package/profiles/lit-wc/hooks/shadow-dom-guard.sh +76 -0
  76. package/profiles/nextjs/README.md +44 -0
  77. package/profiles/nextjs/agents.txt +4 -0
  78. package/profiles/nextjs/gates.yaml +15 -0
  79. package/profiles/nextjs/hooks/server-component-drift.sh +73 -0
@@ -0,0 +1,149 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { analyzeStack } from './stack-analyzer.js';
4
+ import { detectGaps } from './gap-detector.js';
5
+ import { writeReports } from './report-generator.js';
6
+ /**
7
+ * Parse catalyze CLI args.
8
+ */
9
+ export function parseCatalyzeArgs(args) {
10
+ const dryRun = args.includes('--dry-run');
11
+ const auditMode = args.includes('--audit');
12
+ const planMode = args.includes('--plan');
13
+ // targetDir is the first non-flag arg, or cwd
14
+ const targetDirArg = args.find((a) => !a.startsWith('--'));
15
+ const targetDir = targetDirArg ? path.resolve(targetDirArg) : process.cwd();
16
+ return {
17
+ plan: !auditMode || planMode, // default to plan if neither flag set
18
+ audit: auditMode,
19
+ dryRun,
20
+ targetDir,
21
+ };
22
+ }
23
+ /**
24
+ * Run audit mode: compare current state against last catalyze-report.md.
25
+ */
26
+ function runAuditMode(targetDir, dryRun) {
27
+ console.log('\nreagent catalyze --audit');
28
+ console.log(` Target: ${targetDir}`);
29
+ if (dryRun)
30
+ console.log(' Mode: dry-run');
31
+ console.log('');
32
+ const reportPath = path.join(targetDir, 'catalyze-report.md');
33
+ if (!fs.existsSync(reportPath)) {
34
+ console.log('No previous catalyze-report.md found. Run `reagent catalyze --plan` first.');
35
+ return;
36
+ }
37
+ // Re-run analysis
38
+ const analysis = analyzeStack(targetDir);
39
+ const gapAnalysis = detectGaps(analysis);
40
+ // Read previous report to count checkboxes
41
+ const prevReport = fs.readFileSync(reportPath, 'utf8');
42
+ const prevGapMatches = prevReport.match(/^- \[[ x]\]/gm) || [];
43
+ const prevChecked = prevReport.match(/^- \[x\]/gm) || [];
44
+ const prevTotal = prevGapMatches.length;
45
+ const prevImplemented = prevChecked.length;
46
+ const prevOutstanding = prevTotal - prevImplemented;
47
+ const currentTotal = gapAnalysis.gaps.length;
48
+ const implemented = Math.max(0, prevTotal - currentTotal);
49
+ const newGaps = Math.max(0, currentTotal - prevOutstanding);
50
+ const outstanding = currentTotal;
51
+ console.log('DRIFT REPORT');
52
+ console.log(` Implemented since last catalyze: ${implemented} gaps closed`);
53
+ console.log(` New gaps detected: ${newGaps}`);
54
+ console.log(` Outstanding: ${outstanding} gaps remain`);
55
+ console.log('');
56
+ // Show current critical count
57
+ const critical = gapAnalysis.gaps.filter((g) => g.severity === 'critical');
58
+ if (critical.length > 0) {
59
+ console.log(` CRITICAL gaps outstanding (${critical.length}):`);
60
+ for (const gap of critical) {
61
+ console.log(` - ${gap.title}`);
62
+ }
63
+ console.log('');
64
+ }
65
+ if (!dryRun) {
66
+ const generatedAt = new Date().toISOString();
67
+ const { mdPath, htmlPath } = writeReports(gapAnalysis, generatedAt, targetDir, false);
68
+ console.log(`Reports updated:`);
69
+ console.log(` ${mdPath}`);
70
+ console.log(` ${htmlPath}`);
71
+ }
72
+ }
73
+ /**
74
+ * Run plan mode: full analysis, write tasks, generate reports.
75
+ */
76
+ function runPlanMode(targetDir, dryRun) {
77
+ console.log('\nreagent catalyze --plan');
78
+ console.log(` Target: ${targetDir}`);
79
+ if (dryRun)
80
+ console.log(' Mode: dry-run (no files written)');
81
+ console.log('');
82
+ // Analyze stack
83
+ process.stdout.write('Analyzing stack...');
84
+ const analysis = analyzeStack(targetDir);
85
+ console.log(' done.');
86
+ // Detect gaps
87
+ process.stdout.write('Detecting gaps...');
88
+ const gapAnalysis = detectGaps(analysis);
89
+ console.log(' done.');
90
+ // Print summary
91
+ const { stack, gaps } = gapAnalysis;
92
+ console.log('');
93
+ console.log('Stack detected:');
94
+ console.log(` Types: ${stack.detectedTypes.join(', ')}`);
95
+ console.log(` Framework: ${stack.framework || 'not detected'}`);
96
+ console.log(` Test runner: ${stack.testRunner || 'none detected'}`);
97
+ console.log(` Hooks: ${gapAnalysis.installedHookCount}/${gapAnalysis.totalRecommendedHooks} base hooks installed`);
98
+ console.log(` Test files: ${stack.testFiles.length}`);
99
+ console.log('');
100
+ const critical = gaps.filter((g) => g.severity === 'critical');
101
+ const high = gaps.filter((g) => g.severity === 'high');
102
+ const normal = gaps.filter((g) => g.severity === 'normal');
103
+ console.log(`Gaps found: ${gaps.length} total`);
104
+ console.log(` Critical: ${critical.length}`);
105
+ console.log(` High: ${high.length}`);
106
+ console.log(` Normal: ${normal.length}`);
107
+ if (critical.length > 0) {
108
+ console.log('');
109
+ console.log('Critical gaps:');
110
+ for (const gap of critical) {
111
+ console.log(` - [${gap.category}] ${gap.title}`);
112
+ }
113
+ }
114
+ if (!dryRun) {
115
+ const generatedAt = new Date().toISOString();
116
+ const { mdPath, htmlPath } = writeReports(gapAnalysis, generatedAt, targetDir, false);
117
+ console.log('');
118
+ console.log('Reports written:');
119
+ console.log(` ${mdPath}`);
120
+ console.log(` ${htmlPath}`);
121
+ console.log('');
122
+ console.log('Next steps:');
123
+ console.log(' 1. Review catalyze-report.md for the full gap list');
124
+ console.log(' 2. Run `reagent init` to install missing base hooks');
125
+ for (const pType of stack.detectedTypes) {
126
+ if (['astro', 'nextjs', 'lit-wc', 'drupal'].includes(pType)) {
127
+ console.log(` 3. Run \`reagent init --profile ${pType}\` to install ${pType} profile`);
128
+ }
129
+ }
130
+ console.log(' 4. Re-run `reagent catalyze --audit` to track progress');
131
+ }
132
+ else {
133
+ console.log('');
134
+ console.log('(dry-run: no files written)');
135
+ }
136
+ }
137
+ /**
138
+ * Main catalyze command runner.
139
+ */
140
+ export function runCatalyze(args) {
141
+ const opts = parseCatalyzeArgs(args);
142
+ if (opts.audit) {
143
+ runAuditMode(opts.targetDir, opts.dryRun);
144
+ }
145
+ else {
146
+ runPlanMode(opts.targetDir, opts.dryRun);
147
+ }
148
+ }
149
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/cli/commands/catalyze/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { GapAnalysis } from './types.js';
2
+ /**
3
+ * Generate the Markdown report content.
4
+ */
5
+ export declare function generateMarkdownReport(analysis: GapAnalysis, generatedAt: string): string;
6
+ /**
7
+ * Generate the HTML report content (inline CSS, dark mode, no external deps).
8
+ */
9
+ export declare function generateHtmlReport(analysis: GapAnalysis, generatedAt: string): string;
10
+ /**
11
+ * Write both report files to disk.
12
+ */
13
+ export declare function writeReports(analysis: GapAnalysis, generatedAt: string, outputDir: string, dryRun: boolean): {
14
+ mdPath: string;
15
+ htmlPath: string;
16
+ };
17
+ //# sourceMappingURL=report-generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report-generator.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/catalyze/report-generator.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAoB,MAAM,YAAY,CAAC;AAmBhE;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CA+FzF;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CA8KrF;AAED;;GAEG;AACH,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,WAAW,EACrB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,OAAO,GACd;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAatC"}
@@ -0,0 +1,290 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ function severityLabel(s) {
4
+ return s.charAt(0).toUpperCase() + s.slice(1);
5
+ }
6
+ function categoryIcon(category) {
7
+ switch (category) {
8
+ case 'hook':
9
+ return '[hook]';
10
+ case 'gate':
11
+ return '[gate]';
12
+ case 'agent':
13
+ return '[agent]';
14
+ case 'test':
15
+ return '[test]';
16
+ }
17
+ }
18
+ /**
19
+ * Generate the Markdown report content.
20
+ */
21
+ export function generateMarkdownReport(analysis, generatedAt) {
22
+ const { stack, gaps, totalRecommendedHooks, installedHookCount } = analysis;
23
+ const critical = gaps.filter((g) => g.severity === 'critical');
24
+ const high = gaps.filter((g) => g.severity === 'high');
25
+ const normal = gaps.filter((g) => g.severity === 'normal');
26
+ const hookCoverage = `${installedHookCount}/${totalRecommendedHooks}`;
27
+ let md = `# reagent catalyze report
28
+ _Generated: ${generatedAt}_
29
+ _Project: ${stack.projectName} v${stack.projectVersion}_
30
+
31
+ ## Stack detected
32
+
33
+ - **Types:** ${stack.detectedTypes.join(', ')}
34
+ - **Framework:** ${stack.framework || 'not detected'}
35
+ - **Test runner:** ${stack.testRunner || 'none detected'}
36
+ - **Autonomy level:** ${stack.autonomyLevel || 'not configured'}
37
+ - **Profile:** ${stack.profile || 'none'}
38
+ - **Existing hooks:** ${hookCoverage} recommended base hooks installed
39
+ - **Test files found:** ${stack.testFiles.length}
40
+
41
+ ## Summary
42
+
43
+ | Severity | Count |
44
+ |----------|-------|
45
+ | Critical | ${critical.length} |
46
+ | High | ${high.length} |
47
+ | Normal | ${normal.length} |
48
+ | **Total gaps** | **${gaps.length}** |
49
+
50
+ `;
51
+ if (gaps.length === 0) {
52
+ md += `## No gaps detected\n\nAll recommended hooks, gates, and agents appear to be in place for the detected stack.\n`;
53
+ return md;
54
+ }
55
+ md += `## Gaps found (ranked by impact)\n\n`;
56
+ function renderGaps(sectionGaps, severity) {
57
+ if (sectionGaps.length === 0)
58
+ return '';
59
+ let section = `### ${severityLabel(severity)}\n\n`;
60
+ for (const gap of sectionGaps) {
61
+ section += `- [ ] ${categoryIcon(gap.category)} **${gap.title}** — ${gap.description}`;
62
+ if (gap.suggestion) {
63
+ section += `\n _Suggestion: ${gap.suggestion}_`;
64
+ }
65
+ section += '\n';
66
+ }
67
+ return section + '\n';
68
+ }
69
+ md += renderGaps(critical, 'critical');
70
+ md += renderGaps(high, 'high');
71
+ md += renderGaps(normal, 'normal');
72
+ // Recommended next steps
73
+ md += `## Recommended next steps\n\n`;
74
+ md += `1. Run \`reagent init\` to install missing base hooks\n`;
75
+ const profileMap = {
76
+ astro: 'astro',
77
+ nextjs: 'nextjs',
78
+ 'lit-wc': 'lit-wc',
79
+ drupal: 'drupal',
80
+ };
81
+ for (const pType of stack.detectedTypes) {
82
+ const profileName = profileMap[pType];
83
+ if (profileName) {
84
+ md += `2. Run \`reagent init --profile ${profileName}\` to install ${pType} profile hooks and agents\n`;
85
+ }
86
+ }
87
+ md += `3. Review the gaps above and address Critical items first\n`;
88
+ md += `4. Re-run \`reagent catalyze --audit\` after changes to track progress\n`;
89
+ // Hook templates section for project-specific hooks
90
+ const hasLitWc = stack.detectedTypes.includes('lit-wc');
91
+ const hasDrupal = stack.detectedTypes.includes('drupal');
92
+ const hasAstro = stack.detectedTypes.includes('astro');
93
+ const hasNextjs = stack.detectedTypes.includes('nextjs');
94
+ if (hasLitWc || hasDrupal || hasAstro || hasNextjs) {
95
+ md += `\n## Profile-specific hook templates\n\n`;
96
+ md += `Install profile-specific hooks using:\n\n`;
97
+ for (const pType of stack.detectedTypes) {
98
+ const profileName = profileMap[pType];
99
+ if (profileName) {
100
+ md += `\`\`\`bash\nreagent init --profile ${profileName}\n\`\`\`\n\n`;
101
+ }
102
+ }
103
+ }
104
+ return md;
105
+ }
106
+ /**
107
+ * Generate the HTML report content (inline CSS, dark mode, no external deps).
108
+ */
109
+ export function generateHtmlReport(analysis, generatedAt) {
110
+ const { stack, gaps } = analysis;
111
+ const critical = gaps.filter((g) => g.severity === 'critical');
112
+ const high = gaps.filter((g) => g.severity === 'high');
113
+ const normal = gaps.filter((g) => g.severity === 'normal');
114
+ function escapeHtml(str) {
115
+ return str
116
+ .replace(/&/g, '&')
117
+ .replace(/</g, '&lt;')
118
+ .replace(/>/g, '&gt;')
119
+ .replace(/"/g, '&quot;')
120
+ .replace(/'/g, '&#039;');
121
+ }
122
+ function severityColor(s) {
123
+ switch (s) {
124
+ case 'critical':
125
+ return '#ff4444';
126
+ case 'high':
127
+ return '#ff9944';
128
+ case 'normal':
129
+ return '#4499ff';
130
+ }
131
+ }
132
+ function renderGapsHtml(sectionGaps, severity) {
133
+ if (sectionGaps.length === 0)
134
+ return '';
135
+ const color = severityColor(severity);
136
+ let html = `<details open>
137
+ <summary style="color:${color};font-weight:bold;font-size:1.1em;cursor:pointer;padding:8px 0;">
138
+ ${severityLabel(severity)} (${sectionGaps.length})
139
+ </summary>
140
+ <ul style="list-style:none;padding:0;margin:8px 0;">
141
+ `;
142
+ for (const gap of sectionGaps) {
143
+ html += `<li style="padding:10px;margin:6px 0;background:#2a2a2a;border-left:4px solid ${color};border-radius:4px;">
144
+ <span style="background:${color};color:#000;font-size:0.75em;padding:2px 6px;border-radius:3px;font-weight:bold;margin-right:8px;">${gap.category.toUpperCase()}</span>
145
+ <strong>${escapeHtml(gap.title)}</strong>
146
+ <p style="margin:6px 0 4px;color:#ccc;">${escapeHtml(gap.description)}</p>
147
+ ${gap.suggestion ? `<p style="margin:4px 0;color:#888;font-size:0.9em;font-style:italic;">Suggestion: ${escapeHtml(gap.suggestion)}</p>` : ''}
148
+ </li>`;
149
+ }
150
+ html += `</ul></details>`;
151
+ return html;
152
+ }
153
+ const html = `<!DOCTYPE html>
154
+ <html lang="en">
155
+ <head>
156
+ <meta charset="UTF-8">
157
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
158
+ <title>reagent catalyze report — ${escapeHtml(stack.projectName)}</title>
159
+ <style>
160
+ *, *::before, *::after { box-sizing: border-box; }
161
+ body {
162
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, monospace;
163
+ background: #1a1a1a;
164
+ color: #e0e0e0;
165
+ margin: 0;
166
+ padding: 20px;
167
+ line-height: 1.6;
168
+ }
169
+ .container { max-width: 900px; margin: 0 auto; }
170
+ h1 { color: #fff; border-bottom: 2px solid #333; padding-bottom: 12px; }
171
+ h2 { color: #ddd; margin-top: 32px; }
172
+ .meta { color: #888; font-size: 0.9em; margin-bottom: 24px; }
173
+ .stack-grid {
174
+ display: grid;
175
+ grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
176
+ gap: 12px;
177
+ margin-bottom: 24px;
178
+ }
179
+ .stack-card {
180
+ background: #2a2a2a;
181
+ border: 1px solid #333;
182
+ border-radius: 6px;
183
+ padding: 12px;
184
+ }
185
+ .stack-card dt { color: #888; font-size: 0.8em; margin-bottom: 4px; }
186
+ .stack-card dd { color: #fff; margin: 0; font-weight: 500; }
187
+ .summary-badges { display: flex; gap: 12px; margin: 16px 0; flex-wrap: wrap; }
188
+ .badge {
189
+ padding: 6px 14px;
190
+ border-radius: 20px;
191
+ font-weight: bold;
192
+ font-size: 0.9em;
193
+ }
194
+ .badge-critical { background: #ff4444; color: #000; }
195
+ .badge-high { background: #ff9944; color: #000; }
196
+ .badge-normal { background: #4499ff; color: #000; }
197
+ .badge-ok { background: #44bb44; color: #000; }
198
+ details { margin-bottom: 16px; }
199
+ details summary:hover { opacity: 0.8; }
200
+ .next-steps ol { padding-left: 20px; }
201
+ .next-steps li { margin: 6px 0; }
202
+ code { background: #333; padding: 2px 6px; border-radius: 3px; font-size: 0.9em; }
203
+ .footer { margin-top: 40px; color: #555; font-size: 0.8em; border-top: 1px solid #333; padding-top: 16px; }
204
+ </style>
205
+ </head>
206
+ <body>
207
+ <div class="container">
208
+ <h1>reagent catalyze report</h1>
209
+ <div class="meta">
210
+ <span>Generated: ${escapeHtml(generatedAt)}</span> &nbsp;|&nbsp;
211
+ <span>Project: ${escapeHtml(stack.projectName)} v${escapeHtml(stack.projectVersion)}</span>
212
+ </div>
213
+
214
+ <h2>Stack detected</h2>
215
+ <div class="stack-grid">
216
+ <dl class="stack-card">
217
+ <dt>Project types</dt>
218
+ <dd>${escapeHtml(stack.detectedTypes.join(', '))}</dd>
219
+ </dl>
220
+ <dl class="stack-card">
221
+ <dt>Framework</dt>
222
+ <dd>${escapeHtml(stack.framework || 'not detected')}</dd>
223
+ </dl>
224
+ <dl class="stack-card">
225
+ <dt>Test runner</dt>
226
+ <dd>${escapeHtml(stack.testRunner || 'none detected')}</dd>
227
+ </dl>
228
+ <dl class="stack-card">
229
+ <dt>Autonomy level</dt>
230
+ <dd>${escapeHtml(stack.autonomyLevel || 'not configured')}</dd>
231
+ </dl>
232
+ <dl class="stack-card">
233
+ <dt>Profile</dt>
234
+ <dd>${escapeHtml(stack.profile || 'none')}</dd>
235
+ </dl>
236
+ <dl class="stack-card">
237
+ <dt>Hooks installed</dt>
238
+ <dd>${analysis.installedHookCount}/${analysis.totalRecommendedHooks} base hooks</dd>
239
+ </dl>
240
+ </div>
241
+
242
+ <h2>Gap summary</h2>
243
+ <div class="summary-badges">
244
+ ${critical.length > 0 ? `<span class="badge badge-critical">${critical.length} Critical</span>` : ''}
245
+ ${high.length > 0 ? `<span class="badge badge-high">${high.length} High</span>` : ''}
246
+ ${normal.length > 0 ? `<span class="badge badge-normal">${normal.length} Normal</span>` : ''}
247
+ ${gaps.length === 0 ? '<span class="badge badge-ok">No gaps detected</span>' : ''}
248
+ </div>
249
+
250
+ <h2>Gaps found (ranked by impact)</h2>
251
+ ${renderGapsHtml(critical, 'critical')}
252
+ ${renderGapsHtml(high, 'high')}
253
+ ${renderGapsHtml(normal, 'normal')}
254
+
255
+ <div class="next-steps">
256
+ <h2>Recommended next steps</h2>
257
+ <ol>
258
+ <li>Run <code>reagent init</code> to install missing base hooks</li>
259
+ ${stack.detectedTypes
260
+ .filter((t) => ['astro', 'nextjs', 'lit-wc', 'drupal'].includes(t))
261
+ .map((t) => `<li>Run <code>reagent init --profile ${t}</code> to install ${escapeHtml(t)} profile</li>`)
262
+ .join('\n ')}
263
+ <li>Address all <strong style="color:#ff4444">Critical</strong> gaps first</li>
264
+ <li>Re-run <code>reagent catalyze --audit</code> to track progress</li>
265
+ </ol>
266
+ </div>
267
+
268
+ <div class="footer">
269
+ Generated by @bookedsolid/reagent &mdash; <a href="https://github.com/bookedsolidtech/reagent" style="color:#4499ff;">reagent on GitHub</a>
270
+ </div>
271
+ </div>
272
+ </body>
273
+ </html>`;
274
+ return html;
275
+ }
276
+ /**
277
+ * Write both report files to disk.
278
+ */
279
+ export function writeReports(analysis, generatedAt, outputDir, dryRun) {
280
+ const mdPath = path.join(outputDir, 'catalyze-report.md');
281
+ const htmlPath = path.join(outputDir, 'catalyze-report.html');
282
+ const mdContent = generateMarkdownReport(analysis, generatedAt);
283
+ const htmlContent = generateHtmlReport(analysis, generatedAt);
284
+ if (!dryRun) {
285
+ fs.writeFileSync(mdPath, mdContent, 'utf8');
286
+ fs.writeFileSync(htmlPath, htmlContent, 'utf8');
287
+ }
288
+ return { mdPath, htmlPath };
289
+ }
290
+ //# sourceMappingURL=report-generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report-generator.js","sourceRoot":"","sources":["../../../../src/cli/commands/catalyze/report-generator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { StackAnalysis } from './types.js';
2
+ /**
3
+ * Main analyzer entry point.
4
+ */
5
+ export declare function analyzeStack(targetDir: string): StackAnalysis;
6
+ //# sourceMappingURL=stack-analyzer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stack-analyzer.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/catalyze/stack-analyzer.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAe,aAAa,EAAE,MAAM,YAAY,CAAC;AAsP7D;;GAEG;AACH,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,aAAa,CAmD7D"}