mewkit 1.10.3 → 1.10.5

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 (197) hide show
  1. package/README.md +49 -4
  2. package/dist/commands/budget.d.ts +13 -0
  3. package/dist/commands/budget.d.ts.map +1 -1
  4. package/dist/commands/budget.js +45 -0
  5. package/dist/commands/budget.js.map +1 -1
  6. package/dist/commands/doctor-checks.d.ts +1 -1
  7. package/dist/commands/doctor-checks.d.ts.map +1 -1
  8. package/dist/commands/doctor-checks.js +7 -1
  9. package/dist/commands/doctor-checks.js.map +1 -1
  10. package/dist/commands/doctor-hard-gates.d.ts +3 -0
  11. package/dist/commands/doctor-hard-gates.d.ts.map +1 -0
  12. package/dist/commands/doctor-hard-gates.js +170 -0
  13. package/dist/commands/doctor-hard-gates.js.map +1 -0
  14. package/dist/commands/doctor.d.ts +1 -0
  15. package/dist/commands/doctor.d.ts.map +1 -1
  16. package/dist/commands/doctor.js +12 -3
  17. package/dist/commands/doctor.js.map +1 -1
  18. package/dist/commands/evolve.d.ts +11 -0
  19. package/dist/commands/evolve.d.ts.map +1 -0
  20. package/dist/commands/evolve.js +63 -0
  21. package/dist/commands/evolve.js.map +1 -0
  22. package/dist/commands/health.d.ts +14 -0
  23. package/dist/commands/health.d.ts.map +1 -0
  24. package/dist/commands/health.js +193 -0
  25. package/dist/commands/health.js.map +1 -0
  26. package/dist/commands/init.d.ts +6 -0
  27. package/dist/commands/init.d.ts.map +1 -1
  28. package/dist/commands/init.js +64 -3
  29. package/dist/commands/init.js.map +1 -1
  30. package/dist/commands/inventory.d.ts +13 -0
  31. package/dist/commands/inventory.d.ts.map +1 -0
  32. package/dist/commands/inventory.js +85 -0
  33. package/dist/commands/inventory.js.map +1 -0
  34. package/dist/commands/pack-helpers.d.ts +37 -0
  35. package/dist/commands/pack-helpers.d.ts.map +1 -0
  36. package/dist/commands/pack-helpers.js +105 -0
  37. package/dist/commands/pack-helpers.js.map +1 -0
  38. package/dist/commands/pack.d.ts +9 -0
  39. package/dist/commands/pack.d.ts.map +1 -0
  40. package/dist/commands/pack.js +160 -0
  41. package/dist/commands/pack.js.map +1 -0
  42. package/dist/commands/policy.d.ts +8 -0
  43. package/dist/commands/policy.d.ts.map +1 -0
  44. package/dist/commands/policy.js +65 -0
  45. package/dist/commands/policy.js.map +1 -0
  46. package/dist/commands/portability.d.ts +7 -0
  47. package/dist/commands/portability.d.ts.map +1 -0
  48. package/dist/commands/portability.js +50 -0
  49. package/dist/commands/portability.js.map +1 -0
  50. package/dist/commands/providers.d.ts +6 -0
  51. package/dist/commands/providers.d.ts.map +1 -0
  52. package/dist/commands/providers.js +94 -0
  53. package/dist/commands/providers.js.map +1 -0
  54. package/dist/commands/reflect.d.ts +14 -0
  55. package/dist/commands/reflect.d.ts.map +1 -0
  56. package/dist/commands/reflect.js +135 -0
  57. package/dist/commands/reflect.js.map +1 -0
  58. package/dist/commands/simulate.d.ts +14 -0
  59. package/dist/commands/simulate.d.ts.map +1 -0
  60. package/dist/commands/simulate.js +86 -0
  61. package/dist/commands/simulate.js.map +1 -0
  62. package/dist/commands/upgrade.d.ts.map +1 -1
  63. package/dist/commands/upgrade.js +22 -1
  64. package/dist/commands/upgrade.js.map +1 -1
  65. package/dist/commands/validate.d.ts +29 -0
  66. package/dist/commands/validate.d.ts.map +1 -1
  67. package/dist/commands/validate.js +242 -94
  68. package/dist/commands/validate.js.map +1 -1
  69. package/dist/core/build-inventory.d.ts +71 -0
  70. package/dist/core/build-inventory.d.ts.map +1 -0
  71. package/dist/core/build-inventory.js +222 -0
  72. package/dist/core/build-inventory.js.map +1 -0
  73. package/dist/core/check-packs.d.ts +13 -0
  74. package/dist/core/check-packs.d.ts.map +1 -0
  75. package/dist/core/check-packs.js +131 -0
  76. package/dist/core/check-packs.js.map +1 -0
  77. package/dist/core/check-stale-index.d.ts +35 -0
  78. package/dist/core/check-stale-index.d.ts.map +1 -0
  79. package/dist/core/check-stale-index.js +132 -0
  80. package/dist/core/check-stale-index.js.map +1 -0
  81. package/dist/core/check-workflow-drift.d.ts +49 -0
  82. package/dist/core/check-workflow-drift.d.ts.map +1 -0
  83. package/dist/core/check-workflow-drift.js +226 -0
  84. package/dist/core/check-workflow-drift.js.map +1 -0
  85. package/dist/core/context-budget.d.ts +9 -0
  86. package/dist/core/context-budget.d.ts.map +1 -0
  87. package/dist/core/context-budget.js +46 -0
  88. package/dist/core/context-budget.js.map +1 -0
  89. package/dist/core/event-log.d.ts +44 -0
  90. package/dist/core/event-log.d.ts.map +1 -0
  91. package/dist/core/event-log.js +169 -0
  92. package/dist/core/event-log.js.map +1 -0
  93. package/dist/core/evolution/event-clusters.d.ts +4 -0
  94. package/dist/core/evolution/event-clusters.d.ts.map +1 -0
  95. package/dist/core/evolution/event-clusters.js +82 -0
  96. package/dist/core/evolution/event-clusters.js.map +1 -0
  97. package/dist/core/evolution/recommendation-renderer.d.ts +3 -0
  98. package/dist/core/evolution/recommendation-renderer.d.ts.map +1 -0
  99. package/dist/core/evolution/recommendation-renderer.js +24 -0
  100. package/dist/core/evolution/recommendation-renderer.js.map +1 -0
  101. package/dist/core/evolution/review-failure-clusters.d.ts +10 -0
  102. package/dist/core/evolution/review-failure-clusters.d.ts.map +1 -0
  103. package/dist/core/evolution/review-failure-clusters.js +30 -0
  104. package/dist/core/evolution/review-failure-clusters.js.map +1 -0
  105. package/dist/core/evolution/suggestions.d.ts +24 -0
  106. package/dist/core/evolution/suggestions.d.ts.map +1 -0
  107. package/dist/core/evolution/suggestions.js +11 -0
  108. package/dist/core/evolution/suggestions.js.map +1 -0
  109. package/dist/core/gate-policy.d.ts +20 -0
  110. package/dist/core/gate-policy.d.ts.map +1 -0
  111. package/dist/core/gate-policy.js +64 -0
  112. package/dist/core/gate-policy.js.map +1 -0
  113. package/dist/core/harness-scaffold.d.ts +29 -0
  114. package/dist/core/harness-scaffold.d.ts.map +1 -0
  115. package/dist/core/harness-scaffold.js +53 -0
  116. package/dist/core/harness-scaffold.js.map +1 -0
  117. package/dist/core/hook-runner.d.ts +69 -0
  118. package/dist/core/hook-runner.d.ts.map +1 -0
  119. package/dist/core/hook-runner.js +95 -0
  120. package/dist/core/hook-runner.js.map +1 -0
  121. package/dist/core/index.d.ts +2 -0
  122. package/dist/core/index.d.ts.map +1 -1
  123. package/dist/core/index.js +2 -0
  124. package/dist/core/index.js.map +1 -1
  125. package/dist/core/install-metadata.d.ts +15 -0
  126. package/dist/core/install-metadata.d.ts.map +1 -1
  127. package/dist/core/install-metadata.js +11 -0
  128. package/dist/core/install-metadata.js.map +1 -1
  129. package/dist/core/is-hook-script.d.ts +2 -0
  130. package/dist/core/is-hook-script.d.ts.map +1 -0
  131. package/dist/core/is-hook-script.js +45 -0
  132. package/dist/core/is-hook-script.js.map +1 -0
  133. package/dist/core/pack-manifest.d.ts +48 -0
  134. package/dist/core/pack-manifest.d.ts.map +1 -0
  135. package/dist/core/pack-manifest.js +126 -0
  136. package/dist/core/pack-manifest.js.map +1 -0
  137. package/dist/core/pack-resolver.d.ts +18 -0
  138. package/dist/core/pack-resolver.d.ts.map +1 -0
  139. package/dist/core/pack-resolver.js +144 -0
  140. package/dist/core/pack-resolver.js.map +1 -0
  141. package/dist/core/portability-matrix.d.ts +17 -0
  142. package/dist/core/portability-matrix.d.ts.map +1 -0
  143. package/dist/core/portability-matrix.js +31 -0
  144. package/dist/core/portability-matrix.js.map +1 -0
  145. package/dist/core/simulation-runner.d.ts +93 -0
  146. package/dist/core/simulation-runner.d.ts.map +1 -0
  147. package/dist/core/simulation-runner.js +161 -0
  148. package/dist/core/simulation-runner.js.map +1 -0
  149. package/dist/core/smart-update.d.ts +24 -0
  150. package/dist/core/smart-update.d.ts.map +1 -1
  151. package/dist/core/smart-update.js +69 -0
  152. package/dist/core/smart-update.js.map +1 -1
  153. package/dist/core/usage/usage-analyzer.d.ts +18 -0
  154. package/dist/core/usage/usage-analyzer.d.ts.map +1 -0
  155. package/dist/core/usage/usage-analyzer.js +41 -0
  156. package/dist/core/usage/usage-analyzer.js.map +1 -0
  157. package/dist/core/validate-install.d.ts.map +1 -1
  158. package/dist/core/validate-install.js +3 -1
  159. package/dist/core/validate-install.js.map +1 -1
  160. package/dist/index.js +91 -4
  161. package/dist/index.js.map +1 -1
  162. package/dist/memory/archive.d.ts +9 -0
  163. package/dist/memory/archive.d.ts.map +1 -0
  164. package/dist/memory/archive.js +42 -0
  165. package/dist/memory/archive.js.map +1 -0
  166. package/dist/memory/compact.d.ts +9 -0
  167. package/dist/memory/compact.d.ts.map +1 -0
  168. package/dist/memory/compact.js +33 -0
  169. package/dist/memory/compact.js.map +1 -0
  170. package/dist/memory/conflicts.d.ts +8 -0
  171. package/dist/memory/conflicts.d.ts.map +1 -0
  172. package/dist/memory/conflicts.js +28 -0
  173. package/dist/memory/conflicts.js.map +1 -0
  174. package/dist/memory/promote.d.ts +8 -0
  175. package/dist/memory/promote.d.ts.map +1 -0
  176. package/dist/memory/promote.js +10 -0
  177. package/dist/memory/promote.js.map +1 -0
  178. package/dist/memory/store-utils.d.ts +14 -0
  179. package/dist/memory/store-utils.d.ts.map +1 -0
  180. package/dist/memory/store-utils.js +44 -0
  181. package/dist/memory/store-utils.js.map +1 -0
  182. package/dist/migrate/converters/md-to-codex-rules.d.ts.map +1 -1
  183. package/dist/migrate/converters/md-to-codex-rules.js +30 -0
  184. package/dist/migrate/converters/md-to-codex-rules.js.map +1 -1
  185. package/dist/migrate/portability-policy.d.ts.map +1 -1
  186. package/dist/migrate/portability-policy.js +45 -24
  187. package/dist/migrate/portability-policy.js.map +1 -1
  188. package/dist/migrate/provider-support-summary.d.ts +49 -0
  189. package/dist/migrate/provider-support-summary.d.ts.map +1 -0
  190. package/dist/migrate/provider-support-summary.js +98 -0
  191. package/dist/migrate/provider-support-summary.js.map +1 -0
  192. package/dist/migrate/skill-directory-audit.d.ts +4 -1
  193. package/dist/migrate/skill-directory-audit.d.ts.map +1 -1
  194. package/dist/migrate/skill-directory-audit.js +7 -1
  195. package/dist/migrate/skill-directory-audit.js.map +1 -1
  196. package/dist/migrate/types.d.ts +2 -2
  197. package/package.json +1 -1
@@ -0,0 +1,3 @@
1
+ import type { EvolutionSuggestion } from "./suggestions.js";
2
+ export declare function renderSuggestions(suggestions: EvolutionSuggestion[]): void;
3
+ //# sourceMappingURL=recommendation-renderer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recommendation-renderer.d.ts","sourceRoot":"","sources":["../../../src/core/evolution/recommendation-renderer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAM5D,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,mBAAmB,EAAE,GAAG,IAAI,CAkB1E"}
@@ -0,0 +1,24 @@
1
+ import pc from "picocolors";
2
+ function pct(n) {
3
+ return `${Math.round(n * 100)}%`;
4
+ }
5
+ export function renderSuggestions(suggestions) {
6
+ console.log(pc.bold(pc.cyan("MeowKit evolve — proposal-only suggestions")));
7
+ console.log(pc.dim("No rules, skills, hooks, packs, or policies were changed."));
8
+ console.log();
9
+ if (suggestions.length === 0) {
10
+ console.log(pc.yellow("No suggestions met the evidence threshold."));
11
+ return;
12
+ }
13
+ for (const [i, suggestion] of suggestions.entries()) {
14
+ console.log(`${pc.bold(`${i + 1}. ${suggestion.title}`)} ${pc.dim(`[${suggestion.kind}]`)}`);
15
+ console.log(` confidence ${pc.cyan(pct(suggestion.confidence))} · impact ${suggestion.impact} · risk ${suggestion.risk}`);
16
+ for (const evidence of suggestion.evidence) {
17
+ const count = evidence.count === undefined ? "" : ` (${evidence.count})`;
18
+ console.log(` - ${evidence.source}: ${evidence.detail}${count}`);
19
+ }
20
+ console.log(` proposed: ${suggestion.proposedAction}`);
21
+ console.log();
22
+ }
23
+ }
24
+ //# sourceMappingURL=recommendation-renderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recommendation-renderer.js","sourceRoot":"","sources":["../../../src/core/evolution/recommendation-renderer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAG5B,SAAS,GAAG,CAAC,CAAS;IACrB,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,WAAkC;IACnE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC,CAAC,CAAC;IAC5E,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,2DAA2D,CAAC,CAAC,CAAC;IACjF,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9B,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,4CAA4C,CAAC,CAAC,CAAC;QACrE,OAAO;IACR,CAAC;IACD,KAAK,MAAM,CAAC,CAAC,EAAE,UAAU,CAAC,IAAI,WAAW,CAAC,OAAO,EAAE,EAAE,CAAC;QACrD,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,UAAU,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,IAAI,UAAU,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC,CAAC;QAC7F,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,aAAa,UAAU,CAAC,MAAM,WAAW,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC;QAC5H,KAAK,MAAM,QAAQ,IAAI,UAAU,CAAC,QAAQ,EAAE,CAAC;YAC5C,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC,KAAK,GAAG,CAAC;YACzE,OAAO,CAAC,GAAG,CAAC,QAAQ,QAAQ,CAAC,MAAM,KAAK,QAAQ,CAAC,MAAM,GAAG,KAAK,EAAE,CAAC,CAAC;QACpE,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,gBAAgB,UAAU,CAAC,cAAc,EAAE,CAAC,CAAC;QACzD,OAAO,CAAC,GAAG,EAAE,CAAC;IACf,CAAC;AACF,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { EventRecord } from "../event-log.js";
2
+ export interface ReviewFailureCluster {
3
+ key: string;
4
+ count: number;
5
+ tasks: string[];
6
+ slug: string;
7
+ dimension?: string;
8
+ }
9
+ export declare function clusterReviewFailures(events: EventRecord[], minCount?: number): ReviewFailureCluster[];
10
+ //# sourceMappingURL=review-failure-clusters.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-failure-clusters.d.ts","sourceRoot":"","sources":["../../../src/core/evolution/review-failure-clusters.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAEnD,MAAM,WAAW,oBAAoB;IACpC,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAgBD,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,WAAW,EAAE,EAAE,QAAQ,SAAI,GAAG,oBAAoB,EAAE,CAajG"}
@@ -0,0 +1,30 @@
1
+ function str(value, fallback = "unknown") {
2
+ return typeof value === "string" && value.trim().length > 0 ? value.trim() : fallback;
3
+ }
4
+ function clusterKey(event) {
5
+ const slug = str(event.data.slug);
6
+ const dimension = str(event.data.dimension ?? event.data.rubric, "");
7
+ return {
8
+ key: dimension ? `${slug}:${dimension}` : slug,
9
+ slug,
10
+ dimension: dimension || undefined,
11
+ };
12
+ }
13
+ export function clusterReviewFailures(events, minCount = 2) {
14
+ const clusters = new Map();
15
+ for (const event of events) {
16
+ if (event.event !== "verdict_written")
17
+ continue;
18
+ if (str(event.data.overall).toUpperCase() !== "FAIL")
19
+ continue;
20
+ const { key, slug, dimension } = clusterKey(event);
21
+ const existing = clusters.get(key) ?? { key, count: 0, tasks: [], slug, dimension };
22
+ existing.count++;
23
+ const task = str(event.data.task, "");
24
+ if (task && !existing.tasks.includes(task))
25
+ existing.tasks.push(task);
26
+ clusters.set(key, existing);
27
+ }
28
+ return [...clusters.values()].filter((c) => c.count >= minCount).sort((a, b) => b.count - a.count || a.key.localeCompare(b.key));
29
+ }
30
+ //# sourceMappingURL=review-failure-clusters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-failure-clusters.js","sourceRoot":"","sources":["../../../src/core/evolution/review-failure-clusters.ts"],"names":[],"mappings":"AAUA,SAAS,GAAG,CAAC,KAAc,EAAE,QAAQ,GAAG,SAAS;IAChD,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC;AACvF,CAAC;AAED,SAAS,UAAU,CAAC,KAAkB;IACrC,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,SAAS,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACrE,OAAO;QACN,GAAG,EAAE,SAAS,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,SAAS,EAAE,CAAC,CAAC,CAAC,IAAI;QAC9C,IAAI;QACJ,SAAS,EAAE,SAAS,IAAI,SAAS;KACjC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,MAAqB,EAAE,QAAQ,GAAG,CAAC;IACxE,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAgC,CAAC;IACzD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC5B,IAAI,KAAK,CAAC,KAAK,KAAK,iBAAiB;YAAE,SAAS;QAChD,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,KAAK,MAAM;YAAE,SAAS;QAC/D,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;QACnD,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;QACpF,QAAQ,CAAC,KAAK,EAAE,CAAC;QACjB,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACtC,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtE,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAC7B,CAAC;IACD,OAAO,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAClI,CAAC"}
@@ -0,0 +1,24 @@
1
+ export type SuggestionKind = "hook-test" | "review-promotion" | "policy" | "trace-hardening" | "regression-scenario" | "pack-pruning" | "memory-conflict" | "memory-archive";
2
+ export type EvidenceStatus = "available" | "insufficient" | "na";
3
+ export interface SuggestionEvidence {
4
+ source: string;
5
+ detail: string;
6
+ count?: number;
7
+ status?: EvidenceStatus;
8
+ }
9
+ export interface EvolutionSuggestion {
10
+ kind: SuggestionKind;
11
+ title: string;
12
+ evidence: SuggestionEvidence[];
13
+ confidence: number;
14
+ impact: "low" | "medium" | "high";
15
+ risk: "low" | "medium" | "high";
16
+ proposedAction: string;
17
+ neverAutoApply: true;
18
+ }
19
+ export declare function makeSuggestion(args: Omit<EvolutionSuggestion, "neverAutoApply">): EvolutionSuggestion;
20
+ export declare function filterSuggestions(suggestions: EvolutionSuggestion[], opts: {
21
+ minConfidence?: number;
22
+ kind?: string;
23
+ }): EvolutionSuggestion[];
24
+ //# sourceMappingURL=suggestions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"suggestions.d.ts","sourceRoot":"","sources":["../../../src/core/evolution/suggestions.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,cAAc,GACvB,WAAW,GACX,kBAAkB,GAClB,QAAQ,GACR,iBAAiB,GACjB,qBAAqB,GACrB,cAAc,GACd,iBAAiB,GACjB,gBAAgB,CAAC;AAEpB,MAAM,MAAM,cAAc,GAAG,WAAW,GAAG,cAAc,GAAG,IAAI,CAAC;AAEjE,MAAM,WAAW,kBAAkB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,cAAc,CAAC;CACxB;AAED,MAAM,WAAW,mBAAmB;IACnC,IAAI,EAAE,cAAc,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,kBAAkB,EAAE,CAAC;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;IAClC,IAAI,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;IAChC,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,IAAI,CAAC;CACrB;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,mBAAmB,EAAE,gBAAgB,CAAC,GAAG,mBAAmB,CAErG;AAED,wBAAgB,iBAAiB,CAChC,WAAW,EAAE,mBAAmB,EAAE,EAClC,IAAI,EAAE;IAAE,aAAa,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAC7C,mBAAmB,EAAE,CAMvB"}
@@ -0,0 +1,11 @@
1
+ export function makeSuggestion(args) {
2
+ return { ...args, neverAutoApply: true };
3
+ }
4
+ export function filterSuggestions(suggestions, opts) {
5
+ const min = opts.minConfidence ?? 0;
6
+ return suggestions
7
+ .filter((s) => s.confidence >= min)
8
+ .filter((s) => !opts.kind || s.kind === opts.kind)
9
+ .sort((a, b) => b.confidence - a.confidence || a.kind.localeCompare(b.kind) || a.title.localeCompare(b.title));
10
+ }
11
+ //# sourceMappingURL=suggestions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"suggestions.js","sourceRoot":"","sources":["../../../src/core/evolution/suggestions.ts"],"names":[],"mappings":"AA8BA,MAAM,UAAU,cAAc,CAAC,IAAiD;IAC/E,OAAO,EAAE,GAAG,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,iBAAiB,CAChC,WAAkC,EAClC,IAA+C;IAE/C,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,IAAI,CAAC,CAAC;IACpC,OAAO,WAAW;SAChB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,IAAI,GAAG,CAAC;SAClC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC;SACjD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;AACjH,CAAC"}
@@ -0,0 +1,20 @@
1
+ export type GatePolicyProfile = "strict" | "balanced" | "lightweight";
2
+ export interface GatePolicy {
3
+ profile: GatePolicyProfile;
4
+ planGate: "hard" | "advisory";
5
+ requireApprovedPlan: boolean;
6
+ contractGate: "hard" | "optional" | "off";
7
+ reviewGate: "hard" | "hard-on-fail" | "advisory";
8
+ buildVerify: "on";
9
+ humanApproval: "required" | "selected" | "optional";
10
+ }
11
+ export declare const POLICY_PRESETS: Record<GatePolicyProfile, GatePolicy>;
12
+ export declare function policyPath(claudeDir: string): string;
13
+ export declare function parsePolicyProfile(value: string | undefined): GatePolicyProfile | null;
14
+ export declare function readGatePolicy(claudeDir: string): {
15
+ policy: GatePolicy;
16
+ source: string;
17
+ error?: string;
18
+ };
19
+ export declare function writeGatePolicy(claudeDir: string, profile: GatePolicyProfile): void;
20
+ //# sourceMappingURL=gate-policy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gate-policy.d.ts","sourceRoot":"","sources":["../../src/core/gate-policy.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,iBAAiB,GAAG,QAAQ,GAAG,UAAU,GAAG,aAAa,CAAC;AAEtE,MAAM,WAAW,UAAU;IAC1B,OAAO,EAAE,iBAAiB,CAAC;IAC3B,QAAQ,EAAE,MAAM,GAAG,UAAU,CAAC;IAC9B,mBAAmB,EAAE,OAAO,CAAC;IAC7B,YAAY,EAAE,MAAM,GAAG,UAAU,GAAG,KAAK,CAAC;IAC1C,UAAU,EAAE,MAAM,GAAG,cAAc,GAAG,UAAU,CAAC;IACjD,WAAW,EAAE,IAAI,CAAC;IAClB,aAAa,EAAE,UAAU,GAAG,UAAU,GAAG,UAAU,CAAC;CACpD;AAED,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,iBAAiB,EAAE,UAAU,CA4BhE,CAAC;AAEF,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,iBAAiB,GAAG,IAAI,CAEtF;AAED,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG;IAAE,MAAM,EAAE,UAAU,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAWxG;AAED,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,GAAG,IAAI,CAUnF"}
@@ -0,0 +1,64 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ export const POLICY_PRESETS = {
4
+ strict: {
5
+ profile: "strict",
6
+ planGate: "hard",
7
+ requireApprovedPlan: true,
8
+ contractGate: "hard",
9
+ reviewGate: "hard",
10
+ buildVerify: "on",
11
+ humanApproval: "required",
12
+ },
13
+ balanced: {
14
+ profile: "balanced",
15
+ planGate: "hard",
16
+ requireApprovedPlan: false,
17
+ contractGate: "optional",
18
+ reviewGate: "hard-on-fail",
19
+ buildVerify: "on",
20
+ humanApproval: "selected",
21
+ },
22
+ lightweight: {
23
+ profile: "lightweight",
24
+ planGate: "advisory",
25
+ requireApprovedPlan: false,
26
+ contractGate: "off",
27
+ reviewGate: "advisory",
28
+ buildVerify: "on",
29
+ humanApproval: "optional",
30
+ },
31
+ };
32
+ export function policyPath(claudeDir) {
33
+ return path.join(claudeDir, "policy.json");
34
+ }
35
+ export function parsePolicyProfile(value) {
36
+ return value === "strict" || value === "balanced" || value === "lightweight" ? value : null;
37
+ }
38
+ export function readGatePolicy(claudeDir) {
39
+ const p = policyPath(claudeDir);
40
+ if (!fs.existsSync(p))
41
+ return { policy: POLICY_PRESETS.balanced, source: "default" };
42
+ try {
43
+ const parsed = JSON.parse(fs.readFileSync(p, "utf-8"));
44
+ const profile = parsePolicyProfile(parsed.profile);
45
+ if (!profile)
46
+ return { policy: POLICY_PRESETS.strict, source: p, error: "unknown profile; failing safe as strict" };
47
+ return { policy: POLICY_PRESETS[profile], source: p };
48
+ }
49
+ catch {
50
+ return { policy: POLICY_PRESETS.strict, source: p, error: "unreadable policy; failing safe as strict" };
51
+ }
52
+ }
53
+ export function writeGatePolicy(claudeDir, profile) {
54
+ const p = policyPath(claudeDir);
55
+ const tmp = `${p}.tmp`;
56
+ const body = {
57
+ profile,
58
+ updatedAt: new Date().toISOString(),
59
+ note: "Privacy and prompt-injection blocks are never disabled by policy profiles.",
60
+ };
61
+ fs.writeFileSync(tmp, `${JSON.stringify(body, null, 2)}\n`, "utf-8");
62
+ fs.renameSync(tmp, p);
63
+ }
64
+ //# sourceMappingURL=gate-policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gate-policy.js","sourceRoot":"","sources":["../../src/core/gate-policy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAc7B,MAAM,CAAC,MAAM,cAAc,GAA0C;IACpE,MAAM,EAAE;QACP,OAAO,EAAE,QAAQ;QACjB,QAAQ,EAAE,MAAM;QAChB,mBAAmB,EAAE,IAAI;QACzB,YAAY,EAAE,MAAM;QACpB,UAAU,EAAE,MAAM;QAClB,WAAW,EAAE,IAAI;QACjB,aAAa,EAAE,UAAU;KACzB;IACD,QAAQ,EAAE;QACT,OAAO,EAAE,UAAU;QACnB,QAAQ,EAAE,MAAM;QAChB,mBAAmB,EAAE,KAAK;QAC1B,YAAY,EAAE,UAAU;QACxB,UAAU,EAAE,cAAc;QAC1B,WAAW,EAAE,IAAI;QACjB,aAAa,EAAE,UAAU;KACzB;IACD,WAAW,EAAE;QACZ,OAAO,EAAE,aAAa;QACtB,QAAQ,EAAE,UAAU;QACpB,mBAAmB,EAAE,KAAK;QAC1B,YAAY,EAAE,KAAK;QACnB,UAAU,EAAE,UAAU;QACtB,WAAW,EAAE,IAAI;QACjB,aAAa,EAAE,UAAU;KACzB;CACD,CAAC;AAEF,MAAM,UAAU,UAAU,CAAC,SAAiB;IAC3C,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,KAAyB;IAC3D,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,UAAU,IAAI,KAAK,KAAK,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;AAC7F,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,SAAiB;IAC/C,MAAM,CAAC,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;IAChC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IACrF,IAAI,CAAC;QACJ,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,OAAO,CAAC,CAAyB,CAAC;QAC/E,MAAM,OAAO,GAAG,kBAAkB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACnD,IAAI,CAAC,OAAO;YAAE,OAAO,EAAE,MAAM,EAAE,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,yCAAyC,EAAE,CAAC;QACpH,OAAO,EAAE,MAAM,EAAE,cAAc,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;IACvD,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,EAAE,MAAM,EAAE,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,2CAA2C,EAAE,CAAC;IACzG,CAAC;AACF,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,SAAiB,EAAE,OAA0B;IAC5E,MAAM,CAAC,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;IAChC,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC;IACvB,MAAM,IAAI,GAAG;QACZ,OAAO;QACP,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,IAAI,EAAE,4EAA4E;KAClF,CAAC;IACF,EAAE,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACrE,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;AACvB,CAAC"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Build a throwaway project that mirrors a real MeowKit install closely enough to
3
+ * run its configured hooks: the entire `.claude/hooks/` tree (including `lib/`, so
4
+ * relative `source` paths resolve under CLAUDE_PROJECT_DIR) plus `.claude/settings.json`.
5
+ *
6
+ * Shared by the configured-hook integration tests and `doctor --hard-gates` so there
7
+ * is exactly one "mkdtemp + copy .claude" implementation. Tests/probes mutate plan and
8
+ * `.env` state inside the temp dir, never the source repo.
9
+ */
10
+ export interface HarnessProject {
11
+ /** Absolute path to the temp project root (use as CLAUDE_PROJECT_DIR). */
12
+ dir: string;
13
+ /** Remove the temp project. Safe to call multiple times. */
14
+ cleanup: () => void;
15
+ /** Create a plan file so Gate 1 passes. Returns the plan path. */
16
+ addPlan: (opts?: {
17
+ nested?: boolean;
18
+ approved?: boolean;
19
+ slug?: string;
20
+ }) => string;
21
+ /** Remove all plan files (return Gate 1 to the no-plan state). */
22
+ clearPlans: () => void;
23
+ /** Create a sensitive file (default `.env`) in the project root. Returns its path. */
24
+ addEnvFile: (name?: string) => string;
25
+ }
26
+ /** True if `<srcRoot>/.claude/settings.json` and the hooks tree exist. */
27
+ export declare function hasHarness(srcRoot: string): boolean;
28
+ export declare function scaffoldHarnessProject(srcRoot: string): HarnessProject;
29
+ //# sourceMappingURL=harness-scaffold.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"harness-scaffold.d.ts","sourceRoot":"","sources":["../../src/core/harness-scaffold.ts"],"names":[],"mappings":"AAIA;;;;;;;;GAQG;AAEH,MAAM,WAAW,cAAc;IAC9B,0EAA0E;IAC1E,GAAG,EAAE,MAAM,CAAC;IACZ,4DAA4D;IAC5D,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,kEAAkE;IAClE,OAAO,EAAE,CAAC,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,MAAM,CAAC;IACpF,kEAAkE;IAClE,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,sFAAsF;IACtF,UAAU,EAAE,CAAC,IAAI,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;CACtC;AAWD,0EAA0E;AAC1E,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAKnD;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,cAAc,CAsCtE"}
@@ -0,0 +1,53 @@
1
+ import fs from "node:fs";
2
+ import os from "node:os";
3
+ import path from "node:path";
4
+ function copyClaudeHarness(srcRoot, destRoot) {
5
+ const claudeSrc = path.join(srcRoot, ".claude");
6
+ const claudeDst = path.join(destRoot, ".claude");
7
+ fs.mkdirSync(claudeDst, { recursive: true });
8
+ // Whole hooks tree (incl. lib/) so each hook's relative `source` resolves.
9
+ fs.cpSync(path.join(claudeSrc, "hooks"), path.join(claudeDst, "hooks"), { recursive: true });
10
+ fs.copyFileSync(path.join(claudeSrc, "settings.json"), path.join(claudeDst, "settings.json"));
11
+ }
12
+ /** True if `<srcRoot>/.claude/settings.json` and the hooks tree exist. */
13
+ export function hasHarness(srcRoot) {
14
+ return (fs.existsSync(path.join(srcRoot, ".claude", "settings.json")) &&
15
+ fs.existsSync(path.join(srcRoot, ".claude", "hooks")));
16
+ }
17
+ export function scaffoldHarnessProject(srcRoot) {
18
+ const dir = fs.mkdtempSync(path.join(os.tmpdir(), "mewkit-hardgate-"));
19
+ copyClaudeHarness(srcRoot, dir);
20
+ const plansDir = path.join(dir, "tasks", "plans");
21
+ fs.mkdirSync(plansDir, { recursive: true });
22
+ fs.mkdirSync(path.join(dir, "tasks", "contracts"), { recursive: true });
23
+ fs.writeFileSync(path.join(dir, "CLAUDE.md"), "# test project\n");
24
+ const frontmatter = (approved) => `---\nstatus: ${approved ? "approved" : "pending"}\n---\n# plan\n`;
25
+ return {
26
+ dir,
27
+ cleanup: () => fs.rmSync(dir, { recursive: true, force: true }),
28
+ addPlan: (opts = {}) => {
29
+ const slug = opts.slug ?? "260531-demo";
30
+ let planPath;
31
+ if (opts.nested) {
32
+ const planDir = path.join(plansDir, slug);
33
+ fs.mkdirSync(planDir, { recursive: true });
34
+ planPath = path.join(planDir, "plan.md");
35
+ }
36
+ else {
37
+ planPath = path.join(plansDir, `${slug}.md`);
38
+ }
39
+ fs.writeFileSync(planPath, frontmatter(opts.approved ?? false));
40
+ return planPath;
41
+ },
42
+ clearPlans: () => {
43
+ fs.rmSync(plansDir, { recursive: true, force: true });
44
+ fs.mkdirSync(plansDir, { recursive: true });
45
+ },
46
+ addEnvFile: (name = ".env") => {
47
+ const envPath = path.join(dir, name);
48
+ fs.writeFileSync(envPath, "SECRET=do-not-read\n");
49
+ return envPath;
50
+ },
51
+ };
52
+ }
53
+ //# sourceMappingURL=harness-scaffold.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"harness-scaffold.js","sourceRoot":"","sources":["../../src/core/harness-scaffold.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,69 @@
1
+ /**
2
+ * Replays a Claude Code hook exactly as `.claude/settings.json` configures it:
3
+ * same interpreter, same script, JSON on stdin (NOT positional args). This is the
4
+ * single source of truth shared by the configured-hook integration tests and the
5
+ * `doctor --hard-gates` probes — neither hardcodes `bash`, so both reproduce the
6
+ * real invocation (and would catch an `sh`/dash runtime mismatch).
7
+ */
8
+ export interface HookCommand {
9
+ /** The raw command string from settings.json. */
10
+ raw: string;
11
+ /** First token of the command — e.g. "bash", "sh", "node". */
12
+ interpreter: string;
13
+ /** Script path as written in settings.json (may contain `$CLAUDE_PROJECT_DIR`). */
14
+ scriptRef: string;
15
+ /** Basename of the script, for filtering/identification. */
16
+ script: string;
17
+ }
18
+ export interface HookRunResult {
19
+ script: string;
20
+ interpreter: string;
21
+ status: number | null;
22
+ stdout: string;
23
+ stderr: string;
24
+ }
25
+ export interface HookToolInput {
26
+ file_path?: string;
27
+ command?: string;
28
+ [key: string]: unknown;
29
+ }
30
+ export interface RunConfiguredHookOptions {
31
+ projectDir: string;
32
+ event: string;
33
+ /** Concrete tool name (e.g. "Write") matched against each group's `matcher` regex. */
34
+ tool?: string;
35
+ /** tool_name field in the stdin JSON; defaults to `tool`. */
36
+ toolName?: string;
37
+ toolInput?: HookToolInput;
38
+ extraEnv?: Record<string, string>;
39
+ /** Skip non-shell (e.g. node) commands. Default true — shell hooks are the runtime-mismatch surface. */
40
+ shellOnly?: boolean;
41
+ /** If set, only run the command whose script basename equals this value. */
42
+ only?: string;
43
+ /** Script basenames to skip (e.g. a slow bootstrap hook irrelevant to the probe). */
44
+ exclude?: string[];
45
+ }
46
+ interface HookEntry {
47
+ type?: string;
48
+ command?: string;
49
+ }
50
+ interface HookGroup {
51
+ matcher?: string;
52
+ hooks?: HookEntry[];
53
+ }
54
+ interface SettingsShape {
55
+ hooks?: Record<string, HookGroup[]>;
56
+ }
57
+ /**
58
+ * Walk settings.hooks[event], returning every command whose group matches `tool`.
59
+ * Pure — does not expand `$CLAUDE_PROJECT_DIR` (that happens at run time).
60
+ */
61
+ export declare function parseHookCommands(settings: SettingsShape, event: string, tool?: string): HookCommand[];
62
+ /**
63
+ * Reconstruct and run the configured hook commands for one event/tool against
64
+ * `projectDir`, feeding the canonical JSON-on-stdin payload. Returns one result
65
+ * per executed command (in settings order).
66
+ */
67
+ export declare function runConfiguredHook(settings: SettingsShape, opts: RunConfiguredHookOptions): HookRunResult[];
68
+ export {};
69
+ //# sourceMappingURL=hook-runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hook-runner.d.ts","sourceRoot":"","sources":["../../src/core/hook-runner.ts"],"names":[],"mappings":"AAGA;;;;;;GAMG;AAEH,MAAM,WAAW,WAAW;IAC3B,iDAAiD;IACjD,GAAG,EAAE,MAAM,CAAC;IACZ,8DAA8D;IAC9D,WAAW,EAAE,MAAM,CAAC;IACpB,mFAAmF;IACnF,SAAS,EAAE,MAAM,CAAC;IAClB,4DAA4D;IAC5D,MAAM,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,aAAa;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,aAAa;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,wBAAwB;IACxC,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,sFAAsF;IACtF,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,6DAA6D;IAC7D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,aAAa,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,wGAAwG;IACxG,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,4EAA4E;IAC5E,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,qFAAqF;IACrF,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,UAAU,SAAS;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;CACjB;AACD,UAAU,SAAS;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,SAAS,EAAE,CAAC;CACpB;AACD,UAAU,aAAa;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;CACpC;AA0BD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,WAAW,EAAE,CAatG;AAMD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,aAAa,EAAE,IAAI,EAAE,wBAAwB,GAAG,aAAa,EAAE,CAoC1G"}
@@ -0,0 +1,95 @@
1
+ import { spawnSync } from "node:child_process";
2
+ import path from "node:path";
3
+ const SHELL_INTERPRETERS = new Set(["sh", "bash", "dash", "zsh"]);
4
+ /** First token + first double-quoted argument of a hook command string. */
5
+ function parseCommand(raw) {
6
+ const interpMatch = raw.match(/^(\S+)\s+"([^"]+)"/);
7
+ if (!interpMatch)
8
+ return null;
9
+ const interpreter = interpMatch[1] ?? "";
10
+ const scriptRef = interpMatch[2] ?? "";
11
+ return { raw, interpreter, scriptRef, script: path.basename(scriptRef) };
12
+ }
13
+ /** Does a concrete tool name satisfy a group's matcher regex (e.g. "Edit|Write")? */
14
+ function matcherMatches(groupMatcher, tool) {
15
+ // Matcher-less groups (SessionStart, Stop, …) apply to the event unconditionally.
16
+ if (!groupMatcher)
17
+ return true;
18
+ // A matcher present but no concrete tool requested → include (caller wants all).
19
+ if (!tool)
20
+ return true;
21
+ try {
22
+ return new RegExp(`^(?:${groupMatcher})$`).test(tool);
23
+ }
24
+ catch {
25
+ return groupMatcher === tool;
26
+ }
27
+ }
28
+ /**
29
+ * Walk settings.hooks[event], returning every command whose group matches `tool`.
30
+ * Pure — does not expand `$CLAUDE_PROJECT_DIR` (that happens at run time).
31
+ */
32
+ export function parseHookCommands(settings, event, tool) {
33
+ const groups = settings.hooks?.[event];
34
+ if (!Array.isArray(groups))
35
+ return [];
36
+ const out = [];
37
+ for (const group of groups) {
38
+ if (!matcherMatches(group.matcher, tool))
39
+ continue;
40
+ for (const entry of group.hooks ?? []) {
41
+ if (typeof entry.command !== "string")
42
+ continue;
43
+ const parsed = parseCommand(entry.command);
44
+ if (parsed)
45
+ out.push(parsed);
46
+ }
47
+ }
48
+ return out;
49
+ }
50
+ function expandScriptRef(scriptRef, projectDir) {
51
+ return scriptRef.replace(/\$\{?CLAUDE_PROJECT_DIR\}?/g, projectDir);
52
+ }
53
+ /**
54
+ * Reconstruct and run the configured hook commands for one event/tool against
55
+ * `projectDir`, feeding the canonical JSON-on-stdin payload. Returns one result
56
+ * per executed command (in settings order).
57
+ */
58
+ export function runConfiguredHook(settings, opts) {
59
+ const shellOnly = opts.shellOnly !== false;
60
+ const commands = parseHookCommands(settings, opts.event, opts.tool);
61
+ const input = JSON.stringify({
62
+ hook_event_name: opts.event,
63
+ tool_name: opts.toolName ?? opts.tool ?? "",
64
+ tool_input: opts.toolInput ?? {},
65
+ session_id: "hook-runner",
66
+ cwd: opts.projectDir,
67
+ transcript_path: "",
68
+ });
69
+ const results = [];
70
+ for (const cmd of commands) {
71
+ if (shellOnly && !SHELL_INTERPRETERS.has(cmd.interpreter))
72
+ continue;
73
+ if (opts.only && cmd.script !== opts.only)
74
+ continue;
75
+ if (opts.exclude?.includes(cmd.script))
76
+ continue;
77
+ const scriptPath = expandScriptRef(cmd.scriptRef, opts.projectDir);
78
+ const proc = spawnSync(cmd.interpreter, [scriptPath], {
79
+ cwd: opts.projectDir,
80
+ input,
81
+ encoding: "utf8",
82
+ timeout: 15000,
83
+ env: { ...process.env, CLAUDE_PROJECT_DIR: opts.projectDir, ...opts.extraEnv },
84
+ });
85
+ results.push({
86
+ script: cmd.script,
87
+ interpreter: cmd.interpreter,
88
+ status: proc.status,
89
+ stdout: proc.stdout ?? "",
90
+ stderr: proc.stderr ?? "",
91
+ });
92
+ }
93
+ return results;
94
+ }
95
+ //# sourceMappingURL=hook-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hook-runner.js","sourceRoot":"","sources":["../../src/core/hook-runner.ts"],"names":[],"mappings":"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"}
@@ -14,4 +14,6 @@ export * from "./release-metadata.js";
14
14
  export * from "./core-logger.js";
15
15
  export * from "./skills-dependencies.js";
16
16
  export * from "./dependency-installer.js";
17
+ export * from "./pack-manifest.js";
18
+ export * from "./pack-resolver.js";
17
19
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,yDAAyD;AACzD,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,qBAAqB,CAAC;AACpC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC;AAClC,cAAc,yBAAyB,CAAC;AACxC,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,uBAAuB,CAAC;AACtC,cAAc,kBAAkB,CAAC;AACjC,cAAc,0BAA0B,CAAC;AACzC,cAAc,2BAA2B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,yDAAyD;AACzD,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,qBAAqB,CAAC;AACpC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC;AAClC,cAAc,yBAAyB,CAAC;AACxC,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,uBAAuB,CAAC;AACtC,cAAc,kBAAkB,CAAC;AACjC,cAAc,0BAA0B,CAAC;AACzC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC"}
@@ -14,4 +14,6 @@ export * from "./release-metadata.js";
14
14
  export * from "./core-logger.js";
15
15
  export * from "./skills-dependencies.js";
16
16
  export * from "./dependency-installer.js";
17
+ export * from "./pack-manifest.js";
18
+ export * from "./pack-resolver.js";
17
19
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,yDAAyD;AACzD,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,qBAAqB,CAAC;AACpC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC;AAClC,cAAc,yBAAyB,CAAC;AACxC,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,uBAAuB,CAAC;AACtC,cAAc,kBAAkB,CAAC;AACjC,cAAc,0BAA0B,CAAC;AACzC,cAAc,2BAA2B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,yDAAyD;AACzD,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,qBAAqB,CAAC;AACpC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC;AAClC,cAAc,yBAAyB,CAAC;AACxC,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,uBAAuB,CAAC;AACtC,cAAc,kBAAkB,CAAC;AACjC,cAAc,0BAA0B,CAAC;AACzC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC"}
@@ -70,6 +70,13 @@ export declare const InstallMetadataSchema: z.ZodObject<{
70
70
  }, {
71
71
  merged: string[];
72
72
  }>>;
73
+ /** Installed profile name ("full" for a whole-tree install). */
74
+ profile: z.ZodOptional<z.ZodString>;
75
+ /**
76
+ * Resolved pack list for a partial install. Absent/undefined is the "full,
77
+ * auto-adopt new packs on upgrade" sentinel — never a frozen all-packs list.
78
+ */
79
+ packs: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
73
80
  }, "strip", z.ZodTypeAny, {
74
81
  version: string;
75
82
  files: {
@@ -89,6 +96,8 @@ export declare const InstallMetadataSchema: z.ZodObject<{
89
96
  settings?: {
90
97
  merged: string[];
91
98
  } | undefined;
99
+ profile?: string | undefined;
100
+ packs?: string[] | undefined;
92
101
  }, {
93
102
  version: string;
94
103
  files: {
@@ -108,6 +117,8 @@ export declare const InstallMetadataSchema: z.ZodObject<{
108
117
  settings?: {
109
118
  merged: string[];
110
119
  } | undefined;
120
+ profile?: string | undefined;
121
+ packs?: string[] | undefined;
111
122
  }>;
112
123
  export type InstallMetadata = z.infer<typeof InstallMetadataSchema>;
113
124
  export type MetadataSource = "new" | "legacy-manifest" | "legacy-metadata" | "none";
@@ -147,6 +158,10 @@ export interface BuildInstallMetadataOptions {
147
158
  scope?: string;
148
159
  /** settings.json files merged this install. */
149
160
  mergedSettings?: string[];
161
+ /** Installed profile name (recorded verbatim; "full" for whole-tree installs). */
162
+ profile?: string;
163
+ /** Resolved pack list for a partial install; omit for full/legacy (sentinel). */
164
+ packs?: string[];
150
165
  }
151
166
  /**
152
167
  * Scan an installed `.claude/` and build canonical metadata. Ownership for kit
@@ -1 +1 @@
1
- {"version":3,"file":"install-metadata.d.ts","sourceRoot":"","sources":["../../src/core/install-metadata.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,yBAAyB,kBAAkB,CAAC;AAEzD,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;EASjC,CAAC;AACH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAEtE,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAQhC,CAAC;AACH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEpE,MAAM,MAAM,cAAc,GAAG,KAAK,GAAG,iBAAiB,GAAG,iBAAiB,GAAG,MAAM,CAAC;AACpF,MAAM,WAAW,yBAAyB;IACzC,MAAM,EAAE,cAAc,CAAC;IACvB,IAAI,EAAE,eAAe,GAAG,IAAI,CAAC;CAC7B;AAED,0FAA0F;AAC1F,qBAAa,2BAA4B,SAAQ,KAAK;aACzB,MAAM,EAAE,MAAM;gBAAd,MAAM,EAAE,MAAM;CAI1C;AAED,+DAA+D;AAC/D,wBAAgB,WAAW,CAAC,OAAO,EAAE,gBAAgB,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAIzF;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,yBAAyB,CAyChF;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,CAAC,SAAS,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CAGpF;AA6BD,MAAM,WAAW,2BAA2B;IAC3C,qDAAqD;IACrD,OAAO,EAAE,MAAM,CAAC;IAChB,0EAA0E;IAC1E,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1C,oEAAoE;IACpE,kBAAkB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IACtD,oDAAoD;IACpD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+CAA+C;IAC/C,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,2BAA2B,GAAG,eAAe,CA2C1G"}
1
+ {"version":3,"file":"install-metadata.d.ts","sourceRoot":"","sources":["../../src/core/install-metadata.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,yBAAyB,kBAAkB,CAAC;AAEzD,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;EASjC,CAAC;AACH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAEtE,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAQjC,gEAAgE;;IAEhE;;;OAGG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAEF,CAAC;AACH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEpE,MAAM,MAAM,cAAc,GAAG,KAAK,GAAG,iBAAiB,GAAG,iBAAiB,GAAG,MAAM,CAAC;AACpF,MAAM,WAAW,yBAAyB;IACzC,MAAM,EAAE,cAAc,CAAC;IACvB,IAAI,EAAE,eAAe,GAAG,IAAI,CAAC;CAC7B;AAED,0FAA0F;AAC1F,qBAAa,2BAA4B,SAAQ,KAAK;aACzB,MAAM,EAAE,MAAM;gBAAd,MAAM,EAAE,MAAM;CAI1C;AAED,+DAA+D;AAC/D,wBAAgB,WAAW,CAAC,OAAO,EAAE,gBAAgB,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAIzF;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,yBAAyB,CAyChF;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,CAAC,SAAS,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CAGpF;AA6BD,MAAM,WAAW,2BAA2B;IAC3C,qDAAqD;IACrD,OAAO,EAAE,MAAM,CAAC;IAChB,0EAA0E;IAC1E,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1C,oEAAoE;IACpE,kBAAkB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IACtD,oDAAoD;IACpD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+CAA+C;IAC/C,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,kFAAkF;IAClF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,iFAAiF;IACjF,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,2BAA2B,GAAG,eAAe,CA6C1G"}
@@ -26,6 +26,13 @@ export const InstallMetadataSchema = z.object({
26
26
  installedAt: z.string(),
27
27
  files: z.array(InstallFileEntrySchema),
28
28
  settings: z.object({ merged: z.array(z.string()) }).optional(),
29
+ /** Installed profile name ("full" for a whole-tree install). */
30
+ profile: z.string().optional(),
31
+ /**
32
+ * Resolved pack list for a partial install. Absent/undefined is the "full,
33
+ * auto-adopt new packs on upgrade" sentinel — never a frozen all-packs list.
34
+ */
35
+ packs: z.array(z.string()).optional(),
29
36
  });
30
37
  /** Thrown when a canonical metadata.json carries `schemaVersion` but fails validation. */
31
38
  export class CorruptInstallMetadataError extends Error {
@@ -175,6 +182,10 @@ export function buildInstallMetadata(claudeDir, opts) {
175
182
  meta.scope = opts.scope;
176
183
  if (opts.mergedSettings && opts.mergedSettings.length > 0)
177
184
  meta.settings = { merged: opts.mergedSettings };
185
+ if (opts.profile)
186
+ meta.profile = opts.profile;
187
+ if (opts.packs)
188
+ meta.packs = opts.packs;
178
189
  return meta;
179
190
  }
180
191
  //# sourceMappingURL=install-metadata.js.map