kibi-cli 2.22.1 → 2.23.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 (124) hide show
  1. package/dist/cli-register-foundation.d.ts.map +1 -1
  2. package/dist/cli-register-foundation.js +1 -0
  3. package/dist/commands/check.d.ts.map +1 -1
  4. package/dist/commands/check.js +51 -3
  5. package/dist/commands/doctor.d.ts.map +1 -1
  6. package/dist/commands/doctor.js +28 -0
  7. package/dist/commands/migrate.d.ts +10 -0
  8. package/dist/commands/migrate.d.ts.map +1 -1
  9. package/dist/commands/migrate.js +58 -9
  10. package/dist/commands/sync.d.ts.map +1 -1
  11. package/dist/commands/sync.js +15 -1
  12. package/dist/extractors/markdown.d.ts.map +1 -1
  13. package/dist/extractors/markdown.js +37 -35
  14. package/dist/intent-search.d.ts.map +1 -1
  15. package/dist/intent-search.js +32 -4
  16. package/dist/operations/bootstrap/activation.d.ts +7 -1
  17. package/dist/operations/bootstrap/activation.d.ts.map +1 -1
  18. package/dist/operations/bootstrap/activation.js +27 -2
  19. package/dist/operations/bootstrap/generate.d.ts.map +1 -1
  20. package/dist/operations/bootstrap/generate.js +56 -16
  21. package/dist/operations/bootstrap/guidance-actions.d.ts.map +1 -1
  22. package/dist/operations/bootstrap/guidance-actions.js +14 -2
  23. package/dist/operations/bootstrap/guidance.d.ts.map +1 -1
  24. package/dist/operations/bootstrap/guidance.js +6 -2
  25. package/dist/operations/bootstrap/presentation.d.ts.map +1 -1
  26. package/dist/operations/bootstrap/presentation.js +75 -9
  27. package/dist/operations/bootstrap/types.d.ts +6 -0
  28. package/dist/operations/bootstrap/types.d.ts.map +1 -1
  29. package/dist/operations/migration/kb-sources.d.ts +8 -5
  30. package/dist/operations/migration/kb-sources.d.ts.map +1 -1
  31. package/dist/operations/migration/kb-sources.js +50 -14
  32. package/dist/operations/migration/schema6.d.ts.map +1 -1
  33. package/dist/operations/migration/schema6.js +11 -2
  34. package/dist/operations/migration/source-paths.d.ts +18 -1
  35. package/dist/operations/migration/source-paths.d.ts.map +1 -1
  36. package/dist/operations/migration/source-paths.js +111 -16
  37. package/dist/operations/modeling/suggest-predicates.d.ts.map +1 -1
  38. package/dist/operations/modeling/suggest-predicates.js +22 -7
  39. package/dist/operations/mutation/requirement-semantics.d.ts +16 -0
  40. package/dist/operations/mutation/requirement-semantics.d.ts.map +1 -1
  41. package/dist/operations/mutation/requirement-semantics.js +50 -0
  42. package/dist/operations/mutation/strict-fact.js +1 -1
  43. package/dist/operations/mutation/upsert.d.ts.map +1 -1
  44. package/dist/operations/mutation/upsert.js +2 -1
  45. package/dist/operations/planning/apply-plan.d.ts.map +1 -1
  46. package/dist/operations/planning/apply-plan.js +22 -2
  47. package/dist/operations/semantic-advisor/analyze-prose.d.ts.map +1 -1
  48. package/dist/operations/semantic-advisor/analyze-prose.js +49 -17
  49. package/dist/public/impact/analyzer.d.ts.map +1 -1
  50. package/dist/public/impact/analyzer.js +7 -1
  51. package/dist/public/impact/diagnostics.d.ts.map +1 -1
  52. package/dist/public/impact/diagnostics.js +16 -3
  53. package/dist/public/impact/types.d.ts +2 -0
  54. package/dist/public/impact/types.d.ts.map +1 -1
  55. package/dist/public/operations/catalog.d.ts +7 -2
  56. package/dist/public/operations/catalog.d.ts.map +1 -1
  57. package/dist/public/operations/check-executor.d.ts.map +1 -1
  58. package/dist/public/operations/check-executor.js +10 -3
  59. package/dist/public/operations/check-helpers.d.ts +10 -0
  60. package/dist/public/operations/check-helpers.d.ts.map +1 -1
  61. package/dist/public/operations/check-helpers.js +54 -0
  62. package/dist/public/operations/contracts.d.ts.map +1 -1
  63. package/dist/public/operations/contracts.js +1 -0
  64. package/dist/public/operations/discovery-executors.d.ts +18 -0
  65. package/dist/public/operations/discovery-executors.d.ts.map +1 -1
  66. package/dist/public/operations/discovery-executors.js +62 -3
  67. package/dist/public/operations/schema6-check-actions.d.ts +4 -0
  68. package/dist/public/operations/schema6-check-actions.d.ts.map +1 -1
  69. package/dist/public/operations/schema6-check-actions.js +39 -2
  70. package/dist/public/operations/source-path-dangling.d.ts +1 -1
  71. package/dist/public/operations/source-path-dangling.d.ts.map +1 -1
  72. package/dist/public/operations/source-path-dangling.js +11 -2
  73. package/dist/public/operations/specs/composite.d.ts +1 -1
  74. package/dist/public/operations/specs/discovery.d.ts +5 -0
  75. package/dist/public/operations/specs/discovery.d.ts.map +1 -1
  76. package/dist/public/operations/specs/discovery.js +5 -0
  77. package/dist/public/operations/specs/planning.d.ts +1 -1
  78. package/dist/public/operations/specs/planning.js +1 -1
  79. package/dist/public/operations/specs/reporting.d.ts.map +1 -1
  80. package/dist/public/operations/specs/reporting.js +6 -4
  81. package/dist/public/operations/specs/semantic.d.ts +1 -1
  82. package/dist/public/operations/specs/semantic.d.ts.map +1 -1
  83. package/dist/public/operations/specs/semantic.js +4 -2
  84. package/dist/public/skills/kibi-bootstrap/SKILL.md +3 -2
  85. package/dist/public/skills/kibi-usage/SKILL.md +6 -3
  86. package/dist/public/skills/kibi-usage/resources/workflows.md +3 -1
  87. package/dist/search-answer.d.ts +14 -0
  88. package/dist/search-answer.d.ts.map +1 -1
  89. package/dist/search-answer.js +42 -4
  90. package/dist/traceability/git-change-snapshot.d.ts +46 -0
  91. package/dist/traceability/git-change-snapshot.d.ts.map +1 -1
  92. package/dist/traceability/git-change-snapshot.js +187 -3
  93. package/dist/traceability/staged-diagnostics.d.ts.map +1 -1
  94. package/dist/traceability/staged-diagnostics.js +5 -6
  95. package/dist/traceability/staged-inventory-drift.d.ts +24 -0
  96. package/dist/traceability/staged-inventory-drift.d.ts.map +1 -0
  97. package/dist/traceability/staged-inventory-drift.js +84 -0
  98. package/dist/traceability/staged-symbols-manifest.d.ts.map +1 -1
  99. package/dist/traceability/staged-symbols-manifest.js +1 -2
  100. package/dist/utils/content-freshness.d.ts +9 -0
  101. package/dist/utils/content-freshness.d.ts.map +1 -1
  102. package/dist/utils/content-freshness.js +33 -0
  103. package/dist/utils/merge-driver-setup.d.ts +10 -0
  104. package/dist/utils/merge-driver-setup.d.ts.map +1 -0
  105. package/dist/utils/merge-driver-setup.js +69 -0
  106. package/dist/utils/rule-registry.generated.d.ts +1 -1
  107. package/dist/utils/rule-registry.generated.js +1 -1
  108. package/package.json +2 -2
  109. package/src/public/impact/analyzer.ts +13 -1
  110. package/src/public/impact/diagnostics.ts +20 -3
  111. package/src/public/impact/types.ts +2 -0
  112. package/src/public/operations/check-executor.ts +16 -4
  113. package/src/public/operations/check-helpers.ts +65 -0
  114. package/src/public/operations/contracts.ts +1 -0
  115. package/src/public/operations/discovery-executors.ts +97 -3
  116. package/src/public/operations/schema6-check-actions.ts +43 -2
  117. package/src/public/operations/source-path-dangling.ts +12 -2
  118. package/src/public/operations/specs/discovery.ts +6 -0
  119. package/src/public/operations/specs/planning.ts +1 -1
  120. package/src/public/operations/specs/reporting.ts +6 -4
  121. package/src/public/operations/specs/semantic.ts +4 -2
  122. package/src/public/skills/kibi-bootstrap/SKILL.md +3 -2
  123. package/src/public/skills/kibi-usage/SKILL.md +6 -3
  124. package/src/public/skills/kibi-usage/resources/workflows.md +3 -1
@@ -1 +1 @@
1
- {"version":3,"file":"cli-register-foundation.d.ts","sourceRoot":"","sources":["../src/cli-register-foundation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAezC,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAyJjE"}
1
+ {"version":3,"file":"cli-register-foundation.d.ts","sourceRoot":"","sources":["../src/cli-register-foundation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAezC,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA6JjE"}
@@ -22,6 +22,7 @@ export function registerFoundationCommands(program) {
22
22
  .option("--format <format>", "Output format: json|table", "table")
23
23
  .option("--apply-safe", "Apply only explicitly approved deterministic migration actions")
24
24
  .option("--approved-plan-hash <sha256>", "Exact migration plan hash approved for --apply-safe")
25
+ .option("--backlog", "List every quality and coverage backlog action instead of counts per code")
25
26
  .option("--approved-action <id>", "Approve one migration action (repeatable through comma-separated IDs)", (value, previous = []) => [
26
27
  ...previous,
27
28
  ...value
@@ -1 +1 @@
1
- {"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../../src/commands/check.ts"],"names":[],"mappings":"AAqCA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAgF7C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAE3D,YAAY,EAAE,SAAS,EAAE,CAAC;AAE1B,MAAM,WAAW,YAAY;IAC3B,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC3B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CAC1B;AA8gBD,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,CAAC,EACtC,MAAM,EAAE,CAAC,GAAG,IAAI,GAAG,SAAS,EAC5B,MAAM,EAAE,CAAC,GAAG,IAAI,GAAG,SAAS,GAC3B,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,CAMpB;AAGD,wBAAsB,YAAY,CAChC,OAAO,EAAE,YAAY,GACpB,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CAqlB/B;AAED,wBAAsB,yBAAyB,CAC7C,MAAM,EAAE,aAAa,GACpB,OAAO,CAAC,SAAS,EAAE,CAAC,CAoDtB;AAID,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,aAAa,GACpB,OAAO,CAAC,MAAM,EAAE,CAAC,CAgBnB;AAED,wBAAsB,eAAe,CACnC,MAAM,EAAE,aAAa,EACrB,IAAI,CAAC,EAAE,MAAM,GACZ,OAAO,CAAC,MAAM,EAAE,CAAC,CAiBnB;AAED,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,aAAa,GACpB,OAAO,CAAC,SAAS,EAAE,CAAC,CAkEtB;AAID,wBAAsB,aAAa,CACjC,MAAM,EAAE,aAAa,GACpB,OAAO,CAAC,SAAS,EAAE,CAAC,CAmGtB;AAED,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,aAAa,EACrB,YAAY,EAAE,MAAM,EAAE,GACrB,OAAO,CAAC,SAAS,EAAE,CAAC,CAyCtB;AAED,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,aAAa,GACpB,OAAO,CAAC,SAAS,EAAE,CAAC,CAgDtB;AAED,wBAAsB,yBAAyB,CAC7C,MAAM,EAAE,aAAa,GACpB,OAAO,CAAC,SAAS,EAAE,CAAC,CA0BtB;AAED,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,aAAa,GACpB,OAAO,CAAC,SAAS,EAAE,CAAC,CAqBtB;AAED,wBAAsB,yBAAyB,CAC7C,MAAM,EAAE,aAAa,GACpB,OAAO,CAAC,SAAS,EAAE,CAAC,CAqBtB;AAED,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,aAAa,GACpB,OAAO,CAAC,SAAS,EAAE,CAAC,CAqBtB"}
1
+ {"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../../src/commands/check.ts"],"names":[],"mappings":"AAqCA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAiF7C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAE3D,YAAY,EAAE,SAAS,EAAE,CAAC;AAE1B,MAAM,WAAW,YAAY;IAC3B,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC3B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CAC1B;AA8gBD,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,CAAC,EACtC,MAAM,EAAE,CAAC,GAAG,IAAI,GAAG,SAAS,EAC5B,MAAM,EAAE,CAAC,GAAG,IAAI,GAAG,SAAS,GAC3B,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,CAMpB;AAGD,wBAAsB,YAAY,CAChC,OAAO,EAAE,YAAY,GACpB,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CA2oB/B;AAED,wBAAsB,yBAAyB,CAC7C,MAAM,EAAE,aAAa,GACpB,OAAO,CAAC,SAAS,EAAE,CAAC,CAoDtB;AAID,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,aAAa,GACpB,OAAO,CAAC,MAAM,EAAE,CAAC,CAgBnB;AAED,wBAAsB,eAAe,CACnC,MAAM,EAAE,aAAa,EACrB,IAAI,CAAC,EAAE,MAAM,GACZ,OAAO,CAAC,MAAM,EAAE,CAAC,CAiBnB;AAED,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,aAAa,GACpB,OAAO,CAAC,SAAS,EAAE,CAAC,CAkEtB;AAID,wBAAsB,aAAa,CACjC,MAAM,EAAE,aAAa,GACpB,OAAO,CAAC,SAAS,EAAE,CAAC,CAmGtB;AAED,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,aAAa,EACrB,YAAY,EAAE,MAAM,EAAE,GACrB,OAAO,CAAC,SAAS,EAAE,CAAC,CAyCtB;AAED,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,aAAa,GACpB,OAAO,CAAC,SAAS,EAAE,CAAC,CAgDtB;AAED,wBAAsB,yBAAyB,CAC7C,MAAM,EAAE,aAAa,GACpB,OAAO,CAAC,SAAS,EAAE,CAAC,CA0BtB;AAED,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,aAAa,GACpB,OAAO,CAAC,SAAS,EAAE,CAAC,CAqBtB;AAED,wBAAsB,yBAAyB,CAC7C,MAAM,EAAE,aAAa,GACpB,OAAO,CAAC,SAAS,EAAE,CAAC,CAqBtB;AAED,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,aAAa,GACpB,OAAO,CAAC,SAAS,EAAE,CAAC,CAqBtB"}
@@ -38,6 +38,7 @@ import { collectStagedKibiDiagnostics, } from "../traceability/staged-diagnostic
38
38
  import { createStagedEntityIdStyleDiagnostics } from "../traceability/staged-entity-id-style.js";
39
39
  import { analyzeStagedFileCoverage, } from "../traceability/staged-file-coverage.js";
40
40
  import { classifyKibiImpactEvidence, isBehaviorSourceEdit, parseKibiImpactOverride, } from "../traceability/staged-impact-contract.js";
41
+ import { stagedInventoryDriftViolations } from "../traceability/staged-inventory-drift.js";
41
42
  import { assessStagedSymbolsManifest, collectStagedAuthoredSymbolsManifestEvidence, } from "../traceability/staged-symbols-manifest.js";
42
43
  import { createManifestLookupSentinelKey, extractSymbolsFromStagedFileAsync, } from "../traceability/symbol-extract.js";
43
44
  import { cleanupTempKb, consultOverlay, createOverlayFacts, createTempKb, projectStagedEntities, } from "../traceability/temp-kb.js";
@@ -471,9 +472,26 @@ export async function checkCommand(options) {
471
472
  file.disposition = "checked";
472
473
  }
473
474
  }
475
+ const mergeInherited = snapshot.mergeInherited ?? [];
476
+ const mergeNote = mergeInherited.length > 0
477
+ ? `Merge commit: ${mergeInherited.length} staged file(s) are taken unchanged from the merged branch and are not judged here; only what the merge itself changed is checked. Any debt in those files was inherited from that branch.`
478
+ : undefined;
479
+ const renameResolved = snapshot.renameResolved ?? [];
480
+ const renameNote = renameResolved.length > 0
481
+ ? `Baseline: HEAD with ${renameResolved.length} staged knowledge rename(s) into .kb/ resolved; renamed files are judged only on what this commit changed in them. Run kibi check for the full report.`
482
+ : undefined;
483
+ const baselineNotes = [mergeNote, renameNote].filter((note) => note !== undefined);
484
+ const printNotedResult = (input) => {
485
+ printStagedResult(baselineNotes.length === 0
486
+ ? input
487
+ : {
488
+ ...input,
489
+ messages: [...baselineNotes, ...(input.messages ?? [])],
490
+ });
491
+ };
474
492
  const printSnapshotResult = (input) => {
475
493
  snapshot.assertUnchanged();
476
- printStagedResult(input);
494
+ printNotedResult(input);
477
495
  };
478
496
  stagedCoverage = analyzeStagedFileCoverage(stagedInventory, snapshot.readGit);
479
497
  stagedCoverage.snapshot = {
@@ -526,7 +544,11 @@ export async function checkCommand(options) {
526
544
  printSnapshotResult({
527
545
  format: options.format,
528
546
  coverage: stagedCoverage,
529
- messages: ["No staged files found."],
547
+ messages: [
548
+ renameResolved.length > 0
549
+ ? "No staged changes beyond the resolved renames."
550
+ : "No staged files found.",
551
+ ],
530
552
  });
531
553
  return { exitCode: 0 };
532
554
  }
@@ -575,6 +597,32 @@ export async function checkCommand(options) {
575
597
  return { exitCode: options.dryRun ? 0 : 1 };
576
598
  }
577
599
  }
600
+ const inventoryDrift = stagedInventoryDriftViolations({
601
+ stagedPaths: new Set(markdownFiles.map((file) => file.path)),
602
+ snapshotEntities,
603
+ readBase: (filePath) => {
604
+ try {
605
+ return snapshot
606
+ .readGit(["show", `${snapshot.baseTree}:${filePath}`])
607
+ .toString("utf8");
608
+ }
609
+ catch {
610
+ return null;
611
+ }
612
+ },
613
+ });
614
+ if (inventoryDrift.length > 0) {
615
+ printSnapshotResult({
616
+ format: options.format,
617
+ coverage: stagedCoverage,
618
+ violations: inventoryDrift,
619
+ messages: [
620
+ `${inventoryDrift.length} staged requirement(s) have a semantic inventory that no longer matches their prose:`,
621
+ ...inventoryDrift.map((violation) => ` ${violation.message}`),
622
+ ],
623
+ });
624
+ return { exitCode: options.dryRun ? 0 : 1 };
625
+ }
578
626
  const snapshotRequirementIds = new Set(snapshotEntities
579
627
  .filter((row) => row.entity.type === "req")
580
628
  .map((row) => row.entity.id));
@@ -734,7 +782,7 @@ export async function checkCommand(options) {
734
782
  }
735
783
  // Without changed source symbols the result was historically printed
736
784
  // without re-asserting the snapshot; keep that behavior.
737
- const print = allSymbols.length === 0 ? printStagedResult : printSnapshotResult;
785
+ const print = allSymbols.length === 0 ? printNotedResult : printSnapshotResult;
738
786
  const passMessage = allSymbols.length === 0
739
787
  ? "✓ No violations found in staged files."
740
788
  : "✓ No violations found in staged symbols.";
@@ -1 +1 @@
1
- {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAiGA,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CAC3B;AAGD,wBAAsB,aAAa,CACjC,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CAmH/B;AAED,wBAAsB,4BAA4B,CAChD,IAAI,GAAE,MAAM,OAAO,CAAC;IAAE,gBAAgB,CAAC,EAAE,OAAO,CAAA;CAAE,CACT,GACxC,OAAO,CAAC,OAAO,CAAC,CAOlB;AAED,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;;;;;;;;;;;;;;;;MAkE3C;AAkGD,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAGzE;AAED,wBAAgB,2BAA2B,CACzC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,GACX,MAAM,GAAG,SAAS,CAepB"}
1
+ {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAqGA,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CAC3B;AAGD,wBAAsB,aAAa,CACjC,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CAuH/B;AAED,wBAAsB,4BAA4B,CAChD,IAAI,GAAE,MAAM,OAAO,CAAC;IAAE,gBAAgB,CAAC,EAAE,OAAO,CAAA;CAAE,CACT,GACxC,OAAO,CAAC,OAAO,CAAC,CAOlB;AAED,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;;;;;;;;;;;;;;;;MAkE3C;AAkGD,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAGzE;AAED,wBAAgB,2BAA2B,CACzC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,GACX,MAAM,GAAG,SAAS,CAepB"}
@@ -29,6 +29,7 @@ import { resolveBranchAttachment, resolveReadBranchAttachment, } from "../utils/
29
29
  import { branchStoreCompilation, inspectBranchStore, storeLockTakeoverReason, uncompiledBranchStoreReason, } from "../utils/branch-store.js";
30
30
  import { resolveGitRepository, } from "../utils/git-repository-context.js";
31
31
  import { readKbManifestStatus } from "../utils/kb-manifest.js";
32
+ import { MERGE_DRIVER_SETUP, manifestMergeDriverGaps, } from "../utils/merge-driver-setup.js";
32
33
  import { LATEST_KB_SCHEMA_VERSION } from "../utils/schema-version.js";
33
34
  import { KIBI_HOOK_BEGIN, hasManagedHooks, outdatedManagedHooks, } from "./init-helpers.js";
34
35
  import { planLegacyStorageMigration } from "./legacy-storage-migration.js";
@@ -90,6 +91,10 @@ export async function doctorCommand(options = {}) {
90
91
  name: "Kibi-managed hook sections",
91
92
  check: checkManagedHookSections,
92
93
  },
94
+ {
95
+ name: "Manifest merge driver",
96
+ check: checkManifestMergeDriver,
97
+ },
93
98
  {
94
99
  name: "Capability plugins",
95
100
  check: checkCapabilityPlugins,
@@ -683,6 +688,29 @@ function checkGitRepository() {
683
688
  };
684
689
  }
685
690
  }
691
+ /**
692
+ * `.kb/symbols.yaml` conflicts on nearly every parallel branch; `kibi
693
+ * merge-driver` resolves them by record id, but only when Git routes the
694
+ * file to it. A warning, not a failure: merges still work without it.
695
+ */
696
+ // implements REQ-cli-doctor
697
+ function checkManifestMergeDriver() {
698
+ const gaps = manifestMergeDriverGaps(process.cwd());
699
+ if (gaps === null) {
700
+ return {
701
+ passed: true,
702
+ message: "Not needed yet (no git repository or no symbols)",
703
+ };
704
+ }
705
+ if (gaps.length === 0)
706
+ return { passed: true, message: "Configured" };
707
+ return {
708
+ passed: true,
709
+ warning: true,
710
+ message: `Not configured: ${gaps.join("; ")}. Merges of .kb/symbols.yaml fall back to line conflicts.`,
711
+ remediation: MERGE_DRIVER_SETUP,
712
+ };
713
+ }
686
714
  /**
687
715
  * The current branch's KB store: it must exist and hold a compilation
688
716
  * (journal sequence above 0) when .kb/ has authored sources. Kibi stores are
@@ -1,3 +1,4 @@
1
+ import type { MigrationAction } from "../public/operations/migration-plan.js";
1
2
  interface MigrateOptions {
2
3
  dryRun?: boolean;
3
4
  yes?: boolean;
@@ -7,6 +8,8 @@ interface MigrateOptions {
7
8
  approvedActionIds?: string[];
8
9
  /** `--approved-action <id>` as the CLI parser spells it; same as approvedActionIds. */
9
10
  approvedAction?: string[];
11
+ /** List every quality and coverage backlog action, not only their counts. */
12
+ backlog?: boolean;
10
13
  workspaceRoot?: string;
11
14
  /** Internal migration-plan executor: create only the canonical baseline manifest. */
12
15
  initializeMissingConfig?: boolean;
@@ -55,5 +58,12 @@ export declare function migrateCommand(options?: MigrateOptions): Promise<{
55
58
  * (for example legacy links an earlier plan action already marked).
56
59
  */
57
60
  export declare function describeMigrationRun(summary: MigrationRunSummary): string;
61
+ /**
62
+ * Review findings `kibi check` and `kb_status` report at any schema version:
63
+ * quality and coverage work, not steps of the migration. A plan lists them
64
+ * so one approval flow covers both, but they never make a migration
65
+ * incomplete.
66
+ */
67
+ export declare function isBacklogAction(action: Pick<MigrationAction, "code">): boolean;
58
68
  export {};
59
69
  //# sourceMappingURL=migrate.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../../src/commands/migrate.ts"],"names":[],"mappings":"AAmEA,UAAU,cAAc;IACtB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAC1B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7B,uFAAuF;IACvF,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,qFAAqF;IACrF,uBAAuB,CAAC,EAAE,OAAO,CAAC;CACnC;AAED,MAAM,WAAW,oBAAoB;IACnC,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,uBAAuB,EAAE,SAAS,GAAG,WAAW,GAAG,gBAAgB,GAAG,IAAI,CAAC;IAC3E,MAAM,EAAE,SAAS,CAAC;IAClB,4BAA4B,EAAE,MAAM,CAAC;IACrC,8EAA8E;IAC9E,oBAAoB,EAAE,MAAM,CAAC;IAC7B,8DAA8D;IAC9D,4BAA4B,EAAE,MAAM,CAAC;IACrC,sEAAsE;IACtE,oBAAoB,EAAE,MAAM,CAAC;IAC7B,4FAA4F;IAC5F,kBAAkB,EAAE,MAAM,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,oEAAoE;IACpE,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;CAC1B;AAED,iFAAiF;AACjF,MAAM,WAAW,mBAAmB;IAClC,kEAAkE;IAClE,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,oBAAoB,CAAC;IAC5B,0EAA0E;IAC1E,gBAAgB,EAAE,OAAO,CAAC;CAC3B;AAyID,wBAAgB,mBAAmB,CACjC,gBAAgB,EAAE,OAAO,EACzB,UAAU,EAAE,MAAM,GAAG,IAAI,GACxB,MAAM,CAUR;AAsOD,wBAAgB,+BAA+B,IAAI;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,CAKtE;AAGD,wBAAsB,cAAc,CAClC,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,mBAAmB,CAAA;CAAE,CAAC,CAgZ9D;AAED;;;;GAIG;AAEH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,mBAAmB,GAAG,MAAM,CAGzE"}
1
+ {"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../../src/commands/migrate.ts"],"names":[],"mappings":"AA+CA,OAAO,KAAK,EACV,eAAe,EAEhB,MAAM,wCAAwC,CAAC;AAwBhD,UAAU,cAAc;IACtB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAC1B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7B,uFAAuF;IACvF,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,6EAA6E;IAC7E,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,qFAAqF;IACrF,uBAAuB,CAAC,EAAE,OAAO,CAAC;CACnC;AAED,MAAM,WAAW,oBAAoB;IACnC,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,uBAAuB,EAAE,SAAS,GAAG,WAAW,GAAG,gBAAgB,GAAG,IAAI,CAAC;IAC3E,MAAM,EAAE,SAAS,CAAC;IAClB,4BAA4B,EAAE,MAAM,CAAC;IACrC,8EAA8E;IAC9E,oBAAoB,EAAE,MAAM,CAAC;IAC7B,8DAA8D;IAC9D,4BAA4B,EAAE,MAAM,CAAC;IACrC,sEAAsE;IACtE,oBAAoB,EAAE,MAAM,CAAC;IAC7B,4FAA4F;IAC5F,kBAAkB,EAAE,MAAM,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,oEAAoE;IACpE,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;CAC1B;AAED,iFAAiF;AACjF,MAAM,WAAW,mBAAmB;IAClC,kEAAkE;IAClE,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,oBAAoB,CAAC;IAC5B,0EAA0E;IAC1E,gBAAgB,EAAE,OAAO,CAAC;CAC3B;AAyID,wBAAgB,mBAAmB,CACjC,gBAAgB,EAAE,OAAO,EACzB,UAAU,EAAE,MAAM,GAAG,IAAI,GACxB,MAAM,CAUR;AAsOD,wBAAgB,+BAA+B,IAAI;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,CAKtE;AAGD,wBAAsB,cAAc,CAClC,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,mBAAmB,CAAA;CAAE,CAAC,CAsZ9D;AAED;;;;GAIG;AAEH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,mBAAmB,GAAG,MAAM,CAGzE;AA+WD;;;;;GAKG;AAEH,wBAAgB,eAAe,CAC7B,MAAM,EAAE,IAAI,CAAC,eAAe,EAAE,MAAM,CAAC,GACpC,OAAO,CAOT"}
@@ -25,6 +25,7 @@ import { applySymbolLegacyLinks, planSymbolLegacyLinks, } from "../operations/mi
25
25
  import { resolveBranchAttachment } from "../utils/branch-resolver.js";
26
26
  import { defaultKbManifest, readKbManifest, readKbManifestStatus, writeKbManifest, } from "../utils/kb-manifest.js";
27
27
  import { CANONICAL_ENTITY_PATHS } from "../utils/kb-paths.js";
28
+ import { MERGE_DRIVER_SETUP, manifestMergeDriverGaps, } from "../utils/merge-driver-setup.js";
28
29
  import { LATEST_KB_SCHEMA_VERSION, getSchemaVersionStatus, normalizeSchemaVersion, } from "../utils/schema-version.js";
29
30
  import { updateGitIgnore } from "./init-helpers.js";
30
31
  import { applyLegacyStorageMigration, planLegacyStorageMigration, } from "./legacy-storage-migration.js";
@@ -254,7 +255,7 @@ function repairLifecycleFindings(cwd, dryRun) {
254
255
  console.log(`dry run: would close ${closed} superseded requirement(s): ${supersession.closures.map((closure) => closure.id).join(", ")}.`);
255
256
  }
256
257
  if (rewritten > 0) {
257
- console.log(`dry run: would point ${rewritten} pre-canonical source path(s) at their .kb/ files.`);
258
+ console.log(`dry run: would point ${rewritten} pre-canonical source or text_ref path(s) at their .kb/ files.`);
258
259
  }
259
260
  if (removed > 0) {
260
261
  console.log(`dry run: would remove ${removed} redundant or dead source field(s); ${REMOVED_SOURCES_NOTE}.`);
@@ -274,7 +275,7 @@ function repairLifecycleFindings(cwd, dryRun) {
274
275
  removed = repairs.removed.length;
275
276
  unrepaired = [...repairs.skipped];
276
277
  if (rewritten > 0) {
277
- console.log(`Pointed ${rewritten} pre-canonical source path(s) at their .kb/ files.`);
278
+ console.log(`Pointed ${rewritten} pre-canonical source or text_ref path(s) at their .kb/ files.`);
278
279
  }
279
280
  if (removed > 0) {
280
281
  console.log(`Removed ${removed} redundant or dead source field(s); ${REMOVED_SOURCES_NOTE}.`);
@@ -284,7 +285,7 @@ function repairLifecycleFindings(cwd, dryRun) {
284
285
  printWarning(`Requirements ${cycle.members.join(", ")} supersede each other; decide which one is current, remove the supersedes link that points at it, and close the others.`);
285
286
  }
286
287
  for (const skip of unrepaired) {
287
- printWarning(`Source field of ${skip.file} not repaired: ${skip.reason}; a person edits it by hand (kibi migrate --format json lists it as review_source_path_dangling).`);
288
+ printWarning(`Path field of ${skip.file} not repaired: ${skip.reason}; a person edits it by hand (kibi migrate --format json lists it as review_source_path_dangling).`);
288
289
  }
289
290
  return {
290
291
  closed,
@@ -561,6 +562,10 @@ export async function migrateCommand(options = {}) {
561
562
  }
562
563
  console.log(`Wrote migration audit metadata to ${toRelativePath(cwd, auditPath)}.`);
563
564
  console.log("Migration complete. Future 'kibi migrate' runs will be a no-op.");
565
+ const mergeDriverGaps = manifestMergeDriverGaps(cwd);
566
+ if (mergeDriverGaps !== null && mergeDriverGaps.length > 0) {
567
+ console.log(`Tip: kibi merge-driver resolves .kb/symbols.yaml merges by record id, but it is not wired up (${mergeDriverGaps.join("; ")}). ${MERGE_DRIVER_SETUP}`);
568
+ }
564
569
  const gitignoreUpdated = updateGitIgnore(cwd);
565
570
  return {
566
571
  exitCode: 0,
@@ -842,12 +847,56 @@ async function migratePlanCommand(options) {
842
847
  console.log(JSON.stringify(plan, null, 2));
843
848
  }
844
849
  else {
845
- console.log(`Migration plan ${plan.planHash}`);
846
- console.log(`Status: ${plan.status}; actions: ${plan.summary.actionCount}; automatic-ready: ${plan.actions.filter((action) => action.state === "ready" && action.autoApplicable).length}`);
847
- for (const action of plan.actions) {
848
- console.log(`- ${action.state} ${action.safety} ${action.code}: ${action.id}`);
849
- }
850
- console.log("Use --format json for structured actions, or --apply-safe with the approved plan hash.");
850
+ printPlanText(plan, options.backlog === true);
851
851
  }
852
852
  return { exitCode: 0 };
853
853
  }
854
+ /**
855
+ * Review findings `kibi check` and `kb_status` report at any schema version:
856
+ * quality and coverage work, not steps of the migration. A plan lists them
857
+ * so one approval flow covers both, but they never make a migration
858
+ * incomplete.
859
+ */
860
+ // implements REQ-cli-schema-migration
861
+ export function isBacklogAction(action) {
862
+ return (action.code.startsWith("quality_") ||
863
+ action.code.startsWith("coverage_") ||
864
+ (action.code.startsWith("review_") &&
865
+ !MIGRATION_REVIEW_CODES.has(action.code)));
866
+ }
867
+ /** Review actions that belong to the schema or storage migration itself. */
868
+ const MIGRATION_REVIEW_CODES = new Set([
869
+ "review_source_path_dangling",
870
+ "review_supersession_cycle",
871
+ ]);
872
+ function printPlanText(plan, listBacklog) {
873
+ const migration = plan.actions.filter((action) => !isBacklogAction(action));
874
+ const backlog = plan.actions.filter(isBacklogAction);
875
+ const automaticReady = migration.filter((action) => action.state === "ready" && action.autoApplicable).length;
876
+ console.log(`Migration plan ${plan.planHash}`);
877
+ console.log(migration.length === 0
878
+ ? "Migration: complete; no migration actions remain."
879
+ : `Migration: ${migration.length} action(s); automatic-ready: ${automaticReady}`);
880
+ for (const action of migration) {
881
+ console.log(`- ${action.state} ${action.safety} ${action.code}: ${action.id}`);
882
+ }
883
+ if (backlog.length > 0) {
884
+ console.log(`Quality backlog (not part of the migration): ${backlog.length} review item(s) that kibi check and kb_status also report.`);
885
+ if (listBacklog) {
886
+ for (const action of backlog) {
887
+ console.log(`- ${action.state} ${action.safety} ${action.code}: ${action.id}`);
888
+ }
889
+ }
890
+ else {
891
+ const counts = new Map();
892
+ for (const action of backlog) {
893
+ counts.set(action.code, (counts.get(action.code) ?? 0) + 1);
894
+ }
895
+ for (const [code, count] of [...counts].sort(([leftCode, left], [rightCode, right]) => right - left || leftCode.localeCompare(rightCode))) {
896
+ console.log(` ${count} ${code}`);
897
+ }
898
+ console.log(" List each item with --backlog.");
899
+ }
900
+ }
901
+ console.log(`Plan status: ${plan.status} (covers both sections). Use --format json for structured actions, or --apply-safe with the approved plan hash.`);
902
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"AA6BA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AA6BjE,OAAO,EAEL,yBAAyB,EAE1B,MAAM,gDAAgD,CAAC;AAGxD,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EACL,KAAK,gBAAgB,EAGtB,MAAM,6BAA6B,CAAC;AAyBrC,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,qBAAqB,CAAC;AAkCxE,qBAAa,SAAU,SAAQ,KAAK;gBACtB,OAAO,EAAE,MAAM;CAI5B;AAmCD,wBAAgB,wBAAwB,CACtC,aAAa,EAAE,MAAM,EACrB,gBAAgB,EAAE,MAAM,EACxB,4BAA4B,UAAQ,EACpC,4BAA4B,GAAE,4BAA4B,EAAO,GAChE,MAAM,EAAE,CAuGV;AAiFD,MAAM,WAAW,UAAW,SAAQ,WAAW;IAC7C,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,UAAU,yBAAyB;IACjC,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,OAAO,CAAC;CACvB;AAED,UAAU,kBAAkB;IAC1B,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,yBAAyB,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAC3E,UAAU,CAAC,EAAE,CACX,OAAO,EAAE,yBAAyB,GAAG;QAAE,UAAU,EAAE,OAAO,CAAA;KAAE,KACzD,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAC1B,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,KAAK,aAAa,CAAC;IAC/D,yBAAyB,CAAC,EAAE,OAAO,yBAAyB,CAAC;CAC9D;AA+FD,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAGvE;AAGD,wBAAgB,2BAA2B,CACzC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,IAAI,GAChB,IAAI,CAMN;AAED,wBAAgB,4BAA4B,CAC1C,WAAW,EAAE,UAAU,EAAE,EACzB,QAAQ,EAAE,OAAO,EACjB,OAAO,EAAE,OAAO,EAChB,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE,MAAM,GACf,IAAI,CAIN;AAED,wBAAgB,0BAA0B,CAAC,MAAM,EAAE;IACjD,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GAAG,IAAI,CAMP;AAED,wBAAgB,iCAAiC,CAC/C,WAAW,EAAE,UAAU,EAAE,EACzB,oBAAoB,EAAE,OAAO,EAC7B,iBAAiB,EAAE,MAAM,EACzB,WAAW,EAAE,MAAM,GAClB,IAAI,CAUN;AAGD,wBAAsB,WAAW,CAC/B,OAAO,GAAE;IACP,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,wBAAwB,CAAC,EAAE,OAAO,CAAC;IACnC,2EAA2E;IAC3E,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,wEAAwE;IACxE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;OAGG;IACH,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,uEAAuE;IACvE,KAAK,CAAC,EAAE,OAAO,CAAC;CACZ,EACN,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,UAAU,CAAC,CA+qCrB;AAED,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC"}
1
+ {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"AA6BA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AA6BjE,OAAO,EAEL,yBAAyB,EAE1B,MAAM,gDAAgD,CAAC;AAGxD,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EACL,KAAK,gBAAgB,EAGtB,MAAM,6BAA6B,CAAC;AAyBrC,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,qBAAqB,CAAC;AAkCxE,qBAAa,SAAU,SAAQ,KAAK;gBACtB,OAAO,EAAE,MAAM;CAI5B;AAmCD,wBAAgB,wBAAwB,CACtC,aAAa,EAAE,MAAM,EACrB,gBAAgB,EAAE,MAAM,EACxB,4BAA4B,UAAQ,EACpC,4BAA4B,GAAE,4BAA4B,EAAO,GAChE,MAAM,EAAE,CAuGV;AAiFD,MAAM,WAAW,UAAW,SAAQ,WAAW;IAC7C,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,UAAU,yBAAyB;IACjC,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,OAAO,CAAC;CACvB;AAED,UAAU,kBAAkB;IAC1B,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,yBAAyB,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAC3E,UAAU,CAAC,EAAE,CACX,OAAO,EAAE,yBAAyB,GAAG;QAAE,UAAU,EAAE,OAAO,CAAA;KAAE,KACzD,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAC1B,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,KAAK,aAAa,CAAC;IAC/D,yBAAyB,CAAC,EAAE,OAAO,yBAAyB,CAAC;CAC9D;AA+FD,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAGvE;AAGD,wBAAgB,2BAA2B,CACzC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,IAAI,GAChB,IAAI,CAMN;AAED,wBAAgB,4BAA4B,CAC1C,WAAW,EAAE,UAAU,EAAE,EACzB,QAAQ,EAAE,OAAO,EACjB,OAAO,EAAE,OAAO,EAChB,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE,MAAM,GACf,IAAI,CAIN;AAED,wBAAgB,0BAA0B,CAAC,MAAM,EAAE;IACjD,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GAAG,IAAI,CAMP;AAED,wBAAgB,iCAAiC,CAC/C,WAAW,EAAE,UAAU,EAAE,EACzB,oBAAoB,EAAE,OAAO,EAC7B,iBAAiB,EAAE,MAAM,EACzB,WAAW,EAAE,MAAM,GAClB,IAAI,CAUN;AAGD,wBAAsB,WAAW,CAC/B,OAAO,GAAE;IACP,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,wBAAwB,CAAC,EAAE,OAAO,CAAC;IACnC,2EAA2E;IAC3E,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,wEAAwE;IACxE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;OAGG;IACH,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,uEAAuE;IACvE,KAAK,CAAC,EAAE,OAAO,CAAC;CACZ,EACN,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,UAAU,CAAC,CA4rCrB;AAED,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC"}
@@ -719,6 +719,9 @@ export async function syncCommand(options = {}, runtime = {}) {
719
719
  // implements REQ-kibi-proposition-complete-ingestion, REQ-cli-schema-migration
720
720
  // Every drifted inventory is reported in one run, not one per sync attempt.
721
721
  const inventoryFailures = [];
722
+ // Requirements with no inventory at all: kibi migrate re-derives only an
723
+ // inventory a requirement already states, so they need the advisor.
724
+ const uninventoried = [];
722
725
  for (const result of extractedResults) {
723
726
  if (result.entity.type !== "req")
724
727
  continue;
@@ -743,6 +746,8 @@ export async function syncCommand(options = {}, runtime = {}) {
743
746
  advertisedContract;
744
747
  if (enforceBoundary && boundary.errors.length > 0) {
745
748
  inventoryFailures.push(`${key}: proposition-complete ingestion failed: ${boundary.errors.join("; ")}.`);
749
+ if (!advertisedContract)
750
+ uninventoried.push(result.entity.id);
746
751
  continue;
747
752
  }
748
753
  nextSemanticHashes[key] = boundary.sourceHash;
@@ -752,7 +757,16 @@ export async function syncCommand(options = {}, runtime = {}) {
752
757
  throw new SyncError([
753
758
  `${inventoryFailures.length} requirement(s) failed proposition-complete ingestion:`,
754
759
  ...inventoryFailures.map((failure) => ` ${failure}`),
755
- "Run 'kibi migrate' to re-derive inventories that drifted with the semantic advisor (it lists any that need a manual fix), or run kb_model mode analyze (CLI: semantic-advisor) with the complete requirement prose and preserve its inventory contract.",
760
+ ...(uninventoried.length > 0
761
+ ? [
762
+ `${uninventoried.join(", ")} state(s) no inventory, which 'kibi migrate' does not derive: for each, run kb_model mode analyze (CLI: semantic-advisor) with the requirement's id and its complete semantic_text, then write the returned inventory contract into the requirement (kb_upsert with semantic_inventory, semantic_inventory_version, semantic_source_field, semantic_source_hash and logic_claims), or retire it through a superseding requirement.`,
763
+ ]
764
+ : []),
765
+ ...(uninventoried.length < inventoryFailures.length
766
+ ? [
767
+ "Run 'kibi migrate' to re-derive inventories that drifted with the semantic advisor (it lists any that need a manual fix), or run kb_model mode analyze with the requirement's id and complete prose and preserve its inventory contract.",
768
+ ]
769
+ : []),
756
770
  ].join("\n"));
757
771
  }
758
772
  // Collect INVALID_AUTHORING diagnostics
@@ -1 +1 @@
1
- {"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../../src/extractors/markdown.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../../src/extractors/markdown.ts"],"names":[],"mappings":"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"}
@@ -234,23 +234,36 @@ function isVerificationScope(value) {
234
234
  function isVerificationPerspective(value) {
235
235
  return value === "internal" || value === "consumer";
236
236
  }
237
- function parseFrontmatter(content) {
237
+ /**
238
+ * Splits a document into its front matter block and body. Delimiters are
239
+ * whole lines of `---`; a `---` glued onto a value (`priority: must---`) or
240
+ * inside a value does not close the block.
241
+ */
242
+ function splitFrontmatter(content) {
238
243
  const trimmedStart = content.trimStart();
239
- if (!trimmedStart.startsWith("---")) {
240
- return { data: {}, content };
244
+ const opening = /^---[^\S\r\n]*(?:\r?\n|$)/.exec(trimmedStart);
245
+ if (!opening) {
246
+ return null;
241
247
  }
242
- const parts = trimmedStart.split("---");
243
- if (parts.length < 3) {
244
- return { data: {}, content };
248
+ const rest = trimmedStart.slice(opening[0].length);
249
+ const closing = /^---[^\S\r\n]*(?:\r?\n|$)/m.exec(rest);
250
+ if (!closing) {
251
+ return "unclosed";
245
252
  }
246
- const frontmatter = parts[1];
247
- if (frontmatter === undefined) {
253
+ return {
254
+ frontmatter: rest.slice(0, closing.index),
255
+ body: rest.slice(closing.index + closing[0].length),
256
+ };
257
+ }
258
+ function parseFrontmatter(content) {
259
+ const split = splitFrontmatter(content);
260
+ if (split === null || split === "unclosed") {
248
261
  return { data: {}, content };
249
262
  }
250
- const parsed = yamlLoad(frontmatter);
263
+ const parsed = yamlLoad(split.frontmatter);
251
264
  return {
252
265
  data: isObjectRecord(parsed) ? parsed : {},
253
- content: parts.slice(2).join("---"),
266
+ content: split.body,
254
267
  };
255
268
  }
256
269
  /**
@@ -280,14 +293,12 @@ export function requirementSemanticText(body) {
280
293
  return legacyRequirementSemanticText(withoutContextSections(body));
281
294
  }
282
295
  function hasLikelyUnquotedColonInTitle(content) {
283
- if (!content.trim().startsWith("---")) {
284
- return false;
285
- }
286
- const parts = content.split("---");
287
- if (parts.length < 2) {
288
- return false;
289
- }
290
- const frontmatter = parts[1];
296
+ const split = splitFrontmatter(content);
297
+ const frontmatter = split === null
298
+ ? undefined
299
+ : split === "unclosed"
300
+ ? content
301
+ : split.frontmatter;
291
302
  return frontmatter
292
303
  ? /^\s*title:\s*(?!["'])(?![>|])[^#\n]*:\s+\S.*$/m.test(frontmatter)
293
304
  : false;
@@ -343,16 +354,13 @@ data, entityType) {
343
354
  // implements REQ-007, REQ-004
344
355
  function extractFromMarkdownContent(content, filePath) {
345
356
  try {
346
- const { data, content: body } = parseFrontmatter(content);
347
- if (content.trim().startsWith("---")) {
348
- const parts = content.split("---");
349
- if (parts.length < 3) {
350
- throw new FrontmatterError("Missing closing --- delimiter", filePath, {
351
- classification: "Missing closing ---",
352
- hint: "Ensure the frontmatter is enclosed between two '---' delimiters.",
353
- });
354
- }
357
+ if (splitFrontmatter(content) === "unclosed") {
358
+ throw new FrontmatterError("Missing closing --- delimiter", filePath, {
359
+ classification: "Missing closing ---",
360
+ hint: "Ensure the frontmatter is enclosed between two '---' delimiter lines; a '---' appended to the last value does not close it.",
361
+ });
355
362
  }
363
+ const { data, content: body } = parseFrontmatter(content);
356
364
  const type = data.type || inferTypeFromPath(filePath);
357
365
  if (!type) {
358
366
  throw new FrontmatterError("Could not determine entity type from path or frontmatter", filePath, {
@@ -717,14 +725,8 @@ function extractFromMarkdownContent(content, filePath) {
717
725
  hint =
718
726
  'Wrap values containing colons in quotes (e.g., title: "Foo: Bar").';
719
727
  }
720
- else if (!content.trim().startsWith("---") ||
721
- content.split("---").length < 3) {
722
- if (content.trim().startsWith("---") &&
723
- content.split("---").length < 3) {
724
- classification = "Missing closing ---";
725
- hint =
726
- "Ensure the frontmatter is enclosed between two '---' delimiters.";
727
- }
728
+ else if (splitFrontmatter(content) === null) {
729
+ // No front matter block: keep the generic classification.
728
730
  }
729
731
  else if (message.includes("unexpected end of the stream") ||
730
732
  message.includes("flow collection") ||
@@ -1 +1 @@
1
- {"version":3,"file":"intent-search.d.ts","sourceRoot":"","sources":["../src/intent-search.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"intent-search.d.ts","sourceRoot":"","sources":["../src/intent-search.ts"],"names":[],"mappings":"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"}
@@ -116,8 +116,35 @@ const AMBIGUOUS_MARGIN = 0.05;
116
116
  const MAX_CANDIDATES = 10_000;
117
117
  const MAX_GRAPH_SEEDS = 5;
118
118
  const MAX_GRAPH_EDGES = 2_000;
119
+ // A code identifier names its words without spaces ("canExport",
120
+ // "toggleViewMode"). An entity keeps it whole and also reads it word by
121
+ // word; a question reads it word by word only, so the identifier does not
122
+ // weigh twice. A question about a helper then meets the requirement that
123
+ // uses its words.
124
+ const CAMEL_IDENTIFIER = /[A-Za-z0-9]*[a-z0-9][A-Z][A-Za-z0-9]*/g;
125
+ function splitIdentifier(identifier) {
126
+ return identifier.replace(/([a-z0-9])([A-Z])/g, "$1 $2");
127
+ }
128
+ function expandIdentifiers(value) {
129
+ return value.replace(CAMEL_IDENTIFIER, (identifier) => `${identifier} ${splitIdentifier(identifier)}`);
130
+ }
131
+ /**
132
+ * The question's topic text: identifiers expanded, and the paths it also
133
+ * passes as `sourceLocations` removed. Those paths already reach the
134
+ * search as source evidence; their words ("src", "services", "ts") are not
135
+ * the topic and would only dilute the words that are.
136
+ */
137
+ function topicText(query, locations = []) {
138
+ let topic = query;
139
+ for (const location of locations) {
140
+ const located = location.path.replace(/^\.\//, "");
141
+ if (located.length > 0)
142
+ topic = topic.split(located).join(" ");
143
+ }
144
+ return topic.replace(CAMEL_IDENTIFIER, splitIdentifier);
145
+ }
119
146
  function normalize(value) {
120
- return value
147
+ return expandIdentifiers(value)
121
148
  .trim()
122
149
  .toLowerCase()
123
150
  .replace(/[-_]+/g, " ")
@@ -406,13 +433,14 @@ async function readBodies(entities, workspaceRoot, cache) {
406
433
  }
407
434
  // implements REQ-kibi-intent-aware-source-discovery, REQ-bootstrap-provenance-stubs
408
435
  export async function rankIntentEntities(entities, options, workspaceRoot, graphEdges = [], bodyCache = new Map()) {
409
- const queryTokens = tokens(options.query);
436
+ const query = topicText(options.query, options.sourceLocations);
437
+ const queryTokens = tokens(query);
410
438
  const facets = facetValues(options.semanticFacets);
411
439
  const facetTokens = facets.flatMap((facet) => tokens(facet.value));
412
440
  const allTokens = Array.from(new Set([...queryTokens, ...facetTokens]));
413
441
  // Each clause of a compound question is also scored on its own, so the
414
442
  // words of one clause do not dilute a match on another.
415
- const clauseTokenSets = queryClauses(options.query).map((clause) => Array.from(new Set([...clause, ...facetTokens])));
443
+ const clauseTokenSets = queryClauses(query).map((clause) => Array.from(new Set([...clause, ...facetTokens])));
416
444
  const bodies = await readBodies(entities, workspaceRoot, bodyCache);
417
445
  const documentFrequency = buildDocumentFrequency(entities, bodies);
418
446
  const supersededIds = new Set(graphEdges
@@ -586,7 +614,7 @@ async function queryGraphEdges(prolog, seedIds) {
586
614
  }
587
615
  async function loadIntentCandidates(prolog, options) {
588
616
  const terms = [
589
- options.query,
617
+ topicText(options.query, options.sourceLocations),
590
618
  ...facetValues(options.semanticFacets).map((facet) => facet.value),
591
619
  ].filter((term, index, all) => term.trim() && all.indexOf(term) === index);
592
620
  const candidates = new Map();
@@ -1,5 +1,11 @@
1
1
  import type { OperationContext } from "../../public/operations/runtime-types.js";
2
- import type { ActivationPolicy } from "./types.js";
2
+ import type { ActivationPolicy, Candidate } from "./types.js";
3
3
  export declare function missingManifestActivation(vendored: boolean, projectSignal: boolean): ActivationPolicy;
4
+ /**
5
+ * On a seeded KB the plan may hold declared intent claims, already
6
+ * deduplicated against the existing KB. Such a plan is applicable like a thin
7
+ * bootstrap plan; a seeded plan holding anything else stays a handoff.
8
+ */
9
+ export declare function claimPlanActivation(policy: ActivationPolicy, candidates: readonly Candidate[]): ActivationPolicy;
4
10
  export declare function classifyActivation(context: OperationContext, files?: readonly string[]): Promise<ActivationPolicy>;
5
11
  //# sourceMappingURL=activation.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"activation.d.ts","sourceRoot":"","sources":["../../../src/operations/bootstrap/activation.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0CAA0C,CAAC;AAGjF,OAAO,KAAK,EAAE,gBAAgB,EAAmB,MAAM,YAAY,CAAC;AAIpE,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,OAAO,EACjB,aAAa,EAAE,OAAO,GACrB,gBAAgB,CAIlB;AAmHD,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,gBAAgB,EACzB,KAAK,GAAE,SAAS,MAAM,EAAO,GAC5B,OAAO,CAAC,gBAAgB,CAAC,CAyE3B"}
1
+ {"version":3,"file":"activation.d.ts","sourceRoot":"","sources":["../../../src/operations/bootstrap/activation.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0CAA0C,CAAC;AAGjF,OAAO,KAAK,EAAE,gBAAgB,EAAmB,SAAS,EAAE,MAAM,YAAY,CAAC;AAI/E,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,OAAO,EACjB,aAAa,EAAE,OAAO,GACrB,gBAAgB,CAIlB;AAkED;;;;GAIG;AAGH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,gBAAgB,EACxB,UAAU,EAAE,SAAS,SAAS,EAAE,GAC/B,gBAAgB,CAelB;AAyDD,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,gBAAgB,EACzB,KAAK,GAAE,SAAS,MAAM,EAAO,GAC5B,OAAO,CAAC,gBAAgB,CAAC,CAyE3B"}