memorix 1.1.13 → 1.2.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 (88) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/README.md +3 -2
  3. package/README.zh-CN.md +3 -2
  4. package/dist/cli/index.js +36313 -31189
  5. package/dist/cli/index.js.map +1 -1
  6. package/dist/dashboard/static/app.js +50 -30
  7. package/dist/index.js +5348 -674
  8. package/dist/index.js.map +1 -1
  9. package/dist/maintenance-runner.d.ts +1 -1
  10. package/dist/maintenance-runner.js +3661 -293
  11. package/dist/maintenance-runner.js.map +1 -1
  12. package/dist/memcode-runtime/CHANGELOG.md +19 -0
  13. package/dist/sdk.d.ts +1 -1
  14. package/dist/sdk.js +5346 -672
  15. package/dist/sdk.js.map +1 -1
  16. package/docs/1.2.0-CLAIM-LEDGER.md +72 -0
  17. package/docs/1.2.0-CODE-STATE.md +61 -0
  18. package/docs/1.2.0-DEVELOPMENT-CHARTER.md +255 -0
  19. package/docs/1.2.0-DYNAMIC-LIFECYCLE.md +71 -0
  20. package/docs/1.2.0-EVALUATION-HARNESS.md +51 -0
  21. package/docs/1.2.0-IMPLEMENTATION-PLAN.md +554 -0
  22. package/docs/1.2.0-KNOWLEDGE-WORKFLOW-RESEARCH.md +205 -0
  23. package/docs/1.2.0-KNOWLEDGE-WORKSPACE.md +68 -0
  24. package/docs/1.2.0-PRODUCT-STORY.md +234 -0
  25. package/docs/1.2.0-PROVIDER-QUALITY.md +189 -0
  26. package/docs/1.2.0-WORKFLOW-INHERITANCE.md +101 -0
  27. package/docs/1.2.0-WORKSET-RETRIEVAL.md +80 -0
  28. package/docs/AGENT_OPERATOR_PLAYBOOK.md +6 -3
  29. package/docs/API_REFERENCE.md +25 -6
  30. package/docs/CONFIGURATION.md +21 -3
  31. package/docs/README.md +17 -2
  32. package/docs/dev-log/progress.txt +120 -40
  33. package/llms-full.txt +16 -2
  34. package/llms.txt +9 -4
  35. package/package.json +3 -2
  36. package/plugins/codex/memorix/.codex-plugin/plugin.json +1 -1
  37. package/src/cli/capability-map.ts +1 -0
  38. package/src/cli/commands/codegraph.ts +112 -9
  39. package/src/cli/commands/context.ts +2 -0
  40. package/src/cli/commands/doctor.ts +73 -4
  41. package/src/cli/commands/knowledge.ts +282 -0
  42. package/src/cli/commands/serve-http.ts +12 -1
  43. package/src/cli/index.ts +3 -1
  44. package/src/cli/tui/App.tsx +1 -1
  45. package/src/cli/tui/Panels.tsx +8 -8
  46. package/src/cli/tui/theme.ts +1 -1
  47. package/src/cli/tui/views/GraphView.tsx +8 -7
  48. package/src/cli/tui/views/KnowledgeView.tsx +9 -9
  49. package/src/codegraph/auto-context.ts +171 -9
  50. package/src/codegraph/code-state.ts +95 -0
  51. package/src/codegraph/context-pack.ts +82 -1
  52. package/src/codegraph/external-provider.ts +581 -0
  53. package/src/codegraph/lite-provider.ts +64 -19
  54. package/src/codegraph/project-context.ts +9 -1
  55. package/src/codegraph/store.ts +154 -6
  56. package/src/codegraph/types.ts +117 -0
  57. package/src/config/resolved-config.ts +28 -0
  58. package/src/config/toml-loader.ts +3 -0
  59. package/src/config/yaml-loader.ts +6 -0
  60. package/src/dashboard/server.ts +15 -1
  61. package/src/evaluation/workset-evaluation.ts +120 -0
  62. package/src/hooks/handler.ts +48 -6
  63. package/src/knowledge/claim-store.ts +267 -0
  64. package/src/knowledge/claims.ts +537 -0
  65. package/src/knowledge/markdown.ts +129 -0
  66. package/src/knowledge/types.ts +157 -0
  67. package/src/knowledge/wiki.ts +524 -0
  68. package/src/knowledge/workflow-store.ts +168 -0
  69. package/src/knowledge/workflow-types.ts +95 -0
  70. package/src/knowledge/workflows.ts +743 -0
  71. package/src/knowledge/workset.ts +515 -0
  72. package/src/knowledge/workspace-store.ts +220 -0
  73. package/src/knowledge/workspace-types.ts +106 -0
  74. package/src/knowledge/workspace.ts +220 -0
  75. package/src/memory/observations.ts +19 -0
  76. package/src/runtime/control-plane-maintenance.ts +5 -0
  77. package/src/runtime/isolated-maintenance.ts +5 -0
  78. package/src/runtime/lifecycle-status.ts +102 -0
  79. package/src/runtime/lifecycle.ts +107 -0
  80. package/src/runtime/maintenance-jobs.ts +5 -0
  81. package/src/runtime/project-maintenance.ts +190 -0
  82. package/src/server/tool-profile.ts +3 -2
  83. package/src/server.ts +354 -14
  84. package/src/store/file-lock.ts +24 -4
  85. package/src/store/sqlite-db.ts +307 -0
  86. package/src/wiki/generator.ts +4 -2
  87. package/src/wiki/knowledge-graph.ts +7 -4
  88. package/src/wiki/types.ts +16 -4
@@ -293,6 +293,206 @@ CREATE TABLE IF NOT EXISTS observation_code_refs (
293
293
  );
294
294
  `;
295
295
 
296
+ const CREATE_SCHEMA_MIGRATIONS_TABLE = [
297
+ 'CREATE TABLE IF NOT EXISTS schema_migrations (',
298
+ ' id TEXT PRIMARY KEY,',
299
+ ' applied_at TEXT NOT NULL',
300
+ ');',
301
+ ].join('\n');
302
+
303
+ const CREATE_CODE_STATE_SNAPSHOTS_TABLE = [
304
+ 'CREATE TABLE IF NOT EXISTS code_state_snapshots (',
305
+ ' id TEXT PRIMARY KEY,',
306
+ ' projectId TEXT NOT NULL,',
307
+ ' provider TEXT NOT NULL,',
308
+ ' baseRevision TEXT,',
309
+ ' worktreeFingerprint TEXT NOT NULL,',
310
+ ' worktreeState TEXT NOT NULL,',
311
+ ' changedPathCount INTEGER NOT NULL DEFAULT 0,',
312
+ ' indexedAt TEXT NOT NULL,',
313
+ ' sourceEpoch INTEGER NOT NULL,',
314
+ " completenessJson TEXT NOT NULL DEFAULT '{}',",
315
+ ' previousSnapshotId TEXT,',
316
+ ' UNIQUE(projectId, sourceEpoch)',
317
+ ');',
318
+ ].join('\n');
319
+
320
+ // ── 1.2 Knowledge Claim Ledger ──────────────────────────────────────
321
+
322
+ const CREATE_KNOWLEDGE_CLAIMS_TABLE = `
323
+ CREATE TABLE IF NOT EXISTS knowledge_claims (
324
+ id TEXT PRIMARY KEY,
325
+ projectId TEXT NOT NULL,
326
+ subject TEXT NOT NULL,
327
+ predicate TEXT NOT NULL,
328
+ objectValue TEXT NOT NULL,
329
+ scope TEXT NOT NULL,
330
+ claimKey TEXT NOT NULL,
331
+ conflictKey TEXT NOT NULL,
332
+ status TEXT NOT NULL,
333
+ confidence REAL NOT NULL,
334
+ observedAt TEXT NOT NULL,
335
+ validFrom TEXT,
336
+ validTo TEXT,
337
+ supersededBy TEXT,
338
+ reviewState TEXT NOT NULL,
339
+ origin TEXT NOT NULL,
340
+ createdAt TEXT NOT NULL,
341
+ updatedAt TEXT NOT NULL
342
+ );
343
+ `;
344
+
345
+ const CREATE_KNOWLEDGE_CLAIM_EVIDENCE_TABLE = `
346
+ CREATE TABLE IF NOT EXISTS knowledge_claim_evidence (
347
+ id TEXT PRIMARY KEY,
348
+ claimId TEXT NOT NULL,
349
+ evidenceKind TEXT NOT NULL,
350
+ evidenceId TEXT NOT NULL,
351
+ relation TEXT NOT NULL,
352
+ snapshotId TEXT,
353
+ locator TEXT,
354
+ capturedHash TEXT,
355
+ evidenceKey TEXT NOT NULL,
356
+ createdAt TEXT NOT NULL,
357
+ UNIQUE(claimId, evidenceKey),
358
+ FOREIGN KEY (claimId) REFERENCES knowledge_claims(id) ON DELETE CASCADE
359
+ );
360
+ `;
361
+
362
+ const CREATE_KNOWLEDGE_CLAIM_EVENTS_TABLE = `
363
+ CREATE TABLE IF NOT EXISTS knowledge_claim_events (
364
+ id TEXT PRIMARY KEY,
365
+ projectId TEXT NOT NULL,
366
+ claimId TEXT NOT NULL,
367
+ kind TEXT NOT NULL,
368
+ fromStatus TEXT,
369
+ toStatus TEXT,
370
+ relatedClaimId TEXT,
371
+ detail TEXT,
372
+ createdAt TEXT NOT NULL,
373
+ FOREIGN KEY (claimId) REFERENCES knowledge_claims(id) ON DELETE CASCADE
374
+ );
375
+ `;
376
+
377
+ // ── 1.2 Knowledge Workspace ─────────────────────────────────────────
378
+
379
+ const CREATE_KNOWLEDGE_WORKSPACES_TABLE = [
380
+ 'CREATE TABLE IF NOT EXISTS knowledge_workspaces (',
381
+ ' id TEXT PRIMARY KEY,',
382
+ ' projectId TEXT NOT NULL,',
383
+ ' mode TEXT NOT NULL,',
384
+ ' rootPath TEXT NOT NULL,',
385
+ ' projectRoot TEXT,',
386
+ ' status TEXT NOT NULL,',
387
+ ' createdAt TEXT NOT NULL,',
388
+ ' updatedAt TEXT NOT NULL,',
389
+ ' lastCompiledAt TEXT,',
390
+ ' lastLintedAt TEXT,',
391
+ ' UNIQUE(projectId, mode)',
392
+ ');',
393
+ ].join('\n');
394
+
395
+ const CREATE_KNOWLEDGE_PAGES_TABLE = [
396
+ 'CREATE TABLE IF NOT EXISTS knowledge_pages (',
397
+ ' id TEXT PRIMARY KEY,',
398
+ ' workspaceId TEXT NOT NULL,',
399
+ ' relativePath TEXT NOT NULL,',
400
+ ' title TEXT NOT NULL,',
401
+ ' kind TEXT NOT NULL,',
402
+ ' status TEXT NOT NULL,',
403
+ ' reviewState TEXT NOT NULL,',
404
+ ' contentHash TEXT NOT NULL,',
405
+ ' sourceHash TEXT NOT NULL,',
406
+ " claimIdsJson TEXT NOT NULL DEFAULT '[]',",
407
+ ' snapshotId TEXT,',
408
+ " tagsJson TEXT NOT NULL DEFAULT '[]',",
409
+ ' generatedAt TEXT NOT NULL,',
410
+ ' updatedAt TEXT NOT NULL,',
411
+ ' lastLintedAt TEXT,',
412
+ ' manualContentHash TEXT,',
413
+ ' UNIQUE(workspaceId, relativePath),',
414
+ ' FOREIGN KEY (workspaceId) REFERENCES knowledge_workspaces(id) ON DELETE CASCADE',
415
+ ');',
416
+ ].join('\n');
417
+
418
+ const CREATE_KNOWLEDGE_PAGE_CLAIMS_TABLE = [
419
+ 'CREATE TABLE IF NOT EXISTS knowledge_page_claims (',
420
+ ' pageId TEXT NOT NULL,',
421
+ ' claimId TEXT NOT NULL,',
422
+ ' role TEXT NOT NULL,',
423
+ ' PRIMARY KEY (pageId, claimId),',
424
+ ' FOREIGN KEY (pageId) REFERENCES knowledge_pages(id) ON DELETE CASCADE,',
425
+ ' FOREIGN KEY (claimId) REFERENCES knowledge_claims(id) ON DELETE RESTRICT',
426
+ ');',
427
+ ].join('\n');
428
+
429
+ const CREATE_KNOWLEDGE_PAGE_LINKS_TABLE = [
430
+ 'CREATE TABLE IF NOT EXISTS knowledge_page_links (',
431
+ ' sourcePageId TEXT NOT NULL,',
432
+ ' targetPath TEXT NOT NULL,',
433
+ ' PRIMARY KEY (sourcePageId, targetPath),',
434
+ ' FOREIGN KEY (sourcePageId) REFERENCES knowledge_pages(id) ON DELETE CASCADE',
435
+ ');',
436
+ ].join('\n');
437
+
438
+ const CREATE_KNOWLEDGE_PROPOSALS_TABLE = [
439
+ 'CREATE TABLE IF NOT EXISTS knowledge_proposals (',
440
+ ' id TEXT PRIMARY KEY,',
441
+ ' workspaceId TEXT NOT NULL,',
442
+ ' pageId TEXT NOT NULL,',
443
+ ' targetPath TEXT NOT NULL,',
444
+ ' proposalPath TEXT NOT NULL,',
445
+ ' baseContentHash TEXT,',
446
+ ' sourceHash TEXT NOT NULL,',
447
+ ' reason TEXT NOT NULL,',
448
+ ' status TEXT NOT NULL,',
449
+ ' createdAt TEXT NOT NULL,',
450
+ ' appliedAt TEXT,',
451
+ ' UNIQUE(workspaceId, proposalPath),',
452
+ ' FOREIGN KEY (workspaceId) REFERENCES knowledge_workspaces(id) ON DELETE CASCADE,',
453
+ ' FOREIGN KEY (pageId) REFERENCES knowledge_pages(id) ON DELETE CASCADE',
454
+ ');',
455
+ ].join('\n');
456
+
457
+ // ── 1.2 Workflow inheritance ────────────────────────────────────────
458
+
459
+ const CREATE_KNOWLEDGE_WORKFLOWS_TABLE = [
460
+ 'CREATE TABLE IF NOT EXISTS knowledge_workflows (',
461
+ ' id TEXT PRIMARY KEY,',
462
+ ' workspaceId TEXT NOT NULL,',
463
+ ' sourcePath TEXT NOT NULL,',
464
+ ' title TEXT NOT NULL,',
465
+ ' status TEXT NOT NULL,',
466
+ ' version INTEGER NOT NULL,',
467
+ ' sourceHash TEXT NOT NULL,',
468
+ ' contentHash TEXT NOT NULL,',
469
+ ' specJson TEXT NOT NULL,',
470
+ ' importedFrom TEXT,',
471
+ ' createdAt TEXT NOT NULL,',
472
+ ' updatedAt TEXT NOT NULL,',
473
+ ' UNIQUE(workspaceId, sourcePath),',
474
+ ' FOREIGN KEY (workspaceId) REFERENCES knowledge_workspaces(id) ON DELETE CASCADE',
475
+ ');',
476
+ ].join('\n');
477
+
478
+ const CREATE_KNOWLEDGE_WORKFLOW_RUNS_TABLE = [
479
+ 'CREATE TABLE IF NOT EXISTS knowledge_workflow_runs (',
480
+ ' id TEXT PRIMARY KEY,',
481
+ ' workflowId TEXT NOT NULL,',
482
+ ' projectId TEXT NOT NULL,',
483
+ ' task TEXT NOT NULL,',
484
+ ' startingSnapshotId TEXT,',
485
+ " selectedEvidenceJson TEXT NOT NULL DEFAULT '[]',",
486
+ " phaseStateJson TEXT NOT NULL DEFAULT '{}',",
487
+ ' outcome TEXT NOT NULL,',
488
+ ' verificationVerdict TEXT NOT NULL,',
489
+ ' failureReason TEXT,',
490
+ ' startedAt TEXT NOT NULL,',
491
+ ' completedAt TEXT,',
492
+ ' FOREIGN KEY (workflowId) REFERENCES knowledge_workflows(id) ON DELETE CASCADE',
493
+ ');',
494
+ ].join('\n');
495
+
296
496
  // ── Runtime maintenance jobs ───────────────────────────────────────
297
497
 
298
498
  const CREATE_MAINTENANCE_JOBS_TABLE = `
@@ -348,8 +548,23 @@ CREATE INDEX IF NOT EXISTS idx_code_files_project ON code_files(projectId);
348
548
  CREATE INDEX IF NOT EXISTS idx_code_symbols_project_name ON code_symbols(projectId, name);
349
549
  CREATE INDEX IF NOT EXISTS idx_code_symbols_file ON code_symbols(fileId);
350
550
  CREATE INDEX IF NOT EXISTS idx_code_edges_project ON code_edges(projectId, type);
551
+ CREATE INDEX IF NOT EXISTS idx_code_snapshots_project_epoch ON code_state_snapshots(projectId, sourceEpoch DESC);
552
+ CREATE INDEX IF NOT EXISTS idx_code_files_snapshot ON code_files(projectId, snapshotId);
553
+ CREATE INDEX IF NOT EXISTS idx_code_symbols_snapshot ON code_symbols(projectId, snapshotId);
554
+ CREATE INDEX IF NOT EXISTS idx_code_edges_snapshot ON code_edges(projectId, snapshotId);
351
555
  CREATE INDEX IF NOT EXISTS idx_observation_code_refs_obs ON observation_code_refs(projectId, observationId);
352
556
  CREATE INDEX IF NOT EXISTS idx_observation_code_refs_status ON observation_code_refs(projectId, status);
557
+ CREATE INDEX IF NOT EXISTS idx_knowledge_claims_project_status ON knowledge_claims(projectId, status, updatedAt DESC);
558
+ CREATE INDEX IF NOT EXISTS idx_knowledge_claims_project_conflict ON knowledge_claims(projectId, conflictKey, status);
559
+ CREATE INDEX IF NOT EXISTS idx_knowledge_claims_project_key ON knowledge_claims(projectId, claimKey, status);
560
+ CREATE INDEX IF NOT EXISTS idx_knowledge_claim_evidence_claim ON knowledge_claim_evidence(claimId, createdAt);
561
+ CREATE INDEX IF NOT EXISTS idx_knowledge_claim_events_claim ON knowledge_claim_events(claimId, createdAt);
562
+ CREATE INDEX IF NOT EXISTS idx_knowledge_workspaces_project ON knowledge_workspaces(projectId, mode);
563
+ CREATE INDEX IF NOT EXISTS idx_knowledge_pages_workspace_status ON knowledge_pages(workspaceId, status, updatedAt DESC);
564
+ CREATE INDEX IF NOT EXISTS idx_knowledge_page_claims_claim ON knowledge_page_claims(claimId);
565
+ CREATE INDEX IF NOT EXISTS idx_knowledge_proposals_workspace_status ON knowledge_proposals(workspaceId, status, createdAt DESC);
566
+ CREATE INDEX IF NOT EXISTS idx_knowledge_workflows_workspace_status ON knowledge_workflows(workspaceId, status, updatedAt DESC);
567
+ CREATE INDEX IF NOT EXISTS idx_knowledge_workflow_runs_project_workflow ON knowledge_workflow_runs(projectId, workflowId, startedAt DESC);
353
568
  CREATE INDEX IF NOT EXISTS idx_maintenance_jobs_ready ON maintenance_jobs(status, run_after);
354
569
  CREATE INDEX IF NOT EXISTS idx_maintenance_jobs_project ON maintenance_jobs(project_id, status, run_after);
355
570
  CREATE INDEX IF NOT EXISTS idx_maintenance_targets_updated ON maintenance_targets(updated_at);
@@ -358,6 +573,94 @@ CREATE UNIQUE INDEX IF NOT EXISTS idx_maintenance_jobs_active_dedupe
358
573
  WHERE status IN ('pending', 'running', 'retry');
359
574
  `;
360
575
 
576
+ interface SchemaMigration {
577
+ id: string;
578
+ apply: (db: any) => void;
579
+ }
580
+
581
+ function hasColumn(db: any, table: string, column: string): boolean {
582
+ return db.prepare('PRAGMA table_info(' + table + ')')
583
+ .all()
584
+ .some((row: { name?: string }) => row.name === column);
585
+ }
586
+
587
+ function addColumnIfMissing(db: any, table: string, column: string, definition: string): void {
588
+ if (hasColumn(db, table, column)) return;
589
+ db.exec('ALTER TABLE ' + table + ' ADD COLUMN ' + definition);
590
+ }
591
+
592
+ const SCHEMA_MIGRATIONS: SchemaMigration[] = [
593
+ {
594
+ id: '1.2-code-state-snapshots',
595
+ apply: (db) => {
596
+ db.exec(CREATE_CODE_STATE_SNAPSHOTS_TABLE);
597
+ addColumnIfMissing(db, 'code_files', 'snapshotId', 'snapshotId TEXT');
598
+ addColumnIfMissing(db, 'code_files', 'sourceEpoch', 'sourceEpoch INTEGER');
599
+ addColumnIfMissing(db, 'code_symbols', 'snapshotId', 'snapshotId TEXT');
600
+ addColumnIfMissing(db, 'code_symbols', 'sourceEpoch', 'sourceEpoch INTEGER');
601
+ addColumnIfMissing(db, 'code_edges', 'snapshotId', 'snapshotId TEXT');
602
+ addColumnIfMissing(db, 'code_edges', 'sourceEpoch', 'sourceEpoch INTEGER');
603
+ addColumnIfMissing(db, 'observation_code_refs', 'snapshotId', 'snapshotId TEXT');
604
+ db.exec('CREATE INDEX IF NOT EXISTS idx_code_snapshots_project_epoch ON code_state_snapshots(projectId, sourceEpoch DESC)');
605
+ db.exec('CREATE INDEX IF NOT EXISTS idx_code_files_snapshot ON code_files(projectId, snapshotId)');
606
+ db.exec('CREATE INDEX IF NOT EXISTS idx_code_symbols_snapshot ON code_symbols(projectId, snapshotId)');
607
+ db.exec('CREATE INDEX IF NOT EXISTS idx_code_edges_snapshot ON code_edges(projectId, snapshotId)');
608
+ },
609
+ },
610
+ {
611
+ id: '1.2-knowledge-claim-ledger',
612
+ apply: (db) => {
613
+ db.exec(CREATE_KNOWLEDGE_CLAIMS_TABLE);
614
+ db.exec(CREATE_KNOWLEDGE_CLAIM_EVIDENCE_TABLE);
615
+ db.exec(CREATE_KNOWLEDGE_CLAIM_EVENTS_TABLE);
616
+ db.exec('CREATE INDEX IF NOT EXISTS idx_knowledge_claims_project_status ON knowledge_claims(projectId, status, updatedAt DESC)');
617
+ db.exec('CREATE INDEX IF NOT EXISTS idx_knowledge_claims_project_conflict ON knowledge_claims(projectId, conflictKey, status)');
618
+ db.exec('CREATE INDEX IF NOT EXISTS idx_knowledge_claims_project_key ON knowledge_claims(projectId, claimKey, status)');
619
+ db.exec('CREATE INDEX IF NOT EXISTS idx_knowledge_claim_evidence_claim ON knowledge_claim_evidence(claimId, createdAt)');
620
+ db.exec('CREATE INDEX IF NOT EXISTS idx_knowledge_claim_events_claim ON knowledge_claim_events(claimId, createdAt)');
621
+ },
622
+ },
623
+ {
624
+ id: '1.2-knowledge-workspace',
625
+ apply: (db) => {
626
+ db.exec(CREATE_KNOWLEDGE_WORKSPACES_TABLE);
627
+ db.exec(CREATE_KNOWLEDGE_PAGES_TABLE);
628
+ db.exec(CREATE_KNOWLEDGE_PAGE_CLAIMS_TABLE);
629
+ db.exec(CREATE_KNOWLEDGE_PAGE_LINKS_TABLE);
630
+ db.exec(CREATE_KNOWLEDGE_PROPOSALS_TABLE);
631
+ db.exec('CREATE INDEX IF NOT EXISTS idx_knowledge_workspaces_project ON knowledge_workspaces(projectId, mode)');
632
+ db.exec('CREATE INDEX IF NOT EXISTS idx_knowledge_pages_workspace_status ON knowledge_pages(workspaceId, status, updatedAt DESC)');
633
+ db.exec('CREATE INDEX IF NOT EXISTS idx_knowledge_page_claims_claim ON knowledge_page_claims(claimId)');
634
+ db.exec('CREATE INDEX IF NOT EXISTS idx_knowledge_proposals_workspace_status ON knowledge_proposals(workspaceId, status, createdAt DESC)');
635
+ },
636
+ },
637
+ {
638
+ id: '1.2-workflow-inheritance',
639
+ apply: (db) => {
640
+ db.exec(CREATE_KNOWLEDGE_WORKFLOWS_TABLE);
641
+ db.exec(CREATE_KNOWLEDGE_WORKFLOW_RUNS_TABLE);
642
+ db.exec('CREATE INDEX IF NOT EXISTS idx_knowledge_workflows_workspace_status ON knowledge_workflows(workspaceId, status, updatedAt DESC)');
643
+ db.exec('CREATE INDEX IF NOT EXISTS idx_knowledge_workflow_runs_project_workflow ON knowledge_workflow_runs(projectId, workflowId, startedAt DESC)');
644
+ },
645
+ },
646
+ ];
647
+
648
+ function applySchemaMigrations(db: any): void {
649
+ db.exec(CREATE_SCHEMA_MIGRATIONS_TABLE);
650
+ for (const migration of SCHEMA_MIGRATIONS) {
651
+ const applied = db.prepare('SELECT 1 FROM schema_migrations WHERE id = ?').get(migration.id);
652
+ if (applied) continue;
653
+ const apply = db.transaction(() => {
654
+ migration.apply(db);
655
+ db.prepare('INSERT INTO schema_migrations (id, applied_at) VALUES (?, ?)').run(
656
+ migration.id,
657
+ new Date().toISOString(),
658
+ );
659
+ });
660
+ apply();
661
+ }
662
+ }
663
+
361
664
  // ── Singleton cache ─────────────────────────────────────────────────
362
665
 
363
666
  const _dbCache = new Map<string, any>();
@@ -424,6 +727,10 @@ export function getDatabase(dataDir: string): any {
424
727
  try { db.exec(`ALTER TABLE team_messages ADD COLUMN to_role TEXT`); } catch { /* already exists */ }
425
728
  try { db.exec(`ALTER TABLE team_messages ADD COLUMN handoff_status TEXT`); } catch { /* already exists */ }
426
729
 
730
+ // New migrations are transactional and tracked. Older idempotent migrations
731
+ // remain untouched for backwards compatibility with existing local stores.
732
+ applySchemaMigrations(db);
733
+
427
734
  // Create indexes AFTER all ALTER TABLE migrations so referenced columns exist
428
735
  db.exec(CREATE_INDEXES);
429
736
 
@@ -221,8 +221,10 @@ export function generateKnowledgeBase(options: GenerateOptions): ProjectKnowledg
221
221
  const skillRefCount = allRefs.filter((r) => r.kind === 'mini-skill').length;
222
222
 
223
223
  return {
224
- title: 'Knowledge Base',
225
- subtitle: 'LLM Wiki',
224
+ title: 'Memory Overview',
225
+ subtitle: 'Generated from durable project memory',
226
+ kind: 'memory-overview',
227
+ maintained: false,
226
228
  projectId,
227
229
  generatedAt: options.generatedAt ?? new Date().toISOString(),
228
230
  sections,
@@ -56,7 +56,8 @@ const SKILLS_SECTION: SectionDef = {
56
56
  const ALL_SECTIONS: SectionDef[] = [...SECTION_DEFS, GIT_SECTION, SKILLS_SECTION];
57
57
 
58
58
  // -- Edge inference rules --
59
- // Infer semantic edges between observations based on shared attributes.
59
+ // Infer deterministic memory links between observations based on shared
60
+ // attributes. These links are a navigational projection, not verified claims.
60
61
  // Rules (no LLM, deterministic):
61
62
  // 1. supports: same entityName, different section -> source supports target
62
63
  // 2. relates_to: same entityName, same section -> bidirectional
@@ -251,7 +252,7 @@ export function generateKnowledgeGraph(options: GenerateGraphOptions): ProjectKn
251
252
  }
252
253
  }
253
254
 
254
- // Infer edges from observation/skill semantics
255
+ // Infer deterministic links from observation and skill metadata.
255
256
  const edges = inferEdges(nodes, entityNameIndex);
256
257
 
257
258
  // Add derived_from edges: skill -> source obs
@@ -270,7 +271,7 @@ export function generateKnowledgeGraph(options: GenerateGraphOptions): ProjectKn
270
271
  }
271
272
  }
272
273
 
273
- // Merge graph-store relations into semantic edges
274
+ // Merge explicit graph-store relations into the deterministic map.
274
275
  // Only include relations where both endpoints map to existing nodes
275
276
  if (graphRelations && graphRelations.length > 0) {
276
277
  const entityNodeMap = new Map<string, string>(); // entityName -> first matching nodeId
@@ -323,7 +324,9 @@ export function generateKnowledgeGraph(options: GenerateGraphOptions): ProjectKn
323
324
  };
324
325
 
325
326
  return {
326
- title: 'Knowledge Graph',
327
+ title: 'Memory Map',
328
+ kind: 'deterministic-memory-map',
329
+ semantic: false,
327
330
  projectId,
328
331
  generatedAt: options.generatedAt ?? new Date().toISOString(),
329
332
  nodes,
package/src/wiki/types.ts CHANGED
@@ -20,8 +20,14 @@ export interface KnowledgeSection {
20
20
  }
21
21
 
22
22
  export interface ProjectKnowledgeOverview {
23
- title: 'Knowledge Base';
24
- subtitle: 'LLM Wiki';
23
+ /**
24
+ * A read-only projection of durable memories. This is intentionally not
25
+ * called a maintained wiki until the 1.2 Knowledge Workspace exists.
26
+ */
27
+ title: 'Memory Overview';
28
+ subtitle: 'Generated from durable project memory';
29
+ kind: 'memory-overview';
30
+ maintained: false;
25
31
  projectId: string;
26
32
  generatedAt: string;
27
33
  sections: KnowledgeSection[];
@@ -32,7 +38,7 @@ export interface ProjectKnowledgeOverview {
32
38
  };
33
39
  }
34
40
 
35
- // -- Knowledge Graph types --
41
+ // -- Deterministic memory-map types --
36
42
 
37
43
  export type SemanticEdgeType = 'supports' | 'relates_to' | 'mentions' | 'derived_from';
38
44
 
@@ -75,7 +81,13 @@ export interface KnowledgeGraphStats {
75
81
  }
76
82
 
77
83
  export interface ProjectKnowledgeGraph {
78
- title: 'Knowledge Graph';
84
+ /**
85
+ * Deterministic links inferred from current memory data. It is not a
86
+ * semantic graph database or a source of independently verified claims.
87
+ */
88
+ title: 'Memory Map';
89
+ kind: 'deterministic-memory-map';
90
+ semantic: false;
79
91
  projectId: string;
80
92
  generatedAt: string;
81
93
  nodes: SemanticNode[];