aidevo 1.0.0-beta.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 (110) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +431 -0
  3. package/dist/cli/commands/dashboard.d.ts +2 -0
  4. package/dist/cli/commands/dashboard.d.ts.map +1 -0
  5. package/dist/cli/commands/dashboard.js +70 -0
  6. package/dist/cli/commands/dashboard.js.map +1 -0
  7. package/dist/cli/commands/init.d.ts +2 -0
  8. package/dist/cli/commands/init.d.ts.map +1 -0
  9. package/dist/cli/commands/init.js +362 -0
  10. package/dist/cli/commands/init.js.map +1 -0
  11. package/dist/cli/commands/log.d.ts +2 -0
  12. package/dist/cli/commands/log.d.ts.map +1 -0
  13. package/dist/cli/commands/log.js +438 -0
  14. package/dist/cli/commands/log.js.map +1 -0
  15. package/dist/cli/commands/migrate.d.ts +2 -0
  16. package/dist/cli/commands/migrate.d.ts.map +1 -0
  17. package/dist/cli/commands/migrate.js +183 -0
  18. package/dist/cli/commands/migrate.js.map +1 -0
  19. package/dist/cli/commands/reindex.d.ts +10 -0
  20. package/dist/cli/commands/reindex.d.ts.map +1 -0
  21. package/dist/cli/commands/reindex.js +94 -0
  22. package/dist/cli/commands/reindex.js.map +1 -0
  23. package/dist/cli/commands/report.d.ts +2 -0
  24. package/dist/cli/commands/report.d.ts.map +1 -0
  25. package/dist/cli/commands/report.js +219 -0
  26. package/dist/cli/commands/report.js.map +1 -0
  27. package/dist/cli/commands/rules.d.ts +2 -0
  28. package/dist/cli/commands/rules.d.ts.map +1 -0
  29. package/dist/cli/commands/rules.js +143 -0
  30. package/dist/cli/commands/rules.js.map +1 -0
  31. package/dist/cli/commands/start.d.ts +2 -0
  32. package/dist/cli/commands/start.d.ts.map +1 -0
  33. package/dist/cli/commands/start.js +173 -0
  34. package/dist/cli/commands/start.js.map +1 -0
  35. package/dist/cli/commands/status.d.ts +2 -0
  36. package/dist/cli/commands/status.d.ts.map +1 -0
  37. package/dist/cli/commands/status.js +74 -0
  38. package/dist/cli/commands/status.js.map +1 -0
  39. package/dist/cli/commands/update.d.ts +2 -0
  40. package/dist/cli/commands/update.d.ts.map +1 -0
  41. package/dist/cli/commands/update.js +146 -0
  42. package/dist/cli/commands/update.js.map +1 -0
  43. package/dist/cli/index.d.ts +3 -0
  44. package/dist/cli/index.d.ts.map +1 -0
  45. package/dist/cli/index.js +85 -0
  46. package/dist/cli/index.js.map +1 -0
  47. package/dist/mcp/server.d.ts +10 -0
  48. package/dist/mcp/server.d.ts.map +1 -0
  49. package/dist/mcp/server.js +632 -0
  50. package/dist/mcp/server.js.map +1 -0
  51. package/dist/schemas/run-json.d.ts +252 -0
  52. package/dist/schemas/run-json.d.ts.map +1 -0
  53. package/dist/schemas/run-json.js +22 -0
  54. package/dist/schemas/run-json.js.map +1 -0
  55. package/dist/server/api.d.ts +24 -0
  56. package/dist/server/api.d.ts.map +1 -0
  57. package/dist/server/api.js +196 -0
  58. package/dist/server/api.js.map +1 -0
  59. package/dist/server/index.d.ts +2 -0
  60. package/dist/server/index.d.ts.map +1 -0
  61. package/dist/server/index.js +166 -0
  62. package/dist/server/index.js.map +1 -0
  63. package/dist/utils/display.d.ts +12 -0
  64. package/dist/utils/display.d.ts.map +1 -0
  65. package/dist/utils/display.js +52 -0
  66. package/dist/utils/display.js.map +1 -0
  67. package/dist/utils/fs.d.ts +9 -0
  68. package/dist/utils/fs.d.ts.map +1 -0
  69. package/dist/utils/fs.js +43 -0
  70. package/dist/utils/fs.js.map +1 -0
  71. package/dist/utils/git.d.ts +4 -0
  72. package/dist/utils/git.d.ts.map +1 -0
  73. package/dist/utils/git.js +18 -0
  74. package/dist/utils/git.js.map +1 -0
  75. package/dist/utils/paths.d.ts +25 -0
  76. package/dist/utils/paths.d.ts.map +1 -0
  77. package/dist/utils/paths.js +45 -0
  78. package/dist/utils/paths.js.map +1 -0
  79. package/dist/utils/rules.d.ts +44 -0
  80. package/dist/utils/rules.d.ts.map +1 -0
  81. package/dist/utils/rules.js +208 -0
  82. package/dist/utils/rules.js.map +1 -0
  83. package/dist/utils/run-data.d.ts +37 -0
  84. package/dist/utils/run-data.d.ts.map +1 -0
  85. package/dist/utils/run-data.js +353 -0
  86. package/dist/utils/run-data.js.map +1 -0
  87. package/dist/utils/tokens.d.ts +26 -0
  88. package/dist/utils/tokens.d.ts.map +1 -0
  89. package/dist/utils/tokens.js +173 -0
  90. package/dist/utils/tokens.js.map +1 -0
  91. package/package.json +48 -0
  92. package/src/assets/skills/audit.md +98 -0
  93. package/src/assets/skills/bug-fixer.md +48 -0
  94. package/src/assets/skills/code-generator.md +82 -0
  95. package/src/assets/skills/commit-code.md +67 -0
  96. package/src/assets/skills/dashboard-generator.md +65 -0
  97. package/src/assets/skills/dev-flower.md +85 -0
  98. package/src/assets/skills/deviation-recorder.md +89 -0
  99. package/src/assets/skills/docx-to-markdown.md +69 -0
  100. package/src/assets/skills/mcp-reviewer.md +43 -0
  101. package/src/assets/skills/requirement-analyzer.md +103 -0
  102. package/src/assets/skills/rules-evolver.md +48 -0
  103. package/src/assets/skills/self-reviewer.md +53 -0
  104. package/src/assets/skills/task-splitter.md +58 -0
  105. package/src/assets/skills/workflow-orchestrator.md +204 -0
  106. package/src/assets/templates/demo-run.json +910 -0
  107. package/src/assets/templates/run.json +63 -0
  108. package/src/dashboard/assets/index-BMygHuaU.js +111 -0
  109. package/src/dashboard/assets/index-BW0UZ6Es.css +1 -0
  110. package/src/dashboard/index.html +13 -0
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Core reindex logic - can be called from CLI or programmatically (e.g. dashboard startup).
3
+ * Returns the number of runs indexed, or -1 on error.
4
+ */
5
+ export declare function buildIndex(projectRoot: string): number;
6
+ /**
7
+ * CLI entry point for `aidevo reindex`
8
+ */
9
+ export declare function reindex(): Promise<void>;
10
+ //# sourceMappingURL=reindex.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reindex.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/reindex.ts"],"names":[],"mappings":"AAOA;;;GAGG;AACH,wBAAgB,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CA0EtD;AAED;;GAEG;AACH,wBAAsB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAe7C"}
@@ -0,0 +1,94 @@
1
+ import { readdirSync, statSync } from 'node:fs';
2
+ import { resolve } from 'node:path';
3
+ import { configPath, indexPath, runsDir } from '../../utils/paths.js';
4
+ import { fileExists, readJson, writeJson } from '../../utils/fs.js';
5
+ import { green, red } from '../../utils/display.js';
6
+ /**
7
+ * Core reindex logic - can be called from CLI or programmatically (e.g. dashboard startup).
8
+ * Returns the number of runs indexed, or -1 on error.
9
+ */
10
+ export function buildIndex(projectRoot) {
11
+ const theRunsDir = runsDir(projectRoot);
12
+ if (!fileExists(theRunsDir))
13
+ return -1;
14
+ const cfgPath = configPath(projectRoot);
15
+ const config = fileExists(cfgPath) ? readJson(cfgPath) : {};
16
+ const runs = [];
17
+ let branches;
18
+ try {
19
+ branches = readdirSync(theRunsDir).filter(f => statSync(resolve(theRunsDir, f)).isDirectory());
20
+ }
21
+ catch {
22
+ return -1;
23
+ }
24
+ for (const branch of branches) {
25
+ const reqPath = resolve(theRunsDir, branch, 'requirement.json');
26
+ if (!fileExists(reqPath))
27
+ continue;
28
+ try {
29
+ const req = readJson(reqPath);
30
+ let status = 'running';
31
+ let startTime = req.createdAt || '';
32
+ let endTime;
33
+ const branchPath = resolve(theRunsDir, branch);
34
+ const devDirs = readdirSync(branchPath).filter(f => {
35
+ const p = resolve(branchPath, f);
36
+ return statSync(p).isDirectory() && fileExists(resolve(p, 'run.json'));
37
+ });
38
+ let allCompleted = devDirs.length > 0;
39
+ for (const dev of devDirs) {
40
+ const runData = readJson(resolve(branchPath, dev, 'run.json'));
41
+ const meta = runData.meta || {};
42
+ if (meta.startTime && (!startTime || meta.startTime < startTime)) {
43
+ startTime = meta.startTime;
44
+ }
45
+ if (meta.endTime && (!endTime || meta.endTime > endTime)) {
46
+ endTime = meta.endTime;
47
+ }
48
+ if (meta.status !== 'completed') {
49
+ allCompleted = false;
50
+ }
51
+ }
52
+ if (allCompleted && devDirs.length > 0)
53
+ status = 'completed';
54
+ runs.push({
55
+ branch: req.branch || branch,
56
+ title: req.title || branch,
57
+ summary: req.summary || '',
58
+ status,
59
+ startTime,
60
+ endTime,
61
+ developers: req.developers || [],
62
+ highlights: req.highlights || [],
63
+ totals: req.totals || { tasks: 0, completedTasks: 0, bugs: 0, deviations: 0, linesAdded: 0, linesRemoved: 0, totalTokens: 0 },
64
+ });
65
+ }
66
+ catch {
67
+ // Skip invalid requirement.json
68
+ }
69
+ }
70
+ const index = {
71
+ project: config.project || '',
72
+ updatedAt: new Date().toISOString(),
73
+ runs,
74
+ };
75
+ writeJson(indexPath(projectRoot), index);
76
+ return runs.length;
77
+ }
78
+ /**
79
+ * CLI entry point for `aidevo reindex`
80
+ */
81
+ export async function reindex() {
82
+ const projectRoot = process.cwd();
83
+ if (!fileExists(configPath(projectRoot))) {
84
+ console.log(red('\n AIDevOS not initialized. Run `npx aidevo init` first.\n'));
85
+ return;
86
+ }
87
+ const count = buildIndex(projectRoot);
88
+ if (count < 0) {
89
+ console.log(red('\n No runs directory found or failed to read.\n'));
90
+ return;
91
+ }
92
+ console.log(green(`\n ✓ Index rebuilt`) + `: ${count} runs indexed\n`);
93
+ }
94
+ //# sourceMappingURL=reindex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reindex.js","sourceRoot":"","sources":["../../../src/cli/commands/reindex.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function report(): Promise<void>;
2
+ //# sourceMappingURL=report.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/report.ts"],"names":[],"mappings":"AA0LA,wBAAsB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CA4D5C"}
@@ -0,0 +1,219 @@
1
+ import { resolve } from 'node:path';
2
+ import { configPath, indexPath } from '../../utils/paths.js';
3
+ import { fileExists, readJson, writeText } from '../../utils/fs.js';
4
+ import { green, red, cyan, yellow } from '../../utils/display.js';
5
+ import { getDevName } from '../../utils/git.js';
6
+ function parseReportFlags(args) {
7
+ const flags = {};
8
+ for (let i = 0; i < args.length; i++) {
9
+ if (args[i].startsWith('--') && i + 1 < args.length && !args[i + 1].startsWith('--')) {
10
+ flags[args[i].substring(2)] = args[i + 1];
11
+ i++;
12
+ }
13
+ }
14
+ return flags;
15
+ }
16
+ function formatDuration(seconds) {
17
+ if (seconds < 60)
18
+ return `${Math.round(seconds)}s`;
19
+ if (seconds < 3600)
20
+ return `${Math.round(seconds / 60)}min`;
21
+ const h = Math.floor(seconds / 3600);
22
+ const m = Math.round((seconds % 3600) / 60);
23
+ return m > 0 ? `${h}h ${m}min` : `${h}h`;
24
+ }
25
+ function filterByPeriod(runs, period) {
26
+ if (!period)
27
+ return runs;
28
+ const now = new Date();
29
+ let startDate;
30
+ let endDate;
31
+ // Support: 2026-H1, 2026-H2, 2026, 2026-Q1, etc.
32
+ const yearMatch = period.match(/^(\d{4})$/);
33
+ const h1Match = period.match(/^(\d{4})-H1$/i);
34
+ const h2Match = period.match(/^(\d{4})-H2$/i);
35
+ const qMatch = period.match(/^(\d{4})-Q(\d)$/i);
36
+ if (h1Match) {
37
+ const y = parseInt(h1Match[1]);
38
+ startDate = new Date(`${y}-01-01T00:00:00Z`);
39
+ endDate = new Date(`${y}-07-01T00:00:00Z`);
40
+ }
41
+ else if (h2Match) {
42
+ const y = parseInt(h2Match[1]);
43
+ startDate = new Date(`${y}-07-01T00:00:00Z`);
44
+ endDate = new Date(`${y + 1}-01-01T00:00:00Z`);
45
+ }
46
+ else if (qMatch) {
47
+ const y = parseInt(qMatch[1]);
48
+ const q = parseInt(qMatch[2]);
49
+ const startMonth = (q - 1) * 3;
50
+ startDate = new Date(y, startMonth, 1);
51
+ endDate = new Date(y, startMonth + 3, 1);
52
+ }
53
+ else if (yearMatch) {
54
+ const y = parseInt(yearMatch[1]);
55
+ startDate = new Date(`${y}-01-01T00:00:00Z`);
56
+ endDate = new Date(`${y + 1}-01-01T00:00:00Z`);
57
+ }
58
+ else {
59
+ return runs;
60
+ }
61
+ return runs.filter(r => {
62
+ if (!r.startTime)
63
+ return false;
64
+ const t = new Date(r.startTime);
65
+ return t >= startDate && t < endDate;
66
+ });
67
+ }
68
+ function generateMyReport(runs, devName, period) {
69
+ const myRuns = runs.filter(r => r.developers.some(d => d.name === devName));
70
+ const lines = [];
71
+ lines.push(`# ${period || 'All Time'} Report - ${devName}`);
72
+ lines.push('');
73
+ // Summary stats
74
+ let totalTasks = 0, totalCompleted = 0, totalBugs = 0, totalDeviations = 0;
75
+ let totalLinesAdded = 0, totalTokens = 0, totalWorkSeconds = 0;
76
+ for (const run of myRuns) {
77
+ const dev = run.developers.find(d => d.name === devName);
78
+ if (!dev)
79
+ continue;
80
+ totalTasks += dev.tasks;
81
+ totalCompleted += dev.completedTasks;
82
+ totalBugs += dev.bugs;
83
+ totalDeviations += dev.deviations;
84
+ totalLinesAdded += dev.linesAdded;
85
+ totalTokens += dev.totalTokens;
86
+ totalWorkSeconds += dev.actualWorkSeconds;
87
+ }
88
+ lines.push('## Summary');
89
+ lines.push('');
90
+ lines.push(`- Requirements completed: ${myRuns.length}`);
91
+ lines.push(`- Total tasks: ${totalTasks} (completed: ${totalCompleted})`);
92
+ lines.push(`- Total bugs: ${totalBugs}`);
93
+ lines.push(`- Total deviations: ${totalDeviations}`);
94
+ lines.push(`- Code: +${totalLinesAdded} lines`);
95
+ lines.push(`- AI work time: ${formatDuration(totalWorkSeconds)}`);
96
+ if (totalTokens > 0)
97
+ lines.push(`- Token consumption: ${(totalTokens / 1000000).toFixed(2)}M`);
98
+ lines.push('');
99
+ // Per-requirement breakdown
100
+ lines.push('## Requirements');
101
+ lines.push('');
102
+ lines.push('| Requirement | Tasks | Bugs | Deviations | Lines | Status |');
103
+ lines.push('|---|---|---|---|---|---|');
104
+ for (const run of myRuns) {
105
+ const dev = run.developers.find(d => d.name === devName);
106
+ if (!dev)
107
+ continue;
108
+ lines.push(`| ${run.title || run.branch} | ${dev.tasks} | ${dev.bugs} | ${dev.deviations} | +${dev.linesAdded} | ${run.status} |`);
109
+ }
110
+ lines.push('');
111
+ // Highlights
112
+ const allHighlights = myRuns.flatMap(r => r.highlights || []);
113
+ if (allHighlights.length > 0) {
114
+ lines.push('## Highlights');
115
+ lines.push('');
116
+ for (const h of allHighlights) {
117
+ lines.push(`- ${h.content}`);
118
+ }
119
+ lines.push('');
120
+ }
121
+ return lines.join('\n');
122
+ }
123
+ function generateTeamReport(runs, period) {
124
+ const lines = [];
125
+ lines.push(`# ${period || 'All Time'} Team Report`);
126
+ lines.push('');
127
+ // Collect all developers
128
+ const devMap = new Map();
129
+ for (const run of runs) {
130
+ for (const dev of run.developers) {
131
+ const existing = devMap.get(dev.name) || { tasks: 0, completed: 0, bugs: 0, deviations: 0, lines: 0, tokens: 0, workSeconds: 0, runs: 0 };
132
+ existing.tasks += dev.tasks;
133
+ existing.completed += dev.completedTasks;
134
+ existing.bugs += dev.bugs;
135
+ existing.deviations += dev.deviations;
136
+ existing.lines += dev.linesAdded;
137
+ existing.tokens += dev.totalTokens;
138
+ existing.workSeconds += dev.actualWorkSeconds;
139
+ existing.runs += 1;
140
+ devMap.set(dev.name, existing);
141
+ }
142
+ }
143
+ lines.push('## Overview');
144
+ lines.push('');
145
+ lines.push(`- Total requirements: ${runs.length}`);
146
+ lines.push(`- Team members: ${devMap.size}`);
147
+ lines.push('');
148
+ lines.push('## Team Members');
149
+ lines.push('');
150
+ lines.push('| Developer | Requirements | Tasks | Bugs | Deviations | Lines | AI Time |');
151
+ lines.push('|---|---|---|---|---|---|---|');
152
+ for (const [name, stats] of devMap) {
153
+ lines.push(`| ${name} | ${stats.runs} | ${stats.tasks} | ${stats.bugs} | ${stats.deviations} | +${stats.lines} | ${formatDuration(stats.workSeconds)} |`);
154
+ }
155
+ lines.push('');
156
+ // All requirements
157
+ lines.push('## Requirements');
158
+ lines.push('');
159
+ lines.push('| Requirement | Status | Tasks | Developers | Highlights |');
160
+ lines.push('|---|---|---|---|---|');
161
+ for (const run of runs) {
162
+ const devNames = run.developers.map(d => d.name).join(', ');
163
+ const topHighlight = run.highlights?.[0]?.content || '-';
164
+ lines.push(`| ${run.title || run.branch} | ${run.status} | ${run.totals.tasks} | ${devNames} | ${topHighlight} |`);
165
+ }
166
+ lines.push('');
167
+ return lines.join('\n');
168
+ }
169
+ export async function report() {
170
+ const projectRoot = process.cwd();
171
+ if (!fileExists(configPath(projectRoot))) {
172
+ console.log(red('\n AIDevOS not initialized. Run `npx aidevo init` first.\n'));
173
+ return;
174
+ }
175
+ const args = process.argv.slice(3);
176
+ const flags = parseReportFlags(args);
177
+ const scope = flags.scope || 'me';
178
+ const period = flags.period || '';
179
+ // Ensure index exists
180
+ const idxPath = indexPath(projectRoot);
181
+ if (!fileExists(idxPath)) {
182
+ console.log(yellow('\n Index not found. Running reindex first...\n'));
183
+ const { reindex } = await import('./reindex.js');
184
+ await reindex();
185
+ }
186
+ if (!fileExists(idxPath)) {
187
+ console.log(red('\n No data available for report.\n'));
188
+ return;
189
+ }
190
+ const index = readJson(idxPath);
191
+ let runs = index.runs || [];
192
+ // Filter by period
193
+ if (period) {
194
+ runs = filterByPeriod(runs, period);
195
+ if (runs.length === 0) {
196
+ console.log(yellow(`\n No runs found for period: ${period}\n`));
197
+ return;
198
+ }
199
+ }
200
+ let content;
201
+ const devName = getDevName();
202
+ switch (scope) {
203
+ case 'me':
204
+ content = generateMyReport(runs, devName, period);
205
+ break;
206
+ case 'team':
207
+ case 'project':
208
+ content = generateTeamReport(runs, period);
209
+ break;
210
+ default:
211
+ console.log(red(`\n Invalid --scope: "${scope}". Must be one of: me, team, project\n`));
212
+ return;
213
+ }
214
+ const outputPath = resolve(projectRoot, '.aidevos', `report-${scope}-${period || 'all'}.md`);
215
+ writeText(outputPath, content);
216
+ console.log(green('\n ✓ Report generated') + `: ${outputPath}\n`);
217
+ console.log(` ${cyan('Tip')}: Use this file as input for AI to generate a performance review draft.\n`);
218
+ }
219
+ //# sourceMappingURL=report.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report.js","sourceRoot":"","sources":["../../../src/cli/commands/report.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function rules(): Promise<void>;
2
+ //# sourceMappingURL=rules.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rules.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/rules.ts"],"names":[],"mappings":"AA6IA,wBAAsB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAkC3C"}
@@ -0,0 +1,143 @@
1
+ import { configPath } from '../../utils/paths.js';
2
+ import { fileExists, readText } from '../../utils/fs.js';
3
+ import { green, red, cyan, yellow, dim } from '../../utils/display.js';
4
+ import { loadRegistry, saveRegistry, buildRuleViews, findSimilarRules, mergeRegistries, registryPath, } from '../../utils/rules.js';
5
+ function subcommand() {
6
+ return process.argv[3] || '';
7
+ }
8
+ async function rulesBuild() {
9
+ const projectRoot = process.cwd();
10
+ const count = buildRuleViews(projectRoot);
11
+ const entries = loadRegistry(projectRoot);
12
+ console.log(green(`\n ✓ Rules views rebuilt`) +
13
+ `: ${entries.length} rules → ${count} category files\n`);
14
+ }
15
+ async function rulesDedupe() {
16
+ const projectRoot = process.cwd();
17
+ const entries = loadRegistry(projectRoot);
18
+ if (entries.length === 0) {
19
+ console.log(yellow('\n No rules in registry.\n'));
20
+ return;
21
+ }
22
+ const similar = findSimilarRules(entries);
23
+ if (similar.length === 0) {
24
+ console.log(green('\n ✓ No potential duplicates found.\n'));
25
+ return;
26
+ }
27
+ console.log(yellow(`\n Found ${similar.length} potential duplicate(s):\n`));
28
+ for (const { a, b, similarity } of similar) {
29
+ const pct = Math.round(similarity * 100);
30
+ console.log(` ${cyan(a.id)} ↔ ${cyan(b.id)} (${pct}% similar)`);
31
+ console.log(` A: ${a.content.substring(0, 80)}`);
32
+ console.log(` B: ${b.content.substring(0, 80)}`);
33
+ console.log('');
34
+ }
35
+ console.log(dim(' To resolve: manually edit .aidevos/rules.json,') +
36
+ dim(' then run `aidevo rules build`.\n'));
37
+ }
38
+ async function rulesMerge() {
39
+ const projectRoot = process.cwd();
40
+ const regPath = registryPath(projectRoot);
41
+ if (!fileExists(regPath)) {
42
+ console.log(yellow('\n No rules.json found.\n'));
43
+ return;
44
+ }
45
+ // Check if the file has git merge conflict markers
46
+ const raw = readText(regPath);
47
+ if (!raw.includes('<<<<<<<') && !raw.includes('>>>>>>>')) {
48
+ console.log(green('\n ✓ No merge conflicts detected in rules.json.\n'));
49
+ return;
50
+ }
51
+ // Extract both sides from conflict markers
52
+ console.log(yellow('\n Merge conflict detected in rules.json. Resolving...\n'));
53
+ const oursMatch = raw.match(/<<<<<<< .*?\n([\s\S]*?)=======/);
54
+ const theirsMatch = raw.match(/=======\n([\s\S]*?)>>>>>>> /);
55
+ if (!oursMatch || !theirsMatch) {
56
+ console.log(red(' Could not parse conflict markers. Please resolve manually.\n'));
57
+ return;
58
+ }
59
+ let ours = [];
60
+ let theirs = [];
61
+ try {
62
+ ours = JSON.parse(oursMatch[1].trim());
63
+ }
64
+ catch {
65
+ // Ours might be partial, try to wrap in array
66
+ try {
67
+ ours = JSON.parse(`[${oursMatch[1].trim()}]`);
68
+ }
69
+ catch { /* empty */ }
70
+ }
71
+ try {
72
+ theirs = JSON.parse(theirsMatch[1].trim());
73
+ }
74
+ catch {
75
+ try {
76
+ theirs = JSON.parse(`[${theirsMatch[1].trim()}]`);
77
+ }
78
+ catch { /* empty */ }
79
+ }
80
+ const { merged, added } = mergeRegistries(ours, theirs);
81
+ saveRegistry(projectRoot, merged);
82
+ buildRuleViews(projectRoot);
83
+ console.log(green(` ✓ Merged successfully`) +
84
+ `: ${merged.length} total rules (${added} new from incoming branch)\n`);
85
+ }
86
+ async function rulesList() {
87
+ const projectRoot = process.cwd();
88
+ const entries = loadRegistry(projectRoot);
89
+ if (entries.length === 0) {
90
+ console.log(yellow('\n No rules in registry.\n'));
91
+ return;
92
+ }
93
+ console.log(`\n ${entries.length} rules in registry:\n`);
94
+ // Group by category
95
+ const groups = {};
96
+ for (const e of entries) {
97
+ const cat = e.category || 'general';
98
+ if (!groups[cat])
99
+ groups[cat] = [];
100
+ groups[cat].push(e);
101
+ }
102
+ for (const [cat, rules] of Object.entries(groups)) {
103
+ console.log(` ${cyan(cat)} (${rules.length})`);
104
+ for (const r of rules) {
105
+ const status = r.status !== 'active' ? ` [${r.status}]` : '';
106
+ console.log(` ${dim(r.id)}${status} ${r.content.substring(0, 70)}`);
107
+ }
108
+ console.log('');
109
+ }
110
+ }
111
+ export async function rules() {
112
+ const projectRoot = process.cwd();
113
+ if (!fileExists(configPath(projectRoot))) {
114
+ console.log(red('\n AIDevOS not initialized. Run `npx aidevo init` first.\n'));
115
+ return;
116
+ }
117
+ const sub = subcommand();
118
+ switch (sub) {
119
+ case 'build':
120
+ return rulesBuild();
121
+ case 'dedupe':
122
+ return rulesDedupe();
123
+ case 'merge':
124
+ return rulesMerge();
125
+ case 'list':
126
+ case 'ls':
127
+ return rulesList();
128
+ default:
129
+ console.log(`
130
+ ${cyan('aidevo rules')} - Manage project rules registry
131
+
132
+ Subcommands:
133
+ build Rebuild .aidevos/rules/*.md views from rules.json
134
+ dedupe Find potential duplicate or conflicting rules
135
+ merge Auto-resolve git merge conflicts in rules.json
136
+ list List all rules grouped by category
137
+
138
+ The source of truth is .aidevos/rules.json (committed to git).
139
+ The .aidevos/rules/*.md files are auto-generated views (gitignored).
140
+ `);
141
+ }
142
+ }
143
+ //# sourceMappingURL=rules.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rules.js","sourceRoot":"","sources":["../../../src/cli/commands/rules.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAa,MAAM,mBAAmB,CAAC;AACpE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,wBAAwB,CAAC;AACvE,OAAO,EACL,YAAY,EACZ,YAAY,EACZ,cAAc,EACd,gBAAgB,EAChB,eAAe,EACf,YAAY,GACb,MAAM,sBAAsB,CAAC;AAG9B,SAAS,UAAU;IACjB,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AAC/B,CAAC;AAED,KAAK,UAAU,UAAU;IACvB,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAClC,MAAM,KAAK,GAAG,cAAc,CAAC,WAAW,CAAC,CAAC;IAC1C,MAAM,OAAO,GAAG,YAAY,CAAC,WAAW,CAAC,CAAC;IAC1C,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,2BAA2B,CAAC;QAClC,KAAK,OAAO,CAAC,MAAM,YAAY,KAAK,mBAAmB,CACxD,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,WAAW;IACxB,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAClC,MAAM,OAAO,GAAG,YAAY,CAAC,WAAW,CAAC,CAAC;IAE1C,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,6BAA6B,CAAC,CAAC,CAAC;QACnD,OAAO;IACT,CAAC;IAED,MAAM,OAAO,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAE1C,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAC,CAAC;QAC7D,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,aAAa,OAAO,CAAC,MAAM,4BAA4B,CAAC,CAAC,CAAC;IAE7E,KAAK,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,UAAU,EAAE,IAAI,OAAO,EAAE,CAAC;QAC3C,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,GAAG,CAAC,CAAC;QACzC,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,GAAG,YAAY,CAAC,CAAC;QACjE,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;QACpD,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;QACpD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,CAAC,GAAG,CACT,GAAG,CAAC,kDAAkD,CAAC;QACvD,GAAG,CAAC,mCAAmC,CAAC,CACzC,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,UAAU;IACvB,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAClC,MAAM,OAAO,GAAG,YAAY,CAAC,WAAW,CAAC,CAAC;IAE1C,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,4BAA4B,CAAC,CAAC,CAAC;QAClD,OAAO;IACT,CAAC;IAED,mDAAmD;IACnD,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC9B,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QACzD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,oDAAoD,CAAC,CAAC,CAAC;QACzE,OAAO;IACT,CAAC;IAED,2CAA2C;IAC3C,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,2DAA2D,CAAC,CAAC,CAAC;IAEjF,MAAM,SAAS,GAAG,GAAG,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;IAC9D,MAAM,WAAW,GAAG,GAAG,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;IAE7D,IAAI,CAAC,SAAS,IAAI,CAAC,WAAW,EAAE,CAAC;QAC/B,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,gEAAgE,CAAC,CAAC,CAAC;QACnF,OAAO;IACT,CAAC;IAED,IAAI,IAAI,GAAwB,EAAE,CAAC;IACnC,IAAI,MAAM,GAAwB,EAAE,CAAC;IAErC,IAAI,CAAC;QACH,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACzC,CAAC;IAAC,MAAM,CAAC;QACP,8CAA8C;QAC9C,IAAI,CAAC;YAAC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,WAAW,CAAC,CAAC;IAC9E,CAAC;IAED,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAC7C,CAAC;IAAC,MAAM,CAAC;QACP,IAAI,CAAC;YAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,WAAW,CAAC,CAAC;IAClF,CAAC;IAED,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,eAAe,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACxD,YAAY,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IAClC,cAAc,CAAC,WAAW,CAAC,CAAC;IAE5B,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,yBAAyB,CAAC;QAChC,KAAK,MAAM,CAAC,MAAM,iBAAiB,KAAK,8BAA8B,CACvE,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,SAAS;IACtB,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAClC,MAAM,OAAO,GAAG,YAAY,CAAC,WAAW,CAAC,CAAC;IAE1C,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,6BAA6B,CAAC,CAAC,CAAC;QACnD,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,OAAO,OAAO,CAAC,MAAM,uBAAuB,CAAC,CAAC;IAE1D,oBAAoB;IACpB,MAAM,MAAM,GAAwC,EAAE,CAAC;IACvD,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,MAAM,GAAG,GAAG,CAAC,CAAC,QAAQ,IAAI,SAAS,CAAC;QACpC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;YAAE,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;QACnC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACtB,CAAC;IAED,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAClD,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;QAChD,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;YACtB,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7D,OAAO,CAAC,GAAG,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,MAAM,IAAI,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;QACzE,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,KAAK;IACzB,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAElC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC;QACzC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,6DAA6D,CAAC,CAAC,CAAC;QAChF,OAAO;IACT,CAAC;IAED,MAAM,GAAG,GAAG,UAAU,EAAE,CAAC;IAEzB,QAAQ,GAAG,EAAE,CAAC;QACZ,KAAK,OAAO;YACV,OAAO,UAAU,EAAE,CAAC;QACtB,KAAK,QAAQ;YACX,OAAO,WAAW,EAAE,CAAC;QACvB,KAAK,OAAO;YACV,OAAO,UAAU,EAAE,CAAC;QACtB,KAAK,MAAM,CAAC;QACZ,KAAK,IAAI;YACP,OAAO,SAAS,EAAE,CAAC;QACrB;YACE,OAAO,CAAC,GAAG,CAAC;IACd,IAAI,CAAC,cAAc,CAAC;;;;;;;;;;CAUvB,CAAC,CAAC;IACD,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function start(): Promise<void>;
2
+ //# sourceMappingURL=start.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/start.ts"],"names":[],"mappings":"AAcA,wBAAsB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CA4K3C"}