mewkit 1.10.2 → 1.10.4

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 (231) 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 +77 -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 +32 -6
  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/compute-checksums.d.ts +7 -0
  86. package/dist/core/compute-checksums.d.ts.map +1 -1
  87. package/dist/core/compute-checksums.js +12 -3
  88. package/dist/core/compute-checksums.js.map +1 -1
  89. package/dist/core/context-budget.d.ts +9 -0
  90. package/dist/core/context-budget.d.ts.map +1 -0
  91. package/dist/core/context-budget.js +46 -0
  92. package/dist/core/context-budget.js.map +1 -0
  93. package/dist/core/event-log.d.ts +44 -0
  94. package/dist/core/event-log.d.ts.map +1 -0
  95. package/dist/core/event-log.js +169 -0
  96. package/dist/core/event-log.js.map +1 -0
  97. package/dist/core/evolution/event-clusters.d.ts +4 -0
  98. package/dist/core/evolution/event-clusters.d.ts.map +1 -0
  99. package/dist/core/evolution/event-clusters.js +82 -0
  100. package/dist/core/evolution/event-clusters.js.map +1 -0
  101. package/dist/core/evolution/recommendation-renderer.d.ts +3 -0
  102. package/dist/core/evolution/recommendation-renderer.d.ts.map +1 -0
  103. package/dist/core/evolution/recommendation-renderer.js +24 -0
  104. package/dist/core/evolution/recommendation-renderer.js.map +1 -0
  105. package/dist/core/evolution/review-failure-clusters.d.ts +10 -0
  106. package/dist/core/evolution/review-failure-clusters.d.ts.map +1 -0
  107. package/dist/core/evolution/review-failure-clusters.js +30 -0
  108. package/dist/core/evolution/review-failure-clusters.js.map +1 -0
  109. package/dist/core/evolution/suggestions.d.ts +24 -0
  110. package/dist/core/evolution/suggestions.d.ts.map +1 -0
  111. package/dist/core/evolution/suggestions.js +11 -0
  112. package/dist/core/evolution/suggestions.js.map +1 -0
  113. package/dist/core/file-lock.d.ts +3 -0
  114. package/dist/core/file-lock.d.ts.map +1 -0
  115. package/dist/core/file-lock.js +84 -0
  116. package/dist/core/file-lock.js.map +1 -0
  117. package/dist/core/gate-policy.d.ts +20 -0
  118. package/dist/core/gate-policy.d.ts.map +1 -0
  119. package/dist/core/gate-policy.js +64 -0
  120. package/dist/core/gate-policy.js.map +1 -0
  121. package/dist/core/harness-scaffold.d.ts +29 -0
  122. package/dist/core/harness-scaffold.d.ts.map +1 -0
  123. package/dist/core/harness-scaffold.js +53 -0
  124. package/dist/core/harness-scaffold.js.map +1 -0
  125. package/dist/core/hook-runner.d.ts +69 -0
  126. package/dist/core/hook-runner.d.ts.map +1 -0
  127. package/dist/core/hook-runner.js +95 -0
  128. package/dist/core/hook-runner.js.map +1 -0
  129. package/dist/core/index.d.ts +6 -0
  130. package/dist/core/index.d.ts.map +1 -1
  131. package/dist/core/index.js +6 -0
  132. package/dist/core/index.js.map +1 -1
  133. package/dist/core/install-metadata-backref.d.ts +14 -0
  134. package/dist/core/install-metadata-backref.d.ts.map +1 -0
  135. package/dist/core/install-metadata-backref.js +39 -0
  136. package/dist/core/install-metadata-backref.js.map +1 -0
  137. package/dist/core/install-metadata-writer.d.ts +4 -0
  138. package/dist/core/install-metadata-writer.d.ts.map +1 -0
  139. package/dist/core/install-metadata-writer.js +31 -0
  140. package/dist/core/install-metadata-writer.js.map +1 -0
  141. package/dist/core/install-metadata.d.ts +173 -0
  142. package/dist/core/install-metadata.d.ts.map +1 -0
  143. package/dist/core/install-metadata.js +191 -0
  144. package/dist/core/install-metadata.js.map +1 -0
  145. package/dist/core/is-hook-script.d.ts +2 -0
  146. package/dist/core/is-hook-script.d.ts.map +1 -0
  147. package/dist/core/is-hook-script.js +45 -0
  148. package/dist/core/is-hook-script.js.map +1 -0
  149. package/dist/core/pack-manifest.d.ts +48 -0
  150. package/dist/core/pack-manifest.d.ts.map +1 -0
  151. package/dist/core/pack-manifest.js +126 -0
  152. package/dist/core/pack-manifest.js.map +1 -0
  153. package/dist/core/pack-resolver.d.ts +18 -0
  154. package/dist/core/pack-resolver.d.ts.map +1 -0
  155. package/dist/core/pack-resolver.js +144 -0
  156. package/dist/core/pack-resolver.js.map +1 -0
  157. package/dist/core/portability-matrix.d.ts +17 -0
  158. package/dist/core/portability-matrix.d.ts.map +1 -0
  159. package/dist/core/portability-matrix.js +31 -0
  160. package/dist/core/portability-matrix.js.map +1 -0
  161. package/dist/core/release-metadata.d.ts +80 -0
  162. package/dist/core/release-metadata.d.ts.map +1 -0
  163. package/dist/core/release-metadata.js +70 -0
  164. package/dist/core/release-metadata.js.map +1 -0
  165. package/dist/core/simulation-runner.d.ts +93 -0
  166. package/dist/core/simulation-runner.d.ts.map +1 -0
  167. package/dist/core/simulation-runner.js +161 -0
  168. package/dist/core/simulation-runner.js.map +1 -0
  169. package/dist/core/smart-update.d.ts +32 -0
  170. package/dist/core/smart-update.d.ts.map +1 -1
  171. package/dist/core/smart-update.js +239 -47
  172. package/dist/core/smart-update.js.map +1 -1
  173. package/dist/core/usage/usage-analyzer.d.ts +18 -0
  174. package/dist/core/usage/usage-analyzer.d.ts.map +1 -0
  175. package/dist/core/usage/usage-analyzer.js +41 -0
  176. package/dist/core/usage/usage-analyzer.js.map +1 -0
  177. package/dist/core/validate-install.d.ts.map +1 -1
  178. package/dist/core/validate-install.js +3 -1
  179. package/dist/core/validate-install.js.map +1 -1
  180. package/dist/index.js +91 -4
  181. package/dist/index.js.map +1 -1
  182. package/dist/memory/archive.d.ts +9 -0
  183. package/dist/memory/archive.d.ts.map +1 -0
  184. package/dist/memory/archive.js +42 -0
  185. package/dist/memory/archive.js.map +1 -0
  186. package/dist/memory/compact.d.ts +9 -0
  187. package/dist/memory/compact.d.ts.map +1 -0
  188. package/dist/memory/compact.js +33 -0
  189. package/dist/memory/compact.js.map +1 -0
  190. package/dist/memory/conflicts.d.ts +8 -0
  191. package/dist/memory/conflicts.d.ts.map +1 -0
  192. package/dist/memory/conflicts.js +28 -0
  193. package/dist/memory/conflicts.js.map +1 -0
  194. package/dist/memory/promote.d.ts +8 -0
  195. package/dist/memory/promote.d.ts.map +1 -0
  196. package/dist/memory/promote.js +10 -0
  197. package/dist/memory/promote.js.map +1 -0
  198. package/dist/memory/store-utils.d.ts +14 -0
  199. package/dist/memory/store-utils.d.ts.map +1 -0
  200. package/dist/memory/store-utils.js +44 -0
  201. package/dist/memory/store-utils.js.map +1 -0
  202. package/dist/migrate/converters/md-to-codex-rules.d.ts.map +1 -1
  203. package/dist/migrate/converters/md-to-codex-rules.js +30 -0
  204. package/dist/migrate/converters/md-to-codex-rules.js.map +1 -1
  205. package/dist/migrate/migrate-orchestrator.d.ts.map +1 -1
  206. package/dist/migrate/migrate-orchestrator.js +6 -2
  207. package/dist/migrate/migrate-orchestrator.js.map +1 -1
  208. package/dist/migrate/portability-policy.d.ts.map +1 -1
  209. package/dist/migrate/portability-policy.js +44 -23
  210. package/dist/migrate/portability-policy.js.map +1 -1
  211. package/dist/migrate/portable-installer.d.ts +3 -0
  212. package/dist/migrate/portable-installer.d.ts.map +1 -1
  213. package/dist/migrate/portable-installer.js +3 -0
  214. package/dist/migrate/portable-installer.js.map +1 -1
  215. package/dist/migrate/provider-support-summary.d.ts +49 -0
  216. package/dist/migrate/provider-support-summary.d.ts.map +1 -0
  217. package/dist/migrate/provider-support-summary.js +98 -0
  218. package/dist/migrate/provider-support-summary.js.map +1 -0
  219. package/dist/migrate/reconcile/portable-registry-lock.d.ts.map +1 -1
  220. package/dist/migrate/reconcile/portable-registry-lock.js +6 -78
  221. package/dist/migrate/reconcile/portable-registry-lock.js.map +1 -1
  222. package/dist/migrate/reconcile/portable-registry.d.ts +24 -6
  223. package/dist/migrate/reconcile/portable-registry.d.ts.map +1 -1
  224. package/dist/migrate/reconcile/portable-registry.js +7 -1
  225. package/dist/migrate/reconcile/portable-registry.js.map +1 -1
  226. package/dist/migrate/skill-directory-installer.d.ts +2 -0
  227. package/dist/migrate/skill-directory-installer.d.ts.map +1 -1
  228. package/dist/migrate/skill-directory-installer.js +3 -0
  229. package/dist/migrate/skill-directory-installer.js.map +1 -1
  230. package/dist/migrate/types.d.ts +4 -4
  231. package/package.json +1 -1
@@ -0,0 +1,45 @@
1
+ import { statSync, readFileSync } from "node:fs";
2
+ import path from "node:path";
3
+ /**
4
+ * True only for actual hook *scripts*. The validators previously treated every
5
+ * `readdirSync(hooksDir)` entry as a hook and ran `accessSync(X_OK)` on it — but the
6
+ * execute bit is also set on directories (traverse), so `lib/`, `handlers/`, `__tests__/`,
7
+ * and non-scripts like `HOOKS_INDEX.md` / `handlers.json` were reported as "Hook executable".
8
+ * This guard is the single definition shared by validate, validate-install, and doctor.
9
+ *
10
+ * A hook script is: a regular FILE, not an index/doc/json sidecar, and either a known
11
+ * script extension (.sh/.cjs/.js/.mjs) OR an extensionless executable with a shell/node shebang.
12
+ */
13
+ const HOOK_EXTENSIONS = new Set([".sh", ".cjs", ".js", ".mjs"]);
14
+ const EXCLUDED_BASENAMES = new Set(["HOOKS_INDEX.md", "handlers.json"]);
15
+ export function isHookScript(p) {
16
+ let stat;
17
+ try {
18
+ stat = statSync(p);
19
+ }
20
+ catch {
21
+ return false;
22
+ }
23
+ if (!stat.isFile())
24
+ return false; // directories (lib/, handlers/, __tests__/) are never hooks
25
+ const base = path.basename(p);
26
+ if (EXCLUDED_BASENAMES.has(base))
27
+ return false;
28
+ const ext = path.extname(base).toLowerCase();
29
+ if (HOOK_EXTENSIONS.has(ext))
30
+ return true;
31
+ // Allow a legitimately extensionless hook: executable + shell/node shebang.
32
+ if (ext === "") {
33
+ if ((stat.mode & 0o111) === 0)
34
+ return false;
35
+ try {
36
+ const head = readFileSync(p, "utf8").slice(0, 128);
37
+ return /^#!.*\b(sh|bash|dash|node|env)\b/.test(head);
38
+ }
39
+ catch {
40
+ return false;
41
+ }
42
+ }
43
+ return false; // .md, .json, .txt, …
44
+ }
45
+ //# sourceMappingURL=is-hook-script.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"is-hook-script.js","sourceRoot":"","sources":["../../src/core/is-hook-script.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACjD,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B;;;;;;;;;GASG;AAEH,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;AAChE,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC,CAAC,gBAAgB,EAAE,eAAe,CAAC,CAAC,CAAC;AAExE,MAAM,UAAU,YAAY,CAAC,CAAS;IACrC,IAAI,IAAI,CAAC;IACT,IAAI,CAAC;QACJ,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,KAAK,CAAC;IACd,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;QAAE,OAAO,KAAK,CAAC,CAAC,4DAA4D;IAE9F,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC9B,IAAI,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IAE/C,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;IAC7C,IAAI,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAE1C,4EAA4E;IAC5E,IAAI,GAAG,KAAK,EAAE,EAAE,CAAC;QAChB,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;QAC5C,IAAI,CAAC;YACJ,MAAM,IAAI,GAAG,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;YACnD,OAAO,kCAAkC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtD,CAAC;QAAC,MAAM,CAAC;YACR,OAAO,KAAK,CAAC;QACd,CAAC;IACF,CAAC;IAED,OAAO,KAAK,CAAC,CAAC,sBAAsB;AACrC,CAAC"}
@@ -0,0 +1,48 @@
1
+ export declare const PACK_MANIFEST_FILENAME = "pack-manifest.json";
2
+ /** Always-installed essentials: non-artifact files, safety rules, core commands. */
3
+ export interface PackBase {
4
+ files: string[];
5
+ globs: string[];
6
+ commands: string[];
7
+ }
8
+ /** A pack derives membership from `owners` plus per-artifact add/exclude overrides. */
9
+ export interface PackDef {
10
+ owners?: string[];
11
+ artifactsAdd?: string[];
12
+ artifactsExclude?: string[];
13
+ }
14
+ export interface PackManifest {
15
+ schemaVersion: string;
16
+ base: PackBase;
17
+ packs: Record<string, PackDef>;
18
+ profiles: Record<string, string[]>;
19
+ }
20
+ /** Reserved profile entry meaning "every pack" — full-tree install. */
21
+ export declare const WILDCARD = "*";
22
+ /** The always-included pseudo-pack name. */
23
+ export declare const BASE_PACK = "base";
24
+ /** Thrown when the manifest is absent, unreadable, or structurally malformed. */
25
+ export declare class PackManifestError extends Error {
26
+ constructor(message: string);
27
+ }
28
+ /** Path to the manifest under a `.claude/` dir (present or absent). */
29
+ export declare function packManifestPath(claudeDir: string): string;
30
+ /** True when the manifest file exists — used by infra-absent guards (pack/upgrade). */
31
+ export declare function hasPackManifest(claudeDir: string): boolean;
32
+ /** Load + shape-validate the manifest. Throws PackManifestError on any defect. */
33
+ export declare function loadPackManifest(claudeDir: string): PackManifest;
34
+ export declare function availableProfiles(manifest: PackManifest): string[];
35
+ export declare function availablePacks(manifest: PackManifest): string[];
36
+ export interface FlattenResult {
37
+ /** Concrete pack names (always includes BASE_PACK), deduped. */
38
+ packs: string[];
39
+ /** True when the profile transitively references the `*` wildcard (= full tree). */
40
+ wildcard: boolean;
41
+ }
42
+ /**
43
+ * Flatten a profile to its concrete pack list. Profile entries may reference a
44
+ * pack, another profile (extends-style), `base`, or the `*` wildcard. Cycles are
45
+ * detected and rejected; unknown refs throw with the available names.
46
+ */
47
+ export declare function flattenProfile(manifest: PackManifest, profileName: string): FlattenResult;
48
+ //# sourceMappingURL=pack-manifest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pack-manifest.d.ts","sourceRoot":"","sources":["../../src/core/pack-manifest.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,sBAAsB,uBAAuB,CAAC;AAE3D,oFAAoF;AACpF,MAAM,WAAW,QAAQ;IACxB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,uFAAuF;AACvF,MAAM,WAAW,OAAO;IACvB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED,MAAM,WAAW,YAAY;IAC5B,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,QAAQ,CAAC;IACf,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;CACnC;AAED,uEAAuE;AACvE,eAAO,MAAM,QAAQ,MAAM,CAAC;AAC5B,4CAA4C;AAC5C,eAAO,MAAM,SAAS,SAAS,CAAC;AAEhC,iFAAiF;AACjF,qBAAa,iBAAkB,SAAQ,KAAK;gBAC/B,OAAO,EAAE,MAAM;CAI3B;AAED,uEAAuE;AACvE,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED,uFAAuF;AACvF,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAE1D;AAED,kFAAkF;AAClF,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,YAAY,CAYhE;AAmCD,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,YAAY,GAAG,MAAM,EAAE,CAElE;AAED,wBAAgB,cAAc,CAAC,QAAQ,EAAE,YAAY,GAAG,MAAM,EAAE,CAE/D;AAED,MAAM,WAAW,aAAa;IAC7B,gEAAgE;IAChE,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,oFAAoF;IACpF,QAAQ,EAAE,OAAO,CAAC;CAClB;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,GAAG,aAAa,CAwCzF"}
@@ -0,0 +1,126 @@
1
+ // Pack-manifest data model + pure manifest operations (no filesystem walking of
2
+ // artifacts). The manifest (`.claude/pack-manifest.json`) maps install profiles
3
+ // onto the Phase-2 `owner` governance metadata plus an explicit `base` essentials
4
+ // set. This module loads/shape-validates the manifest and flattens a profile to
5
+ // its concrete pack list; pack-resolver.ts turns that into actual file paths.
6
+ import { existsSync, readFileSync } from "node:fs";
7
+ import { join } from "node:path";
8
+ export const PACK_MANIFEST_FILENAME = "pack-manifest.json";
9
+ /** Reserved profile entry meaning "every pack" — full-tree install. */
10
+ export const WILDCARD = "*";
11
+ /** The always-included pseudo-pack name. */
12
+ export const BASE_PACK = "base";
13
+ /** Thrown when the manifest is absent, unreadable, or structurally malformed. */
14
+ export class PackManifestError extends Error {
15
+ constructor(message) {
16
+ super(message);
17
+ this.name = "PackManifestError";
18
+ }
19
+ }
20
+ /** Path to the manifest under a `.claude/` dir (present or absent). */
21
+ export function packManifestPath(claudeDir) {
22
+ return join(claudeDir, PACK_MANIFEST_FILENAME);
23
+ }
24
+ /** True when the manifest file exists — used by infra-absent guards (pack/upgrade). */
25
+ export function hasPackManifest(claudeDir) {
26
+ return existsSync(packManifestPath(claudeDir));
27
+ }
28
+ /** Load + shape-validate the manifest. Throws PackManifestError on any defect. */
29
+ export function loadPackManifest(claudeDir) {
30
+ const file = packManifestPath(claudeDir);
31
+ if (!existsSync(file)) {
32
+ throw new PackManifestError(`pack-manifest.json not found at ${file}`);
33
+ }
34
+ let parsed;
35
+ try {
36
+ parsed = JSON.parse(readFileSync(file, "utf-8"));
37
+ }
38
+ catch (err) {
39
+ throw new PackManifestError(`pack-manifest.json is not valid JSON: ${err.message}`);
40
+ }
41
+ return validateManifest(parsed);
42
+ }
43
+ function validateManifest(parsed) {
44
+ if (typeof parsed !== "object" || parsed === null) {
45
+ throw new PackManifestError("manifest root is not an object");
46
+ }
47
+ const m = parsed;
48
+ const base = m.base;
49
+ if (!base || !Array.isArray(base.files) || !Array.isArray(base.globs) || !Array.isArray(base.commands)) {
50
+ throw new PackManifestError("manifest.base must have array fields files/globs/commands");
51
+ }
52
+ if (typeof m.packs !== "object" || m.packs === null) {
53
+ throw new PackManifestError("manifest.packs must be an object");
54
+ }
55
+ if (typeof m.profiles !== "object" || m.profiles === null) {
56
+ throw new PackManifestError("manifest.profiles must be an object");
57
+ }
58
+ const profiles = m.profiles;
59
+ for (const [name, entry] of Object.entries(profiles)) {
60
+ if (!Array.isArray(entry)) {
61
+ throw new PackManifestError(`profile "${name}" must be an array of pack/profile refs`);
62
+ }
63
+ }
64
+ return {
65
+ schemaVersion: typeof m.schemaVersion === "string" ? m.schemaVersion : "1.0",
66
+ base: {
67
+ files: base.files.map(String),
68
+ globs: base.globs.map(String),
69
+ commands: base.commands.map(String),
70
+ },
71
+ packs: m.packs,
72
+ profiles: m.profiles,
73
+ };
74
+ }
75
+ export function availableProfiles(manifest) {
76
+ return Object.keys(manifest.profiles);
77
+ }
78
+ export function availablePacks(manifest) {
79
+ return Object.keys(manifest.packs);
80
+ }
81
+ /**
82
+ * Flatten a profile to its concrete pack list. Profile entries may reference a
83
+ * pack, another profile (extends-style), `base`, or the `*` wildcard. Cycles are
84
+ * detected and rejected; unknown refs throw with the available names.
85
+ */
86
+ export function flattenProfile(manifest, profileName) {
87
+ if (!(profileName in manifest.profiles)) {
88
+ throw new PackManifestError(`unknown profile "${profileName}" — available: ${availableProfiles(manifest).join(", ")}`);
89
+ }
90
+ const packs = new Set([BASE_PACK]);
91
+ let wildcard = false;
92
+ const visiting = new Set();
93
+ const walk = (name) => {
94
+ if (visiting.has(name)) {
95
+ throw new PackManifestError(`profile cycle detected at "${name}"`);
96
+ }
97
+ visiting.add(name);
98
+ for (const ref of manifest.profiles[name]) {
99
+ if (ref === WILDCARD) {
100
+ wildcard = true;
101
+ for (const p of availablePacks(manifest))
102
+ packs.add(p);
103
+ }
104
+ else if (ref === BASE_PACK) {
105
+ packs.add(BASE_PACK);
106
+ }
107
+ else if (ref in manifest.packs) {
108
+ // Pack-first: a profile named like its own domain pack (e.g. profile
109
+ // "atlassian" → pack "atlassian") must bind to the pack, not recurse
110
+ // into itself. Profile-extension targets (core, developer) are not
111
+ // pack names, so they fall through to the profile branch below.
112
+ packs.add(ref);
113
+ }
114
+ else if (ref in manifest.profiles) {
115
+ walk(ref);
116
+ }
117
+ else {
118
+ throw new PackManifestError(`profile "${name}" references unknown pack/profile "${ref}" — packs: ${availablePacks(manifest).join(", ")}`);
119
+ }
120
+ }
121
+ visiting.delete(name);
122
+ };
123
+ walk(profileName);
124
+ return { packs: [...packs], wildcard };
125
+ }
126
+ //# sourceMappingURL=pack-manifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pack-manifest.js","sourceRoot":"","sources":["../../src/core/pack-manifest.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { type PackManifest } from "./pack-manifest.js";
2
+ export interface ResolveResult {
3
+ /** All `.claude/`-relative paths for the resolved profile/packs (incl. base). */
4
+ paths: Set<string>;
5
+ /** Per-pack path sets (incl. the `base` pseudo-pack) for exclusive-delete math. */
6
+ packMembership: Map<string, Set<string>>;
7
+ /** Concrete pack names resolved (always includes `base`). */
8
+ packs: string[];
9
+ }
10
+ /** Resolve a profile name to its install allow-set. `full`/`*` ⇒ the whole tree. */
11
+ export declare function resolveProfile(claudeDir: string, manifest: PackManifest, profileName: string): Set<string>;
12
+ /** Resolve a profile with per-pack membership exposed (for pack remove exclusivity). */
13
+ export declare function resolveProfileDetailed(claudeDir: string, manifest: PackManifest, profileName: string): ResolveResult;
14
+ /** Resolve an explicit pack list to its install allow-set (always includes base). */
15
+ export declare function resolvePacks(claudeDir: string, manifest: PackManifest, packNames: string[]): Set<string>;
16
+ /** Resolve an explicit pack list with per-pack membership exposed. */
17
+ export declare function resolvePacksDetailed(claudeDir: string, manifest: PackManifest, packNames: string[]): ResolveResult;
18
+ //# sourceMappingURL=pack-resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pack-resolver.d.ts","sourceRoot":"","sources":["../../src/core/pack-resolver.ts"],"names":[],"mappings":"AASA,OAAO,EAKN,KAAK,YAAY,EACjB,MAAM,oBAAoB,CAAC;AAE5B,MAAM,WAAW,aAAa;IAC7B,iFAAiF;IACjF,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACnB,mFAAmF;IACnF,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;IACzC,6DAA6D;IAC7D,KAAK,EAAE,MAAM,EAAE,CAAC;CAChB;AA2GD,oFAAoF;AACpF,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAE1G;AAED,wFAAwF;AACxF,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,GAAG,aAAa,CASpH;AAED,qFAAqF;AACrF,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,CAExG;AAED,sEAAsE;AACtE,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,aAAa,CAUlH"}
@@ -0,0 +1,144 @@
1
+ // Pure profile/pack resolver: turns a profile (or explicit pack list) into the
2
+ // exact set of `.claude/`-relative file paths to install. Membership derives from
3
+ // the Phase-2 `owner` inventory plus the manifest's base essentials and per-pack
4
+ // overrides. No fs writes. The `full`/`*` path short-circuits to the whole tree
5
+ // (collectFiles) for byte parity with today's monolithic install.
6
+ import fs from "node:fs";
7
+ import path from "node:path";
8
+ import { collectFiles } from "./compute-checksums.js";
9
+ import { buildInventory } from "./build-inventory.js";
10
+ import { availablePacks, BASE_PACK, flattenProfile, PackManifestError, } from "./pack-manifest.js";
11
+ /** Normalize to forward slashes so the allow-set matches smartUpdate's manifestPath. */
12
+ function norm(p) {
13
+ return p.replace(/\\/g, "/");
14
+ }
15
+ /** Expand a base glob (`<dir>/**`) against the source tree, or treat as a literal file. */
16
+ function expandBaseGlob(claudeDir, glob) {
17
+ if (glob.endsWith("/**")) {
18
+ const sub = glob.slice(0, -3);
19
+ const abs = path.join(claudeDir, sub);
20
+ return fs.existsSync(abs) ? collectFiles(abs, claudeDir) : [];
21
+ }
22
+ return [glob];
23
+ }
24
+ /** A skill installs its whole directory; every other artifact is a single file. */
25
+ function artifactPaths(claudeDir, entry) {
26
+ if (entry.type === "skill") {
27
+ const dir = path.posix.dirname(entry.path); // skills/<dir>
28
+ const abs = path.join(claudeDir, dir);
29
+ if (fs.existsSync(abs))
30
+ return collectFiles(abs, claudeDir);
31
+ }
32
+ return [entry.path];
33
+ }
34
+ /** Always-installed essentials: explicit files, expanded globs, and core commands. */
35
+ function baseSeed(claudeDir, manifest) {
36
+ const set = new Set();
37
+ for (const f of manifest.base.files)
38
+ set.add(norm(f));
39
+ for (const g of manifest.base.globs)
40
+ for (const f of expandBaseGlob(claudeDir, g))
41
+ set.add(norm(f));
42
+ for (const c of manifest.base.commands)
43
+ set.add(`commands/mk/${c}.md`);
44
+ return set;
45
+ }
46
+ /**
47
+ * Transitive `depends_on` closure across pack boundaries. Inert today — Phase-2
48
+ * populated owner/criticality/status/runtime but no edges — so this currently
49
+ * adds nothing; kept so profiles auto-pull future hard runtime dependencies.
50
+ * Dangling dep ids are tolerated here (P4 `validate --packs` flags them).
51
+ */
52
+ function closeDependsOn(claudeDir, inv, includedIds, paths) {
53
+ const byId = new Map(inv.entries.map((e) => [e.id, e]));
54
+ let changed = true;
55
+ while (changed) {
56
+ changed = false;
57
+ for (const id of [...includedIds]) {
58
+ for (const dep of byId.get(id)?.dependsOn ?? []) {
59
+ const de = byId.get(dep);
60
+ if (!de || includedIds.has(dep))
61
+ continue;
62
+ includedIds.add(dep);
63
+ for (const ap of artifactPaths(claudeDir, de))
64
+ paths.add(norm(ap));
65
+ changed = true;
66
+ }
67
+ }
68
+ }
69
+ }
70
+ /** Core builder: union base + each pack's owner/override-selected artifact files. */
71
+ function buildFromPacks(claudeDir, manifest, packNames, inv) {
72
+ const invIds = new Set(inv.entries.map((e) => e.id));
73
+ const paths = new Set();
74
+ const packMembership = new Map();
75
+ const includedIds = new Set();
76
+ const base = baseSeed(claudeDir, manifest);
77
+ packMembership.set(BASE_PACK, base);
78
+ for (const p of base)
79
+ paths.add(p);
80
+ for (const packName of packNames) {
81
+ if (packName === BASE_PACK)
82
+ continue;
83
+ const pack = manifest.packs[packName];
84
+ if (!pack) {
85
+ throw new PackManifestError(`unknown pack "${packName}" — available: ${availablePacks(manifest).join(", ")}`);
86
+ }
87
+ const owners = new Set(pack.owners ?? []);
88
+ const add = new Set(pack.artifactsAdd ?? []);
89
+ const exclude = new Set(pack.artifactsExclude ?? []);
90
+ for (const id of [...add, ...exclude]) {
91
+ if (!invIds.has(id)) {
92
+ throw new PackManifestError(`pack "${packName}" references unknown artifact id "${id}"`);
93
+ }
94
+ }
95
+ const member = new Set();
96
+ for (const e of inv.entries) {
97
+ if (exclude.has(e.id))
98
+ continue;
99
+ if (!owners.has(e.owner) && !add.has(e.id))
100
+ continue;
101
+ includedIds.add(e.id);
102
+ for (const ap of artifactPaths(claudeDir, e)) {
103
+ const np = norm(ap);
104
+ paths.add(np);
105
+ member.add(np);
106
+ }
107
+ }
108
+ packMembership.set(packName, member);
109
+ }
110
+ closeDependsOn(claudeDir, inv, includedIds, paths);
111
+ return { paths, packMembership };
112
+ }
113
+ /** Resolve a profile name to its install allow-set. `full`/`*` ⇒ the whole tree. */
114
+ export function resolveProfile(claudeDir, manifest, profileName) {
115
+ return resolveProfileDetailed(claudeDir, manifest, profileName).paths;
116
+ }
117
+ /** Resolve a profile with per-pack membership exposed (for pack remove exclusivity). */
118
+ export function resolveProfileDetailed(claudeDir, manifest, profileName) {
119
+ const flat = flattenProfile(manifest, profileName);
120
+ if (flat.wildcard) {
121
+ const all = new Set(collectFiles(claudeDir, claudeDir).map(norm));
122
+ return { paths: all, packMembership: new Map([[BASE_PACK, all]]), packs: flat.packs };
123
+ }
124
+ const inv = buildInventory(claudeDir);
125
+ const { paths, packMembership } = buildFromPacks(claudeDir, manifest, flat.packs, inv);
126
+ return { paths, packMembership, packs: flat.packs };
127
+ }
128
+ /** Resolve an explicit pack list to its install allow-set (always includes base). */
129
+ export function resolvePacks(claudeDir, manifest, packNames) {
130
+ return resolvePacksDetailed(claudeDir, manifest, packNames).paths;
131
+ }
132
+ /** Resolve an explicit pack list with per-pack membership exposed. */
133
+ export function resolvePacksDetailed(claudeDir, manifest, packNames) {
134
+ const names = [BASE_PACK, ...packNames.filter((n) => n !== BASE_PACK)];
135
+ for (const n of names) {
136
+ if (n !== BASE_PACK && !(n in manifest.packs)) {
137
+ throw new PackManifestError(`unknown pack "${n}" — available: ${availablePacks(manifest).join(", ")}`);
138
+ }
139
+ }
140
+ const inv = buildInventory(claudeDir);
141
+ const { paths, packMembership } = buildFromPacks(claudeDir, manifest, names, inv);
142
+ return { paths, packMembership, packs: names };
143
+ }
144
+ //# sourceMappingURL=pack-resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pack-resolver.js","sourceRoot":"","sources":["../../src/core/pack-resolver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import { type ProviderContractDiagnostic } from "../migrate/provider-contract-diagnostics.js";
2
+ import type { ProviderType } from "../migrate/types.js";
3
+ export interface PortabilityMatrixRow extends ProviderContractDiagnostic {
4
+ displayStatus: "native" | "documented" | "disabled" | "unsupported" | "warn" | "fail";
5
+ }
6
+ export interface PortabilityCoverage {
7
+ providers: number;
8
+ surfaces: number;
9
+ documented: number;
10
+ disabledUnsupported: number;
11
+ warn: number;
12
+ fail: number;
13
+ }
14
+ export declare function buildPortabilityMatrix(): PortabilityMatrixRow[];
15
+ export declare function explainProvider(provider: ProviderType): PortabilityMatrixRow[];
16
+ export declare function coverage(rows?: PortabilityMatrixRow[]): PortabilityCoverage;
17
+ //# sourceMappingURL=portability-matrix.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"portability-matrix.d.ts","sourceRoot":"","sources":["../../src/core/portability-matrix.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsC,KAAK,0BAA0B,EAAE,MAAM,6CAA6C,CAAC;AAClI,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAExD,MAAM,WAAW,oBAAqB,SAAQ,0BAA0B;IACvE,aAAa,EAAE,QAAQ,GAAG,YAAY,GAAG,UAAU,GAAG,aAAa,GAAG,MAAM,GAAG,MAAM,CAAC;CACtF;AAED,MAAM,WAAW,mBAAmB;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACb;AAWD,wBAAgB,sBAAsB,IAAI,oBAAoB,EAAE,CAE/D;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,YAAY,GAAG,oBAAoB,EAAE,CAE9E;AAED,wBAAgB,QAAQ,CAAC,IAAI,yBAA2B,GAAG,mBAAmB,CAS7E"}
@@ -0,0 +1,31 @@
1
+ import { collectProviderContractDiagnostics } from "../migrate/provider-contract-diagnostics.js";
2
+ function displayStatus(d) {
3
+ if (d.provider === "claude-code" && d.surfaceStatus === "documented" && d.severity === "pass")
4
+ return "native";
5
+ if (d.severity === "fail")
6
+ return "fail";
7
+ if (d.severity === "warn")
8
+ return "warn";
9
+ if (d.surfaceStatus === "documented")
10
+ return "documented";
11
+ if (d.surfaceStatus === "unsupported")
12
+ return "unsupported";
13
+ return "disabled";
14
+ }
15
+ export function buildPortabilityMatrix() {
16
+ return collectProviderContractDiagnostics().map((d) => ({ ...d, displayStatus: displayStatus(d) }));
17
+ }
18
+ export function explainProvider(provider) {
19
+ return buildPortabilityMatrix().filter((r) => r.provider === provider);
20
+ }
21
+ export function coverage(rows = buildPortabilityMatrix()) {
22
+ return {
23
+ providers: new Set(rows.map((r) => r.provider)).size,
24
+ surfaces: rows.length,
25
+ documented: rows.filter((r) => r.surfaceStatus === "documented").length,
26
+ disabledUnsupported: rows.filter((r) => r.surfaceStatus !== "documented" && r.severity !== "fail").length,
27
+ warn: rows.filter((r) => r.severity === "warn").length,
28
+ fail: rows.filter((r) => r.severity === "fail").length,
29
+ };
30
+ }
31
+ //# sourceMappingURL=portability-matrix.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"portability-matrix.js","sourceRoot":"","sources":["../../src/core/portability-matrix.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kCAAkC,EAAmC,MAAM,6CAA6C,CAAC;AAgBlI,SAAS,aAAa,CAAC,CAA6B;IACnD,IAAI,CAAC,CAAC,QAAQ,KAAK,aAAa,IAAI,CAAC,CAAC,aAAa,KAAK,YAAY,IAAI,CAAC,CAAC,QAAQ,KAAK,MAAM;QAAE,OAAO,QAAQ,CAAC;IAC/G,IAAI,CAAC,CAAC,QAAQ,KAAK,MAAM;QAAE,OAAO,MAAM,CAAC;IACzC,IAAI,CAAC,CAAC,QAAQ,KAAK,MAAM;QAAE,OAAO,MAAM,CAAC;IACzC,IAAI,CAAC,CAAC,aAAa,KAAK,YAAY;QAAE,OAAO,YAAY,CAAC;IAC1D,IAAI,CAAC,CAAC,aAAa,KAAK,aAAa;QAAE,OAAO,aAAa,CAAC;IAC5D,OAAO,UAAU,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,sBAAsB;IACrC,OAAO,kCAAkC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,aAAa,EAAE,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACrG,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,QAAsB;IACrD,OAAO,sBAAsB,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC;AACxE,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,IAAI,GAAG,sBAAsB,EAAE;IACvD,OAAO;QACN,SAAS,EAAE,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI;QACpD,QAAQ,EAAE,IAAI,CAAC,MAAM;QACrB,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,KAAK,YAAY,CAAC,CAAC,MAAM;QACvE,mBAAmB,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,KAAK,YAAY,IAAI,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC,MAAM;QACzG,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC,MAAM;QACtD,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC,MAAM;KACtD,CAAC;AACH,CAAC"}
@@ -0,0 +1,80 @@
1
+ import { z } from "zod";
2
+ import type { Manifest } from "./compute-checksums.js";
3
+ export declare const RELEASE_MANIFEST_FILENAME = "release-manifest.json";
4
+ export declare const ReleaseFileEntrySchema: z.ZodObject<{
5
+ path: z.ZodString;
6
+ checksum: z.ZodString;
7
+ size: z.ZodOptional<z.ZodNumber>;
8
+ lastModified: z.ZodOptional<z.ZodString>;
9
+ }, "strip", z.ZodTypeAny, {
10
+ path: string;
11
+ checksum: string;
12
+ size?: number | undefined;
13
+ lastModified?: string | undefined;
14
+ }, {
15
+ path: string;
16
+ checksum: string;
17
+ size?: number | undefined;
18
+ lastModified?: string | undefined;
19
+ }>;
20
+ export type ReleaseFileEntry = z.infer<typeof ReleaseFileEntrySchema>;
21
+ export declare const ReleaseManifestSchema: z.ZodObject<{
22
+ version: z.ZodString;
23
+ generatedAt: z.ZodString;
24
+ files: z.ZodArray<z.ZodObject<{
25
+ path: z.ZodString;
26
+ checksum: z.ZodString;
27
+ size: z.ZodOptional<z.ZodNumber>;
28
+ lastModified: z.ZodOptional<z.ZodString>;
29
+ }, "strip", z.ZodTypeAny, {
30
+ path: string;
31
+ checksum: string;
32
+ size?: number | undefined;
33
+ lastModified?: string | undefined;
34
+ }, {
35
+ path: string;
36
+ checksum: string;
37
+ size?: number | undefined;
38
+ lastModified?: string | undefined;
39
+ }>, "many">;
40
+ deletions: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
41
+ }, "strip", z.ZodTypeAny, {
42
+ version: string;
43
+ generatedAt: string;
44
+ files: {
45
+ path: string;
46
+ checksum: string;
47
+ size?: number | undefined;
48
+ lastModified?: string | undefined;
49
+ }[];
50
+ deletions: string[];
51
+ }, {
52
+ version: string;
53
+ generatedAt: string;
54
+ files: {
55
+ path: string;
56
+ checksum: string;
57
+ size?: number | undefined;
58
+ lastModified?: string | undefined;
59
+ }[];
60
+ deletions?: string[] | undefined;
61
+ }>;
62
+ export type ReleaseManifest = z.infer<typeof ReleaseManifestSchema>;
63
+ /** Thrown when `release-manifest.json` is present but does not match the schema. */
64
+ export declare class CorruptReleaseManifestError extends Error {
65
+ readonly detail: string;
66
+ constructor(detail: string);
67
+ }
68
+ /**
69
+ * Read `release-manifest.json` from an extracted release root.
70
+ * Returns null when the file is absent; throws on a present-but-corrupt manifest.
71
+ */
72
+ export declare function readReleaseMetadata(sourceDir: string): ReleaseManifest | null;
73
+ /** Map each release file path to its source commit timestamp (when recorded). */
74
+ export declare function mapPathToLastModified(release: ReleaseManifest | null): Record<string, string>;
75
+ /**
76
+ * Project a release manifest onto the `Manifest` shape `findOrphans` consumes —
77
+ * only the checksum keys matter for orphan detection.
78
+ */
79
+ export declare function toOrphanManifest(release: ReleaseManifest): Manifest;
80
+ //# sourceMappingURL=release-metadata.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"release-metadata.d.ts","sourceRoot":"","sources":["../../src/core/release-metadata.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAEvD,eAAO,MAAM,yBAAyB,0BAA0B,CAAC;AAEjE,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;EAKjC,CAAC;AACH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAEtE,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAKhC,CAAC;AACH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEpE,oFAAoF;AACpF,qBAAa,2BAA4B,SAAQ,KAAK;aACzB,MAAM,EAAE,MAAM;gBAAd,MAAM,EAAE,MAAM;CAI1C;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CAY7E;AAED,iFAAiF;AACjF,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,eAAe,GAAG,IAAI,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAM7F;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,eAAe,GAAG,QAAQ,CAMnE"}
@@ -0,0 +1,70 @@
1
+ // CLI-side reader for the release-metadata carrier: `release-manifest.json` at
2
+ // the extracted release root. This is the single parser for that file — it
3
+ // supplies the installed kit version, per-file source timestamps, and the
4
+ // optional maintainer-curated `deletions[]` list.
5
+ import { existsSync, readFileSync } from "node:fs";
6
+ import { join } from "node:path";
7
+ import { z } from "zod";
8
+ export const RELEASE_MANIFEST_FILENAME = "release-manifest.json";
9
+ export const ReleaseFileEntrySchema = z.object({
10
+ path: z.string(),
11
+ checksum: z.string(),
12
+ size: z.number().optional(),
13
+ lastModified: z.string().optional(),
14
+ });
15
+ export const ReleaseManifestSchema = z.object({
16
+ version: z.string(),
17
+ generatedAt: z.string(),
18
+ files: z.array(ReleaseFileEntrySchema),
19
+ deletions: z.array(z.string()).default([]),
20
+ });
21
+ /** Thrown when `release-manifest.json` is present but does not match the schema. */
22
+ export class CorruptReleaseManifestError extends Error {
23
+ detail;
24
+ constructor(detail) {
25
+ super(`Corrupt release-manifest.json: ${detail}`);
26
+ this.detail = detail;
27
+ this.name = "CorruptReleaseManifestError";
28
+ }
29
+ }
30
+ /**
31
+ * Read `release-manifest.json` from an extracted release root.
32
+ * Returns null when the file is absent; throws on a present-but-corrupt manifest.
33
+ */
34
+ export function readReleaseMetadata(sourceDir) {
35
+ const manifestPath = join(sourceDir, RELEASE_MANIFEST_FILENAME);
36
+ if (!existsSync(manifestPath))
37
+ return null;
38
+ let parsed;
39
+ try {
40
+ parsed = JSON.parse(readFileSync(manifestPath, "utf-8"));
41
+ }
42
+ catch (err) {
43
+ throw new CorruptReleaseManifestError(err.message);
44
+ }
45
+ const result = ReleaseManifestSchema.safeParse(parsed);
46
+ if (!result.success)
47
+ throw new CorruptReleaseManifestError(result.error.message);
48
+ return result.data;
49
+ }
50
+ /** Map each release file path to its source commit timestamp (when recorded). */
51
+ export function mapPathToLastModified(release) {
52
+ const out = {};
53
+ for (const f of release?.files ?? []) {
54
+ if (f.lastModified)
55
+ out[f.path] = f.lastModified;
56
+ }
57
+ return out;
58
+ }
59
+ /**
60
+ * Project a release manifest onto the `Manifest` shape `findOrphans` consumes —
61
+ * only the checksum keys matter for orphan detection.
62
+ */
63
+ export function toOrphanManifest(release) {
64
+ const checksums = {};
65
+ for (const f of release.files) {
66
+ checksums[f.path] = { sha256: f.checksum, layer: "core" };
67
+ }
68
+ return { version: release.version, generatedAt: release.generatedAt, checksums };
69
+ }
70
+ //# sourceMappingURL=release-metadata.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"release-metadata.js","sourceRoot":"","sources":["../../src/core/release-metadata.ts"],"names":[],"mappings":"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"}