mewkit 1.13.0 → 1.14.1

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 (223) hide show
  1. package/README.md +37 -0
  2. package/dist/commands/migrate.d.ts +2 -0
  3. package/dist/commands/migrate.d.ts.map +1 -1
  4. package/dist/commands/migrate.js +2 -0
  5. package/dist/commands/migrate.js.map +1 -1
  6. package/dist/commands/validate.js +14 -7
  7. package/dist/commands/validate.js.map +1 -1
  8. package/dist/index.js +11 -0
  9. package/dist/index.js.map +1 -1
  10. package/dist/migrate/apply-env-var-rewrites.d.ts +15 -0
  11. package/dist/migrate/apply-env-var-rewrites.d.ts.map +1 -0
  12. package/dist/migrate/apply-env-var-rewrites.js +26 -0
  13. package/dist/migrate/apply-env-var-rewrites.js.map +1 -0
  14. package/dist/migrate/config-merger/merge-single-sections.d.ts.map +1 -1
  15. package/dist/migrate/config-merger/merge-single-sections.js +4 -2
  16. package/dist/migrate/config-merger/merge-single-sections.js.map +1 -1
  17. package/dist/migrate/converters/command-to-codex-skill.d.ts +10 -0
  18. package/dist/migrate/converters/command-to-codex-skill.d.ts.map +1 -0
  19. package/dist/migrate/converters/command-to-codex-skill.js +88 -0
  20. package/dist/migrate/converters/command-to-codex-skill.js.map +1 -0
  21. package/dist/migrate/converters/direct-copy.d.ts +4 -1
  22. package/dist/migrate/converters/direct-copy.d.ts.map +1 -1
  23. package/dist/migrate/converters/direct-copy.js +19 -22
  24. package/dist/migrate/converters/direct-copy.js.map +1 -1
  25. package/dist/migrate/converters/fm-strip.d.ts.map +1 -1
  26. package/dist/migrate/converters/fm-strip.js +5 -1
  27. package/dist/migrate/converters/fm-strip.js.map +1 -1
  28. package/dist/migrate/converters/fm-to-codex-toml.d.ts +4 -1
  29. package/dist/migrate/converters/fm-to-codex-toml.d.ts.map +1 -1
  30. package/dist/migrate/converters/fm-to-codex-toml.js +8 -3
  31. package/dist/migrate/converters/fm-to-codex-toml.js.map +1 -1
  32. package/dist/migrate/converters/fm-to-fm.js +4 -4
  33. package/dist/migrate/converters/fm-to-fm.js.map +1 -1
  34. package/dist/migrate/converters/fm-to-json.d.ts.map +1 -1
  35. package/dist/migrate/converters/fm-to-json.js +2 -1
  36. package/dist/migrate/converters/fm-to-json.js.map +1 -1
  37. package/dist/migrate/converters/fm-to-yaml.js +1 -1
  38. package/dist/migrate/converters/fm-to-yaml.js.map +1 -1
  39. package/dist/migrate/converters/index.d.ts +7 -2
  40. package/dist/migrate/converters/index.d.ts.map +1 -1
  41. package/dist/migrate/converters/index.js +8 -8
  42. package/dist/migrate/converters/index.js.map +1 -1
  43. package/dist/migrate/converters/mcp-json-to-codex-toml.d.ts +8 -0
  44. package/dist/migrate/converters/mcp-json-to-codex-toml.d.ts.map +1 -0
  45. package/dist/migrate/converters/mcp-json-to-codex-toml.js +65 -0
  46. package/dist/migrate/converters/mcp-json-to-codex-toml.js.map +1 -0
  47. package/dist/migrate/converters/md-strip.d.ts +10 -1
  48. package/dist/migrate/converters/md-strip.d.ts.map +1 -1
  49. package/dist/migrate/converters/md-strip.js +27 -70
  50. package/dist/migrate/converters/md-strip.js.map +1 -1
  51. package/dist/migrate/converters/md-to-kiro-steering.js +1 -1
  52. package/dist/migrate/converters/md-to-kiro-steering.js.map +1 -1
  53. package/dist/migrate/converters/md-to-mdc.js +1 -1
  54. package/dist/migrate/converters/md-to-mdc.js.map +1 -1
  55. package/dist/migrate/converters/md-to-toml.js +1 -1
  56. package/dist/migrate/converters/md-to-toml.js.map +1 -1
  57. package/dist/migrate/discovery/config-discovery.d.ts +29 -0
  58. package/dist/migrate/discovery/config-discovery.d.ts.map +1 -1
  59. package/dist/migrate/discovery/config-discovery.js +45 -0
  60. package/dist/migrate/discovery/config-discovery.js.map +1 -1
  61. package/dist/migrate/discovery/handlers-json-filter.d.ts.map +1 -1
  62. package/dist/migrate/discovery/handlers-json-filter.js +4 -2
  63. package/dist/migrate/discovery/handlers-json-filter.js.map +1 -1
  64. package/dist/migrate/discovery/hooks-discovery.d.ts +5 -0
  65. package/dist/migrate/discovery/hooks-discovery.d.ts.map +1 -1
  66. package/dist/migrate/discovery/hooks-discovery.js +21 -5
  67. package/dist/migrate/discovery/hooks-discovery.js.map +1 -1
  68. package/dist/migrate/hooks/codex-features-flag.d.ts.map +1 -1
  69. package/dist/migrate/hooks/codex-features-flag.js +21 -6
  70. package/dist/migrate/hooks/codex-features-flag.js.map +1 -1
  71. package/dist/migrate/hooks/codex-hook-wrapper.d.ts +15 -1
  72. package/dist/migrate/hooks/codex-hook-wrapper.d.ts.map +1 -1
  73. package/dist/migrate/hooks/codex-hook-wrapper.js +79 -8
  74. package/dist/migrate/hooks/codex-hook-wrapper.js.map +1 -1
  75. package/dist/migrate/hooks/codex-mcp-installer.d.ts +9 -0
  76. package/dist/migrate/hooks/codex-mcp-installer.d.ts.map +1 -0
  77. package/dist/migrate/hooks/codex-mcp-installer.js +65 -0
  78. package/dist/migrate/hooks/codex-mcp-installer.js.map +1 -0
  79. package/dist/migrate/hooks/codex-path-safety.d.ts +29 -0
  80. package/dist/migrate/hooks/codex-path-safety.d.ts.map +1 -1
  81. package/dist/migrate/hooks/codex-path-safety.js +36 -1
  82. package/dist/migrate/hooks/codex-path-safety.js.map +1 -1
  83. package/dist/migrate/hooks/codex-sh-wrapper-script.d.ts +8 -0
  84. package/dist/migrate/hooks/codex-sh-wrapper-script.d.ts.map +1 -0
  85. package/dist/migrate/hooks/codex-sh-wrapper-script.js +118 -0
  86. package/dist/migrate/hooks/codex-sh-wrapper-script.js.map +1 -0
  87. package/dist/migrate/hooks/codex-shell-env-installer.d.ts +14 -0
  88. package/dist/migrate/hooks/codex-shell-env-installer.d.ts.map +1 -0
  89. package/dist/migrate/hooks/codex-shell-env-installer.js +82 -0
  90. package/dist/migrate/hooks/codex-shell-env-installer.js.map +1 -0
  91. package/dist/migrate/hooks/codex-toml-installer.d.ts +2 -0
  92. package/dist/migrate/hooks/codex-toml-installer.d.ts.map +1 -1
  93. package/dist/migrate/hooks/codex-toml-installer.js +18 -7
  94. package/dist/migrate/hooks/codex-toml-installer.js.map +1 -1
  95. package/dist/migrate/hooks/hooks-settings-merger.d.ts +3 -0
  96. package/dist/migrate/hooks/hooks-settings-merger.d.ts.map +1 -1
  97. package/dist/migrate/hooks/hooks-settings-merger.js +157 -21
  98. package/dist/migrate/hooks/hooks-settings-merger.js.map +1 -1
  99. package/dist/migrate/migrate-orchestrator.d.ts +19 -0
  100. package/dist/migrate/migrate-orchestrator.d.ts.map +1 -1
  101. package/dist/migrate/migrate-orchestrator.js +233 -26
  102. package/dist/migrate/migrate-orchestrator.js.map +1 -1
  103. package/dist/migrate/migrate-ui-summary.d.ts +25 -0
  104. package/dist/migrate/migrate-ui-summary.d.ts.map +1 -1
  105. package/dist/migrate/migrate-ui-summary.js +50 -0
  106. package/dist/migrate/migrate-ui-summary.js.map +1 -1
  107. package/dist/migrate/model-routing-config.d.ts +3 -1
  108. package/dist/migrate/model-routing-config.d.ts.map +1 -1
  109. package/dist/migrate/model-routing-config.js +28 -0
  110. package/dist/migrate/model-routing-config.js.map +1 -1
  111. package/dist/migrate/portability-policy.d.ts +3 -1
  112. package/dist/migrate/portability-policy.d.ts.map +1 -1
  113. package/dist/migrate/portability-policy.js +5 -31
  114. package/dist/migrate/portability-policy.js.map +1 -1
  115. package/dist/migrate/portable-installer.d.ts +17 -1
  116. package/dist/migrate/portable-installer.d.ts.map +1 -1
  117. package/dist/migrate/portable-installer.js +171 -9
  118. package/dist/migrate/portable-installer.js.map +1 -1
  119. package/dist/migrate/provider-registry-utils.d.ts.map +1 -1
  120. package/dist/migrate/provider-registry-utils.js +5 -0
  121. package/dist/migrate/provider-registry-utils.js.map +1 -1
  122. package/dist/migrate/providers/codex/capabilities.d.ts +6 -1
  123. package/dist/migrate/providers/codex/capabilities.d.ts.map +1 -1
  124. package/dist/migrate/providers/codex/capabilities.js +87 -0
  125. package/dist/migrate/providers/codex/capabilities.js.map +1 -1
  126. package/dist/migrate/providers/codex/config.d.ts.map +1 -1
  127. package/dist/migrate/providers/codex/config.js +27 -8
  128. package/dist/migrate/providers/codex/config.js.map +1 -1
  129. package/dist/migrate/providers/codex/contract.d.ts.map +1 -1
  130. package/dist/migrate/providers/codex/contract.js +4 -3
  131. package/dist/migrate/providers/codex/contract.js.map +1 -1
  132. package/dist/migrate/providers/codex/shell-env-policy-emitter.d.ts +27 -0
  133. package/dist/migrate/providers/codex/shell-env-policy-emitter.d.ts.map +1 -0
  134. package/dist/migrate/providers/codex/shell-env-policy-emitter.js +86 -0
  135. package/dist/migrate/providers/codex/shell-env-policy-emitter.js.map +1 -0
  136. package/dist/migrate/providers/provider-config-types.d.ts +1 -1
  137. package/dist/migrate/providers/provider-config-types.d.ts.map +1 -1
  138. package/dist/migrate/reconcile/index.d.ts +1 -1
  139. package/dist/migrate/reconcile/index.d.ts.map +1 -1
  140. package/dist/migrate/reconcile/index.js +1 -1
  141. package/dist/migrate/reconcile/index.js.map +1 -1
  142. package/dist/migrate/reconcile/portable-manifest.d.ts +18 -12
  143. package/dist/migrate/reconcile/portable-manifest.d.ts.map +1 -1
  144. package/dist/migrate/reconcile/portable-manifest.js +23 -0
  145. package/dist/migrate/reconcile/portable-manifest.js.map +1 -1
  146. package/dist/migrate/reconcile/portable-registry.d.ts +30 -30
  147. package/dist/migrate/reconcile/process-lock.d.ts.map +1 -1
  148. package/dist/migrate/reconcile/process-lock.js +10 -1
  149. package/dist/migrate/reconcile/process-lock.js.map +1 -1
  150. package/dist/migrate/reconcile/reconcile-state-builders.d.ts +12 -5
  151. package/dist/migrate/reconcile/reconcile-state-builders.d.ts.map +1 -1
  152. package/dist/migrate/reconcile/reconcile-state-builders.js +2 -2
  153. package/dist/migrate/reconcile/reconcile-state-builders.js.map +1 -1
  154. package/dist/migrate/references/codex-command-skill-path.d.ts +12 -0
  155. package/dist/migrate/references/codex-command-skill-path.d.ts.map +1 -0
  156. package/dist/migrate/references/codex-command-skill-path.js +27 -0
  157. package/dist/migrate/references/codex-command-skill-path.js.map +1 -0
  158. package/dist/migrate/references/env-var-rewrite-table.d.ts +36 -0
  159. package/dist/migrate/references/env-var-rewrite-table.d.ts.map +1 -0
  160. package/dist/migrate/references/env-var-rewrite-table.js +97 -0
  161. package/dist/migrate/references/env-var-rewrite-table.js.map +1 -0
  162. package/dist/migrate/references/fence-aware-reference-rewriter.d.ts +30 -0
  163. package/dist/migrate/references/fence-aware-reference-rewriter.d.ts.map +1 -0
  164. package/dist/migrate/references/fence-aware-reference-rewriter.js +182 -0
  165. package/dist/migrate/references/fence-aware-reference-rewriter.js.map +1 -0
  166. package/dist/migrate/references/reference-classifier.d.ts +27 -0
  167. package/dist/migrate/references/reference-classifier.d.ts.map +1 -0
  168. package/dist/migrate/references/reference-classifier.js +177 -0
  169. package/dist/migrate/references/reference-classifier.js.map +1 -0
  170. package/dist/migrate/references/reference-target-registry.d.ts +42 -0
  171. package/dist/migrate/references/reference-target-registry.d.ts.map +1 -0
  172. package/dist/migrate/references/reference-target-registry.js +100 -0
  173. package/dist/migrate/references/reference-target-registry.js.map +1 -0
  174. package/dist/migrate/references/reference-types.d.ts +23 -0
  175. package/dist/migrate/references/reference-types.d.ts.map +1 -0
  176. package/dist/migrate/references/reference-types.js +5 -0
  177. package/dist/migrate/references/reference-types.js.map +1 -0
  178. package/dist/migrate/runtime-compat-audit.d.ts +3 -1
  179. package/dist/migrate/runtime-compat-audit.d.ts.map +1 -1
  180. package/dist/migrate/runtime-compat-audit.js +10 -5
  181. package/dist/migrate/runtime-compat-audit.js.map +1 -1
  182. package/dist/migrate/runtime-coupling-patterns.d.ts +32 -3
  183. package/dist/migrate/runtime-coupling-patterns.d.ts.map +1 -1
  184. package/dist/migrate/runtime-coupling-patterns.js +51 -8
  185. package/dist/migrate/runtime-coupling-patterns.js.map +1 -1
  186. package/dist/migrate/skill-directory-audit.d.ts +17 -0
  187. package/dist/migrate/skill-directory-audit.d.ts.map +1 -1
  188. package/dist/migrate/skill-directory-audit.js +70 -11
  189. package/dist/migrate/skill-directory-audit.js.map +1 -1
  190. package/dist/migrate/skill-directory-installer.d.ts +5 -0
  191. package/dist/migrate/skill-directory-installer.d.ts.map +1 -1
  192. package/dist/migrate/skill-directory-installer.js +115 -9
  193. package/dist/migrate/skill-directory-installer.js.map +1 -1
  194. package/dist/migrate/state-changing-script-detector.d.ts +16 -0
  195. package/dist/migrate/state-changing-script-detector.d.ts.map +1 -0
  196. package/dist/migrate/state-changing-script-detector.js +144 -0
  197. package/dist/migrate/state-changing-script-detector.js.map +1 -0
  198. package/dist/migrate/types.d.ts +20 -10
  199. package/dist/migrate/types.d.ts.map +1 -1
  200. package/dist/migrate/types.js +4 -0
  201. package/dist/migrate/types.js.map +1 -1
  202. package/dist/migrate/validation/migrate-conversion-report.d.ts +48 -0
  203. package/dist/migrate/validation/migrate-conversion-report.d.ts.map +1 -0
  204. package/dist/migrate/validation/migrate-conversion-report.js +146 -0
  205. package/dist/migrate/validation/migrate-conversion-report.js.map +1 -0
  206. package/dist/migrate/validation/migration-ledger-inputs.d.ts +56 -0
  207. package/dist/migrate/validation/migration-ledger-inputs.d.ts.map +1 -0
  208. package/dist/migrate/validation/migration-ledger-inputs.js +160 -0
  209. package/dist/migrate/validation/migration-ledger-inputs.js.map +1 -0
  210. package/dist/migrate/validation/migration-record-types.d.ts +38 -0
  211. package/dist/migrate/validation/migration-record-types.d.ts.map +1 -0
  212. package/dist/migrate/validation/migration-record-types.js +12 -0
  213. package/dist/migrate/validation/migration-record-types.js.map +1 -0
  214. package/dist/migrate/validation/migration-report-writer.d.ts +98 -0
  215. package/dist/migrate/validation/migration-report-writer.d.ts.map +1 -0
  216. package/dist/migrate/validation/migration-report-writer.js +0 -0
  217. package/dist/migrate/validation/migration-report-writer.js.map +1 -0
  218. package/dist/migrate/validation/unresolved-reference-scanner.d.ts +18 -0
  219. package/dist/migrate/validation/unresolved-reference-scanner.d.ts.map +1 -0
  220. package/dist/migrate/validation/unresolved-reference-scanner.js +47 -0
  221. package/dist/migrate/validation/unresolved-reference-scanner.js.map +1 -0
  222. package/package.json +1 -1
  223. package/portable-manifest.json +10 -2
@@ -1,14 +1,19 @@
1
1
  import { findRuntimeCouplingMatches } from "./runtime-coupling-patterns.js";
2
2
  const AUDITED_TYPES = new Set(["agent", "command", "config", "rules", "hooks"]);
3
- export function auditRuntimeCompatibility(content, item, targetProvider) {
3
+ export function auditRuntimeCompatibility(content, item, targetProvider, occurrences = []) {
4
4
  if (targetProvider === "claude-code")
5
- return { errors: [] };
5
+ return { errors: [], warnings: [] };
6
6
  if (!AUDITED_TYPES.has(item.type))
7
- return { errors: [] };
7
+ return { errors: [], warnings: [] };
8
8
  const errors = [];
9
- for (const match of findRuntimeCouplingMatches(content)) {
9
+ const warnings = [];
10
+ for (const match of findRuntimeCouplingMatches(content, occurrences)) {
11
+ if ((item.type === "rules" || item.type === "config") && match.cls === "claude-env-var" && match.rewrite) {
12
+ warnings.push(`${item.type}/${item.name} ${match.message} (${match.rewrite.annotation})`);
13
+ continue;
14
+ }
10
15
  errors.push(`${item.type}/${item.name} ${match.message}`);
11
16
  }
12
- return { errors };
17
+ return { errors, warnings };
13
18
  }
14
19
  //# sourceMappingURL=runtime-compat-audit.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"runtime-compat-audit.js","sourceRoot":"","sources":["../../src/migrate/runtime-compat-audit.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,0BAA0B,EAAE,MAAM,gCAAgC,CAAC;AAM5E,MAAM,aAAa,GAAG,IAAI,GAAG,CAAe,CAAC,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;AAE9F,MAAM,UAAU,yBAAyB,CACxC,OAAe,EACf,IAAyC,EACzC,cAA4B;IAE5B,IAAI,cAAc,KAAK,aAAa;QAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IAC5D,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IAEzD,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,KAAK,MAAM,KAAK,IAAI,0BAA0B,CAAC,OAAO,CAAC,EAAE,CAAC;QACzD,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IAC3D,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,CAAC;AACnB,CAAC"}
1
+ {"version":3,"file":"runtime-compat-audit.js","sourceRoot":"","sources":["../../src/migrate/runtime-compat-audit.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,0BAA0B,EAAE,MAAM,gCAAgC,CAAC;AAO5E,MAAM,aAAa,GAAG,IAAI,GAAG,CAAe,CAAC,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;AAE9F,MAAM,UAAU,yBAAyB,CACxC,OAAe,EACf,IAAyC,EACzC,cAA4B,EAC5B,cAAqC,EAAE;IAEvC,IAAI,cAAc,KAAK,aAAa;QAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IAC1E,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IAEvE,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,KAAK,MAAM,KAAK,IAAI,0BAA0B,CAAC,OAAO,EAAE,WAAW,CAAC,EAAE,CAAC;QACtE,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,OAAO,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,IAAI,KAAK,CAAC,GAAG,KAAK,gBAAgB,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;YAC1G,QAAQ,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,KAAK,CAAC,OAAO,KAAK,KAAK,CAAC,OAAO,CAAC,UAAU,GAAG,CAAC,CAAC;YAC1F,SAAS;QACV,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IAC3D,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;AAC7B,CAAC"}
@@ -1,9 +1,38 @@
1
+ import type { ReferenceOccurrence } from "./references/reference-types.js";
2
+ /**
3
+ * Coarse pattern class of a runtime-coupling match. Downstream verdict logic keys
4
+ * off this to decide rewrite vs downgrade vs fail — the class is metadata, it does
5
+ * NOT itself relax the fail-closed default.
6
+ */
7
+ export type RuntimeCouplingClass = "claude-env-var" | "claude-cli" | "claude-path" | "claude-config-token";
1
8
  export interface RuntimeCouplingMatch {
2
9
  message: string;
10
+ /** Pattern class, used by the audit to select severity/rewrite handling. */
11
+ cls: RuntimeCouplingClass;
12
+ /**
13
+ * When the match is a table-known env var, this is the disposition + static
14
+ * rewrite/annotation from env-var-rewrite-table.ts. Absent for other classes.
15
+ * The value is ALWAYS a literal-table lookup — never derived from `content`.
16
+ */
17
+ rewrite?: {
18
+ token: string;
19
+ disposition: "rewrite" | "neutralize";
20
+ rewriteTo?: string;
21
+ annotation: string;
22
+ };
3
23
  }
4
- export declare const RUNTIME_COUPLING_PATTERNS: Array<{
24
+ interface CouplingRule {
5
25
  pattern: RegExp;
6
26
  message: string;
7
- }>;
8
- export declare function findRuntimeCouplingMatches(content: string): RuntimeCouplingMatch[];
27
+ cls: RuntimeCouplingClass;
28
+ }
29
+ /**
30
+ * Literal command/env patterns. `$CLAUDE_*` / `$ANTHROPIC_*` are handled via the
31
+ * env-var table below (so each occurrence carries a rewrite disposition); the two
32
+ * CLI patterns stay detect-only (no safe portable rewrite exists for a command
33
+ * assumption — it is neutralized or fails per file class).
34
+ */
35
+ export declare const RUNTIME_COUPLING_PATTERNS: ReadonlyArray<CouplingRule>;
36
+ export declare function findRuntimeCouplingMatches(content: string, occurrences?: ReferenceOccurrence[]): RuntimeCouplingMatch[];
37
+ export {};
9
38
  //# sourceMappingURL=runtime-coupling-patterns.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"runtime-coupling-patterns.d.ts","sourceRoot":"","sources":["../../src/migrate/runtime-coupling-patterns.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,oBAAoB;IACpC,OAAO,EAAE,MAAM,CAAC;CAChB;AAED,eAAO,MAAM,yBAAyB,EAAE,KAAK,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAOjF,CAAC;AAEF,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,MAAM,GAAG,oBAAoB,EAAE,CAMlF"}
1
+ {"version":3,"file":"runtime-coupling-patterns.d.ts","sourceRoot":"","sources":["../../src/migrate/runtime-coupling-patterns.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AAE3E;;;;GAIG;AACH,MAAM,MAAM,oBAAoB,GAC7B,gBAAgB,GAChB,YAAY,GACZ,aAAa,GACb,qBAAqB,CAAC;AAEzB,MAAM,WAAW,oBAAoB;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,4EAA4E;IAC5E,GAAG,EAAE,oBAAoB,CAAC;IAC1B;;;;OAIG;IACH,OAAO,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,SAAS,GAAG,YAAY,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;CAC3G;AAED,UAAU,YAAY;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,oBAAoB,CAAC;CAC1B;AAED;;;;;GAKG;AACH,eAAO,MAAM,yBAAyB,EAAE,aAAa,CAAC,YAAY,CAOjE,CAAC;AAUF,wBAAgB,0BAA0B,CACzC,OAAO,EAAE,MAAM,EACf,WAAW,GAAE,mBAAmB,EAAO,GACrC,oBAAoB,EAAE,CAiCxB"}
@@ -1,16 +1,59 @@
1
+ import { isExplainedReference } from "./validation/unresolved-reference-scanner.js";
2
+ import { sourceConfigTokenPattern, sourceReferencePattern } from "./references/reference-target-registry.js";
3
+ import { envVarTokenPattern, resolveEnvVar } from "./references/env-var-rewrite-table.js";
4
+ /**
5
+ * Literal command/env patterns. `$CLAUDE_*` / `$ANTHROPIC_*` are handled via the
6
+ * env-var table below (so each occurrence carries a rewrite disposition); the two
7
+ * CLI patterns stay detect-only (no safe portable rewrite exists for a command
8
+ * assumption — it is neutralized or fails per file class).
9
+ */
1
10
  export const RUNTIME_COUPLING_PATTERNS = [
2
- { pattern: /\.claude\//i, message: "contains a .claude/ path reference" },
3
- { pattern: /\bCLAUDE\.md\b/, message: "contains a CLAUDE.md reference" },
4
- { pattern: /\$CLAUDE_[A-Z0-9_]+\b/, message: "contains a Claude-specific environment variable" },
5
- { pattern: /\$ANTHROPIC_[A-Z0-9_]+\b/, message: "contains an Anthropic-specific environment variable" },
6
- { pattern: /\bnpx\s+claude\b/i, message: "contains a Claude Code command assumption" },
7
- { pattern: /\bclaude\s+(?:--|mcp|doctor|update)\b/i, message: "contains a Claude Code command assumption" },
11
+ { pattern: /\bnpx\s+claude\b/i, message: "contains a Claude Code command assumption", cls: "claude-cli" },
12
+ {
13
+ pattern: /\bclaude\s+(?:--|mcp|doctor|update)\b/i,
14
+ message: "contains a Claude Code command assumption",
15
+ cls: "claude-cli",
16
+ },
8
17
  ];
9
- export function findRuntimeCouplingMatches(content) {
18
+ // Source references are only coupling errors when the fence-aware classifier
19
+ // did NOT deliberately decide to keep them (citation, fenced runtime command,
20
+ // merged/non-directory target). Unexplained ones still hard-fail.
21
+ const SOURCE_REFERENCE_CHECKS = [
22
+ { makePattern: sourceReferencePattern, message: "contains a .claude/ path reference", cls: "claude-path" },
23
+ { makePattern: sourceConfigTokenPattern, message: "contains a CLAUDE.md reference", cls: "claude-config-token" },
24
+ ];
25
+ export function findRuntimeCouplingMatches(content, occurrences = []) {
10
26
  const matches = [];
27
+ // Env vars: one match per DISTINCT token so per-pattern verdicts stay granular.
28
+ const seenTokens = new Set();
29
+ for (const found of content.matchAll(envVarTokenPattern())) {
30
+ const token = found[0];
31
+ if (seenTokens.has(token))
32
+ continue;
33
+ seenTokens.add(token);
34
+ const resolution = resolveEnvVar(token);
35
+ if (!resolution)
36
+ continue;
37
+ const isAnthropic = /^\$\{?ANTHROPIC_/.test(token);
38
+ matches.push({
39
+ message: isAnthropic
40
+ ? "contains an Anthropic-specific environment variable"
41
+ : "contains a Claude-specific environment variable",
42
+ cls: "claude-env-var",
43
+ rewrite: { token, ...resolution },
44
+ });
45
+ }
11
46
  for (const rule of RUNTIME_COUPLING_PATTERNS) {
12
47
  if (rule.pattern.test(content))
13
- matches.push({ message: rule.message });
48
+ matches.push({ message: rule.message, cls: rule.cls });
49
+ }
50
+ for (const check of SOURCE_REFERENCE_CHECKS) {
51
+ for (const match of content.matchAll(check.makePattern())) {
52
+ if (!isExplainedReference(match[0], occurrences)) {
53
+ matches.push({ message: check.message, cls: check.cls });
54
+ break;
55
+ }
56
+ }
14
57
  }
15
58
  return matches;
16
59
  }
@@ -1 +1 @@
1
- {"version":3,"file":"runtime-coupling-patterns.js","sourceRoot":"","sources":["../../src/migrate/runtime-coupling-patterns.ts"],"names":[],"mappings":"AAIA,MAAM,CAAC,MAAM,yBAAyB,GAAgD;IACrF,EAAE,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,oCAAoC,EAAE;IACzE,EAAE,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,gCAAgC,EAAE;IACxE,EAAE,OAAO,EAAE,uBAAuB,EAAE,OAAO,EAAE,iDAAiD,EAAE;IAChG,EAAE,OAAO,EAAE,0BAA0B,EAAE,OAAO,EAAE,qDAAqD,EAAE;IACvG,EAAE,OAAO,EAAE,mBAAmB,EAAE,OAAO,EAAE,2CAA2C,EAAE;IACtF,EAAE,OAAO,EAAE,wCAAwC,EAAE,OAAO,EAAE,2CAA2C,EAAE;CAC3G,CAAC;AAEF,MAAM,UAAU,0BAA0B,CAAC,OAAe;IACzD,MAAM,OAAO,GAA2B,EAAE,CAAC;IAC3C,KAAK,MAAM,IAAI,IAAI,yBAAyB,EAAE,CAAC;QAC9C,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC;YAAE,OAAO,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IACzE,CAAC;IACD,OAAO,OAAO,CAAC;AAChB,CAAC"}
1
+ {"version":3,"file":"runtime-coupling-patterns.js","sourceRoot":"","sources":["../../src/migrate/runtime-coupling-patterns.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,8CAA8C,CAAC;AACpF,OAAO,EAAE,wBAAwB,EAAE,sBAAsB,EAAE,MAAM,2CAA2C,CAAC;AAC7G,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,uCAAuC,CAAC;AAgC1F;;;;;GAKG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAgC;IACrE,EAAE,OAAO,EAAE,mBAAmB,EAAE,OAAO,EAAE,2CAA2C,EAAE,GAAG,EAAE,YAAY,EAAE;IACzG;QACC,OAAO,EAAE,wCAAwC;QACjD,OAAO,EAAE,2CAA2C;QACpD,GAAG,EAAE,YAAY;KACjB;CACD,CAAC;AAEF,6EAA6E;AAC7E,8EAA8E;AAC9E,kEAAkE;AAClE,MAAM,uBAAuB,GAAqF;IACjH,EAAE,WAAW,EAAE,sBAAsB,EAAE,OAAO,EAAE,oCAAoC,EAAE,GAAG,EAAE,aAAa,EAAE;IAC1G,EAAE,WAAW,EAAE,wBAAwB,EAAE,OAAO,EAAE,gCAAgC,EAAE,GAAG,EAAE,qBAAqB,EAAE;CAChH,CAAC;AAEF,MAAM,UAAU,0BAA0B,CACzC,OAAe,EACf,cAAqC,EAAE;IAEvC,MAAM,OAAO,GAA2B,EAAE,CAAC;IAE3C,gFAAgF;IAChF,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;IACrC,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,QAAQ,CAAC,kBAAkB,EAAE,CAAC,EAAE,CAAC;QAC5D,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACvB,IAAI,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC;YAAE,SAAS;QACpC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACtB,MAAM,UAAU,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;QACxC,IAAI,CAAC,UAAU;YAAE,SAAS;QAC1B,MAAM,WAAW,GAAG,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnD,OAAO,CAAC,IAAI,CAAC;YACZ,OAAO,EAAE,WAAW;gBACnB,CAAC,CAAC,qDAAqD;gBACvD,CAAC,CAAC,iDAAiD;YACpD,GAAG,EAAE,gBAAgB;YACrB,OAAO,EAAE,EAAE,KAAK,EAAE,GAAG,UAAU,EAAE;SACjC,CAAC,CAAC;IACJ,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,yBAAyB,EAAE,CAAC;QAC9C,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC;YAAE,OAAO,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IACxF,CAAC;IACD,KAAK,MAAM,KAAK,IAAI,uBAAuB,EAAE,CAAC;QAC7C,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;YAC3D,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,EAAE,CAAC;gBAClD,OAAO,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;gBACzD,MAAM;YACP,CAAC;QACF,CAAC;IACF,CAAC;IACD,OAAO,OAAO,CAAC;AAChB,CAAC"}
@@ -1,13 +1,30 @@
1
+ import type { ReferenceOccurrence } from "./references/reference-types.js";
1
2
  import type { ProviderType } from "./types.js";
2
3
  export interface SkillDirectoryAuditIssue {
3
4
  filePath: string;
4
5
  message: string;
5
6
  }
7
+ /**
8
+ * A runtime-coupling match that was downgraded from fail-closed to warn+annotate
9
+ * (reference-grade markdown, or a table-rewriteable pattern in a non-state-changing
10
+ * script). Every waiver is a structured record — never a silent absence.
11
+ */
12
+ export interface SkillDirectoryAuditWaiver {
13
+ filePath: string;
14
+ /** Pattern class message, e.g. "contains a Claude-specific environment variable". */
15
+ message: string;
16
+ /** Provider-neutral annotation describing what was rewritten/neutralized. */
17
+ annotation: string;
18
+ }
6
19
  export interface SkillDirectoryAuditResult {
7
20
  errors: SkillDirectoryAuditIssue[];
21
+ /** Downgraded matches (warn, not fail). Empty when nothing was downgraded. */
22
+ waivers: SkillDirectoryAuditWaiver[];
8
23
  }
9
24
  export interface SkillDirectoryAuditOptions {
10
25
  ignoreRewriteableMarkdown?: boolean;
26
+ /** Classifier decisions per rewritten markdown file (relative path) */
27
+ occurrencesByFile?: Map<string, ReferenceOccurrence[]>;
11
28
  }
12
29
  export declare function auditSkillDirectory(rootDir: string, provider: ProviderType, skillName: string, options?: SkillDirectoryAuditOptions): Promise<SkillDirectoryAuditResult>;
13
30
  //# sourceMappingURL=skill-directory-audit.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"skill-directory-audit.d.ts","sourceRoot":"","sources":["../../src/migrate/skill-directory-audit.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,MAAM,WAAW,wBAAwB;IACxC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,yBAAyB;IACzC,MAAM,EAAE,wBAAwB,EAAE,CAAC;CACnC;AAED,MAAM,WAAW,0BAA0B;IAC1C,yBAAyB,CAAC,EAAE,OAAO,CAAC;CACpC;AAuDD,wBAAsB,mBAAmB,CACxC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,YAAY,EACtB,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,0BAA+B,GACtC,OAAO,CAAC,yBAAyB,CAAC,CAyBpC"}
1
+ {"version":3,"file":"skill-directory-audit.d.ts","sourceRoot":"","sources":["../../src/migrate/skill-directory-audit.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AAC3E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,MAAM,WAAW,wBAAwB;IACxC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CAChB;AAED;;;;GAIG;AACH,MAAM,WAAW,yBAAyB;IACzC,QAAQ,EAAE,MAAM,CAAC;IACjB,qFAAqF;IACrF,OAAO,EAAE,MAAM,CAAC;IAChB,6EAA6E;IAC7E,UAAU,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,yBAAyB;IACzC,MAAM,EAAE,wBAAwB,EAAE,CAAC;IACnC,8EAA8E;IAC9E,OAAO,EAAE,yBAAyB,EAAE,CAAC;CACrC;AAED,MAAM,WAAW,0BAA0B;IAC1C,yBAAyB,CAAC,EAAE,OAAO,CAAC;IACpC,uEAAuE;IACvE,iBAAiB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,mBAAmB,EAAE,CAAC,CAAC;CACvD;AAkHD,wBAAsB,mBAAmB,CACxC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,YAAY,EACtB,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,0BAA+B,GACtC,OAAO,CAAC,yBAAyB,CAAC,CAoCpC"}
@@ -1,6 +1,7 @@
1
1
  import { readdir, readFile, stat } from "node:fs/promises";
2
2
  import { extname, join, relative } from "node:path";
3
3
  import { findRuntimeCouplingMatches } from "./runtime-coupling-patterns.js";
4
+ import { detectStateChanging, languageFor } from "./state-changing-script-detector.js";
4
5
  import { isBinaryContent } from "./reconcile/checksum-utils.js";
5
6
  const MAX_TEXT_FILE_BYTES = 512 * 1024;
6
7
  const EXECUTABLE_EXTENSIONS = new Set([".sh", ".py", ".js", ".cjs", ".mjs", ".ts"]);
@@ -30,9 +31,16 @@ function shouldScanFile(filePath, size) {
30
31
  return false;
31
32
  return TEXT_EXTENSIONS.has(extname(filePath).toLowerCase());
32
33
  }
33
- function isHighRiskFile(filePath) {
34
- const base = filePath.split("/").pop()?.toLowerCase() ?? "";
35
- return EXECUTABLE_EXTENSIONS.has(extname(filePath).toLowerCase()) || base === "skill.md";
34
+ function classifyFile(relativePath) {
35
+ const base = relativePath.split("/").pop()?.toLowerCase() ?? "";
36
+ const ext = extname(relativePath).toLowerCase();
37
+ if (EXECUTABLE_EXTENSIONS.has(ext))
38
+ return "script";
39
+ if (base === "skill.md")
40
+ return "entry";
41
+ if (ext === ".md" || ext === ".mdx")
42
+ return "reference";
43
+ return "other";
36
44
  }
37
45
  function isMarkdownFile(filePath) {
38
46
  const extension = extname(filePath).toLowerCase();
@@ -52,10 +60,52 @@ async function collectFiles(rootDir) {
52
60
  }
53
61
  return files;
54
62
  }
63
+ /**
64
+ * Severity-aware, per-pattern verdict. This is where the LOCKED script policy and
65
+ * the reference-grade downgrade live:
66
+ *
67
+ * - Reference-grade markdown (references/*.md, non-entry docs): every runtime
68
+ * coupling downgrades to warn+annotate. Markdown never executes.
69
+ * - Entry markdown (SKILL.md): env-var patterns are table-rewriteable (a safe
70
+ * static lookup) → warn+annotate; CLI/path/config patterns downgrade to warn
71
+ * too, because a markdown doc line is not runnable. (High-risk == a runnable
72
+ * *script*, not the fact of being SKILL.md.)
73
+ * - Scripts: if the whole script is state-changing AND carries ANY coupling
74
+ * match → FAIL-CLOSED for every match (a rewrite never downgrades it). A
75
+ * non-state-changing script rewrites known env-var patterns (warn+annotate),
76
+ * else warn+preserve — per the locked policy.
77
+ */
78
+ function verdictFor(match, fileClass, scriptIsStateChanging, stateChangingReason) {
79
+ if (fileClass === "script" && scriptIsStateChanging) {
80
+ return {
81
+ kind: "fail",
82
+ message: `${match.message} (state-changing script ${stateChangingReason ?? ""}; fail-closed — no rewrite path downgrades it)`.trimEnd(),
83
+ };
84
+ }
85
+ if (match.cls === "claude-env-var" && match.rewrite) {
86
+ const detail = match.rewrite.disposition === "rewrite" ? "rewritten" : "neutralized";
87
+ return { kind: "warn", message: `${match.message} (${detail})`, annotation: match.rewrite.annotation };
88
+ }
89
+ // Non-env patterns (CLI, .claude/ path, CLAUDE.md token).
90
+ if (fileClass === "reference" || fileClass === "entry") {
91
+ return {
92
+ kind: "warn",
93
+ message: `${match.message} (documentation reference)`,
94
+ annotation: `${match.message}; preserved in migrated docs — adapt manually for the target runtime`,
95
+ };
96
+ }
97
+ // Non-state-changing script, non-rewriteable pattern → warn + preserve.
98
+ return {
99
+ kind: "warn",
100
+ message: `${match.message} (preserved)`,
101
+ annotation: `${match.message}; left unchanged (no safe portable rewrite) — adapt manually for the target runtime`,
102
+ };
103
+ }
55
104
  export async function auditSkillDirectory(rootDir, provider, skillName, options = {}) {
56
105
  if (provider === "claude-code")
57
- return { errors: [] };
106
+ return { errors: [], waivers: [] };
58
107
  const errors = [];
108
+ const waivers = [];
59
109
  for (const filePath of await collectFiles(rootDir)) {
60
110
  const info = await stat(filePath);
61
111
  if (!shouldScanFile(filePath, info.size))
@@ -67,14 +117,23 @@ export async function auditSkillDirectory(rootDir, provider, skillName, options
67
117
  const relativePath = relative(rootDir, filePath).replace(/\\/g, "/");
68
118
  if (options.ignoreRewriteableMarkdown && isMarkdownFile(relativePath))
69
119
  continue;
70
- for (const match of findRuntimeCouplingMatches(content)) {
71
- const severity = isHighRiskFile(relativePath) ? "high-risk" : "runtime-coupled";
72
- errors.push({
73
- filePath: relativePath,
74
- message: `${provider} skill/${skillName} ${severity} file ${relativePath} ${match.message}`,
75
- });
120
+ const fileClass = classifyFile(relativePath);
121
+ const stateChange = fileClass === "script" ? detectStateChanging(content, languageFor(relativePath)) : { stateChanging: false };
122
+ const occurrences = options.occurrencesByFile?.get(relativePath) ?? [];
123
+ for (const match of findRuntimeCouplingMatches(content, occurrences)) {
124
+ const verdict = verdictFor(match, fileClass, stateChange.stateChanging, stateChange.reason);
125
+ const severity = fileClass === "script" || fileClass === "entry" ? "high-risk" : "runtime-coupled";
126
+ if (verdict.kind === "fail") {
127
+ errors.push({
128
+ filePath: relativePath,
129
+ message: `${provider} skill/${skillName} ${severity} file ${relativePath} ${verdict.message}`,
130
+ });
131
+ }
132
+ else {
133
+ waivers.push({ filePath: relativePath, message: verdict.message, annotation: verdict.annotation });
134
+ }
76
135
  }
77
136
  }
78
- return { errors };
137
+ return { errors, waivers };
79
138
  }
80
139
  //# sourceMappingURL=skill-directory-audit.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"skill-directory-audit.js","sourceRoot":"","sources":["../../src/migrate/skill-directory-audit.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"skill-directory-audit.js","sourceRoot":"","sources":["../../src/migrate/skill-directory-audit.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,6 @@
1
+ import { type ReferenceIntegrityIndex } from "./references/fence-aware-reference-rewriter.js";
1
2
  import { type InstalledBackRef } from "../core/install-metadata-backref.js";
3
+ import type { MigrationDecisionRecord } from "./validation/migration-record-types.js";
2
4
  import type { ProviderType, SkillInfo } from "./types.js";
3
5
  export interface SkillInstallResult {
4
6
  skill: string;
@@ -6,6 +8,8 @@ export interface SkillInstallResult {
6
8
  success: boolean;
7
9
  path?: string;
8
10
  error?: string;
11
+ /** Structured decision records (migrated / failed / partial-with-waivers) for the run report. */
12
+ records?: MigrationDecisionRecord[];
9
13
  }
10
14
  /**
11
15
  * Install a single skill directory to the target provider.
@@ -15,6 +19,7 @@ export interface SkillInstallResult {
15
19
  export declare function installSkillDirectory(skill: SkillInfo, provider: ProviderType, options: {
16
20
  global: boolean;
17
21
  installedBackRef?: InstalledBackRef | null;
22
+ migratedRefs?: ReferenceIntegrityIndex | null;
18
23
  }): Promise<SkillInstallResult>;
19
24
  /**
20
25
  * Compute the install path for a skill on a target provider (used by reconciler/dry-run).
@@ -1 +1 @@
1
- {"version":3,"file":"skill-directory-installer.d.ts","sourceRoot":"","sources":["../../src/migrate/skill-directory-installer.ts"],"names":[],"mappings":"AAYA,OAAO,EAA2B,KAAK,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AAErG,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE1D,MAAM,WAAW,kBAAkB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,YAAY,CAAC;IACvB,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AA0CD;;;;GAIG;AACH,wBAAsB,qBAAqB,CAC1C,KAAK,EAAE,SAAS,EAChB,QAAQ,EAAE,YAAY,EACtB,OAAO,EAAE;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,gBAAgB,CAAC,EAAE,gBAAgB,GAAG,IAAI,CAAA;CAAE,GACtE,OAAO,CAAC,kBAAkB,CAAC,CAwF7B;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAClC,KAAK,EAAE,SAAS,EAChB,QAAQ,EAAE,YAAY,EACtB,OAAO,EAAE;IAAE,MAAM,EAAE,OAAO,CAAA;CAAE,GAC1B,MAAM,GAAG,IAAI,CAGf"}
1
+ {"version":3,"file":"skill-directory-installer.d.ts","sourceRoot":"","sources":["../../src/migrate/skill-directory-installer.ts"],"names":[],"mappings":"AAOA,OAAO,EAGN,KAAK,uBAAuB,EAC5B,MAAM,gDAAgD,CAAC;AAMxD,OAAO,EAA2B,KAAK,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AAIrG,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,wCAAwC,CAAC;AACtF,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAe1D,MAAM,WAAW,kBAAkB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,YAAY,CAAC;IACvB,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iGAAiG;IACjG,OAAO,CAAC,EAAE,uBAAuB,EAAE,CAAC;CACpC;AAqGD;;;;GAIG;AACH,wBAAsB,qBAAqB,CAC1C,KAAK,EAAE,SAAS,EAChB,QAAQ,EAAE,YAAY,EACtB,OAAO,EAAE;IACR,MAAM,EAAE,OAAO,CAAC;IAChB,gBAAgB,CAAC,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAC3C,YAAY,CAAC,EAAE,uBAAuB,GAAG,IAAI,CAAC;CAC9C,GACC,OAAO,CAAC,kBAAkB,CAAC,CA2I7B;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAClC,KAAK,EAAE,SAAS,EAChB,QAAQ,EAAE,YAAY,EACtB,OAAO,EAAE;IAAE,MAAM,EAAE,OAAO,CAAA;CAAE,GAC1B,MAAM,GAAG,IAAI,CAGf"}
@@ -4,6 +4,7 @@ import { existsSync } from "node:fs";
4
4
  import { cp, mkdir, readdir, readFile, realpath, rename, rm, writeFile } from "node:fs/promises";
5
5
  import { dirname, join, resolve } from "node:path";
6
6
  import { stripClaudeRefs } from "./converters/index.js";
7
+ import { combineIntegrityIndexes, createReferenceIntegrityIndex, } from "./references/fence-aware-reference-rewriter.js";
7
8
  import { providers } from "./provider-registry.js";
8
9
  import { getPortableInstallPath } from "./provider-registry-utils.js";
9
10
  import { sanitizeSkillName } from "./discovery/skills-discovery.js";
@@ -11,6 +12,20 @@ import { computeContentChecksum } from "./reconcile/checksum-utils.js";
11
12
  import { addPortableInstallation } from "./reconcile/portable-registry.js";
12
13
  import { resolveInstalledBackRef } from "../core/install-metadata-backref.js";
13
14
  import { auditSkillDirectory } from "./skill-directory-audit.js";
15
+ import { applyEnvVarRewrites } from "./apply-env-var-rewrites.js";
16
+ import { detectStateChanging, languageFor } from "./state-changing-script-detector.js";
17
+ const NON_STATE_CHANGING_REWRITE_EXTENSIONS = new Set([".sh", ".py", ".js", ".cjs", ".mjs", ".ts", ".tsx"]);
18
+ const REWRITE_SCANNABLE_EXTENSIONS = new Set([
19
+ ...NON_STATE_CHANGING_REWRITE_EXTENSIONS,
20
+ ".md",
21
+ ".mdx",
22
+ ".txt",
23
+ ".json",
24
+ ".jsonc",
25
+ ".yaml",
26
+ ".yml",
27
+ ".toml",
28
+ ]);
14
29
  async function canonicalize(path) {
15
30
  try {
16
31
  return await realpath(path);
@@ -31,26 +46,74 @@ async function canonicalize(path) {
31
46
  }
32
47
  }
33
48
  }
34
- async function rewriteMarkdownFilesForProvider(rootDir, provider) {
49
+ async function rewriteMarkdownFilesForProvider(rootDir, provider, migratedRefs, occurrencesByFile, baseDir = rootDir) {
35
50
  const entries = await readdir(rootDir, { withFileTypes: true });
36
51
  for (const entry of entries) {
37
52
  const fullPath = join(rootDir, entry.name);
38
53
  if (entry.isDirectory()) {
39
- await rewriteMarkdownFilesForProvider(fullPath, provider);
54
+ await rewriteMarkdownFilesForProvider(fullPath, provider, migratedRefs, occurrencesByFile, baseDir);
40
55
  continue;
41
56
  }
42
57
  if (!entry.isFile() || !entry.name.toLowerCase().endsWith(".md"))
43
58
  continue;
44
59
  const original = await readFile(fullPath, "utf-8");
45
- const rewritten = stripClaudeRefs(original, {
60
+ const stripped = stripClaudeRefs(original, {
46
61
  provider,
47
62
  targetName: providers[provider].displayName,
48
- }).content;
49
- if (rewritten !== original) {
50
- await writeFile(fullPath, rewritten, "utf-8");
63
+ file: entry.name,
64
+ migratedRefs,
65
+ });
66
+ const relPath = fullPath.slice(baseDir.length + 1).replace(/\\/g, "/");
67
+ occurrencesByFile.set(relPath, stripped.occurrences);
68
+ if (stripped.content !== original) {
69
+ await writeFile(fullPath, stripped.content, "utf-8");
51
70
  }
52
71
  }
53
72
  }
73
+ /**
74
+ * Apply the static env-var rewrite table across the copied tree BEFORE the audit.
75
+ * State-changing scripts are NOT rewritten — a rewrite path must never downgrade a
76
+ * state-changing script (LOCKED policy 4a); it fail-closes in the audit regardless.
77
+ * Only "rewrite"-disposition tokens are substituted; "neutralize" tokens remain for
78
+ * the audit to warn+annotate. Returns one migration record per file that changed.
79
+ */
80
+ async function applyEnvVarRewritesForProvider(rootDir, provider, skill, baseDir = rootDir) {
81
+ const records = [];
82
+ const entries = await readdir(rootDir, { withFileTypes: true });
83
+ for (const entry of entries) {
84
+ const fullPath = join(rootDir, entry.name);
85
+ if (entry.isDirectory()) {
86
+ records.push(...(await applyEnvVarRewritesForProvider(fullPath, provider, skill, baseDir)));
87
+ continue;
88
+ }
89
+ if (!entry.isFile())
90
+ continue;
91
+ const ext = fullPath.slice(fullPath.lastIndexOf(".")).toLowerCase();
92
+ if (!REWRITE_SCANNABLE_EXTENSIONS.has(ext))
93
+ continue;
94
+ const original = await readFile(fullPath, "utf-8");
95
+ // Never rewrite a state-changing script — it stays fail-closed by policy.
96
+ if (NON_STATE_CHANGING_REWRITE_EXTENSIONS.has(ext) && detectStateChanging(original, languageFor(fullPath)).stateChanging)
97
+ continue;
98
+ const { content, applied } = applyEnvVarRewrites(original);
99
+ if (applied.length === 0)
100
+ continue;
101
+ await writeFile(fullPath, content, "utf-8");
102
+ const relPath = fullPath.slice(baseDir.length + 1).replace(/\\/g, "/");
103
+ for (const a of applied) {
104
+ records.push({
105
+ source: `.claude/skills/${skill.dirName}/${relPath}`,
106
+ type: "skill",
107
+ provider,
108
+ outcome: "partial",
109
+ reason: "runtime-neutralized",
110
+ detail: a.annotation,
111
+ target: relPath,
112
+ });
113
+ }
114
+ }
115
+ return records;
116
+ }
54
117
  /**
55
118
  * Install a single skill directory to the target provider.
56
119
  * Source dir → target dir using node fs.cp recursive.
@@ -72,6 +135,10 @@ export async function installSkillDirectory(skill, provider, options) {
72
135
  };
73
136
  }
74
137
  const targetDir = join(targetBase, sanitizedName);
138
+ // Structured decision records — populated during install (waivers/rewrites) and
139
+ // on audit failure (fail-closed). Surfaced on the result so no outcome is silent.
140
+ const installRecords = [];
141
+ let failureRecords = [];
75
142
  try {
76
143
  const parent = dirname(targetDir);
77
144
  if (!existsSync(parent))
@@ -90,11 +157,43 @@ export async function installSkillDirectory(skill, provider, options) {
90
157
  try {
91
158
  await cp(skill.sourcePath, targetDir, { recursive: true, force: true, errorOnExist: false });
92
159
  copied = true;
93
- await rewriteMarkdownFilesForProvider(targetDir, provider);
94
- const audit = await auditSkillDirectory(targetDir, provider, skill.name);
160
+ // The skill being installed is definitionally part of the migration set,
161
+ // so its own fenced self-references always pass the integrity check.
162
+ const selfIndex = createReferenceIntegrityIndex([`.claude/skills/${skill.dirName}/`]);
163
+ const occurrencesByFile = new Map();
164
+ await rewriteMarkdownFilesForProvider(targetDir, provider, combineIntegrityIndexes(selfIndex, options.migratedRefs), occurrencesByFile);
165
+ // Apply the static env-var rewrite table across the tree (scripts + markdown)
166
+ // BEFORE the audit, so table-known tokens (e.g. $CLAUDE_PROJECT_DIR) are already
167
+ // neutralized to a provider-neutral literal when the audit runs. State-changing
168
+ // scripts are skipped inside the helper and stay fail-closed.
169
+ const rewriteRecords = provider === "claude-code" ? [] : await applyEnvVarRewritesForProvider(targetDir, provider, skill);
170
+ installRecords.push(...rewriteRecords);
171
+ const audit = await auditSkillDirectory(targetDir, provider, skill.name, { occurrencesByFile });
95
172
  if (audit.errors.length > 0) {
173
+ // Fail-closed: emit a structured failure record (never a silent absence),
174
+ // then throw so the catch block rolls the whole skill dir back.
175
+ failureRecords = audit.errors.map((e) => ({
176
+ source: `.claude/skills/${skill.dirName}/${e.filePath}`,
177
+ type: "skill",
178
+ provider,
179
+ outcome: "failed",
180
+ reason: "audit-rejected",
181
+ detail: e.message,
182
+ }));
96
183
  throw new Error(`Skill runtime compatibility audit failed: ${audit.errors.map((e) => e.message).join("; ")}`);
97
184
  }
185
+ // Downgraded matches (warn+annotate) become partial-migration records.
186
+ for (const w of audit.waivers) {
187
+ installRecords.push({
188
+ source: `.claude/skills/${skill.dirName}/${w.filePath}`,
189
+ type: "skill",
190
+ provider,
191
+ outcome: "partial",
192
+ reason: "runtime-neutralized",
193
+ detail: `${w.message}: ${w.annotation}`,
194
+ target: w.filePath,
195
+ });
196
+ }
98
197
  const skillMdPath = join(skill.sourcePath, "SKILL.md");
99
198
  const skillMdTarget = join(targetDir, "SKILL.md");
100
199
  const sourceChecksum = computeContentChecksum(await readFile(skillMdPath, "utf-8"));
@@ -125,7 +224,13 @@ export async function installSkillDirectory(skill, provider, options) {
125
224
  if (backupDir && existsSync(backupDir)) {
126
225
  await rm(backupDir, { recursive: true, force: true });
127
226
  }
128
- return { skill: skill.name, provider, success: true, path: targetDir };
227
+ return {
228
+ skill: skill.name,
229
+ provider,
230
+ success: true,
231
+ path: targetDir,
232
+ records: installRecords.length > 0 ? installRecords : undefined,
233
+ };
129
234
  }
130
235
  catch (err) {
131
236
  return {
@@ -133,6 +238,7 @@ export async function installSkillDirectory(skill, provider, options) {
133
238
  provider,
134
239
  success: false,
135
240
  error: err instanceof Error ? err.message : String(err),
241
+ records: failureRecords.length > 0 ? failureRecords : undefined,
136
242
  };
137
243
  }
138
244
  }
@@ -1 +1 @@
1
- {"version":3,"file":"skill-directory-installer.js","sourceRoot":"","sources":["../../src/migrate/skill-directory-installer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"skill-directory-installer.js","sourceRoot":"","sources":["../../src/migrate/skill-directory-installer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ export type ScriptLanguage = "shell" | "python" | "node" | "unknown";
2
+ export declare function languageFor(filePath: string): ScriptLanguage;
3
+ export interface StateChangingResult {
4
+ stateChanging: boolean;
5
+ /** Reason for the first matched state-changing command (for records/escalation). */
6
+ reason?: string;
7
+ }
8
+ /**
9
+ * Report whether `content` contains a state-changing command. `language` scopes the
10
+ * language-specific rules; omit it (or pass "unknown") to apply ALL rules — the
11
+ * most conservative choice. Comment lines and (for shell command patterns) quoted
12
+ * strings are excluded so a mention in a comment/string is not a false positive.
13
+ * `content` is DATA: matched, never executed.
14
+ */
15
+ export declare function detectStateChanging(content: string, language?: ScriptLanguage): StateChangingResult;
16
+ //# sourceMappingURL=state-changing-script-detector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state-changing-script-detector.d.ts","sourceRoot":"","sources":["../../src/migrate/state-changing-script-detector.ts"],"names":[],"mappings":"AAiBA,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,GAAG,SAAS,CAAC;AAmErE,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc,CAe5D;AAED,MAAM,WAAW,mBAAmB;IACnC,aAAa,EAAE,OAAO,CAAC;IACvB,oFAAoF;IACpF,MAAM,CAAC,EAAE,MAAM,CAAC;CAChB;AAmBD;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,GAAE,cAA0B,GAAG,mBAAmB,CAsB9G"}