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,45 @@
|
|
|
1
|
+
import { resolve, dirname } from 'node:path';
|
|
2
|
+
import { fileURLToPath } from 'node:url';
|
|
3
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
4
|
+
const __dirname = dirname(__filename);
|
|
5
|
+
/** AIDevOS package root */
|
|
6
|
+
export const PACKAGE_ROOT = resolve(__dirname, '..', '..');
|
|
7
|
+
/** Bundled assets directory */
|
|
8
|
+
export const ASSETS_DIR = resolve(PACKAGE_ROOT, 'src', 'assets');
|
|
9
|
+
/** Bundled skill files */
|
|
10
|
+
export const SKILLS_DIR = resolve(ASSETS_DIR, 'skills');
|
|
11
|
+
/** Bundled template files */
|
|
12
|
+
export const TEMPLATES_DIR = resolve(ASSETS_DIR, 'templates');
|
|
13
|
+
/** Dashboard HTML file */
|
|
14
|
+
export const DASHBOARD_FILE = resolve(PACKAGE_ROOT, 'src', 'dashboard', 'index.html');
|
|
15
|
+
/** .aidevos directory in user's project */
|
|
16
|
+
export function aidevosDir(projectRoot = process.cwd()) {
|
|
17
|
+
return resolve(projectRoot, '.aidevos');
|
|
18
|
+
}
|
|
19
|
+
/** Runs directory */
|
|
20
|
+
export function runsDir(projectRoot = process.cwd()) {
|
|
21
|
+
return resolve(projectRoot, '.aidevos', 'runs');
|
|
22
|
+
}
|
|
23
|
+
/** Run data directory for a specific branch + developer */
|
|
24
|
+
export function runDir(projectRoot, branchName, devName) {
|
|
25
|
+
const safeBranch = branchName.replace(/\//g, '-');
|
|
26
|
+
return resolve(projectRoot, '.aidevos', 'runs', safeBranch, devName);
|
|
27
|
+
}
|
|
28
|
+
/** Branch-level directory (shared PRD, analysis, requirement.json) */
|
|
29
|
+
export function branchDir(projectRoot, branchName) {
|
|
30
|
+
const safeBranch = branchName.replace(/\//g, '-');
|
|
31
|
+
return resolve(projectRoot, '.aidevos', 'runs', safeBranch);
|
|
32
|
+
}
|
|
33
|
+
/** Branch-level requirement.json path */
|
|
34
|
+
export function requirementPath(projectRoot, branchName) {
|
|
35
|
+
return resolve(branchDir(projectRoot, branchName), 'requirement.json');
|
|
36
|
+
}
|
|
37
|
+
/** Project-level index.json path */
|
|
38
|
+
export function indexPath(projectRoot = process.cwd()) {
|
|
39
|
+
return resolve(projectRoot, '.aidevos', 'index.json');
|
|
40
|
+
}
|
|
41
|
+
/** Config file path */
|
|
42
|
+
export function configPath(projectRoot = process.cwd()) {
|
|
43
|
+
return resolve(projectRoot, '.aidevos', 'config.json');
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/utils/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAEtC,2BAA2B;AAC3B,MAAM,CAAC,MAAM,YAAY,GAAG,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AAE3D,+BAA+B;AAC/B,MAAM,CAAC,MAAM,UAAU,GAAG,OAAO,CAAC,YAAY,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;AAEjE,0BAA0B;AAC1B,MAAM,CAAC,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;AAExD,6BAA6B;AAC7B,MAAM,CAAC,MAAM,aAAa,GAAG,OAAO,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;AAE9D,0BAA0B;AAC1B,MAAM,CAAC,MAAM,cAAc,GAAG,OAAO,CAAC,YAAY,EAAE,KAAK,EAAE,WAAW,EAAE,YAAY,CAAC,CAAC;AAEtF,2CAA2C;AAC3C,MAAM,UAAU,UAAU,CAAC,cAAsB,OAAO,CAAC,GAAG,EAAE;IAC5D,OAAO,OAAO,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;AAC1C,CAAC;AAED,qBAAqB;AACrB,MAAM,UAAU,OAAO,CAAC,cAAsB,OAAO,CAAC,GAAG,EAAE;IACzD,OAAO,OAAO,CAAC,WAAW,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;AAClD,CAAC;AAED,2DAA2D;AAC3D,MAAM,UAAU,MAAM,CACpB,WAAmB,EACnB,UAAkB,EAClB,OAAe;IAEf,MAAM,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAClD,OAAO,OAAO,CAAC,WAAW,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;AACvE,CAAC;AAED,sEAAsE;AACtE,MAAM,UAAU,SAAS,CACvB,WAAmB,EACnB,UAAkB;IAElB,MAAM,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAClD,OAAO,OAAO,CAAC,WAAW,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;AAC9D,CAAC;AAED,yCAAyC;AACzC,MAAM,UAAU,eAAe,CAC7B,WAAmB,EACnB,UAAkB;IAElB,OAAO,OAAO,CAAC,SAAS,CAAC,WAAW,EAAE,UAAU,CAAC,EAAE,kBAAkB,CAAC,CAAC;AACzE,CAAC;AAED,oCAAoC;AACpC,MAAM,UAAU,SAAS,CAAC,cAAsB,OAAO,CAAC,GAAG,EAAE;IAC3D,OAAO,OAAO,CAAC,WAAW,EAAE,UAAU,EAAE,YAAY,CAAC,CAAC;AACxD,CAAC;AAED,uBAAuB;AACvB,MAAM,UAAU,UAAU,CAAC,cAAsB,OAAO,CAAC,GAAG,EAAE;IAC5D,OAAO,OAAO,CAAC,WAAW,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC;AACzD,CAAC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type { RuleRegistryEntry } from '../schemas/run-json.js';
|
|
2
|
+
export declare function registryPath(projectRoot: string): string;
|
|
3
|
+
export declare function rulesViewDir(projectRoot: string): string;
|
|
4
|
+
export declare function fingerprint(content: string): string;
|
|
5
|
+
export declare function loadRegistry(projectRoot: string): RuleRegistryEntry[];
|
|
6
|
+
export declare function saveRegistry(projectRoot: string, entries: RuleRegistryEntry[]): void;
|
|
7
|
+
export declare function nextRuleId(entries: RuleRegistryEntry[]): string;
|
|
8
|
+
/**
|
|
9
|
+
* Add a rule to the registry. Returns the entry if added, or the existing entry if duplicate.
|
|
10
|
+
*/
|
|
11
|
+
export declare function addRule(projectRoot: string, opts: {
|
|
12
|
+
content: string;
|
|
13
|
+
category: string;
|
|
14
|
+
branch: string;
|
|
15
|
+
deviation: string | null;
|
|
16
|
+
author: string;
|
|
17
|
+
status?: RuleRegistryEntry['status'];
|
|
18
|
+
}): {
|
|
19
|
+
entry: RuleRegistryEntry;
|
|
20
|
+
isDuplicate: boolean;
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* Rebuild all .aidevos/rules/*.md from rules.json.
|
|
24
|
+
* Returns the number of categories written.
|
|
25
|
+
*/
|
|
26
|
+
export declare function buildRuleViews(projectRoot: string): number;
|
|
27
|
+
/**
|
|
28
|
+
* Merge two registries (union by fingerprint). Used after git merge conflicts.
|
|
29
|
+
* Returns merged entries and count of new entries added.
|
|
30
|
+
*/
|
|
31
|
+
export declare function mergeRegistries(base: RuleRegistryEntry[], incoming: RuleRegistryEntry[]): {
|
|
32
|
+
merged: RuleRegistryEntry[];
|
|
33
|
+
added: number;
|
|
34
|
+
};
|
|
35
|
+
/**
|
|
36
|
+
* Find potential duplicates by checking keyword overlap.
|
|
37
|
+
* Returns pairs of entries that might be duplicates or conflicts.
|
|
38
|
+
*/
|
|
39
|
+
export declare function findSimilarRules(entries: RuleRegistryEntry[]): {
|
|
40
|
+
a: RuleRegistryEntry;
|
|
41
|
+
b: RuleRegistryEntry;
|
|
42
|
+
similarity: number;
|
|
43
|
+
}[];
|
|
44
|
+
//# sourceMappingURL=rules.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rules.d.ts","sourceRoot":"","sources":["../../src/utils/rules.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAKhE,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAExD;AAED,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAExD;AAYD,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEnD;AAID,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,iBAAiB,EAAE,CASrE;AAED,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,EAAE,GAAG,IAAI,CAEpF;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,iBAAiB,EAAE,GAAG,MAAM,CAS/D;AAED;;GAEG;AACH,wBAAgB,OAAO,CACrB,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE;IACJ,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,iBAAiB,CAAC,QAAQ,CAAC,CAAC;CACtC,GACA;IAAE,KAAK,EAAE,iBAAiB,CAAC;IAAC,WAAW,EAAE,OAAO,CAAA;CAAE,CA2BpD;AAID;;;GAGG;AACH,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CA0D1D;AAoBD;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,iBAAiB,EAAE,EACzB,QAAQ,EAAE,iBAAiB,EAAE,GAC5B;IAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAgBhD;AAID;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,iBAAiB,EAAE,GAC3B;IAAE,CAAC,EAAE,iBAAiB,CAAC;IAAC,CAAC,EAAE,iBAAiB,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,EAAE,CAsCtE"}
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { resolve } from 'node:path';
|
|
3
|
+
import { fileExists, readJson, writeJson, writeText, ensureDir } from './fs.js';
|
|
4
|
+
import { aidevosDir } from './paths.js';
|
|
5
|
+
// ─── Paths ────────────────────────────────────────────────
|
|
6
|
+
export function registryPath(projectRoot) {
|
|
7
|
+
return resolve(aidevosDir(projectRoot), 'rules.json');
|
|
8
|
+
}
|
|
9
|
+
export function rulesViewDir(projectRoot) {
|
|
10
|
+
return resolve(aidevosDir(projectRoot), 'rules');
|
|
11
|
+
}
|
|
12
|
+
// ─── Fingerprint ──────────────────────────────────────────
|
|
13
|
+
function normalize(content) {
|
|
14
|
+
return content
|
|
15
|
+
.toLowerCase()
|
|
16
|
+
.replace(/[\s\n\r\t]+/g, ' ')
|
|
17
|
+
.replace(/[,。!?、;:""''()《》【】\.\,\!\?\;\:\"\'\(\)\[\]\{\}]/g, '')
|
|
18
|
+
.trim();
|
|
19
|
+
}
|
|
20
|
+
export function fingerprint(content) {
|
|
21
|
+
return createHash('sha256').update(normalize(content)).digest('hex').substring(0, 12);
|
|
22
|
+
}
|
|
23
|
+
// ─── Registry CRUD ────────────────────────────────────────
|
|
24
|
+
export function loadRegistry(projectRoot) {
|
|
25
|
+
const p = registryPath(projectRoot);
|
|
26
|
+
if (!fileExists(p))
|
|
27
|
+
return [];
|
|
28
|
+
try {
|
|
29
|
+
const data = readJson(p);
|
|
30
|
+
return Array.isArray(data) ? data : [];
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
return [];
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
export function saveRegistry(projectRoot, entries) {
|
|
37
|
+
writeJson(registryPath(projectRoot), entries);
|
|
38
|
+
}
|
|
39
|
+
export function nextRuleId(entries) {
|
|
40
|
+
const nums = entries
|
|
41
|
+
.map((e) => {
|
|
42
|
+
const m = e.id.match(/^RULE-(\d+)$/);
|
|
43
|
+
return m ? parseInt(m[1]) : 0;
|
|
44
|
+
})
|
|
45
|
+
.filter((n) => n > 0);
|
|
46
|
+
const max = nums.length > 0 ? Math.max(...nums) : 0;
|
|
47
|
+
return `RULE-${String(max + 1).padStart(3, '0')}`;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Add a rule to the registry. Returns the entry if added, or the existing entry if duplicate.
|
|
51
|
+
*/
|
|
52
|
+
export function addRule(projectRoot, opts) {
|
|
53
|
+
const entries = loadRegistry(projectRoot);
|
|
54
|
+
const fp = fingerprint(opts.content);
|
|
55
|
+
// Check for exact duplicate by fingerprint
|
|
56
|
+
const existing = entries.find((e) => e.fingerprint === fp);
|
|
57
|
+
if (existing) {
|
|
58
|
+
return { entry: existing, isDuplicate: true };
|
|
59
|
+
}
|
|
60
|
+
const entry = {
|
|
61
|
+
id: nextRuleId(entries),
|
|
62
|
+
category: opts.category || 'general',
|
|
63
|
+
content: opts.content,
|
|
64
|
+
fingerprint: fp,
|
|
65
|
+
source: {
|
|
66
|
+
branch: opts.branch,
|
|
67
|
+
deviation: opts.deviation,
|
|
68
|
+
author: opts.author,
|
|
69
|
+
},
|
|
70
|
+
createdAt: new Date().toISOString(),
|
|
71
|
+
status: opts.status || 'active',
|
|
72
|
+
};
|
|
73
|
+
entries.push(entry);
|
|
74
|
+
saveRegistry(projectRoot, entries);
|
|
75
|
+
return { entry, isDuplicate: false };
|
|
76
|
+
}
|
|
77
|
+
// ─── Build Views ──────────────────────────────────────────
|
|
78
|
+
/**
|
|
79
|
+
* Rebuild all .aidevos/rules/*.md from rules.json.
|
|
80
|
+
* Returns the number of categories written.
|
|
81
|
+
*/
|
|
82
|
+
export function buildRuleViews(projectRoot) {
|
|
83
|
+
const entries = loadRegistry(projectRoot);
|
|
84
|
+
const viewDir = rulesViewDir(projectRoot);
|
|
85
|
+
ensureDir(viewDir);
|
|
86
|
+
// Group by category
|
|
87
|
+
const groups = {};
|
|
88
|
+
for (const e of entries) {
|
|
89
|
+
if (e.status === 'deprecated')
|
|
90
|
+
continue;
|
|
91
|
+
const cat = e.category || 'general';
|
|
92
|
+
if (!groups[cat])
|
|
93
|
+
groups[cat] = [];
|
|
94
|
+
groups[cat].push(e);
|
|
95
|
+
}
|
|
96
|
+
// Always include iron-rules if they exist in registry
|
|
97
|
+
let written = 0;
|
|
98
|
+
for (const [cat, rules] of Object.entries(groups)) {
|
|
99
|
+
const lines = [];
|
|
100
|
+
lines.push(`<!-- AUTO-GENERATED from rules.json - DO NOT EDIT -->`);
|
|
101
|
+
lines.push(`# ${categoryTitle(cat)} Rules`);
|
|
102
|
+
lines.push('');
|
|
103
|
+
for (const r of rules) {
|
|
104
|
+
const statusTag = r.status === 'pending' ? ' [PENDING]' :
|
|
105
|
+
r.status === 'conflict' ? ' [CONFLICT]' : '';
|
|
106
|
+
lines.push(`- [${r.id}]${statusTag} ${r.content}`);
|
|
107
|
+
}
|
|
108
|
+
lines.push('');
|
|
109
|
+
writeText(resolve(viewDir, `${cat}.md`), lines.join('\n'));
|
|
110
|
+
written++;
|
|
111
|
+
}
|
|
112
|
+
// Write a combined all-rules.md for easy AI consumption
|
|
113
|
+
const activeCount = Object.keys(groups).length;
|
|
114
|
+
if (activeCount > 0) {
|
|
115
|
+
const allLines = [];
|
|
116
|
+
allLines.push(`<!-- AUTO-GENERATED from rules.json - DO NOT EDIT -->`);
|
|
117
|
+
allLines.push(`# All Project Rules`);
|
|
118
|
+
allLines.push('');
|
|
119
|
+
for (const [cat, rules] of Object.entries(groups)) {
|
|
120
|
+
allLines.push(`## ${categoryTitle(cat)}`);
|
|
121
|
+
allLines.push('');
|
|
122
|
+
for (const r of rules) {
|
|
123
|
+
const statusTag = r.status === 'pending' ? ' [PENDING]' :
|
|
124
|
+
r.status === 'conflict' ? ' [CONFLICT]' : '';
|
|
125
|
+
allLines.push(`- [${r.id}]${statusTag} ${r.content}`);
|
|
126
|
+
}
|
|
127
|
+
allLines.push('');
|
|
128
|
+
}
|
|
129
|
+
writeText(resolve(viewDir, '_all.md'), allLines.join('\n'));
|
|
130
|
+
written++;
|
|
131
|
+
}
|
|
132
|
+
return written;
|
|
133
|
+
}
|
|
134
|
+
function categoryTitle(cat) {
|
|
135
|
+
const titles = {
|
|
136
|
+
component: 'Component',
|
|
137
|
+
api: 'API',
|
|
138
|
+
style: 'Style',
|
|
139
|
+
i18n: 'i18n',
|
|
140
|
+
architecture: 'Architecture',
|
|
141
|
+
'state-management': 'State Management',
|
|
142
|
+
routing: 'Routing',
|
|
143
|
+
testing: 'Testing',
|
|
144
|
+
process: 'Process',
|
|
145
|
+
general: 'General',
|
|
146
|
+
};
|
|
147
|
+
return titles[cat] || cat.charAt(0).toUpperCase() + cat.slice(1);
|
|
148
|
+
}
|
|
149
|
+
// ─── Merge ────────────────────────────────────────────────
|
|
150
|
+
/**
|
|
151
|
+
* Merge two registries (union by fingerprint). Used after git merge conflicts.
|
|
152
|
+
* Returns merged entries and count of new entries added.
|
|
153
|
+
*/
|
|
154
|
+
export function mergeRegistries(base, incoming) {
|
|
155
|
+
const fpSet = new Set(base.map((e) => e.fingerprint));
|
|
156
|
+
const merged = [...base];
|
|
157
|
+
let added = 0;
|
|
158
|
+
for (const entry of incoming) {
|
|
159
|
+
if (!fpSet.has(entry.fingerprint)) {
|
|
160
|
+
// Reassign ID to avoid collisions
|
|
161
|
+
entry.id = nextRuleId(merged);
|
|
162
|
+
merged.push(entry);
|
|
163
|
+
fpSet.add(entry.fingerprint);
|
|
164
|
+
added++;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
return { merged, added };
|
|
168
|
+
}
|
|
169
|
+
// ─── Dedupe ───────────────────────────────────────────────
|
|
170
|
+
/**
|
|
171
|
+
* Find potential duplicates by checking keyword overlap.
|
|
172
|
+
* Returns pairs of entries that might be duplicates or conflicts.
|
|
173
|
+
*/
|
|
174
|
+
export function findSimilarRules(entries) {
|
|
175
|
+
const results = [];
|
|
176
|
+
function tokenize(s) {
|
|
177
|
+
return new Set(normalize(s)
|
|
178
|
+
.split(' ')
|
|
179
|
+
.filter((w) => w.length > 1));
|
|
180
|
+
}
|
|
181
|
+
function jaccard(setA, setB) {
|
|
182
|
+
let intersection = 0;
|
|
183
|
+
for (const w of setA) {
|
|
184
|
+
if (setB.has(w))
|
|
185
|
+
intersection++;
|
|
186
|
+
}
|
|
187
|
+
const union = setA.size + setB.size - intersection;
|
|
188
|
+
return union > 0 ? intersection / union : 0;
|
|
189
|
+
}
|
|
190
|
+
for (let i = 0; i < entries.length; i++) {
|
|
191
|
+
for (let j = i + 1; j < entries.length; j++) {
|
|
192
|
+
// Skip exact fingerprint matches (already deduplicated)
|
|
193
|
+
if (entries[i].fingerprint === entries[j].fingerprint)
|
|
194
|
+
continue;
|
|
195
|
+
// Only compare same category
|
|
196
|
+
if (entries[i].category !== entries[j].category)
|
|
197
|
+
continue;
|
|
198
|
+
const tokensA = tokenize(entries[i].content);
|
|
199
|
+
const tokensB = tokenize(entries[j].content);
|
|
200
|
+
const sim = jaccard(tokensA, tokensB);
|
|
201
|
+
if (sim >= 0.4) {
|
|
202
|
+
results.push({ a: entries[i], b: entries[j], similarity: sim });
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
return results.sort((a, b) => b.similarity - a.similarity);
|
|
207
|
+
}
|
|
208
|
+
//# sourceMappingURL=rules.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rules.js","sourceRoot":"","sources":["../../src/utils/rules.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared run.json read/write logic.
|
|
3
|
+
*
|
|
4
|
+
* Used by both CLI (log.ts) and MCP Server (server.ts).
|
|
5
|
+
* Single source of truth for data manipulation.
|
|
6
|
+
*/
|
|
7
|
+
import type { RunData } from '../schemas/run-json.js';
|
|
8
|
+
export declare function now(): string;
|
|
9
|
+
export declare function nextId(arr: any[], prefix: string): string;
|
|
10
|
+
export declare function addEvent(data: RunData, type: string, eventData: Record<string, any>): void;
|
|
11
|
+
export declare function addTimeline(data: RunData, type: string, title: string): void;
|
|
12
|
+
export declare function loadConfig(projectRoot: string): Record<string, any>;
|
|
13
|
+
export declare function recalcMetrics(data: RunData, projectRoot?: string): void;
|
|
14
|
+
export declare function updateRequirement(data: RunData, projectRoot: string): void;
|
|
15
|
+
export declare function saveRunData(path: string, data: RunData, projectRoot: string): void;
|
|
16
|
+
export declare function normalizeRunData(data: RunData): RunData;
|
|
17
|
+
/**
|
|
18
|
+
* Load existing run.json for current git branch/dev.
|
|
19
|
+
* Returns null if not found.
|
|
20
|
+
*/
|
|
21
|
+
export declare function loadRunJson(projectRoot: string): {
|
|
22
|
+
path: string;
|
|
23
|
+
data: RunData;
|
|
24
|
+
} | null;
|
|
25
|
+
/**
|
|
26
|
+
* Create initial RunData structure.
|
|
27
|
+
*/
|
|
28
|
+
export declare function createInitialRunData(branch: string, dev: string, config: Record<string, any>): RunData;
|
|
29
|
+
/**
|
|
30
|
+
* Ensure run.json exists (lazy init).
|
|
31
|
+
* Creates .aidevos/, config.json, run.json, branch-level files if missing.
|
|
32
|
+
*/
|
|
33
|
+
export declare function ensureRunJson(projectRoot: string): {
|
|
34
|
+
path: string;
|
|
35
|
+
data: RunData;
|
|
36
|
+
};
|
|
37
|
+
//# sourceMappingURL=run-data.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-data.d.ts","sourceRoot":"","sources":["../../src/utils/run-data.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,OAAO,KAAK,EACV,OAAO,EAIR,MAAM,wBAAwB,CAAC;AAIhC,wBAAgB,GAAG,IAAI,MAAM,CAE5B;AAED,wBAAgB,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAWzD;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,CAE1F;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAE5E;AAID,wBAAgB,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAMnE;AAID,wBAAgB,aAAa,CAAC,IAAI,EAAE,OAAO,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAmHvE;AAID,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI,CAwE1E;AAID,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI,CAKlF;AAID,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAUvD;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,CAAA;CAAE,GAAG,IAAI,CAYvF;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAC1B,OAAO,CAsDT;AAID;;;GAGG;AACH,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,CAAA;CAAE,CA4DlF"}
|