@rasensio/aidlc 0.7.0 → 1.1.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 (112) hide show
  1. package/README.md +25 -1
  2. package/dist/cli.js +13 -0
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/discover.d.ts +6 -2
  5. package/dist/commands/discover.d.ts.map +1 -1
  6. package/dist/commands/discover.js +30 -4
  7. package/dist/commands/discover.js.map +1 -1
  8. package/dist/commands/gate.d.ts.map +1 -1
  9. package/dist/commands/gate.js +8 -0
  10. package/dist/commands/gate.js.map +1 -1
  11. package/dist/commands/init.d.ts.map +1 -1
  12. package/dist/commands/init.js +3 -0
  13. package/dist/commands/init.js.map +1 -1
  14. package/dist/commands/knowledge.d.ts +16 -0
  15. package/dist/commands/knowledge.d.ts.map +1 -0
  16. package/dist/commands/knowledge.js +454 -0
  17. package/dist/commands/knowledge.js.map +1 -0
  18. package/dist/commands/start.d.ts +2 -1
  19. package/dist/commands/start.d.ts.map +1 -1
  20. package/dist/commands/start.js +31 -1
  21. package/dist/commands/start.js.map +1 -1
  22. package/dist/commands/transition.d.ts.map +1 -1
  23. package/dist/commands/transition.js +14 -1
  24. package/dist/commands/transition.js.map +1 -1
  25. package/dist/commands/update.d.ts.map +1 -1
  26. package/dist/commands/update.js +8 -1
  27. package/dist/commands/update.js.map +1 -1
  28. package/dist/compile/adapters/claude-code.d.ts.map +1 -1
  29. package/dist/compile/adapters/claude-code.js +5 -0
  30. package/dist/compile/adapters/claude-code.js.map +1 -1
  31. package/dist/compile/adapters/codex.d.ts.map +1 -1
  32. package/dist/compile/adapters/codex.js +5 -0
  33. package/dist/compile/adapters/codex.js.map +1 -1
  34. package/dist/compile/adapters/cursor.d.ts.map +1 -1
  35. package/dist/compile/adapters/cursor.js +5 -0
  36. package/dist/compile/adapters/cursor.js.map +1 -1
  37. package/dist/compile/adapters/kiro.d.ts.map +1 -1
  38. package/dist/compile/adapters/kiro.js +5 -0
  39. package/dist/compile/adapters/kiro.js.map +1 -1
  40. package/dist/compile/adapters/windsurf.d.ts.map +1 -1
  41. package/dist/compile/adapters/windsurf.js +5 -0
  42. package/dist/compile/adapters/windsurf.js.map +1 -1
  43. package/dist/compile/knowledge-section.d.ts +19 -0
  44. package/dist/compile/knowledge-section.d.ts.map +1 -0
  45. package/dist/compile/knowledge-section.js +46 -0
  46. package/dist/compile/knowledge-section.js.map +1 -0
  47. package/dist/core/types.d.ts +3 -1
  48. package/dist/core/types.d.ts.map +1 -1
  49. package/dist/discover/scanner.d.ts.map +1 -1
  50. package/dist/discover/scanner.js +18 -12
  51. package/dist/discover/scanner.js.map +1 -1
  52. package/dist/discover/workspaces.d.ts +24 -0
  53. package/dist/discover/workspaces.d.ts.map +1 -0
  54. package/dist/discover/workspaces.js +116 -0
  55. package/dist/discover/workspaces.js.map +1 -0
  56. package/dist/knowledge/compact.d.ts +24 -0
  57. package/dist/knowledge/compact.d.ts.map +1 -0
  58. package/dist/knowledge/compact.js +70 -0
  59. package/dist/knowledge/compact.js.map +1 -0
  60. package/dist/knowledge/context-generator.d.ts +36 -0
  61. package/dist/knowledge/context-generator.d.ts.map +1 -0
  62. package/dist/knowledge/context-generator.js +150 -0
  63. package/dist/knowledge/context-generator.js.map +1 -0
  64. package/dist/knowledge/engine.d.ts +40 -0
  65. package/dist/knowledge/engine.d.ts.map +1 -0
  66. package/dist/knowledge/engine.js +79 -0
  67. package/dist/knowledge/engine.js.map +1 -0
  68. package/dist/knowledge/gate-criterion.d.ts +36 -0
  69. package/dist/knowledge/gate-criterion.d.ts.map +1 -0
  70. package/dist/knowledge/gate-criterion.js +60 -0
  71. package/dist/knowledge/gate-criterion.js.map +1 -0
  72. package/dist/knowledge/index/knowledge-index.d.ts +45 -0
  73. package/dist/knowledge/index/knowledge-index.d.ts.map +1 -0
  74. package/dist/knowledge/index/knowledge-index.js +20 -0
  75. package/dist/knowledge/index/knowledge-index.js.map +1 -0
  76. package/dist/knowledge/index/sqlite-index.d.ts +53 -0
  77. package/dist/knowledge/index/sqlite-index.d.ts.map +1 -0
  78. package/dist/knowledge/index/sqlite-index.js +354 -0
  79. package/dist/knowledge/index/sqlite-index.js.map +1 -0
  80. package/dist/knowledge/merge-driver.d.ts +36 -0
  81. package/dist/knowledge/merge-driver.d.ts.map +1 -0
  82. package/dist/knowledge/merge-driver.js +130 -0
  83. package/dist/knowledge/merge-driver.js.map +1 -0
  84. package/dist/knowledge/reader.d.ts +32 -0
  85. package/dist/knowledge/reader.d.ts.map +1 -0
  86. package/dist/knowledge/reader.js +74 -0
  87. package/dist/knowledge/reader.js.map +1 -0
  88. package/dist/knowledge/seed.d.ts +38 -0
  89. package/dist/knowledge/seed.d.ts.map +1 -0
  90. package/dist/knowledge/seed.js +254 -0
  91. package/dist/knowledge/seed.js.map +1 -0
  92. package/dist/knowledge/staleness.d.ts +41 -0
  93. package/dist/knowledge/staleness.d.ts.map +1 -0
  94. package/dist/knowledge/staleness.js +102 -0
  95. package/dist/knowledge/staleness.js.map +1 -0
  96. package/dist/knowledge/sync.d.ts +31 -0
  97. package/dist/knowledge/sync.d.ts.map +1 -0
  98. package/dist/knowledge/sync.js +103 -0
  99. package/dist/knowledge/sync.js.map +1 -0
  100. package/dist/knowledge/types.d.ts +87 -0
  101. package/dist/knowledge/types.d.ts.map +1 -0
  102. package/dist/knowledge/types.js +82 -0
  103. package/dist/knowledge/types.js.map +1 -0
  104. package/dist/knowledge/writer.d.ts +67 -0
  105. package/dist/knowledge/writer.d.ts.map +1 -0
  106. package/dist/knowledge/writer.js +189 -0
  107. package/dist/knowledge/writer.js.map +1 -0
  108. package/dist/knowledge/yaml-source.d.ts +48 -0
  109. package/dist/knowledge/yaml-source.d.ts.map +1 -0
  110. package/dist/knowledge/yaml-source.js +195 -0
  111. package/dist/knowledge/yaml-source.js.map +1 -0
  112. package/package.json +3 -3
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reader.js","sourceRoot":"","sources":["../../src/knowledge/reader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Knowledge seeding from static analysis — the graph half of `aidlc discover`
3
+ * (design D4: one discover command, shared scanner).
4
+ *
5
+ * Maps the project onto entities/relationships: modules (directories with
6
+ * index files, per workspace package), dependencies (each package.json),
7
+ * endpoints (Express/Fastify route regex, best-effort), and one convention
8
+ * entity per detected convention — which is what lets the ideation gate's
9
+ * "≥1 convention" criterion pass from auto-discovery alone (KG Req 8.1–8.3).
10
+ *
11
+ * All facts get confidence 0.6 and author "auto-discovery". Static analysis
12
+ * only — no build, no execution.
13
+ *
14
+ * @module
15
+ */
16
+ import type { Entity } from './types.js';
17
+ import type { ScanResult } from '../discover/scanner.js';
18
+ export interface SeedInput {
19
+ entities: Array<Partial<Entity> & {
20
+ id: string;
21
+ type: string;
22
+ name: string;
23
+ }>;
24
+ relationships: Array<{
25
+ from: string;
26
+ to: string;
27
+ type: string;
28
+ metadata?: Record<string, unknown>;
29
+ }>;
30
+ }
31
+ /**
32
+ * Derive knowledge entities and relationships from a scanned project.
33
+ *
34
+ * @param projectRoot - Absolute project root.
35
+ * @param scan - Result of `scanCodebase` (conventions reused as entities).
36
+ */
37
+ export declare function seedFromScan(projectRoot: string, scan: ScanResult): SeedInput;
38
+ //# sourceMappingURL=seed.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seed.d.ts","sourceRoot":"","sources":["../../src/knowledge/seed.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAMH,OAAO,KAAK,EAAE,MAAM,EAAgB,MAAM,YAAY,CAAC;AACvD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAWzD,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC9E,aAAa,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC,CAAC;CACtG;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,SAAS,CAoI7E"}
@@ -0,0 +1,254 @@
1
+ /**
2
+ * Knowledge seeding from static analysis — the graph half of `aidlc discover`
3
+ * (design D4: one discover command, shared scanner).
4
+ *
5
+ * Maps the project onto entities/relationships: modules (directories with
6
+ * index files, per workspace package), dependencies (each package.json),
7
+ * endpoints (Express/Fastify route regex, best-effort), and one convention
8
+ * entity per detected convention — which is what lets the ideation gate's
9
+ * "≥1 convention" criterion pass from auto-discovery alone (KG Req 8.1–8.3).
10
+ *
11
+ * All facts get confidence 0.6 and author "auto-discovery". Static analysis
12
+ * only — no build, no execution.
13
+ *
14
+ * @module
15
+ */
16
+ import { readFileSync, readdirSync, existsSync, statSync } from 'node:fs';
17
+ import { join } from 'node:path';
18
+ import { DISCOVERY_CONFIDENCE } from './types.js';
19
+ import { detectWorkspacePackages } from '../discover/workspaces.js';
20
+ const AUTO_AUTHOR = 'auto-discovery';
21
+ /** Route definitions recognized in source files (best-effort, design risk 4). */
22
+ const ROUTE_RE = /\b(?:app|router|fastify|server)\.(get|post|put|patch|delete|head|options)\(\s*['"`]([^'"`]+)['"`]/g;
23
+ /** Max source files to scan for endpoints (keeps discovery fast on big repos). */
24
+ const MAX_ENDPOINT_FILES = 500;
25
+ /**
26
+ * Derive knowledge entities and relationships from a scanned project.
27
+ *
28
+ * @param projectRoot - Absolute project root.
29
+ * @param scan - Result of `scanCodebase` (conventions reused as entities).
30
+ */
31
+ export function seedFromScan(projectRoot, scan) {
32
+ const now = new Date().toISOString();
33
+ const entities = [];
34
+ const relationships = [];
35
+ const packages = detectWorkspacePackages(projectRoot);
36
+ // Workspace members have a non-empty relPath; a lone root package does not.
37
+ // Even a one-member workspace is a monorepo layout (KG Req 8.2).
38
+ const multiPackage = packages.some((pkg) => pkg.relPath !== '');
39
+ for (const pkg of packages) {
40
+ const pkgSlug = slugify(pkg.name);
41
+ // Workspace packages are modules themselves in a monorepo.
42
+ if (multiPackage) {
43
+ entities.push({
44
+ id: `module-${pkgSlug}`,
45
+ type: 'module',
46
+ name: pkg.name,
47
+ description: `Workspace package at ${pkg.relPath || '.'}/`,
48
+ confidence: DISCOVERY_CONFIDENCE,
49
+ source: pkg.relPath ? `${pkg.relPath}/package.json` : 'package.json',
50
+ author: AUTO_AUTHOR,
51
+ tags: ['auto-discovered', 'workspace-package'],
52
+ lastVerified: now,
53
+ });
54
+ }
55
+ // Modules: directories under the package's src/ (KG Req 8.1).
56
+ for (const module of detectModules(pkg.root)) {
57
+ const moduleId = multiPackage ? `module-${pkgSlug}-${module.name}` : `module-${module.name}`;
58
+ const relDir = pkg.relPath ? `${pkg.relPath}/src/${module.name}` : `src/${module.name}`;
59
+ entities.push({
60
+ id: moduleId,
61
+ type: 'module',
62
+ name: multiPackage ? `${pkg.name}/${module.name}` : module.name,
63
+ description: `Module at ${relDir}/${module.hasIndex ? ' (has index)' : ''}`,
64
+ confidence: DISCOVERY_CONFIDENCE,
65
+ source: relDir,
66
+ author: AUTO_AUTHOR,
67
+ tags: ['auto-discovered'],
68
+ lastVerified: now,
69
+ });
70
+ if (multiPackage) {
71
+ relationships.push({ from: `module-${pkgSlug}`, to: moduleId, type: 'contains' });
72
+ }
73
+ }
74
+ // Dependencies from the package's package.json (KG Req 8.1).
75
+ const owner = multiPackage ? `module-${pkgSlug}` : null;
76
+ for (const dep of detectDependencies(pkg.root)) {
77
+ const depId = `dep-${slugify(dep.name)}`;
78
+ if (!entities.some((e) => e.id === depId)) {
79
+ entities.push({
80
+ id: depId,
81
+ type: 'dependency',
82
+ name: dep.name,
83
+ description: `External dependency: ${dep.name}@${dep.version}`,
84
+ confidence: DISCOVERY_CONFIDENCE,
85
+ source: pkg.relPath ? `${pkg.relPath}/package.json` : 'package.json',
86
+ author: AUTO_AUTHOR,
87
+ tags: ['auto-discovered', 'external'],
88
+ lastVerified: now,
89
+ metadata: { version: dep.version },
90
+ });
91
+ }
92
+ if (owner) {
93
+ relationships.push({ from: owner, to: depId, type: 'depends-on' });
94
+ }
95
+ }
96
+ // Endpoints: route definitions in source files (KG Req 8.1, best-effort).
97
+ for (const endpoint of detectEndpoints(pkg.root, projectRoot)) {
98
+ const endpointId = `endpoint-${slugify(`${endpoint.method}-${endpoint.path}`)}`;
99
+ if (!entities.some((e) => e.id === endpointId)) {
100
+ entities.push({
101
+ id: endpointId,
102
+ type: 'endpoint',
103
+ name: `${endpoint.method.toUpperCase()} ${endpoint.path}`,
104
+ description: `Route defined in ${endpoint.file}`,
105
+ confidence: DISCOVERY_CONFIDENCE,
106
+ source: endpoint.file,
107
+ author: AUTO_AUTHOR,
108
+ tags: ['auto-discovered'],
109
+ lastVerified: now,
110
+ });
111
+ }
112
+ }
113
+ }
114
+ // In single-package projects, wire modules to the dependencies they import… is
115
+ // deeper analysis than v1 regex scanning supports; module→dep edges come from
116
+ // workspaces above. Guarantee the gate's relationship criterion with contains
117
+ // edges between the root and its modules when nothing else produced edges.
118
+ if (!multiPackage) {
119
+ const moduleIds = entities.filter((e) => e.type === 'module').map((e) => e.id);
120
+ const depIds = entities.filter((e) => e.type === 'dependency').map((e) => e.id);
121
+ if (moduleIds.length > 0 && depIds.length > 0) {
122
+ // Without import analysis, attribute package.json deps to the project's
123
+ // primary module set conservatively: first module depends on externals.
124
+ for (const depId of depIds.slice(0, 25)) {
125
+ relationships.push({ from: moduleIds[0], to: depId, type: 'depends-on' });
126
+ }
127
+ }
128
+ }
129
+ // Conventions from the style scan (KG Req 8.1; feeds the ideation gate).
130
+ const conventionEntries = [];
131
+ if (scan.conventions.indentation !== 'unknown') {
132
+ conventionEntries.push(['indentation', 'Indentation', scan.conventions.indentation]);
133
+ }
134
+ if (scan.conventions.naming !== 'unknown') {
135
+ conventionEntries.push(['naming', 'Naming convention', scan.conventions.naming]);
136
+ }
137
+ if (scan.conventions.importStyle !== 'unknown') {
138
+ conventionEntries.push(['import-style', 'Import style', scan.conventions.importStyle]);
139
+ }
140
+ for (const [key, name, value] of conventionEntries) {
141
+ entities.push({
142
+ id: `convention-${key}`,
143
+ type: 'convention',
144
+ name,
145
+ description: value,
146
+ confidence: DISCOVERY_CONFIDENCE,
147
+ source: 'agent-inferred',
148
+ author: AUTO_AUTHOR,
149
+ tags: ['auto-discovered', 'style'],
150
+ lastVerified: now,
151
+ });
152
+ }
153
+ return { entities, relationships };
154
+ }
155
+ function detectModules(packageRoot) {
156
+ const srcDir = join(packageRoot, 'src');
157
+ if (!isDirectory(srcDir))
158
+ return [];
159
+ try {
160
+ return readdirSync(srcDir, { withFileTypes: true })
161
+ .filter((d) => d.isDirectory() && !d.name.startsWith('.'))
162
+ .map((d) => ({
163
+ name: d.name,
164
+ hasIndex: existsSync(join(srcDir, d.name, 'index.ts')) ||
165
+ existsSync(join(srcDir, d.name, 'index.js')),
166
+ }));
167
+ }
168
+ catch {
169
+ return [];
170
+ }
171
+ }
172
+ function detectDependencies(packageRoot) {
173
+ const pkgPath = join(packageRoot, 'package.json');
174
+ if (!existsSync(pkgPath))
175
+ return [];
176
+ try {
177
+ const pkg = JSON.parse(readFileSync(pkgPath, 'utf8'));
178
+ return Object.entries(pkg.dependencies ?? {}).map(([name, version]) => ({ name, version }));
179
+ }
180
+ catch {
181
+ return [];
182
+ }
183
+ }
184
+ function detectEndpoints(packageRoot, projectRoot) {
185
+ const srcDir = join(packageRoot, 'src');
186
+ if (!isDirectory(srcDir))
187
+ return [];
188
+ const endpoints = [];
189
+ const files = collectSourceFiles(srcDir, MAX_ENDPOINT_FILES);
190
+ for (const file of files) {
191
+ let content;
192
+ try {
193
+ content = readFileSync(file, 'utf8');
194
+ }
195
+ catch {
196
+ continue;
197
+ }
198
+ let match;
199
+ ROUTE_RE.lastIndex = 0;
200
+ while ((match = ROUTE_RE.exec(content)) !== null) {
201
+ endpoints.push({
202
+ method: match[1],
203
+ path: match[2],
204
+ file: file.slice(projectRoot.length + 1),
205
+ });
206
+ }
207
+ }
208
+ return endpoints;
209
+ }
210
+ function collectSourceFiles(dir, limit) {
211
+ const files = [];
212
+ function walk(current) {
213
+ if (files.length >= limit)
214
+ return;
215
+ let entries;
216
+ try {
217
+ entries = readdirSync(current, { withFileTypes: true });
218
+ }
219
+ catch {
220
+ return;
221
+ }
222
+ for (const entry of entries) {
223
+ if (files.length >= limit)
224
+ return;
225
+ if (entry.name.startsWith('.') || entry.name === 'node_modules')
226
+ continue;
227
+ const full = join(current, entry.name);
228
+ if (entry.isDirectory()) {
229
+ walk(full);
230
+ }
231
+ else if (/\.[jt]sx?$/.test(entry.name)) {
232
+ files.push(full);
233
+ }
234
+ }
235
+ }
236
+ walk(dir);
237
+ return files;
238
+ }
239
+ function slugify(text) {
240
+ return text
241
+ .toLowerCase()
242
+ .replace(/[^a-z0-9]+/g, '-')
243
+ .replace(/^-+|-+$/g, '')
244
+ .replace(/-{2,}/g, '-');
245
+ }
246
+ function isDirectory(path) {
247
+ try {
248
+ return statSync(path).isDirectory();
249
+ }
250
+ catch {
251
+ return false;
252
+ }
253
+ }
254
+ //# sourceMappingURL=seed.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seed.js","sourceRoot":"","sources":["../../src/knowledge/seed.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Staleness detection — flag facts that may no longer reflect the code.
3
+ *
4
+ * Two signals: age (`lastVerified` older than a threshold) and change (the
5
+ * file named in an entity's `source` was modified per git diff). Confidence
6
+ * degrades ×0.8 on change until re-verified; decay is applied lazily by the
7
+ * commands that call in here — no watchers or daemons (design DD6).
8
+ *
9
+ * Requirements: KG 7.1–7.4
10
+ *
11
+ * @module
12
+ */
13
+ import type { Entity } from './types.js';
14
+ import type { KnowledgeIndex } from './index/knowledge-index.js';
15
+ import type { YamlSourceStore } from './yaml-source.js';
16
+ /** Multiplier applied to confidence when a source file changed (KG Req 7.2). */
17
+ export declare const CONFIDENCE_DECAY = 0.8;
18
+ /** Default staleness threshold in days (KG Req 7.1). */
19
+ export declare const DEFAULT_STALE_DAYS = 30;
20
+ export interface StaleEntity {
21
+ entity: Entity;
22
+ reason: 'age' | 'file-changed';
23
+ detail: string;
24
+ }
25
+ export declare class StalenessDetector {
26
+ private readonly index;
27
+ private readonly source;
28
+ private readonly projectRoot;
29
+ constructor(index: KnowledgeIndex, source: YamlSourceStore, projectRoot: string);
30
+ /** Entities not verified within `thresholdDays` (KG Req 7.1). */
31
+ byAge(thresholdDays?: number): StaleEntity[];
32
+ /**
33
+ * Entities whose source file changed per git diff; degrades their
34
+ * confidence ×0.8 in both index and YAML (KG Req 7.2, 7.3).
35
+ */
36
+ degradeChanged(sinceRef?: string): StaleEntity[];
37
+ /** Confirm an entity is accurate: bump lastVerified, restore confidence (KG Req 7.4). */
38
+ verify(entityId: string): Entity;
39
+ private recentlyModifiedFiles;
40
+ }
41
+ //# sourceMappingURL=staleness.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"staleness.d.ts","sourceRoot":"","sources":["../../src/knowledge/staleness.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAExD,gFAAgF;AAChF,eAAO,MAAM,gBAAgB,MAAM,CAAC;AAEpC,wDAAwD;AACxD,eAAO,MAAM,kBAAkB,KAAK,CAAC;AAKrC,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,KAAK,GAAG,cAAc,CAAC;IAC/B,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,iBAAiB;IAE1B,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,WAAW;gBAFX,KAAK,EAAE,cAAc,EACrB,MAAM,EAAE,eAAe,EACvB,WAAW,EAAE,MAAM;IAGtC,iEAAiE;IACjE,KAAK,CAAC,aAAa,GAAE,MAA2B,GAAG,WAAW,EAAE;IAehE;;;OAGG;IACH,cAAc,CAAC,QAAQ,SAAY,GAAG,WAAW,EAAE;IAuBnD,yFAAyF;IACzF,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;IAgBhC,OAAO,CAAC,qBAAqB;CAkB9B"}
@@ -0,0 +1,102 @@
1
+ /**
2
+ * Staleness detection — flag facts that may no longer reflect the code.
3
+ *
4
+ * Two signals: age (`lastVerified` older than a threshold) and change (the
5
+ * file named in an entity's `source` was modified per git diff). Confidence
6
+ * degrades ×0.8 on change until re-verified; decay is applied lazily by the
7
+ * commands that call in here — no watchers or daemons (design DD6).
8
+ *
9
+ * Requirements: KG 7.1–7.4
10
+ *
11
+ * @module
12
+ */
13
+ import { execSync } from 'node:child_process';
14
+ /** Multiplier applied to confidence when a source file changed (KG Req 7.2). */
15
+ export const CONFIDENCE_DECAY = 0.8;
16
+ /** Default staleness threshold in days (KG Req 7.1). */
17
+ export const DEFAULT_STALE_DAYS = 30;
18
+ /** Confidence restored on manual verification. */
19
+ const VERIFY_CONFIDENCE_BUMP = 0.1;
20
+ export class StalenessDetector {
21
+ index;
22
+ source;
23
+ projectRoot;
24
+ constructor(index, source, projectRoot) {
25
+ this.index = index;
26
+ this.source = source;
27
+ this.projectRoot = projectRoot;
28
+ }
29
+ /** Entities not verified within `thresholdDays` (KG Req 7.1). */
30
+ byAge(thresholdDays = DEFAULT_STALE_DAYS) {
31
+ const cutoff = new Date();
32
+ cutoff.setDate(cutoff.getDate() - thresholdDays);
33
+ const cutoffIso = cutoff.toISOString();
34
+ return this.index
35
+ .getAllEntities()
36
+ .filter((e) => e.lastVerified < cutoffIso)
37
+ .map((entity) => ({
38
+ entity,
39
+ reason: 'age',
40
+ detail: `last verified ${entity.lastVerified.slice(0, 10)}`,
41
+ }));
42
+ }
43
+ /**
44
+ * Entities whose source file changed per git diff; degrades their
45
+ * confidence ×0.8 in both index and YAML (KG Req 7.2, 7.3).
46
+ */
47
+ degradeChanged(sinceRef = 'HEAD~10') {
48
+ const changed = this.recentlyModifiedFiles(sinceRef);
49
+ const degraded = [];
50
+ for (const filePath of changed) {
51
+ for (const entity of this.index.getEntitiesByFilePath(filePath)) {
52
+ const updated = {
53
+ ...entity,
54
+ confidence: Math.max(0, entity.confidence * CONFIDENCE_DECAY),
55
+ };
56
+ this.index.upsertEntity(updated);
57
+ this.source.updateEntity(updated);
58
+ degraded.push({
59
+ entity: updated,
60
+ reason: 'file-changed',
61
+ detail: `${filePath} modified since ${sinceRef}`,
62
+ });
63
+ }
64
+ }
65
+ return degraded;
66
+ }
67
+ /** Confirm an entity is accurate: bump lastVerified, restore confidence (KG Req 7.4). */
68
+ verify(entityId) {
69
+ const entity = this.index.getEntity(entityId);
70
+ if (!entity) {
71
+ throw new Error(`Entity not found: '${entityId}'`);
72
+ }
73
+ const verified = {
74
+ ...entity,
75
+ lastVerified: new Date().toISOString(),
76
+ confidence: Math.min(1.0, entity.confidence + VERIFY_CONFIDENCE_BUMP),
77
+ };
78
+ this.index.upsertEntity(verified);
79
+ this.source.updateEntity(verified);
80
+ return verified;
81
+ }
82
+ recentlyModifiedFiles(sinceRef) {
83
+ // Refs reach a shell command line — restrict to safe revision characters
84
+ // so a future caller can't wire user input into command injection.
85
+ if (!/^[A-Za-z0-9_./~^-]+$/.test(sinceRef)) {
86
+ return [];
87
+ }
88
+ try {
89
+ const output = execSync(`git diff --name-only ${sinceRef}`, {
90
+ cwd: this.projectRoot,
91
+ encoding: 'utf8',
92
+ stdio: ['ignore', 'pipe', 'ignore'],
93
+ });
94
+ return output.trim().split('\n').filter(Boolean);
95
+ }
96
+ catch {
97
+ // Not a git repo, or the ref doesn't exist — skip change detection (KG design: graceful).
98
+ return [];
99
+ }
100
+ }
101
+ }
102
+ //# sourceMappingURL=staleness.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"staleness.js","sourceRoot":"","sources":["../../src/knowledge/staleness.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * `knowledge sync` — post-pull index rebuild plus suspicious-merge report.
3
+ *
4
+ * Compares the freshly parsed YAML against the previous index contents and
5
+ * flags semantically suspicious outcomes: descriptions that diverged sharply
6
+ * (>50% Levenshtein distance) and relationships pointing at entities that no
7
+ * longer exist.
8
+ *
9
+ * Requirements: KG 12.4
10
+ *
11
+ * @module
12
+ */
13
+ import type { KnowledgeIndex } from './index/knowledge-index.js';
14
+ import type { YamlSourceStore } from './yaml-source.js';
15
+ export interface SyncWarning {
16
+ entityId: string;
17
+ type: 'description-divergence' | 'orphan-relationship' | 'parse-warning';
18
+ message: string;
19
+ }
20
+ export interface SyncResult {
21
+ entitiesTotal: number;
22
+ added: number;
23
+ updated: number;
24
+ removed: number;
25
+ relationshipsTotal: number;
26
+ warnings: SyncWarning[];
27
+ }
28
+ export declare function syncKnowledge(source: YamlSourceStore, index: KnowledgeIndex): SyncResult;
29
+ /** Iterative two-row Levenshtein — fine for description-sized strings. */
30
+ export declare function levenshtein(a: string, b: string): number;
31
+ //# sourceMappingURL=sync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/knowledge/sync.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAExD,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,wBAAwB,GAAG,qBAAqB,GAAG,eAAe,CAAC;IACzE,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,UAAU;IACzB,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,QAAQ,EAAE,WAAW,EAAE,CAAC;CACzB;AAKD,wBAAgB,aAAa,CAAC,MAAM,EAAE,eAAe,EAAE,KAAK,EAAE,cAAc,GAAG,UAAU,CA+DxF;AAMD,0EAA0E;AAC1E,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAmBxD"}
@@ -0,0 +1,103 @@
1
+ /**
2
+ * `knowledge sync` — post-pull index rebuild plus suspicious-merge report.
3
+ *
4
+ * Compares the freshly parsed YAML against the previous index contents and
5
+ * flags semantically suspicious outcomes: descriptions that diverged sharply
6
+ * (>50% Levenshtein distance) and relationships pointing at entities that no
7
+ * longer exist.
8
+ *
9
+ * Requirements: KG 12.4
10
+ *
11
+ * @module
12
+ */
13
+ /** Description change ratio above which a merge is reported as suspicious. */
14
+ const DIVERGENCE_THRESHOLD = 0.5;
15
+ export function syncKnowledge(source, index) {
16
+ const before = new Map(index.getAllEntities().map((e) => [e.id, e]));
17
+ const { entities, relationships, warnings: parseWarnings } = source.loadAll();
18
+ const warnings = parseWarnings.map((message) => ({
19
+ entityId: '',
20
+ type: 'parse-warning',
21
+ message,
22
+ }));
23
+ // Detect suspicious description divergence against the pre-sync index.
24
+ for (const entity of entities) {
25
+ const prior = before.get(entity.id);
26
+ if (!prior || !prior.description || !entity.description)
27
+ continue;
28
+ if (prior.description === entity.description)
29
+ continue;
30
+ const distance = levenshtein(prior.description, entity.description);
31
+ const ratio = distance / Math.max(prior.description.length, entity.description.length);
32
+ if (ratio > DIVERGENCE_THRESHOLD) {
33
+ warnings.push({
34
+ entityId: entity.id,
35
+ type: 'description-divergence',
36
+ message: `description of '${entity.id}' changed by ${Math.round(ratio * 100)}% — review the merge`,
37
+ });
38
+ }
39
+ }
40
+ // Orphan relationships: endpoints missing from the merged sources.
41
+ const ids = new Set(entities.map((e) => e.id));
42
+ for (const rel of relationships) {
43
+ for (const endpoint of [rel.from, rel.to]) {
44
+ if (!ids.has(endpoint)) {
45
+ warnings.push({
46
+ entityId: endpoint,
47
+ type: 'orphan-relationship',
48
+ message: `relationship ${rel.from} → ${rel.type} → ${rel.to} references missing entity '${endpoint}'`,
49
+ });
50
+ }
51
+ }
52
+ }
53
+ index.rebuild(entities, relationships);
54
+ const after = new Map(entities.map((e) => [e.id, e]));
55
+ let added = 0;
56
+ let updated = 0;
57
+ for (const [id, entity] of after) {
58
+ const prior = before.get(id);
59
+ if (!prior)
60
+ added++;
61
+ else if (!entitiesEqual(prior, entity))
62
+ updated++;
63
+ }
64
+ let removed = 0;
65
+ for (const id of before.keys()) {
66
+ if (!after.has(id))
67
+ removed++;
68
+ }
69
+ return {
70
+ entitiesTotal: entities.length,
71
+ added,
72
+ updated,
73
+ removed,
74
+ relationshipsTotal: relationships.length,
75
+ warnings,
76
+ };
77
+ }
78
+ function entitiesEqual(a, b) {
79
+ return JSON.stringify(a) === JSON.stringify(b);
80
+ }
81
+ /** Iterative two-row Levenshtein — fine for description-sized strings. */
82
+ export function levenshtein(a, b) {
83
+ if (a === b)
84
+ return 0;
85
+ if (a.length === 0)
86
+ return b.length;
87
+ if (b.length === 0)
88
+ return a.length;
89
+ let prev = new Array(b.length + 1);
90
+ let curr = new Array(b.length + 1);
91
+ for (let j = 0; j <= b.length; j++)
92
+ prev[j] = j;
93
+ for (let i = 1; i <= a.length; i++) {
94
+ curr[0] = i;
95
+ for (let j = 1; j <= b.length; j++) {
96
+ const cost = a[i - 1] === b[j - 1] ? 0 : 1;
97
+ curr[j] = Math.min(prev[j] + 1, curr[j - 1] + 1, prev[j - 1] + cost);
98
+ }
99
+ [prev, curr] = [curr, prev];
100
+ }
101
+ return prev[b.length];
102
+ }
103
+ //# sourceMappingURL=sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/knowledge/sync.ts"],"names":[],"mappings":"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"}