ai-dev-analytics 1.0.0-beta.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +422 -0
- package/README.zh-CN.md +422 -0
- package/dist/cli/commands/dashboard.d.ts +2 -0
- package/dist/cli/commands/dashboard.d.ts.map +1 -0
- package/dist/cli/commands/dashboard.js +70 -0
- package/dist/cli/commands/dashboard.js.map +1 -0
- package/dist/cli/commands/init.d.ts +2 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +367 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/log.d.ts +2 -0
- package/dist/cli/commands/log.d.ts.map +1 -0
- package/dist/cli/commands/log.js +438 -0
- package/dist/cli/commands/log.js.map +1 -0
- package/dist/cli/commands/migrate.d.ts +2 -0
- package/dist/cli/commands/migrate.d.ts.map +1 -0
- package/dist/cli/commands/migrate.js +300 -0
- package/dist/cli/commands/migrate.js.map +1 -0
- package/dist/cli/commands/reindex.d.ts +10 -0
- package/dist/cli/commands/reindex.d.ts.map +1 -0
- package/dist/cli/commands/reindex.js +94 -0
- package/dist/cli/commands/reindex.js.map +1 -0
- package/dist/cli/commands/report.d.ts +2 -0
- package/dist/cli/commands/report.d.ts.map +1 -0
- package/dist/cli/commands/report.js +219 -0
- package/dist/cli/commands/report.js.map +1 -0
- package/dist/cli/commands/rules.d.ts +2 -0
- package/dist/cli/commands/rules.d.ts.map +1 -0
- package/dist/cli/commands/rules.js +143 -0
- package/dist/cli/commands/rules.js.map +1 -0
- package/dist/cli/commands/start.d.ts +2 -0
- package/dist/cli/commands/start.d.ts.map +1 -0
- package/dist/cli/commands/start.js +173 -0
- package/dist/cli/commands/start.js.map +1 -0
- package/dist/cli/commands/status.d.ts +2 -0
- package/dist/cli/commands/status.d.ts.map +1 -0
- package/dist/cli/commands/status.js +74 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/commands/update.d.ts +2 -0
- package/dist/cli/commands/update.d.ts.map +1 -0
- package/dist/cli/commands/update.js +146 -0
- package/dist/cli/commands/update.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +85 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/mcp/server.d.ts +10 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +704 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/schemas/run-json.d.ts +258 -0
- package/dist/schemas/run-json.d.ts.map +1 -0
- package/dist/schemas/run-json.js +22 -0
- package/dist/schemas/run-json.js.map +1 -0
- package/dist/server/api.d.ts +30 -0
- package/dist/server/api.d.ts.map +1 -0
- package/dist/server/api.js +239 -0
- package/dist/server/api.js.map +1 -0
- package/dist/server/index.d.ts +2 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +228 -0
- package/dist/server/index.js.map +1 -0
- package/dist/utils/display.d.ts +12 -0
- package/dist/utils/display.d.ts.map +1 -0
- package/dist/utils/display.js +52 -0
- package/dist/utils/display.js.map +1 -0
- package/dist/utils/fs.d.ts +9 -0
- package/dist/utils/fs.d.ts.map +1 -0
- package/dist/utils/fs.js +43 -0
- package/dist/utils/fs.js.map +1 -0
- package/dist/utils/git.d.ts +4 -0
- package/dist/utils/git.d.ts.map +1 -0
- package/dist/utils/git.js +18 -0
- package/dist/utils/git.js.map +1 -0
- package/dist/utils/guide.d.ts +18 -0
- package/dist/utils/guide.d.ts.map +1 -0
- package/dist/utils/guide.js +172 -0
- package/dist/utils/guide.js.map +1 -0
- package/dist/utils/paths.d.ts +25 -0
- package/dist/utils/paths.d.ts.map +1 -0
- package/dist/utils/paths.js +45 -0
- package/dist/utils/paths.js.map +1 -0
- package/dist/utils/rules.d.ts +44 -0
- package/dist/utils/rules.d.ts.map +1 -0
- package/dist/utils/rules.js +208 -0
- package/dist/utils/rules.js.map +1 -0
- package/dist/utils/run-data.d.ts +37 -0
- package/dist/utils/run-data.d.ts.map +1 -0
- package/dist/utils/run-data.js +389 -0
- package/dist/utils/run-data.js.map +1 -0
- package/dist/utils/tokens.d.ts +26 -0
- package/dist/utils/tokens.d.ts.map +1 -0
- package/dist/utils/tokens.js +173 -0
- package/dist/utils/tokens.js.map +1 -0
- package/package.json +49 -0
- package/src/assets/skills/audit.md +98 -0
- package/src/assets/skills/bug-fixer.md +48 -0
- package/src/assets/skills/code-generator.md +82 -0
- package/src/assets/skills/commit-code.md +67 -0
- package/src/assets/skills/dashboard-generator.md +65 -0
- package/src/assets/skills/dev-flower.md +85 -0
- package/src/assets/skills/deviation-recorder.md +82 -0
- package/src/assets/skills/docx-to-markdown.md +69 -0
- package/src/assets/skills/mcp-reviewer.md +43 -0
- package/src/assets/skills/requirement-analyzer.md +103 -0
- package/src/assets/skills/rules-evolver.md +47 -0
- package/src/assets/skills/self-reviewer.md +53 -0
- package/src/assets/skills/task-splitter.md +58 -0
- package/src/assets/skills/workflow-orchestrator.md +209 -0
- package/src/assets/templates/demo-run.json +910 -0
- package/src/assets/templates/run.json +63 -0
- package/src/dashboard/assets/index-C-E7m3g4.css +1 -0
- package/src/dashboard/assets/index-CsU3dyCj.js +111 -0
- package/src/dashboard/demo/overview.json +71 -0
- package/src/dashboard/demo/run.json +2667 -0
- package/src/dashboard/demo/runs.json +19 -0
- package/src/dashboard/index.html +13 -0
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
import { createServer } from 'node:http';
|
|
2
|
+
import { readFileSync, watch, existsSync } from 'node:fs';
|
|
3
|
+
import { resolve, extname } from 'node:path';
|
|
4
|
+
import { PACKAGE_ROOT } from '../utils/paths.js';
|
|
5
|
+
import { getAllRuns, getRunData, getAggregatedData, getRequirementData, getIndexData, updateRunCost, updateProjectConfig } from './api.js';
|
|
6
|
+
import { buildIndex } from '../cli/commands/reindex.js';
|
|
7
|
+
const DASHBOARD_DIR = resolve(PACKAGE_ROOT, 'src', 'dashboard');
|
|
8
|
+
const sseClients = new Set();
|
|
9
|
+
const MIME_TYPES = {
|
|
10
|
+
'.html': 'text/html; charset=utf-8',
|
|
11
|
+
'.js': 'application/javascript',
|
|
12
|
+
'.css': 'text/css',
|
|
13
|
+
'.json': 'application/json',
|
|
14
|
+
'.svg': 'image/svg+xml',
|
|
15
|
+
'.png': 'image/png',
|
|
16
|
+
'.ico': 'image/x-icon',
|
|
17
|
+
};
|
|
18
|
+
function serveStatic(filePath, res) {
|
|
19
|
+
if (!existsSync(filePath))
|
|
20
|
+
return false;
|
|
21
|
+
try {
|
|
22
|
+
const content = readFileSync(filePath);
|
|
23
|
+
const ext = extname(filePath);
|
|
24
|
+
res.writeHead(200, { 'Content-Type': MIME_TYPES[ext] || 'application/octet-stream' });
|
|
25
|
+
res.end(content);
|
|
26
|
+
return true;
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
return false;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
export async function startServer(port, projectRoot) {
|
|
33
|
+
const theRunsDir = resolve(projectRoot, '.aidevos', 'runs');
|
|
34
|
+
const server = createServer((req, res) => {
|
|
35
|
+
const url = req.url || '/';
|
|
36
|
+
res.setHeader('Access-Control-Allow-Origin', '*');
|
|
37
|
+
res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');
|
|
38
|
+
res.setHeader('Access-Control-Allow-Headers', 'Content-Type');
|
|
39
|
+
if (req.method === 'OPTIONS') {
|
|
40
|
+
res.writeHead(204);
|
|
41
|
+
res.end();
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
// POST API routes
|
|
45
|
+
if (req.method === 'POST' && url.startsWith('/api/runs/') && url.endsWith('/cost')) {
|
|
46
|
+
const middle = decodeURIComponent(url.replace('/api/runs/', '').replace('/cost', ''));
|
|
47
|
+
const parts = middle.split('/');
|
|
48
|
+
if (parts.length >= 2) {
|
|
49
|
+
const branch = parts[0];
|
|
50
|
+
const dev = parts[1];
|
|
51
|
+
if (branch.includes('..') || dev.includes('..') || branch.includes('\0') || dev.includes('\0')) {
|
|
52
|
+
res.writeHead(403, { 'Content-Type': 'application/json' });
|
|
53
|
+
res.end(JSON.stringify({ error: 'Forbidden' }));
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
let body = '';
|
|
57
|
+
req.on('data', (chunk) => { body += chunk; });
|
|
58
|
+
req.on('end', () => {
|
|
59
|
+
try {
|
|
60
|
+
const updates = JSON.parse(body);
|
|
61
|
+
const ok = updateRunCost(theRunsDir, branch, dev, updates, projectRoot);
|
|
62
|
+
res.writeHead(ok ? 200 : 404, { 'Content-Type': 'application/json' });
|
|
63
|
+
res.end(JSON.stringify({ success: ok }));
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
res.writeHead(400, { 'Content-Type': 'application/json' });
|
|
67
|
+
res.end(JSON.stringify({ error: 'Invalid JSON' }));
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
if (req.method === 'POST' && url === '/api/config') {
|
|
74
|
+
let body = '';
|
|
75
|
+
req.on('data', (chunk) => { body += chunk; });
|
|
76
|
+
req.on('end', () => {
|
|
77
|
+
try {
|
|
78
|
+
const updates = JSON.parse(body);
|
|
79
|
+
const ok = updateProjectConfig(projectRoot, updates);
|
|
80
|
+
// After config change, recalc all runs to pick up new hourlyRate
|
|
81
|
+
if (ok && updates.hourlyRate != null) {
|
|
82
|
+
const runs = getAllRuns(theRunsDir);
|
|
83
|
+
for (const run of runs) {
|
|
84
|
+
const p = run.runId.split('/');
|
|
85
|
+
if (p.length >= 2)
|
|
86
|
+
updateRunCost(theRunsDir, p[0], p[1], {}, projectRoot);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
res.writeHead(ok ? 200 : 500, { 'Content-Type': 'application/json' });
|
|
90
|
+
res.end(JSON.stringify({ success: ok }));
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
res.writeHead(400, { 'Content-Type': 'application/json' });
|
|
94
|
+
res.end(JSON.stringify({ error: 'Invalid JSON' }));
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
// API routes
|
|
100
|
+
if (url === '/api/runs') {
|
|
101
|
+
const runs = getAllRuns(theRunsDir);
|
|
102
|
+
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
103
|
+
res.end(JSON.stringify(runs));
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
if (url === '/api/aggregate') {
|
|
107
|
+
const data = getAggregatedData(theRunsDir);
|
|
108
|
+
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
109
|
+
res.end(JSON.stringify(data));
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
if (url === '/api/overview') {
|
|
113
|
+
const data = getIndexData(projectRoot);
|
|
114
|
+
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
115
|
+
res.end(JSON.stringify(data || { project: '', updatedAt: '', runs: [] }));
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
if (url.startsWith('/api/requirement/')) {
|
|
119
|
+
const branch = decodeURIComponent(url.replace('/api/requirement/', ''));
|
|
120
|
+
if (branch.includes('..') || branch.includes('\0')) {
|
|
121
|
+
res.writeHead(403, { 'Content-Type': 'application/json' });
|
|
122
|
+
res.end(JSON.stringify({ error: 'Forbidden' }));
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
const data = getRequirementData(theRunsDir, branch);
|
|
126
|
+
if (data) {
|
|
127
|
+
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
128
|
+
res.end(JSON.stringify(data));
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
res.writeHead(404, { 'Content-Type': 'application/json' });
|
|
132
|
+
res.end(JSON.stringify({ error: 'Requirement not found' }));
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
if (url.startsWith('/api/runs/')) {
|
|
136
|
+
const parts = decodeURIComponent(url.replace('/api/runs/', '')).split('/');
|
|
137
|
+
if (parts.length >= 2) {
|
|
138
|
+
const branch = parts[0];
|
|
139
|
+
const dev = parts[1];
|
|
140
|
+
// Reject path traversal attempts
|
|
141
|
+
if (branch.includes('..') || dev.includes('..') || branch.includes('\0') || dev.includes('\0')) {
|
|
142
|
+
res.writeHead(403, { 'Content-Type': 'application/json' });
|
|
143
|
+
res.end(JSON.stringify({ error: 'Forbidden' }));
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
const data = getRunData(theRunsDir, branch, dev, projectRoot);
|
|
147
|
+
if (data) {
|
|
148
|
+
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
149
|
+
res.end(JSON.stringify(data));
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
res.writeHead(404, { 'Content-Type': 'application/json' });
|
|
154
|
+
res.end(JSON.stringify({ error: 'Run not found' }));
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
if (url === '/api/events') {
|
|
158
|
+
res.writeHead(200, {
|
|
159
|
+
'Content-Type': 'text/event-stream',
|
|
160
|
+
'Cache-Control': 'no-cache',
|
|
161
|
+
Connection: 'keep-alive',
|
|
162
|
+
});
|
|
163
|
+
res.write('data: {"type":"connected"}\n\n');
|
|
164
|
+
sseClients.add(res);
|
|
165
|
+
req.on('close', () => sseClients.delete(res));
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
// Static file serving from dashboard build output
|
|
169
|
+
const safePath = url.split('?')[0].split('#')[0];
|
|
170
|
+
if (safePath !== '/' && safePath !== '/index.html') {
|
|
171
|
+
const filePath = resolve(DASHBOARD_DIR, safePath.replace(/^\//, ''));
|
|
172
|
+
if (!filePath.startsWith(DASHBOARD_DIR)) {
|
|
173
|
+
res.writeHead(403);
|
|
174
|
+
res.end('Forbidden');
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
if (serveStatic(filePath, res))
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
// SPA fallback: serve index.html
|
|
181
|
+
const indexPath = resolve(DASHBOARD_DIR, 'index.html');
|
|
182
|
+
if (serveStatic(indexPath, res))
|
|
183
|
+
return;
|
|
184
|
+
res.writeHead(404);
|
|
185
|
+
res.end('Dashboard not found. Run `pnpm build` in the dashboard/ directory.');
|
|
186
|
+
});
|
|
187
|
+
// Watch for run.json changes with debounce
|
|
188
|
+
if (existsSync(theRunsDir)) {
|
|
189
|
+
let debounceTimer = null;
|
|
190
|
+
watch(theRunsDir, { recursive: true }, (_eventType, filename) => {
|
|
191
|
+
if (!filename?.endsWith('run.json') && !filename?.endsWith('requirement.json'))
|
|
192
|
+
return;
|
|
193
|
+
if (debounceTimer)
|
|
194
|
+
clearTimeout(debounceTimer);
|
|
195
|
+
debounceTimer = setTimeout(() => {
|
|
196
|
+
// Rebuild index so overview stays fresh
|
|
197
|
+
try {
|
|
198
|
+
buildIndex(projectRoot);
|
|
199
|
+
}
|
|
200
|
+
catch { /* best-effort */ }
|
|
201
|
+
const event = JSON.stringify({
|
|
202
|
+
type: 'run_updated',
|
|
203
|
+
file: filename,
|
|
204
|
+
time: new Date().toISOString(),
|
|
205
|
+
});
|
|
206
|
+
for (const client of sseClients) {
|
|
207
|
+
try {
|
|
208
|
+
client.write(`data: ${event}\n\n`);
|
|
209
|
+
}
|
|
210
|
+
catch {
|
|
211
|
+
sseClients.delete(client);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
}, 300);
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
return new Promise((resolvePromise, reject) => {
|
|
218
|
+
server.on('error', (err) => {
|
|
219
|
+
if (err.code === 'EADDRINUSE') {
|
|
220
|
+
console.error(`\n Port ${port} is already in use. Use --port to specify another port.\n`);
|
|
221
|
+
process.exit(1);
|
|
222
|
+
}
|
|
223
|
+
reject(err);
|
|
224
|
+
});
|
|
225
|
+
server.listen(port, () => resolvePromise());
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export declare function bold(text: string): string;
|
|
2
|
+
export declare function green(text: string): string;
|
|
3
|
+
export declare function red(text: string): string;
|
|
4
|
+
export declare function yellow(text: string): string;
|
|
5
|
+
export declare function cyan(text: string): string;
|
|
6
|
+
export declare function blue(text: string): string;
|
|
7
|
+
export declare function dim(text: string): string;
|
|
8
|
+
export declare function purple(text: string): string;
|
|
9
|
+
export declare function section(title: string): string;
|
|
10
|
+
export declare function formatDuration(ms: number): string;
|
|
11
|
+
export declare function formatDate(iso: string): string;
|
|
12
|
+
//# sourceMappingURL=display.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"display.d.ts","sourceRoot":"","sources":["../../src/utils/display.ts"],"names":[],"mappings":"AAAA,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEzC;AAED,wBAAgB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE1C;AAED,wBAAgB,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAExC;AAED,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE3C;AAED,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEzC;AAED,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEzC;AAED,wBAAgB,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAExC;AAED,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE3C;AAED,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAG7C;AAED,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAUjD;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAS9C"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
export function bold(text) {
|
|
2
|
+
return `\x1b[1m${text}\x1b[0m`;
|
|
3
|
+
}
|
|
4
|
+
export function green(text) {
|
|
5
|
+
return `\x1b[32m${text}\x1b[0m`;
|
|
6
|
+
}
|
|
7
|
+
export function red(text) {
|
|
8
|
+
return `\x1b[31m${text}\x1b[0m`;
|
|
9
|
+
}
|
|
10
|
+
export function yellow(text) {
|
|
11
|
+
return `\x1b[33m${text}\x1b[0m`;
|
|
12
|
+
}
|
|
13
|
+
export function cyan(text) {
|
|
14
|
+
return `\x1b[36m${text}\x1b[0m`;
|
|
15
|
+
}
|
|
16
|
+
export function blue(text) {
|
|
17
|
+
return `\x1b[34m${text}\x1b[0m`;
|
|
18
|
+
}
|
|
19
|
+
export function dim(text) {
|
|
20
|
+
return `\x1b[2m${text}\x1b[0m`;
|
|
21
|
+
}
|
|
22
|
+
export function purple(text) {
|
|
23
|
+
return `\x1b[35m${text}\x1b[0m`;
|
|
24
|
+
}
|
|
25
|
+
export function section(title) {
|
|
26
|
+
const line = '─'.repeat(42 - title.length);
|
|
27
|
+
return dim(`── ${title} ${line}`);
|
|
28
|
+
}
|
|
29
|
+
export function formatDuration(ms) {
|
|
30
|
+
const seconds = Math.floor(ms / 1000);
|
|
31
|
+
const minutes = Math.floor(seconds / 60);
|
|
32
|
+
const hours = Math.floor(minutes / 60);
|
|
33
|
+
const days = Math.floor(hours / 24);
|
|
34
|
+
if (days > 0)
|
|
35
|
+
return `${days}d ${hours % 24}h`;
|
|
36
|
+
if (hours > 0)
|
|
37
|
+
return `${hours}h ${minutes % 60}m`;
|
|
38
|
+
if (minutes > 0)
|
|
39
|
+
return `${minutes}m`;
|
|
40
|
+
return `${seconds}s`;
|
|
41
|
+
}
|
|
42
|
+
export function formatDate(iso) {
|
|
43
|
+
const d = new Date(iso);
|
|
44
|
+
return d.toLocaleString('en-US', {
|
|
45
|
+
year: 'numeric',
|
|
46
|
+
month: 'short',
|
|
47
|
+
day: 'numeric',
|
|
48
|
+
hour: '2-digit',
|
|
49
|
+
minute: '2-digit',
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=display.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"display.js","sourceRoot":"","sources":["../../src/utils/display.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,IAAI,CAAC,IAAY;IAC/B,OAAO,UAAU,IAAI,SAAS,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,IAAY;IAChC,OAAO,WAAW,IAAI,SAAS,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,GAAG,CAAC,IAAY;IAC9B,OAAO,WAAW,IAAI,SAAS,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,IAAY;IACjC,OAAO,WAAW,IAAI,SAAS,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,IAAY;IAC/B,OAAO,WAAW,IAAI,SAAS,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,IAAY;IAC/B,OAAO,WAAW,IAAI,SAAS,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,GAAG,CAAC,IAAY;IAC9B,OAAO,UAAU,IAAI,SAAS,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,IAAY;IACjC,OAAO,WAAW,IAAI,SAAS,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,KAAa;IACnC,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;IAC3C,OAAO,GAAG,CAAC,MAAM,KAAK,IAAI,IAAI,EAAE,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,EAAU;IACvC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;IACtC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;IACzC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;IACvC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC;IAEpC,IAAI,IAAI,GAAG,CAAC;QAAE,OAAO,GAAG,IAAI,KAAK,KAAK,GAAG,EAAE,GAAG,CAAC;IAC/C,IAAI,KAAK,GAAG,CAAC;QAAE,OAAO,GAAG,KAAK,KAAK,OAAO,GAAG,EAAE,GAAG,CAAC;IACnD,IAAI,OAAO,GAAG,CAAC;QAAE,OAAO,GAAG,OAAO,GAAG,CAAC;IACtC,OAAO,GAAG,OAAO,GAAG,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,GAAW;IACpC,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC;IACxB,OAAO,CAAC,CAAC,cAAc,CAAC,OAAO,EAAE;QAC/B,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,OAAO;QACd,GAAG,EAAE,SAAS;QACd,IAAI,EAAE,SAAS;QACf,MAAM,EAAE,SAAS;KAClB,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare function ensureDir(dir: string): void;
|
|
2
|
+
export declare function readJson<T = unknown>(filePath: string): T;
|
|
3
|
+
export declare function writeJson(filePath: string, data: unknown): void;
|
|
4
|
+
export declare function fileExists(filePath: string): boolean;
|
|
5
|
+
export declare function readText(filePath: string): string;
|
|
6
|
+
export declare function writeText(filePath: string, content: string): void;
|
|
7
|
+
export declare function getProjectName(): string;
|
|
8
|
+
export declare function listDirs(dir: string): string[];
|
|
9
|
+
//# sourceMappingURL=fs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fs.d.ts","sourceRoot":"","sources":["../../src/utils/fs.ts"],"names":[],"mappings":"AAUA,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAI3C;AAED,wBAAgB,QAAQ,CAAC,CAAC,GAAG,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,CAAC,CAGzD;AAED,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI,CAE/D;AAED,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAEpD;AAED,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAEjE;AAED,wBAAgB,cAAc,IAAI,MAAM,CAUvC;AAED,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAM9C"}
|
package/dist/utils/fs.js
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync, readdirSync, statSync, } from 'node:fs';
|
|
2
|
+
import { resolve, basename } from 'node:path';
|
|
3
|
+
export function ensureDir(dir) {
|
|
4
|
+
if (!existsSync(dir)) {
|
|
5
|
+
mkdirSync(dir, { recursive: true });
|
|
6
|
+
}
|
|
7
|
+
}
|
|
8
|
+
export function readJson(filePath) {
|
|
9
|
+
const content = readFileSync(filePath, 'utf-8');
|
|
10
|
+
return JSON.parse(content);
|
|
11
|
+
}
|
|
12
|
+
export function writeJson(filePath, data) {
|
|
13
|
+
writeFileSync(filePath, JSON.stringify(data, null, 2) + '\n', 'utf-8');
|
|
14
|
+
}
|
|
15
|
+
export function fileExists(filePath) {
|
|
16
|
+
return existsSync(filePath);
|
|
17
|
+
}
|
|
18
|
+
export function readText(filePath) {
|
|
19
|
+
return readFileSync(filePath, 'utf-8');
|
|
20
|
+
}
|
|
21
|
+
export function writeText(filePath, content) {
|
|
22
|
+
writeFileSync(filePath, content, 'utf-8');
|
|
23
|
+
}
|
|
24
|
+
export function getProjectName() {
|
|
25
|
+
try {
|
|
26
|
+
const pkg = readJson(resolve(process.cwd(), 'package.json'));
|
|
27
|
+
if (pkg.name)
|
|
28
|
+
return pkg.name;
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
/* no package.json */
|
|
32
|
+
}
|
|
33
|
+
return basename(process.cwd());
|
|
34
|
+
}
|
|
35
|
+
export function listDirs(dir) {
|
|
36
|
+
if (!existsSync(dir))
|
|
37
|
+
return [];
|
|
38
|
+
return readdirSync(dir).filter((name) => {
|
|
39
|
+
const full = resolve(dir, name);
|
|
40
|
+
return statSync(full).isDirectory();
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=fs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fs.js","sourceRoot":"","sources":["../../src/utils/fs.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,SAAS,EACT,YAAY,EACZ,aAAa,EACb,WAAW,EACX,QAAQ,GACT,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAE9C,MAAM,UAAU,SAAS,CAAC,GAAW;IACnC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACrB,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,QAAQ,CAAc,QAAgB;IACpD,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAChD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAM,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,QAAgB,EAAE,IAAa;IACvD,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;AACzE,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,QAAgB;IACzC,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,QAAgB;IACvC,OAAO,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,QAAgB,EAAE,OAAe;IACzD,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,QAAQ,CAClB,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,cAAc,CAAC,CACvC,CAAC;QACF,IAAI,GAAG,CAAC,IAAI;YAAE,OAAO,GAAG,CAAC,IAAI,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,qBAAqB;IACvB,CAAC;IACD,OAAO,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,GAAW;IAClC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,EAAE,CAAC;IAChC,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;QACtC,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAChC,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;IACtC,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../../src/utils/git.ts"],"names":[],"mappings":"AAEA,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED,wBAAgB,UAAU,IAAI,MAAM,CAGnC;AAED,wBAAgB,SAAS,IAAI,OAAO,CAOnC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { execSync } from 'node:child_process';
|
|
2
|
+
export function getBranchName() {
|
|
3
|
+
return execSync('git branch --show-current', { encoding: 'utf-8' }).trim();
|
|
4
|
+
}
|
|
5
|
+
export function getDevName() {
|
|
6
|
+
const name = execSync('git config user.name', { encoding: 'utf-8' }).trim();
|
|
7
|
+
return name.toLowerCase().replace(/\s+/g, '-');
|
|
8
|
+
}
|
|
9
|
+
export function isGitRepo() {
|
|
10
|
+
try {
|
|
11
|
+
execSync('git rev-parse --is-inside-work-tree', { encoding: 'utf-8' });
|
|
12
|
+
return true;
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
return false;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=git.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/utils/git.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAE9C,MAAM,UAAU,aAAa;IAC3B,OAAO,QAAQ,CAAC,2BAA2B,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;AAC7E,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,MAAM,IAAI,GAAG,QAAQ,CAAC,sBAAsB,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC5E,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,SAAS;IACvB,IAAI,CAAC;QACH,QAAQ,CAAC,qCAAqC,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;QACvE,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AIDA Guide — ensures data collection and rule sedimentation guidance
|
|
3
|
+
* is written to AI tool instruction files.
|
|
4
|
+
*
|
|
5
|
+
* Single source of truth: .aidevos/aida-guide.md
|
|
6
|
+
* References: CLAUDE.md (Claude Code) / .cursor/rules/ (Cursor)
|
|
7
|
+
*/
|
|
8
|
+
export declare function guidePath(projectRoot: string): string;
|
|
9
|
+
/**
|
|
10
|
+
* Write .aidevos/aida-guide.md if it doesn't exist.
|
|
11
|
+
*/
|
|
12
|
+
export declare function ensureGuide(projectRoot: string): void;
|
|
13
|
+
/**
|
|
14
|
+
* Add guide reference to AI tool instruction files.
|
|
15
|
+
* Called by init (with explicit tool list) or ensureRunJson (auto-detect).
|
|
16
|
+
*/
|
|
17
|
+
export declare function syncGuideReference(projectRoot: string, tools?: string[]): void;
|
|
18
|
+
//# sourceMappingURL=guide.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guide.d.ts","sourceRoot":"","sources":["../../src/utils/guide.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAqHH,wBAAgB,SAAS,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAErD;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAKrD;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAY9E"}
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AIDA Guide — ensures data collection and rule sedimentation guidance
|
|
3
|
+
* is written to AI tool instruction files.
|
|
4
|
+
*
|
|
5
|
+
* Single source of truth: .aidevos/aida-guide.md
|
|
6
|
+
* References: CLAUDE.md (Claude Code) / .cursor/rules/ (Cursor)
|
|
7
|
+
*/
|
|
8
|
+
import { resolve } from 'node:path';
|
|
9
|
+
import { fileExists, readText, writeText, ensureDir } from './fs.js';
|
|
10
|
+
import { aidevosDir } from './paths.js';
|
|
11
|
+
// ─── Guide Content ──────────────────────────────────────
|
|
12
|
+
const GUIDE_FILENAME = 'aida-guide.md';
|
|
13
|
+
const GUIDE_CONTENT = `# AIDA 数据采集与规则沉淀指南
|
|
14
|
+
|
|
15
|
+
> 此文件引导 AI 在开发过程中采集结构化数据并沉淀项目规则。由 AIDA 自动生成,请勿删除。
|
|
16
|
+
> **这是强制规范,不是可选建议。**
|
|
17
|
+
|
|
18
|
+
## 一、数据采集
|
|
19
|
+
|
|
20
|
+
### 核心原则
|
|
21
|
+
|
|
22
|
+
每个任务的完整生命周期必须被记录。遗漏数据采集节点等于数据缺失,会导致看板和分析不准确。
|
|
23
|
+
|
|
24
|
+
### 单个任务的数据采集流程
|
|
25
|
+
|
|
26
|
+
每接到一个任务/功能/修改,必须按以下顺序调用:
|
|
27
|
+
|
|
28
|
+
1. **开始前** → 调用 \`aida_task_start\`,传入任务标题和所属模块
|
|
29
|
+
2. **编码完成后** → 调用 \`aida_log_files\`,自动扫描 git diff 记录文件变更(无需传参)
|
|
30
|
+
3. **自检代码** → 对照项目规范审查自己的产出,调用 \`aida_log_review\` 记录审查结果(pass/fail + 问题列表)
|
|
31
|
+
4. **任务完成** → 调用 \`aida_task_done\`,传入任务 ID
|
|
32
|
+
|
|
33
|
+
### 过程中的事件记录
|
|
34
|
+
|
|
35
|
+
在开发过程中遇到以下情况时,必须立即记录:
|
|
36
|
+
|
|
37
|
+
- **发现 Bug** → 调用 \`aida_log_bug\`,传入描述和严重程度(critical/high/medium/low)
|
|
38
|
+
- **修复 Bug** → 调用 \`aida_bug_fix\`,传入 Bug ID 和修复方案
|
|
39
|
+
- **用户指出偏差**(AI 产出与用户预期不符) → 调用 \`aida_log_deviation\`,传入偏差描述、根因分类(rootCause)和偏差类别(category)
|
|
40
|
+
- **值得记录的亮点**(如性能优化、架构改进) → 调用 \`aida_highlight\`
|
|
41
|
+
|
|
42
|
+
### rootCause 和 category 参数说明
|
|
43
|
+
|
|
44
|
+
\`aida_log_deviation\` 的 rootCause 可选值:
|
|
45
|
+
- \`rule-missing\`:项目规范中缺少对应规则
|
|
46
|
+
- \`hallucination\`:AI 臆想了不存在的 API/组件/用法
|
|
47
|
+
- \`context-insufficient\`:上下文信息不足导致产出偏差
|
|
48
|
+
- \`misunderstanding\`:AI 理解错了用户意图
|
|
49
|
+
- \`reference-copy\`:AI 照搬了参考代码但不适用
|
|
50
|
+
- \`process-omission\`:AI 跳过了必要的步骤
|
|
51
|
+
- \`other\`:其他原因
|
|
52
|
+
|
|
53
|
+
category 可选值:
|
|
54
|
+
- \`ui-spacing\`, \`layout\`, \`component-usage\`, \`i18n\`, \`api\`, \`logic\`, \`architecture\`, \`style\`, \`other\`
|
|
55
|
+
|
|
56
|
+
### 多任务场景
|
|
57
|
+
|
|
58
|
+
如果一次需求包含多个子任务,每个子任务都必须单独调用 \`aida_task_start\` 和 \`aida_task_done\`。\`aida_log_files\` 可以在每个任务完成后调用,也可以在一批任务完成后统一调用一次。
|
|
59
|
+
|
|
60
|
+
### 查看当前状态
|
|
61
|
+
|
|
62
|
+
随时可以调用 \`aida_status\` 查看当前的任务列表、Bug 数量、进度等信息。
|
|
63
|
+
|
|
64
|
+
## 二、规则沉淀
|
|
65
|
+
|
|
66
|
+
当通过 \`aida_log_deviation\` 记录偏差,且 rootCause 为 \`rule-missing\` 时,必须评估是否需要沉淀规则。
|
|
67
|
+
|
|
68
|
+
### 判断标准(严格执行)
|
|
69
|
+
|
|
70
|
+
**需要沉淀 — 仅限项目级技术规范:**
|
|
71
|
+
- 公共组件的使用方式错误(如:el-dialog 内 Table 必须有 min-height 容器)
|
|
72
|
+
- 公共模块/能力的调用方式错误(如:API 请求必须走统一封装层)
|
|
73
|
+
- 参数传递错误(如:日期组件必须传 format="YYYY-MM-DD")
|
|
74
|
+
- 代码风格/架构规范(如:状态管理必须使用 Pinia,禁止直接操作 localStorage)
|
|
75
|
+
|
|
76
|
+
**绝对不沉淀 — 业务逻辑:**
|
|
77
|
+
- 特定页面的功能需求(如:用户列表需要显示注册时间)
|
|
78
|
+
- 特定业务流程的实现(如:订单状态流转需要通知仓库)
|
|
79
|
+
- 一次性的数据处理逻辑
|
|
80
|
+
|
|
81
|
+
### 执行流程
|
|
82
|
+
|
|
83
|
+
1. 修复偏差代码后,判断修复方案是否属于上述"需要沉淀"的范围
|
|
84
|
+
2. 如果是,**必须询问用户**:"这个偏差的修复方案属于项目级规范,沉淀为规则后可以防止同类问题复现。是否沉淀为项目规则?"
|
|
85
|
+
3. 用户同意后,调用 \`aida_log_rule\` 工具,传入参数:
|
|
86
|
+
- content: 规则描述
|
|
87
|
+
- category: 分类(可选值:component, api, style, i18n, architecture, state-management, routing, testing, process, general)
|
|
88
|
+
- sourceDeviation: 关联的偏差 ID(如 DEV-01)
|
|
89
|
+
|
|
90
|
+
### 阶段性回顾
|
|
91
|
+
|
|
92
|
+
完成一轮开发(多个任务完成)后:
|
|
93
|
+
1. 调用 \`aida_status\` 查看当前偏差情况
|
|
94
|
+
2. 检查是否有 rootCause 为 \`rule-missing\` 的偏差尚未沉淀对应规则
|
|
95
|
+
3. 如果有,汇总这些偏差模式并询问用户是否需要批量沉淀
|
|
96
|
+
`;
|
|
97
|
+
// ─── CLAUDE.md reference ────────────────────────────────
|
|
98
|
+
const CLAUDE_MARKER = '.aidevos/aida-guide.md';
|
|
99
|
+
const CLAUDE_REFERENCE = `
|
|
100
|
+
|
|
101
|
+
## AIDA
|
|
102
|
+
|
|
103
|
+
本项目使用 AIDA 进行开发数据采集与规则沉淀,开发过程中必须遵循 \`.aidevos/aida-guide.md\` 中的数据采集和规则沉淀规范。如果存在 \`.aidevos/rules/_all.md\`,请在开始开发前读取该文件了解已沉淀的项目规则。
|
|
104
|
+
`;
|
|
105
|
+
// ─── Cursor rule frontmatter ────────────────────────────
|
|
106
|
+
const CURSOR_FRONTMATTER = `---
|
|
107
|
+
description: AIDA 数据采集与规则沉淀规范
|
|
108
|
+
globs: ['**/*']
|
|
109
|
+
---
|
|
110
|
+
|
|
111
|
+
`;
|
|
112
|
+
// ─── Public API ─────────────────────────────────────────
|
|
113
|
+
export function guidePath(projectRoot) {
|
|
114
|
+
return resolve(aidevosDir(projectRoot), GUIDE_FILENAME);
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Write .aidevos/aida-guide.md if it doesn't exist.
|
|
118
|
+
*/
|
|
119
|
+
export function ensureGuide(projectRoot) {
|
|
120
|
+
const p = guidePath(projectRoot);
|
|
121
|
+
if (fileExists(p))
|
|
122
|
+
return;
|
|
123
|
+
ensureDir(aidevosDir(projectRoot));
|
|
124
|
+
writeText(p, GUIDE_CONTENT);
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Add guide reference to AI tool instruction files.
|
|
128
|
+
* Called by init (with explicit tool list) or ensureRunJson (auto-detect).
|
|
129
|
+
*/
|
|
130
|
+
export function syncGuideReference(projectRoot, tools) {
|
|
131
|
+
const detected = tools || detectAiTools(projectRoot);
|
|
132
|
+
for (const tool of detected) {
|
|
133
|
+
switch (tool) {
|
|
134
|
+
case 'claude-code':
|
|
135
|
+
addClaudeReference(projectRoot);
|
|
136
|
+
break;
|
|
137
|
+
case 'cursor':
|
|
138
|
+
addCursorReference(projectRoot);
|
|
139
|
+
break;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
// ─── Internal ───────────────────────────────────────────
|
|
144
|
+
function detectAiTools(projectRoot) {
|
|
145
|
+
const tools = [];
|
|
146
|
+
if (fileExists(resolve(projectRoot, '.mcp.json')))
|
|
147
|
+
tools.push('claude-code');
|
|
148
|
+
if (fileExists(resolve(projectRoot, '.cursor', 'mcp.json')))
|
|
149
|
+
tools.push('cursor');
|
|
150
|
+
return tools;
|
|
151
|
+
}
|
|
152
|
+
function addClaudeReference(projectRoot) {
|
|
153
|
+
const file = resolve(projectRoot, 'CLAUDE.md');
|
|
154
|
+
if (fileExists(file)) {
|
|
155
|
+
const content = readText(file);
|
|
156
|
+
if (content.includes(CLAUDE_MARKER))
|
|
157
|
+
return;
|
|
158
|
+
writeText(file, content + CLAUDE_REFERENCE);
|
|
159
|
+
}
|
|
160
|
+
else {
|
|
161
|
+
writeText(file, CLAUDE_REFERENCE.trim() + '\n');
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
function addCursorReference(projectRoot) {
|
|
165
|
+
const rulesDir = resolve(projectRoot, '.cursor', 'rules', 'aidevos');
|
|
166
|
+
ensureDir(rulesDir);
|
|
167
|
+
const file = resolve(rulesDir, 'aida-guide.md');
|
|
168
|
+
if (fileExists(file))
|
|
169
|
+
return;
|
|
170
|
+
writeText(file, CURSOR_FRONTMATTER + GUIDE_CONTENT);
|
|
171
|
+
}
|
|
172
|
+
//# sourceMappingURL=guide.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guide.js","sourceRoot":"","sources":["../../src/utils/guide.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/** AIDevOS package root */
|
|
2
|
+
export declare const PACKAGE_ROOT: string;
|
|
3
|
+
/** Bundled assets directory */
|
|
4
|
+
export declare const ASSETS_DIR: string;
|
|
5
|
+
/** Bundled skill files */
|
|
6
|
+
export declare const SKILLS_DIR: string;
|
|
7
|
+
/** Bundled template files */
|
|
8
|
+
export declare const TEMPLATES_DIR: string;
|
|
9
|
+
/** Dashboard HTML file */
|
|
10
|
+
export declare const DASHBOARD_FILE: string;
|
|
11
|
+
/** .aidevos directory in user's project */
|
|
12
|
+
export declare function aidevosDir(projectRoot?: string): string;
|
|
13
|
+
/** Runs directory */
|
|
14
|
+
export declare function runsDir(projectRoot?: string): string;
|
|
15
|
+
/** Run data directory for a specific branch + developer */
|
|
16
|
+
export declare function runDir(projectRoot: string, branchName: string, devName: string): string;
|
|
17
|
+
/** Branch-level directory (shared PRD, analysis, requirement.json) */
|
|
18
|
+
export declare function branchDir(projectRoot: string, branchName: string): string;
|
|
19
|
+
/** Branch-level requirement.json path */
|
|
20
|
+
export declare function requirementPath(projectRoot: string, branchName: string): string;
|
|
21
|
+
/** Project-level index.json path */
|
|
22
|
+
export declare function indexPath(projectRoot?: string): string;
|
|
23
|
+
/** Config file path */
|
|
24
|
+
export declare function configPath(projectRoot?: string): string;
|
|
25
|
+
//# sourceMappingURL=paths.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/utils/paths.ts"],"names":[],"mappings":"AAMA,2BAA2B;AAC3B,eAAO,MAAM,YAAY,QAAiC,CAAC;AAE3D,+BAA+B;AAC/B,eAAO,MAAM,UAAU,QAAyC,CAAC;AAEjE,0BAA0B;AAC1B,eAAO,MAAM,UAAU,QAAgC,CAAC;AAExD,6BAA6B;AAC7B,eAAO,MAAM,aAAa,QAAmC,CAAC;AAE9D,0BAA0B;AAC1B,eAAO,MAAM,cAAc,QAA0D,CAAC;AAEtF,2CAA2C;AAC3C,wBAAgB,UAAU,CAAC,WAAW,GAAE,MAAsB,GAAG,MAAM,CAEtE;AAED,qBAAqB;AACrB,wBAAgB,OAAO,CAAC,WAAW,GAAE,MAAsB,GAAG,MAAM,CAEnE;AAED,2DAA2D;AAC3D,wBAAgB,MAAM,CACpB,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,GACd,MAAM,CAGR;AAED,sEAAsE;AACtE,wBAAgB,SAAS,CACvB,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,GACjB,MAAM,CAGR;AAED,yCAAyC;AACzC,wBAAgB,eAAe,CAC7B,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,GACjB,MAAM,CAER;AAED,oCAAoC;AACpC,wBAAgB,SAAS,CAAC,WAAW,GAAE,MAAsB,GAAG,MAAM,CAErE;AAED,uBAAuB;AACvB,wBAAgB,UAAU,CAAC,WAAW,GAAE,MAAsB,GAAG,MAAM,CAEtE"}
|