kibi-cli 2.38.0 → 2.40.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 (222) hide show
  1. package/dist/cli-json-command.d.ts.map +1 -1
  2. package/dist/cli-json-command.js +4 -0
  3. package/dist/cli-register-foundation.js +2 -2
  4. package/dist/cli-register-reporting.d.ts.map +1 -1
  5. package/dist/cli-register-reporting.js +1 -0
  6. package/dist/cli.d.ts.map +1 -1
  7. package/dist/cli.js +3 -0
  8. package/dist/commands/check.d.ts.map +1 -1
  9. package/dist/commands/check.js +33 -9
  10. package/dist/commands/coverage.d.ts +1 -0
  11. package/dist/commands/coverage.d.ts.map +1 -1
  12. package/dist/commands/coverage.js +40 -0
  13. package/dist/commands/doctor.d.ts +5 -0
  14. package/dist/commands/doctor.d.ts.map +1 -1
  15. package/dist/commands/doctor.js +29 -0
  16. package/dist/commands/init.d.ts.map +1 -1
  17. package/dist/commands/init.js +4 -0
  18. package/dist/commands/migrate-plan-record.d.ts +18 -0
  19. package/dist/commands/migrate-plan-record.d.ts.map +1 -0
  20. package/dist/commands/migrate-plan-record.js +112 -0
  21. package/dist/commands/migrate.d.ts +11 -2
  22. package/dist/commands/migrate.d.ts.map +1 -1
  23. package/dist/commands/migrate.js +60 -8
  24. package/dist/commands/prove.d.ts.map +1 -1
  25. package/dist/commands/prove.js +18 -3
  26. package/dist/commands/sync/manifest.d.ts.map +1 -1
  27. package/dist/commands/sync/manifest.js +17 -4
  28. package/dist/commands/sync/persistence.d.ts.map +1 -1
  29. package/dist/commands/sync/persistence.js +6 -0
  30. package/dist/commands/sync.d.ts.map +1 -1
  31. package/dist/commands/sync.js +8 -0
  32. package/dist/commands/telemetry.d.ts.map +1 -1
  33. package/dist/commands/telemetry.js +12 -2
  34. package/dist/extractors/markdown.d.ts +6 -0
  35. package/dist/extractors/markdown.d.ts.map +1 -1
  36. package/dist/extractors/markdown.js +21 -0
  37. package/dist/extractors/symbol-title-match.d.ts +31 -0
  38. package/dist/extractors/symbol-title-match.d.ts.map +1 -0
  39. package/dist/extractors/symbol-title-match.js +133 -0
  40. package/dist/extractors/symbols-coordinator.d.ts.map +1 -1
  41. package/dist/extractors/symbols-coordinator.js +81 -12
  42. package/dist/operations/bootstrap/discovery-evidence.d.ts.map +1 -1
  43. package/dist/operations/bootstrap/discovery-evidence.js +44 -2
  44. package/dist/operations/bootstrap/discovery.d.ts.map +1 -1
  45. package/dist/operations/bootstrap/discovery.js +1 -0
  46. package/dist/operations/bootstrap/guidance-actions.d.ts.map +1 -1
  47. package/dist/operations/bootstrap/guidance-actions.js +12 -1
  48. package/dist/operations/bootstrap/plugin-offers.d.ts +7 -1
  49. package/dist/operations/bootstrap/plugin-offers.d.ts.map +1 -1
  50. package/dist/operations/bootstrap/plugin-offers.js +73 -3
  51. package/dist/operations/modeling/logic-modeling.d.ts.map +1 -1
  52. package/dist/operations/modeling/logic-modeling.js +2 -1
  53. package/dist/operations/modeling/model-requirement.d.ts.map +1 -1
  54. package/dist/operations/modeling/model-requirement.js +2 -1
  55. package/dist/operations/mutation/symbol-refresh.d.ts +2 -0
  56. package/dist/operations/mutation/symbol-refresh.d.ts.map +1 -1
  57. package/dist/operations/mutation/symbol-refresh.js +6 -1
  58. package/dist/operations/mutation/upsert.d.ts.map +1 -1
  59. package/dist/operations/mutation/upsert.js +7 -0
  60. package/dist/operations/planning/compile-intent.d.ts.map +1 -1
  61. package/dist/operations/planning/compile-intent.js +2 -1
  62. package/dist/operations/proof/claim-bindings.d.ts +11 -0
  63. package/dist/operations/proof/claim-bindings.d.ts.map +1 -1
  64. package/dist/operations/proof/claim-bindings.js +144 -1
  65. package/dist/operations/proof/code-certificates.d.ts +10 -3
  66. package/dist/operations/proof/code-certificates.d.ts.map +1 -1
  67. package/dist/operations/proof/code-certificates.js +65 -13
  68. package/dist/operations/proof/code-languages.d.ts +104 -0
  69. package/dist/operations/proof/code-languages.d.ts.map +1 -0
  70. package/dist/operations/proof/code-languages.js +119 -0
  71. package/dist/operations/proof/code-models.d.ts +2 -0
  72. package/dist/operations/proof/code-models.d.ts.map +1 -1
  73. package/dist/operations/proof/code-models.js +11 -5
  74. package/dist/operations/proof/code-runner.d.ts +12 -9
  75. package/dist/operations/proof/code-runner.d.ts.map +1 -1
  76. package/dist/operations/proof/code-runner.js +81 -38
  77. package/dist/operations/proof/code-scope.d.ts +8 -0
  78. package/dist/operations/proof/code-scope.d.ts.map +1 -1
  79. package/dist/operations/proof/code-scope.js +30 -1
  80. package/dist/operations/proof/explain.d.ts +76 -0
  81. package/dist/operations/proof/explain.d.ts.map +1 -1
  82. package/dist/operations/proof/explain.js +228 -0
  83. package/dist/operations/proof/ingest-proof.d.ts +2 -0
  84. package/dist/operations/proof/ingest-proof.d.ts.map +1 -1
  85. package/dist/operations/proof/ingest-proof.js +1 -0
  86. package/dist/operations/proof/java-package-shadow.d.ts +14 -0
  87. package/dist/operations/proof/java-package-shadow.d.ts.map +1 -0
  88. package/dist/operations/proof/java-package-shadow.js +389 -0
  89. package/dist/operations/proof/prolog-evaluator.d.ts +14 -0
  90. package/dist/operations/proof/prolog-evaluator.d.ts.map +1 -0
  91. package/dist/operations/proof/prolog-evaluator.js +247 -0
  92. package/dist/operations/proof/prolog-source-reader.d.ts +20 -0
  93. package/dist/operations/proof/prolog-source-reader.d.ts.map +1 -0
  94. package/dist/operations/proof/prolog-source-reader.js +1123 -0
  95. package/dist/operations/proof/source-code-readers.d.ts +6 -0
  96. package/dist/operations/proof/source-code-readers.d.ts.map +1 -1
  97. package/dist/operations/proof/source-code-readers.js +879 -75
  98. package/dist/operations/semantic-advisor/analyze-prose.d.ts +9 -1
  99. package/dist/operations/semantic-advisor/analyze-prose.d.ts.map +1 -1
  100. package/dist/operations/semantic-advisor/analyze-prose.js +21 -0
  101. package/dist/operations/semantic-advisor/case-preview.d.ts +24 -0
  102. package/dist/operations/semantic-advisor/case-preview.d.ts.map +1 -0
  103. package/dist/operations/semantic-advisor/case-preview.js +216 -0
  104. package/dist/operations/semantic-advisor/shared.d.ts.map +1 -1
  105. package/dist/operations/semantic-advisor/shared.js +3 -0
  106. package/dist/operations/semantic-advisor/types.d.ts +23 -0
  107. package/dist/operations/semantic-advisor/types.d.ts.map +1 -1
  108. package/dist/plugins/approved-source-analyzers.generated.d.ts +15 -34
  109. package/dist/plugins/approved-source-analyzers.generated.d.ts.map +1 -1
  110. package/dist/plugins/approved-source-analyzers.generated.js +15 -34
  111. package/dist/plugins/plugin-install-check.d.ts +21 -0
  112. package/dist/plugins/plugin-install-check.d.ts.map +1 -0
  113. package/dist/plugins/plugin-install-check.js +62 -0
  114. package/dist/plugins/proof-reference-extractors.d.ts +20 -0
  115. package/dist/plugins/proof-reference-extractors.d.ts.map +1 -0
  116. package/dist/plugins/proof-reference-extractors.js +104 -0
  117. package/dist/plugins/reference-language-suggestion.d.ts +51 -0
  118. package/dist/plugins/reference-language-suggestion.d.ts.map +1 -0
  119. package/dist/plugins/reference-language-suggestion.js +277 -0
  120. package/dist/plugins/registry.d.ts.map +1 -1
  121. package/dist/plugins/registry.js +3 -1
  122. package/dist/plugins/source-analysis-service.d.ts.map +1 -1
  123. package/dist/plugins/source-analysis-service.js +4 -0
  124. package/dist/plugins/source-change-analysis.d.ts +26 -1
  125. package/dist/plugins/source-change-analysis.d.ts.map +1 -1
  126. package/dist/plugins/source-change-analysis.js +77 -5
  127. package/dist/plugins/source-classification.d.ts +2 -2
  128. package/dist/plugins/source-classification.d.ts.map +1 -1
  129. package/dist/plugins/source-classification.js +45 -1
  130. package/dist/public/operations/catalog.d.ts +62 -7
  131. package/dist/public/operations/catalog.d.ts.map +1 -1
  132. package/dist/public/operations/check-executor.d.ts.map +1 -1
  133. package/dist/public/operations/check-executor.js +3 -0
  134. package/dist/public/operations/evidence-floor.d.ts +8 -0
  135. package/dist/public/operations/evidence-floor.d.ts.map +1 -1
  136. package/dist/public/operations/evidence-floor.js +19 -1
  137. package/dist/public/operations/repair-plan.d.ts +46 -0
  138. package/dist/public/operations/repair-plan.d.ts.map +1 -1
  139. package/dist/public/operations/repair-plan.js +110 -1
  140. package/dist/public/operations/schema6-check-actions.js +1 -1
  141. package/dist/public/operations/specs/check-rules.generated.d.ts +1 -1
  142. package/dist/public/operations/specs/check-rules.generated.d.ts.map +1 -1
  143. package/dist/public/operations/specs/check-rules.generated.js +3 -1
  144. package/dist/public/operations/specs/check.d.ts +1 -1
  145. package/dist/public/operations/specs/mutation-schemas.d.ts +61 -6
  146. package/dist/public/operations/specs/mutation-schemas.d.ts.map +1 -1
  147. package/dist/public/operations/specs/mutation-schemas.js +30 -0
  148. package/dist/public/operations/specs/reporting.d.ts +8 -0
  149. package/dist/public/operations/specs/reporting.d.ts.map +1 -1
  150. package/dist/public/operations/specs/reporting.js +26 -3
  151. package/dist/public/operations/specs/semantic.d.ts.map +1 -1
  152. package/dist/public/operations/specs/semantic.js +2 -1
  153. package/dist/public/operations/specs/upsert.d.ts +61 -6
  154. package/dist/public/operations/specs/upsert.d.ts.map +1 -1
  155. package/dist/public/operations/symbol-coordinates-check.d.ts +11 -0
  156. package/dist/public/operations/symbol-coordinates-check.d.ts.map +1 -0
  157. package/dist/public/operations/symbol-coordinates-check.js +66 -0
  158. package/dist/public/proof-protocol.d.ts +31 -6
  159. package/dist/public/proof-protocol.d.ts.map +1 -1
  160. package/dist/public/proof-protocol.js +45 -15
  161. package/dist/public/proof-sources.d.ts +4 -2
  162. package/dist/public/proof-sources.d.ts.map +1 -1
  163. package/dist/public/proof-sources.js +43 -4
  164. package/dist/public/schemas/entity.d.ts.map +1 -1
  165. package/dist/public/schemas/entity.js +59 -0
  166. package/dist/public/skills/kibi-commit-review/SKILL.md +6 -2
  167. package/dist/public/skills/kibi-decisions/SKILL.md +7 -2
  168. package/dist/public/skills/kibi-decisions/resources/signoff-views.md +3 -1
  169. package/dist/public/skills/kibi-usage/SKILL.md +14 -3
  170. package/dist/public/skills/kibi-usage/resources/prolog-proofs.md +207 -0
  171. package/dist/public/skills/kibi-usage/resources/proof.md +44 -3
  172. package/dist/schemas/entity.schema.json +126 -6
  173. package/dist/search-answer.d.ts +3 -2
  174. package/dist/search-answer.d.ts.map +1 -1
  175. package/dist/search-answer.js +56 -3
  176. package/dist/traceability/analysis-gate.d.ts +3 -1
  177. package/dist/traceability/analysis-gate.d.ts.map +1 -1
  178. package/dist/traceability/analysis-gate.js +9 -1
  179. package/dist/traceability/impact-knowledge.d.ts.map +1 -1
  180. package/dist/traceability/impact-knowledge.js +2 -0
  181. package/dist/traceability/staged-file-coverage.d.ts.map +1 -1
  182. package/dist/traceability/staged-file-coverage.js +7 -2
  183. package/dist/traceability/symbol-extract.d.ts +17 -0
  184. package/dist/traceability/symbol-extract.d.ts.map +1 -1
  185. package/dist/traceability/symbol-extract.js +69 -15
  186. package/dist/traceability/temp-kb.d.ts.map +1 -1
  187. package/dist/traceability/temp-kb.js +11 -1
  188. package/dist/traceability/validate.d.ts.map +1 -1
  189. package/dist/traceability/validate.js +5 -7
  190. package/dist/types/entities.d.ts +12 -0
  191. package/dist/types/entities.d.ts.map +1 -1
  192. package/dist/usage-telemetry.d.ts +9 -0
  193. package/dist/usage-telemetry.d.ts.map +1 -1
  194. package/dist/usage-telemetry.js +50 -4
  195. package/dist/utils/first-sentence.d.ts +9 -0
  196. package/dist/utils/first-sentence.d.ts.map +1 -0
  197. package/dist/utils/first-sentence.js +52 -0
  198. package/dist/utils/rule-registry.generated.d.ts +11 -0
  199. package/dist/utils/rule-registry.generated.d.ts.map +1 -1
  200. package/dist/utils/rule-registry.generated.js +13 -0
  201. package/package.json +5 -5
  202. package/schema/entities.pl +12 -0
  203. package/src/public/operations/check-executor.ts +8 -0
  204. package/src/public/operations/evidence-floor.ts +29 -1
  205. package/src/public/operations/repair-plan.ts +152 -1
  206. package/src/public/operations/schema6-check-actions.ts +1 -1
  207. package/src/public/operations/specs/check-rules.generated.ts +3 -1
  208. package/src/public/operations/specs/mutation-schemas.ts +34 -0
  209. package/src/public/operations/specs/reporting.ts +38 -3
  210. package/src/public/operations/specs/semantic.ts +2 -1
  211. package/src/public/operations/symbol-coordinates-check.ts +79 -0
  212. package/src/public/proof-protocol-types.d.ts +22 -5
  213. package/src/public/proof-protocol.ts +78 -19
  214. package/src/public/proof-sources.ts +51 -3
  215. package/src/public/schemas/entity.ts +65 -0
  216. package/src/public/skills/kibi-commit-review/SKILL.md +6 -2
  217. package/src/public/skills/kibi-decisions/SKILL.md +7 -2
  218. package/src/public/skills/kibi-decisions/resources/signoff-views.md +3 -1
  219. package/src/public/skills/kibi-usage/SKILL.md +14 -3
  220. package/src/public/skills/kibi-usage/resources/prolog-proofs.md +207 -0
  221. package/src/public/skills/kibi-usage/resources/proof.md +44 -3
  222. package/src/schemas/entity.schema.json +126 -6
@@ -1 +1 @@
1
- {"version":3,"file":"cli-json-command.d.ts","sourceRoot":"","sources":["../src/cli-json-command.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAazC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAGlE,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAIpE;AAGD;;;;GAIG;AACH,wBAAsB,mBAAmB,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAW7E;AAGD,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAC;IACtC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS;QAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;KACpC,EAAE,CAAC;CACL,CAAC;AAkDF,wBAAsB,iBAAiB,CACrC,UAAU,EAAE,cAAc,GACzB,OAAO,CAAC,IAAI,CAAC,CA+Gf"}
1
+ {"version":3,"file":"cli-json-command.d.ts","sourceRoot":"","sources":["../src/cli-json-command.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAazC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAIlE,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAIpE;AAGD;;;;GAIG;AACH,wBAAsB,mBAAmB,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAW7E;AAGD,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAC;IACtC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS;QAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;KACpC,EAAE,CAAC;CACL,CAAC;AAmDF,wBAAsB,iBAAiB,CACrC,UAAU,EAAE,cAAc,GACzB,OAAO,CAAC,IAAI,CAAC,CAgHf"}
@@ -6,6 +6,7 @@ import { executeOperation as executeProtocolOperation, openFailureResult, } from
6
6
  import { prepareOperationInput } from "./cli-validate.js";
7
7
  import { appendCliDiagnosticUsage, diagnosticEnvOptIn, } from "./public/diagnostic-usage.js";
8
8
  import { createCliRuntime } from "./runtime/cli-runtime.js";
9
+ import { noteCliErrorCategory, noteCliResultError } from "./usage-telemetry.js";
9
10
  export function writeOptionalStderr(stderr) {
10
11
  if (stderr !== undefined) {
11
12
  process.stderr.write(stderr);
@@ -31,6 +32,7 @@ export async function withConsoleOnStderr(fn) {
31
32
  }
32
33
  }
33
34
  function writeInputError(error) {
35
+ noteCliErrorCategory(error.code);
34
36
  process.stderr.write(`Error [${error.code}]: ${error.detail}\n`);
35
37
  process.exitCode = error.exitCode;
36
38
  }
@@ -173,5 +175,7 @@ export async function runJsonInvocation(invocation) {
173
175
  await writeAndWaitForDrain(process.stdout, result.stdout);
174
176
  }
175
177
  writeOptionalStderr(result.stderr);
178
+ if (result.exitCode !== 0)
179
+ noteCliResultError(result.stdout);
176
180
  process.exitCode = result.exitCode;
177
181
  }
@@ -21,8 +21,8 @@ export function registerFoundationCommands(program) {
21
21
  .option("--dry-run", "Preview migration changes without writing files")
22
22
  .option("--yes", "Apply migration changes without prompting")
23
23
  .option("--format <format>", "Output format: json|table", "table")
24
- .option("--apply-safe", "Apply only explicitly approved deterministic migration actions")
25
- .option("--approved-plan-hash <sha256>", "Exact migration plan hash approved for --apply-safe")
24
+ .option("--apply-safe [sha256]", "Apply only explicitly approved deterministic migration actions of the plan with this hash")
25
+ .option("--approved-plan-hash <sha256>", "Exact migration plan hash approved for --apply-safe (same as --apply-safe <sha256>)")
26
26
  .option("--backlog", "List every quality and coverage backlog action instead of counts per code")
27
27
  .option("--approved-action <id>", "Approve one migration action (repeatable through comma-separated IDs)", (value, previous = []) => [
28
28
  ...previous,
@@ -1 +1 @@
1
- {"version":3,"file":"cli-register-reporting.d.ts","sourceRoot":"","sources":["../src/cli-register-reporting.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAYzC,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAuRhE"}
1
+ {"version":3,"file":"cli-register-reporting.d.ts","sourceRoot":"","sources":["../src/cli-register-reporting.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAYzC,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA4RhE"}
@@ -75,6 +75,7 @@ export function registerReportingCommands(program) {
75
75
  .option("--migration-offset <n>", "Skip ready semantic-inventory migration batches", "0")
76
76
  .option("--migration-predicate-limit <n>", "Maximum ranked predicate schemas per proposition", "5")
77
77
  .option("--migration-predicate-min-score <score>", "Minimum predicate schema rank score", "0.35")
78
+ .option("--cases", "Print the edge cases derived from each requirement's typed claims, with their predicted outcome and covering scenarios", false)
78
79
  .option("--format <format>", "Output format: json|table", "table")
79
80
  .action(async (options, command) => {
80
81
  if (options.input !== undefined) {
package/dist/cli.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAsBA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAWpC,YAAY,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAMtD,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAUrD;AAED,wBAAgB,eAAe,CAC7B,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,SAAS,EAAE,MAAM,GAChB,OAAO,CAIT;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAM7D;AAGD,wBAAgB,YAAY,IAAI,OAAO,CAiBtC;AAGD,wBAAsB,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,CAkC3C;AAED,wBAAsB,kBAAkB,CACtC,YAAY,UAAoD,EAChE,KAAK,cAAO,GACX,OAAO,CAAC,IAAI,CAAC,CAGf"}
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAsBA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAWpC,YAAY,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAMtD,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAUrD;AAED,wBAAgB,eAAe,CAC7B,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,SAAS,EAAE,MAAM,GAChB,OAAO,CAIT;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAM7D;AAGD,wBAAgB,YAAY,IAAI,OAAO,CAiBtC;AAGD,wBAAsB,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,CAqC3C;AAED,wBAAsB,kBAAkB,CACtC,YAAY,UAAoD,EAChE,KAAK,cAAO,GACX,OAAO,CAAC,IAAI,CAAC,CAGf"}
package/dist/cli.js CHANGED
@@ -75,11 +75,13 @@ export async function main() {
75
75
  const program = buildProgram();
76
76
  const commandPath = trackCommandPath(program);
77
77
  let exitCode = process.exitCode ?? 0;
78
+ let failure;
78
79
  try {
79
80
  await program.parseAsync(workspace.argv);
80
81
  exitCode = process.exitCode ?? 0;
81
82
  }
82
83
  catch (error) {
84
+ failure = error;
83
85
  exitCode = exitCodeFromCliFailure(error);
84
86
  }
85
87
  try {
@@ -88,6 +90,7 @@ export async function main() {
88
90
  packageVersion: packageVersion(packageJson),
89
91
  startedAt,
90
92
  exitCode: Number(exitCode),
93
+ error: failure,
91
94
  });
92
95
  }
93
96
  catch {
@@ -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;AAsF7C,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;IACzB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AA6hBD,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,CAqsB/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":"AAsCA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAuF7C,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;IACzB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AA6hBD,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,CAyuB/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"}
@@ -20,7 +20,7 @@ import { EngineClient } from "../engine.js";
20
20
  import { extractFromManifestString } from "../extractors/manifest.js";
21
21
  import { extractFromMarkdownString, } from "../extractors/markdown.js";
22
22
  import { createMaintenanceSourceAnalysisService, fingerprintMaintenanceSourceSet, readSnapshotSourceConfig, } from "../plugins/maintenance-source-analysis.js";
23
- import { analyzeSourceChanges, assertSourceAnalysisGate, } from "../plugins/source-change-analysis.js";
23
+ import { analyzeSourceChanges, assertSourceAnalysisGate, partialAnalysisReviews, } from "../plugins/source-change-analysis.js";
24
24
  import { PrologProcess } from "../prolog.js";
25
25
  import { escapeAtom, normalizeEntityId, parseTriples, parseViolationRows, } from "../prolog/codec.js";
26
26
  import { createSemanticReviewDiagnostics, createSymbolGranularityDiagnostics, createSymbolQualityDiagnostics, hasBlockingImpactDiagnostics, } from "../public/impact-diagnostics.js";
@@ -45,7 +45,7 @@ import { classifyKibiImpactEvidence, isBehaviorSourceEdit, parseKibiImpactOverri
45
45
  import { stagedInventoryDriftViolations } from "../traceability/staged-inventory-drift.js";
46
46
  import { stagedCommitCarriesMigration } from "../traceability/staged-migration.js";
47
47
  import { assessStagedSymbolsManifest, collectStagedAuthoredSymbolsManifestEvidence, } from "../traceability/staged-symbols-manifest.js";
48
- import { createManifestLookupSentinelKey, extractSymbolsFromStagedFileAsync, } from "../traceability/symbol-extract.js";
48
+ import { createManifestLookupSentinelKey, extractSymbolsFromStagedFileAsync, partialAnalysisSymbolsUsable, } from "../traceability/symbol-extract.js";
49
49
  import { cleanupTempKb, consultOverlay, createOverlayFacts, createTempKb, projectStagedEntities, } from "../traceability/temp-kb.js";
50
50
  import { formatCoverageViolations, formatViolations as formatStagedViolations, validateStagedSymbolCoverage, validateStagedSymbols, } from "../traceability/validate.js";
51
51
  import { resolveReadBranchAttachment } from "../utils/branch-resolver.js";
@@ -321,7 +321,7 @@ function noValidatedSymbolsMessage(sourceAnalysis) {
321
321
  return [`${analysis.path}${provider}`];
322
322
  });
323
323
  if (partialFiles.length > 0) {
324
- return `Partial source analysis was reviewed for ${partialFiles.join(", ")}; no fully analyzed exported symbols or staged entities were available for symbol validation.`;
324
+ return `Partial source analysis was reviewed for ${partialFiles.join(", ")}; the staged change touches no declaration the analyzer placed and no staged entity.`;
325
325
  }
326
326
  return "No exported symbols or staged entities found in staged files.";
327
327
  }
@@ -480,12 +480,30 @@ export async function checkCommand(options) {
480
480
  const trustedSourceConfig = readSnapshotSourceConfig(snapshot, snapshot.baseTree);
481
481
  const sourceService = createMaintenanceSourceAnalysisService(process.cwd(), trustedSourceConfig);
482
482
  const sourceAnalysis = await analyzeSourceChanges(stagedInventory, sourceService);
483
+ // A partial result still places its declarations: they are checked
484
+ // like fully analyzed ones, and only a staged line in a gap outside
485
+ // them keeps the file at file-level review.
486
+ const partialReviews = partialAnalysisReviews(stagedInventory, sourceAnalysis);
487
+ const partialReviewPaths = new Set(partialReviews.map((review) => review.path));
488
+ const impactPolicyEnabled = stagedInventory.length > 0 && hasValidBaseImpactPolicy(snapshot);
489
+ const partialSymbolPaths = new Set();
483
490
  for (const file of stagedInventory) {
484
- const analysis = sourceAnalysis.get(file.path);
485
- if (analysis?.after?.status === "ok") {
491
+ const after = sourceAnalysis.get(file.path)?.after;
492
+ if (after?.status === "ok") {
486
493
  file.analysisDepth = "symbol";
487
494
  file.disposition = "checked";
488
495
  }
496
+ else if (after &&
497
+ file.status !== "D" &&
498
+ !file.skipReason &&
499
+ partialAnalysisSymbolsUsable(after)) {
500
+ partialSymbolPaths.add(file.path);
501
+ // An impact review binds the classified depth; keep it there.
502
+ if (!impactPolicyEnabled && !partialReviewPaths.has(file.path)) {
503
+ file.analysisDepth = "symbol";
504
+ file.disposition = "checked";
505
+ }
506
+ }
489
507
  }
490
508
  const mergeInherited = snapshot.mergeInherited ?? [];
491
509
  const mergeNote = mergeInherited.length > 0
@@ -495,7 +513,11 @@ export async function checkCommand(options) {
495
513
  const renameNote = renameResolved.length > 0
496
514
  ? `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.`
497
515
  : undefined;
498
- const baselineNotes = [mergeNote, renameNote].filter((note) => note !== undefined);
516
+ const baselineNotes = [
517
+ mergeNote,
518
+ renameNote,
519
+ ...partialReviews.map((review) => `Partial source analysis: staged line(s) ${review.lines.map((range) => (range.startLine === range.endLine ? `${range.startLine}` : `${range.startLine}-${range.endLine}`)).join(", ")} of ${review.path} fall outside every declaration the analyzer placed (${review.detail}); review that change at file level.`),
520
+ ].filter((note) => note !== undefined);
499
521
  const printNotedResult = (input) => {
500
522
  printStagedResult(baselineNotes.length === 0
501
523
  ? input
@@ -535,7 +557,6 @@ export async function checkCommand(options) {
535
557
  record.providerId =
536
558
  analysis.after?.providerId ?? analysis.before?.providerId ?? null;
537
559
  }
538
- const impactPolicyEnabled = stagedInventory.length > 0 && hasValidBaseImpactPolicy(snapshot);
539
560
  // One rule decides which analysis gaps block (see analysis-gate): the
540
561
  // committed side never blocks, and an after-side local gap blocks only
541
562
  // where it overlaps the staged lines. With a policy, the impact review
@@ -568,9 +589,12 @@ export async function checkCommand(options) {
568
589
  return { exitCode: 0 };
569
590
  }
570
591
  const symbolPaths = new Set(stagedInventory
571
- .filter((file) => file.analysisDepth === "symbol")
592
+ .filter((file) => file.analysisDepth === "symbol" ||
593
+ partialSymbolPaths.has(file.path))
572
594
  .map((file) => file.path));
573
- const sourceFiles = stagedFiles.filter((file) => symbolPaths.has(file.path));
595
+ const sourceFiles = supportedStagedFiles(stagedInventory.map((file) => partialSymbolPaths.has(file.path)
596
+ ? { ...file, analysisDepth: "symbol" }
597
+ : file)).filter((file) => symbolPaths.has(file.path));
574
598
  const markdownFiles = stagedFiles.filter((file) => file.path.endsWith(".md") && isEntityLanePath(file.path));
575
599
  const markdownErrors = [];
576
600
  for (const f of markdownFiles) {
@@ -12,6 +12,7 @@ interface CoverageOptions {
12
12
  migrationPredicateLimit?: string;
13
13
  migrationPredicateMinScore?: string;
14
14
  format?: "json" | "table";
15
+ cases?: boolean;
15
16
  }
16
17
  export declare function coverageCommand(options: CoverageOptions): Promise<void>;
17
18
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"coverage.d.ts","sourceRoot":"","sources":["../../src/commands/coverage.ts"],"names":[],"mappings":"AAMA,UAAU,eAAe;IACvB,EAAE,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;IAC/B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,0BAA0B,CAAC,EAAE,MAAM,CAAC;IACpC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CAC3B;AAGD,wBAAsB,eAAe,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAmC7E"}
1
+ {"version":3,"file":"coverage.d.ts","sourceRoot":"","sources":["../../src/commands/coverage.ts"],"names":[],"mappings":"AAMA,UAAU,eAAe;IACvB,EAAE,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;IAC/B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,0BAA0B,CAAC,EAAE,MAAM,CAAC;IACpC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAC1B,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAGD,wBAAsB,eAAe,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAuC7E"}
@@ -26,5 +26,45 @@ export async function coverageCommand(options) {
26
26
  migrationPredicateLimit: Number.parseInt(options.migrationPredicateLimit || "5", 10),
27
27
  migrationPredicateMinScore: Number.parseFloat(options.migrationPredicateMinScore || "0.35"),
28
28
  });
29
+ if (options.cases === true) {
30
+ printCaseTable(options.format, result.structuredContent);
31
+ return;
32
+ }
29
33
  printDiscoveryResult(options.format, result.structuredContent, result.content[0]?.text ?? "Coverage summary unavailable.");
30
34
  }
35
+ // implements REQ-kibi-case-coverage
36
+ // The edge cases of each returned requirement: one line per case with its
37
+ // predicted outcome and coverage, and the assumption an uncovered rejection
38
+ // case needs. JSON keeps the requirement id with its cases stage.
39
+ function printCaseTable(format, structured) {
40
+ const rows = Array.isArray(structured?.rows)
41
+ ? structured.rows
42
+ : [];
43
+ const withCases = rows.flatMap((row) => {
44
+ const stages = row.proofStages;
45
+ const stage = stages?.cases;
46
+ return stage?.cases?.length ? [{ id: String(row.id), stage }] : [];
47
+ });
48
+ if (format === "json") {
49
+ console.log(JSON.stringify({ rows: withCases.map(({ id, stage }) => ({ id, cases: stage })) }, null, 2));
50
+ return;
51
+ }
52
+ if (withCases.length === 0) {
53
+ console.log("No requirement in this page has derived edge cases.");
54
+ return;
55
+ }
56
+ const lines = [];
57
+ for (const { id, stage } of withCases) {
58
+ const summary = stage.summary ?? {};
59
+ lines.push(`${id}: ${stage.status} (${summary.covered ?? 0} covered, ${summary.uncovered ?? 0} uncovered, ${summary.unspecified ?? 0} unspecified, ${summary.waived ?? 0} waived)`);
60
+ for (const row of stage.cases ?? []) {
61
+ const where = row.coverage === "covered"
62
+ ? ` by ${(row.scenarios ?? []).join(", ")}`
63
+ : "";
64
+ lines.push(` ${row.caseId} ${row.factId} ${row.constraint} -> ${row.predicted}: ${row.coverage}${where}`);
65
+ if (row.coverage === "uncovered" && row.predicted === "rejection")
66
+ lines.push(` assumes ${JSON.stringify(row.assumption ?? {})}`);
67
+ }
68
+ }
69
+ console.log(lines.join("\n"));
70
+ }
@@ -1,6 +1,11 @@
1
1
  export interface DoctorOptions {
2
2
  format?: "json" | "table";
3
3
  }
4
+ /** `doctor:capability_plugins+git_hooks` for the checks that failed. */
5
+ export declare function doctorFailureCategory(results: readonly {
6
+ name: string;
7
+ passed: boolean;
8
+ }[]): string | undefined;
4
9
  export declare function doctorCommand(options?: DoctorOptions): Promise<{
5
10
  exitCode: number;
6
11
  }>;
@@ -1 +1 @@
1
- {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAgHA,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"}
1
+ {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAmHA,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CAC3B;AAGD,wEAAwE;AACxE,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,SAAS;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,EAAE,GACpD,MAAM,GAAG,SAAS,CAUpB;AAGD,wBAAsB,aAAa,CACjC,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CAyH/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"}
@@ -22,9 +22,12 @@ import * as path from "node:path";
22
22
  import { fileURLToPath } from "node:url";
23
23
  import { bootstrapKibiEnvironment, secretSourceFromBootstrap, } from "../env/bootstrap.js";
24
24
  import { kibiPackageVersions } from "../package-versions.js";
25
+ import { pluginInstallProblems } from "../plugins/plugin-install-check.js";
25
26
  import { describeConfiguredCapabilityPlugins, readProjectKibiConfig, } from "../plugins/project-config.js";
27
+ import { workspaceReferenceLanguageNote } from "../plugins/reference-language-suggestion.js";
26
28
  import { SwiplResolutionError, inspectSwiplBundle, probeRequiredLibraries, resolveSwipl, } from "../prolog/swipl-resolver.js";
27
29
  import { buildMigrationPlan, migrationAction, } from "../public/operations/migration-plan.js";
30
+ import { noteCliErrorCategory } from "../usage-telemetry.js";
28
31
  import { resolveBranchAttachment, resolveReadBranchAttachment, } from "../utils/branch-resolver.js";
29
32
  import { branchStoreCompilation, inspectBranchStore, storeLockTakeoverReason, uncompiledBranchStoreReason, } from "../utils/branch-store.js";
30
33
  import { LEGACY_KB_MIGRATION_COMMAND, LEGACY_KB_MIGRATION_NOTE, } from "../utils/config.js";
@@ -46,6 +49,17 @@ const FIRST_PARTY_PLUGIN_SECRETS = {
46
49
  /** Static Jev defaults — must stay aligned with kibi-plugin-jev (no import). */
47
50
  const JEV_DEFAULT_MODEL = "jev-latest";
48
51
  const JEV_MAX_TIMEOUT_MS = 120_000;
52
+ // implements REQ-kibi-anonymous-usage-telemetry
53
+ /** `doctor:capability_plugins+git_hooks` for the checks that failed. */
54
+ export function doctorFailureCategory(results) {
55
+ const failed = results
56
+ .filter((result) => !result.passed)
57
+ .map((result) => result.name
58
+ .toLowerCase()
59
+ .replace(/[^a-z0-9]+/g, "_")
60
+ .replace(/^_|_$/g, ""));
61
+ return failed.length === 0 ? undefined : `doctor:${failed.join("+")}`;
62
+ }
49
63
  // implements REQ-003
50
64
  export async function doctorCommand(options = {}) {
51
65
  // The repository context is per-diagnostic-run state: clearing here keeps
@@ -111,6 +125,8 @@ export async function doctorCommand(options = {}) {
111
125
  results.push({ name, ...(await check()) });
112
126
  }
113
127
  const allPassed = results.every((result) => result.passed);
128
+ // Usage telemetry names the failing checks by their fixed names.
129
+ noteCliErrorCategory(doctorFailureCategory(results));
114
130
  const warnings = results.filter((result) => result.passed && result.warning === true).length;
115
131
  const runtime = await runtimeProvenance();
116
132
  const packageActions = await packageMigrationActions(runtime);
@@ -429,10 +445,14 @@ function checkCapabilityPlugins() {
429
445
  const bootstrap = bootstrapKibiEnvironment();
430
446
  const workspaceRoot = bootstrap.workspaceRoot;
431
447
  const rows = describeConfiguredCapabilityPlugins(workspaceRoot);
448
+ const languages = workspaceReferenceLanguageNote(workspaceRoot);
432
449
  if (rows.length === 0) {
433
450
  return {
434
451
  passed: true,
435
452
  message: "None configured; builtin providers only",
453
+ ...(languages === null
454
+ ? {}
455
+ : { warning: true, remediation: languages }),
436
456
  };
437
457
  }
438
458
  const parts = rows.map((row) => `${row.package} ${row.capability} ${row.mode} declared=${row.declared ? "yes" : "no"}`);
@@ -447,6 +467,14 @@ function checkCapabilityPlugins() {
447
467
  const packages = [
448
468
  ...new Set((config.plugins ?? []).map((plugin) => plugin.package)),
449
469
  ];
470
+ const installProblems = pluginInstallProblems(workspaceRoot, packages);
471
+ if (installProblems.length > 0) {
472
+ return {
473
+ passed: false,
474
+ message: `${parts.join("; ")}; ${installProblems.map((row) => row.problem).join("; ")}`,
475
+ remediation: installProblems.map((row) => row.fix).join(" "),
476
+ };
477
+ }
450
478
  const missingSecrets = [];
451
479
  // Secrets whose plugin only augments a builtin provider: without them the
452
480
  // plugin is skipped and the builtin keeps working, so doctor warns.
@@ -499,6 +527,7 @@ function checkCapabilityPlugins() {
499
527
  return {
500
528
  passed: true,
501
529
  message,
530
+ ...(languages === null ? {} : { warning: true, remediation: languages }),
502
531
  };
503
532
  }
504
533
  catch (error) {
@@ -1 +1 @@
1
- {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AA8GA,UAAU,WAAW;IACnB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAkFD,wBAAsB,WAAW,CAC/B,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CA0L/B"}
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AA+GA,UAAU,WAAW;IACnB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAkFD,wBAAsB,WAAW,CAC/B,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CA4L/B"}
@@ -19,6 +19,7 @@ import { existsSync, lstatSync, realpathSync } from "node:fs";
19
19
  import * as path from "node:path";
20
20
  import { fileURLToPath } from "node:url";
21
21
  import { classifyActivation } from "../operations/bootstrap/activation.js";
22
+ import { workspaceReferenceLanguageNote } from "../plugins/reference-language-suggestion.js";
22
23
  import { nodeFilesystem } from "../public/operations/node-ports.js";
23
24
  import { resolveBranchAttachment } from "../utils/branch-resolver.js";
24
25
  import { readLegacyKbConfig } from "../utils/config.js";
@@ -268,6 +269,9 @@ export async function initCommand(options) {
268
269
  console.log(legacyConfig
269
270
  ? " Next: run 'kibi migrate --yes' to move the legacy knowledge into .kb/."
270
271
  : (await initNextAction(projectRoot)).message);
272
+ const plugins = workspaceReferenceLanguageNote(projectRoot);
273
+ if (plugins !== null)
274
+ console.log(` Suggested plugin: ${plugins}`);
271
275
  console.log(" Optional diagnostic: run 'kibi doctor' if setup appears degraded.");
272
276
  if (options.github === true) {
273
277
  scaffoldGitHubIntegration({
@@ -0,0 +1,18 @@
1
+ import type { MigrationPlan } from "../public/operations/migration-plan.js";
2
+ export type PrintedPlan = Readonly<{
3
+ planHash: string;
4
+ printedAt: string;
5
+ expected: MigrationPlan["expected"];
6
+ actions: readonly Readonly<{
7
+ id: string;
8
+ code: string;
9
+ state: string;
10
+ }>[];
11
+ }>;
12
+ /** Remember a plan `kibi migrate` printed; a write failure is ignored. */
13
+ export declare function recordPrintedPlan(workspaceRoot: string, plan: MigrationPlan, now?: Date): void;
14
+ /** The printed plan with this hash, if `kibi migrate` printed it here. */
15
+ export declare function findPrintedPlan(workspaceRoot: string, planHash: string): PrintedPlan | undefined;
16
+ /** What differs between a printed plan and the current one, one line each. */
17
+ export declare function describePlanChange(printed: PrintedPlan, current: MigrationPlan): string[];
18
+ //# sourceMappingURL=migrate-plan-record.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate-plan-record.d.ts","sourceRoot":"","sources":["../../src/commands/migrate-plan-record.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wCAAwC,CAAC;AAY5E,MAAM,MAAM,WAAW,GAAG,QAAQ,CAAC;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC;IACpC,OAAO,EAAE,SAAS,QAAQ,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,EAAE,CAAC;CAC3E,CAAC,CAAC;AA0BH,0EAA0E;AAC1E,wBAAgB,iBAAiB,CAC/B,aAAa,EAAE,MAAM,EACrB,IAAI,EAAE,aAAa,EACnB,GAAG,GAAE,IAAiB,GACrB,IAAI,CA0BN;AAGD,0EAA0E;AAC1E,wBAAgB,eAAe,CAC7B,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE,MAAM,GACf,WAAW,GAAG,SAAS,CAIzB;AAmBD,8EAA8E;AAC9E,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,WAAW,EACpB,OAAO,EAAE,aAAa,GACrB,MAAM,EAAE,CA0BV"}
@@ -0,0 +1,112 @@
1
+ /*
2
+ Kibi — repo-local, per-branch, queryable long-term memory for software projects
3
+ Copyright (C) 2026 Piotr Franczyk
4
+
5
+ This program is free software: you can redistribute it and/or modify
6
+ it under the terms of the GNU Affero General Public License as published by
7
+ the Free Software Foundation, either version 3 of the License, or
8
+ (at your option) any later version.
9
+
10
+ This program is distributed in the hope that it will be useful,
11
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ GNU Affero General Public License for more details.
14
+
15
+ You should have received a copy of the GNU Affero General Public License
16
+ along with this program. If not, see <https://www.gnu.org/licenses/>.
17
+ */
18
+ import * as fs from "node:fs";
19
+ import * as path from "node:path";
20
+ /**
21
+ * The migration plans `kibi migrate` printed recently, so an approval of a
22
+ * plan that has since changed can say what changed. The file lives in the
23
+ * gitignored `.kb/migrations/` and is only a reading aid: a plan applies only
24
+ * with its current hash whatever this file says.
25
+ */
26
+ const RECORD_FILE = "printed-plans.json";
27
+ const MAX_RECORDS = 8;
28
+ function recordPath(workspaceRoot) {
29
+ return path.join(workspaceRoot, ".kb", "migrations", RECORD_FILE);
30
+ }
31
+ function readRecords(workspaceRoot) {
32
+ try {
33
+ const parsed = JSON.parse(fs.readFileSync(recordPath(workspaceRoot), "utf8"));
34
+ return Array.isArray(parsed)
35
+ ? parsed.filter((entry) => typeof entry === "object" &&
36
+ entry !== null &&
37
+ typeof entry.planHash === "string" &&
38
+ Array.isArray(entry.actions))
39
+ : [];
40
+ }
41
+ catch {
42
+ return [];
43
+ }
44
+ }
45
+ // implements REQ-cli-schema-migration
46
+ /** Remember a plan `kibi migrate` printed; a write failure is ignored. */
47
+ export function recordPrintedPlan(workspaceRoot, plan, now = new Date()) {
48
+ const entry = {
49
+ planHash: plan.planHash,
50
+ printedAt: now.toISOString(),
51
+ expected: plan.expected,
52
+ actions: plan.actions.map((action) => ({
53
+ id: action.id,
54
+ code: action.code,
55
+ state: action.state,
56
+ })),
57
+ };
58
+ const records = [
59
+ entry,
60
+ ...readRecords(workspaceRoot).filter((record) => record.planHash !== plan.planHash),
61
+ ].slice(0, MAX_RECORDS);
62
+ try {
63
+ fs.mkdirSync(path.dirname(recordPath(workspaceRoot)), { recursive: true });
64
+ fs.writeFileSync(recordPath(workspaceRoot), `${JSON.stringify(records, null, 2)}\n`);
65
+ }
66
+ catch {
67
+ // The record only explains a changed plan; never fail a preview on it.
68
+ }
69
+ }
70
+ // implements REQ-cli-schema-migration
71
+ /** The printed plan with this hash, if `kibi migrate` printed it here. */
72
+ export function findPrintedPlan(workspaceRoot, planHash) {
73
+ return readRecords(workspaceRoot).find((record) => record.planHash === planHash);
74
+ }
75
+ const EXPECTED_LABELS = {
76
+ branch: "the Git branch",
77
+ kbBranch: "the KB branch",
78
+ kbSnapshotId: "the KB snapshot",
79
+ workspaceSnapshot: "the workspace files",
80
+ configHash: "the KB config",
81
+ };
82
+ /** A long hash cut to its first 12 characters; other values as they are. */
83
+ function short(value) {
84
+ if (value === null)
85
+ return "none";
86
+ return /^[0-9a-f]{20,}$/i.test(value) ? value.slice(0, 12) : value;
87
+ }
88
+ // implements REQ-cli-schema-migration
89
+ /** What differs between a printed plan and the current one, one line each. */
90
+ export function describePlanChange(printed, current) {
91
+ const lines = [];
92
+ const before = new Map(printed.actions.map((action) => [action.id, action]));
93
+ const after = new Map(current.actions.map((action) => [action.id, action]));
94
+ for (const action of current.actions) {
95
+ const old = before.get(action.id);
96
+ if (old === undefined)
97
+ lines.push(`added ${action.state} ${action.code}: ${action.id}`);
98
+ else if (old.state !== action.state)
99
+ lines.push(`${action.id} went from ${old.state} to ${action.state}`);
100
+ }
101
+ for (const action of printed.actions) {
102
+ if (!after.has(action.id))
103
+ lines.push(`removed ${action.state} ${action.code}: ${action.id}`);
104
+ }
105
+ for (const key of Object.keys(EXPECTED_LABELS)) {
106
+ const was = printed.expected?.[key] ?? null;
107
+ const now = current.expected[key];
108
+ if (was !== now)
109
+ lines.push(`${EXPECTED_LABELS[key]} changed (${short(was)} -> ${short(now)})`);
110
+ }
111
+ return lines;
112
+ }
@@ -1,9 +1,10 @@
1
- import type { MigrationAction } from "../public/operations/migration-plan.js";
1
+ import type { MigrationAction, MigrationPlan } from "../public/operations/migration-plan.js";
2
2
  interface MigrateOptions {
3
3
  dryRun?: boolean;
4
4
  yes?: boolean;
5
5
  format?: "json" | "table";
6
- applySafe?: boolean;
6
+ /** `--apply-safe [sha256]`: true, or the approved plan hash given with it. */
7
+ applySafe?: boolean | string;
7
8
  approvedPlanHash?: string;
8
9
  approvedActionIds?: string[];
9
10
  /** `--approved-action <id>` as the CLI parser spells it; same as approvedActionIds. */
@@ -60,6 +61,14 @@ export declare function migrateCommand(options?: MigrateOptions): Promise<{
60
61
  * (for example legacy links an earlier plan action already marked).
61
62
  */
62
63
  export declare function describeMigrationRun(summary: MigrationRunSummary): string;
64
+ /** The exact command that applies the plan with this hash. */
65
+ export declare function applyPlanCommand(planHash: string): string;
66
+ /**
67
+ * Why an approved hash is not the current plan's: what changed since that
68
+ * plan was printed here, when Kibi recorded it, and the command for the
69
+ * current plan.
70
+ */
71
+ export declare function planChangedMessage(workspaceRoot: string, approvedPlanHash: string, plan: MigrationPlan): string;
63
72
  /**
64
73
  * Review findings `kibi check` and `kb_status` report at any schema version:
65
74
  * quality and coverage work, not steps of the migration. A plan lists them
@@ -1 +1 @@
1
- {"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../../src/commands/migrate.ts"],"names":[],"mappings":"AAmEA,OAAO,KAAK,EACV,eAAe,EAGhB,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,wHAAwH;IACxH,oBAAoB,EAAE,MAAM,CAAC;IAC7B,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;AAqLD,wBAAgB,mBAAmB,CACjC,gBAAgB,EAAE,OAAO,EACzB,UAAU,EAAE,MAAM,GAAG,IAAI,GACxB,MAAM,CAUR;AAwXD,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,CAgkB9D;AAED;;;;GAIG;AAEH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,mBAAmB,GAAG,MAAM,CAGzE;AA8YD;;;;;GAKG;AAEH,wBAAgB,eAAe,CAC7B,MAAM,EAAE,IAAI,CAAC,eAAe,EAAE,MAAM,CAAC,GACpC,OAAO,CAOT"}
1
+ {"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../../src/commands/migrate.ts"],"names":[],"mappings":"AAmEA,OAAO,KAAK,EACV,eAAe,EACf,aAAa,EAEd,MAAM,wCAAwC,CAAC;AA8BhD,UAAU,cAAc;IACtB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAC1B,8EAA8E;IAC9E,SAAS,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAC7B,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,wHAAwH;IACxH,oBAAoB,EAAE,MAAM,CAAC;IAC7B,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;AAqLD,wBAAgB,mBAAmB,CACjC,gBAAgB,EAAE,OAAO,EACzB,UAAU,EAAE,MAAM,GAAG,IAAI,GACxB,MAAM,CAUR;AAwXD,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,CAgkB9D;AAED;;;;GAIG;AAEH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,mBAAmB,GAAG,MAAM,CAGzE;AAoUD,8DAA8D;AAE9D,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED;;;;GAIG;AAEH,wBAAgB,kBAAkB,CAChC,aAAa,EAAE,MAAM,EACrB,gBAAgB,EAAE,MAAM,EACxB,IAAI,EAAE,aAAa,GAClB,MAAM,CAeR;AAuGD;;;;;GAKG;AAEH,wBAAgB,eAAe,CAC7B,MAAM,EAAE,IAAI,CAAC,eAAe,EAAE,MAAM,CAAC,GACpC,OAAO,CAOT"}