@monoes/monomindcli 2.15.6 → 2.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (304) hide show
  1. package/.claude/helpers/build-skill-registry.cjs +23 -2
  2. package/.claude/helpers/handlers/route-handler.cjs +89 -3
  3. package/.claude/helpers/handlers/session-restore-handler.cjs +1 -1
  4. package/.claude/helpers/jev-picker.cjs +499 -0
  5. package/.claude/helpers/redact-secrets.cjs +69 -0
  6. package/.claude/skills/mastermind-agent-select/SKILL.md +28 -0
  7. package/dist/src/catalog/blueprints.d.ts +39 -0
  8. package/dist/src/catalog/blueprints.d.ts.map +1 -0
  9. package/dist/src/catalog/blueprints.js +78 -0
  10. package/dist/src/catalog/blueprints.js.map +1 -0
  11. package/dist/src/catalog/digest.d.ts +16 -0
  12. package/dist/src/catalog/digest.d.ts.map +1 -0
  13. package/dist/src/catalog/digest.js +62 -0
  14. package/dist/src/catalog/digest.js.map +1 -0
  15. package/dist/src/catalog/frontmatter.d.ts +23 -0
  16. package/dist/src/catalog/frontmatter.d.ts.map +1 -0
  17. package/dist/src/catalog/frontmatter.js +80 -0
  18. package/dist/src/catalog/frontmatter.js.map +1 -0
  19. package/dist/src/catalog/lifecycle.d.ts +31 -0
  20. package/dist/src/catalog/lifecycle.d.ts.map +1 -0
  21. package/dist/src/catalog/lifecycle.js +78 -0
  22. package/dist/src/catalog/lifecycle.js.map +1 -0
  23. package/dist/src/catalog/projection.d.ts +57 -0
  24. package/dist/src/catalog/projection.d.ts.map +1 -0
  25. package/dist/src/catalog/projection.js +272 -0
  26. package/dist/src/catalog/projection.js.map +1 -0
  27. package/dist/src/catalog/scan.d.ts +37 -0
  28. package/dist/src/catalog/scan.d.ts.map +1 -0
  29. package/dist/src/catalog/scan.js +214 -0
  30. package/dist/src/catalog/scan.js.map +1 -0
  31. package/dist/src/catalog/snapshot.d.ts +62 -0
  32. package/dist/src/catalog/snapshot.d.ts.map +1 -0
  33. package/dist/src/catalog/snapshot.js +183 -0
  34. package/dist/src/catalog/snapshot.js.map +1 -0
  35. package/dist/src/catalog/stage.d.ts +26 -0
  36. package/dist/src/catalog/stage.d.ts.map +1 -0
  37. package/dist/src/catalog/stage.js +316 -0
  38. package/dist/src/catalog/stage.js.map +1 -0
  39. package/dist/src/catalog/state.d.ts +23 -0
  40. package/dist/src/catalog/state.d.ts.map +1 -0
  41. package/dist/src/catalog/state.js +102 -0
  42. package/dist/src/catalog/state.js.map +1 -0
  43. package/dist/src/catalog/types.d.ts +289 -0
  44. package/dist/src/catalog/types.d.ts.map +1 -0
  45. package/dist/src/catalog/types.js +118 -0
  46. package/dist/src/catalog/types.js.map +1 -0
  47. package/dist/src/commands/catalog.d.ts +14 -0
  48. package/dist/src/commands/catalog.d.ts.map +1 -0
  49. package/dist/src/commands/catalog.js +392 -0
  50. package/dist/src/commands/catalog.js.map +1 -0
  51. package/dist/src/commands/doctor-catalog-checks.d.ts +3 -0
  52. package/dist/src/commands/doctor-catalog-checks.d.ts.map +1 -0
  53. package/dist/src/commands/doctor-catalog-checks.js +69 -0
  54. package/dist/src/commands/doctor-catalog-checks.js.map +1 -0
  55. package/dist/src/commands/doctor-decision-checks.d.ts +10 -0
  56. package/dist/src/commands/doctor-decision-checks.d.ts.map +1 -0
  57. package/dist/src/commands/doctor-decision-checks.js +82 -0
  58. package/dist/src/commands/doctor-decision-checks.js.map +1 -0
  59. package/dist/src/commands/doctor.d.ts.map +1 -1
  60. package/dist/src/commands/doctor.js +9 -1
  61. package/dist/src/commands/doctor.js.map +1 -1
  62. package/dist/src/commands/index.d.ts +2 -2
  63. package/dist/src/commands/index.d.ts.map +1 -1
  64. package/dist/src/commands/index.js +4 -1
  65. package/dist/src/commands/index.js.map +1 -1
  66. package/dist/src/commands/org-observe.d.ts.map +1 -1
  67. package/dist/src/commands/org-observe.js +7 -1
  68. package/dist/src/commands/org-observe.js.map +1 -1
  69. package/dist/src/commands/org-skills.d.ts.map +1 -1
  70. package/dist/src/commands/org-skills.js +14 -4
  71. package/dist/src/commands/org-skills.js.map +1 -1
  72. package/dist/src/commands/org.d.ts.map +1 -1
  73. package/dist/src/commands/org.js +8 -1
  74. package/dist/src/commands/org.js.map +1 -1
  75. package/dist/src/commands/pick.d.ts +4 -0
  76. package/dist/src/commands/pick.d.ts.map +1 -0
  77. package/dist/src/commands/pick.js +77 -0
  78. package/dist/src/commands/pick.js.map +1 -0
  79. package/dist/src/commands/route.js +1 -1
  80. package/dist/src/commands/route.js.map +1 -1
  81. package/dist/src/decision/catalogs.d.ts +20 -0
  82. package/dist/src/decision/catalogs.d.ts.map +1 -0
  83. package/dist/src/decision/catalogs.js +64 -0
  84. package/dist/src/decision/catalogs.js.map +1 -0
  85. package/dist/src/decision/jev.d.ts +85 -0
  86. package/dist/src/decision/jev.d.ts.map +1 -0
  87. package/dist/src/decision/jev.js +72 -0
  88. package/dist/src/decision/jev.js.map +1 -0
  89. package/dist/src/decision/picks.d.ts +50 -0
  90. package/dist/src/decision/picks.d.ts.map +1 -0
  91. package/dist/src/decision/picks.js +100 -0
  92. package/dist/src/decision/picks.js.map +1 -0
  93. package/dist/src/init/helpers-generator.d.ts.map +1 -1
  94. package/dist/src/init/helpers-generator.js +7 -0
  95. package/dist/src/init/helpers-generator.js.map +1 -1
  96. package/dist/src/orgrt/checkpoint-ops.d.ts.map +1 -1
  97. package/dist/src/orgrt/checkpoint-ops.js +6 -1
  98. package/dist/src/orgrt/checkpoint-ops.js.map +1 -1
  99. package/dist/src/orgrt/completion-gate.d.ts +15 -0
  100. package/dist/src/orgrt/completion-gate.d.ts.map +1 -1
  101. package/dist/src/orgrt/completion-gate.js +59 -3
  102. package/dist/src/orgrt/completion-gate.js.map +1 -1
  103. package/dist/src/orgrt/daemon.d.ts +18 -1
  104. package/dist/src/orgrt/daemon.d.ts.map +1 -1
  105. package/dist/src/orgrt/daemon.js +33 -3
  106. package/dist/src/orgrt/daemon.js.map +1 -1
  107. package/dist/src/orgrt/decisions.d.ts +24 -0
  108. package/dist/src/orgrt/decisions.d.ts.map +1 -1
  109. package/dist/src/orgrt/decisions.js +164 -18
  110. package/dist/src/orgrt/decisions.js.map +1 -1
  111. package/dist/src/orgrt/review-packet.d.ts +1 -1
  112. package/dist/src/orgrt/review-packet.d.ts.map +1 -1
  113. package/dist/src/orgrt/review-packet.js +2 -2
  114. package/dist/src/orgrt/review-packet.js.map +1 -1
  115. package/dist/src/orgrt/session.d.ts +9 -0
  116. package/dist/src/orgrt/session.d.ts.map +1 -1
  117. package/dist/src/orgrt/session.js +24 -2
  118. package/dist/src/orgrt/session.js.map +1 -1
  119. package/dist/src/orgrt/skill-library.d.ts +10 -1
  120. package/dist/src/orgrt/skill-library.d.ts.map +1 -1
  121. package/dist/src/orgrt/skill-library.js +53 -4
  122. package/dist/src/orgrt/skill-library.js.map +1 -1
  123. package/dist/src/orgrt/task-dag.d.ts +3 -0
  124. package/dist/src/orgrt/task-dag.d.ts.map +1 -1
  125. package/dist/src/orgrt/task-dag.js +6 -0
  126. package/dist/src/orgrt/task-dag.js.map +1 -1
  127. package/dist/src/orgrt/types.d.ts +2 -0
  128. package/dist/src/orgrt/types.d.ts.map +1 -1
  129. package/dist/src/orgrt/types.js +4 -0
  130. package/dist/src/orgrt/types.js.map +1 -1
  131. package/dist/src/platform-adapters/mutation.d.ts +34 -0
  132. package/dist/src/platform-adapters/mutation.d.ts.map +1 -0
  133. package/dist/src/platform-adapters/mutation.js +188 -0
  134. package/dist/src/platform-adapters/mutation.js.map +1 -0
  135. package/dist/src/platform-adapters/operations.d.ts +7 -1
  136. package/dist/src/platform-adapters/operations.d.ts.map +1 -1
  137. package/dist/src/platform-adapters/operations.js +18 -76
  138. package/dist/src/platform-adapters/operations.js.map +1 -1
  139. package/dist/src/routing/jev-step.d.ts +17 -0
  140. package/dist/src/routing/jev-step.d.ts.map +1 -0
  141. package/dist/src/routing/jev-step.js +27 -0
  142. package/dist/src/routing/jev-step.js.map +1 -0
  143. package/dist/src/routing/route-layer-factory.d.ts.map +1 -1
  144. package/dist/src/routing/route-layer-factory.js +16 -1
  145. package/dist/src/routing/route-layer-factory.js.map +1 -1
  146. package/dist/src/utils/redaction.d.ts.map +1 -1
  147. package/dist/src/utils/redaction.js +19 -4
  148. package/dist/src/utils/redaction.js.map +1 -1
  149. package/dist/tsconfig.tsbuildinfo +1 -1
  150. package/package.json +4 -4
  151. package/.claude/skills/monodesign/SKILL.md +0 -257
  152. package/.claude/skills/monodesign/adapt.md +0 -53
  153. package/.claude/skills/monodesign/agents/monodesign-asset-producer.md +0 -100
  154. package/.claude/skills/monodesign/agents/monodesign-manual-edit-applier.md +0 -103
  155. package/.claude/skills/monodesign/animate.md +0 -65
  156. package/.claude/skills/monodesign/audit.md +0 -89
  157. package/.claude/skills/monodesign/bolder.md +0 -50
  158. package/.claude/skills/monodesign/clarify.md +0 -64
  159. package/.claude/skills/monodesign/colorize.md +0 -68
  160. package/.claude/skills/monodesign/craft.md +0 -51
  161. package/.claude/skills/monodesign/critique.md +0 -66
  162. package/.claude/skills/monodesign/delight.md +0 -47
  163. package/.claude/skills/monodesign/distill.md +0 -56
  164. package/.claude/skills/monodesign/document.md +0 -83
  165. package/.claude/skills/monodesign/extract.md +0 -74
  166. package/.claude/skills/monodesign/harden.md +0 -65
  167. package/.claude/skills/monodesign/init.md +0 -30
  168. package/.claude/skills/monodesign/layout.md +0 -36
  169. package/.claude/skills/monodesign/live.md +0 -34
  170. package/.claude/skills/monodesign/onboard.md +0 -50
  171. package/.claude/skills/monodesign/optimize.md +0 -64
  172. package/.claude/skills/monodesign/overdrive.md +0 -56
  173. package/.claude/skills/monodesign/polish.md +0 -68
  174. package/.claude/skills/monodesign/quieter.md +0 -57
  175. package/.claude/skills/monodesign/reference/adapt.md +0 -312
  176. package/.claude/skills/monodesign/reference/adapt.native.md +0 -58
  177. package/.claude/skills/monodesign/reference/android.md +0 -40
  178. package/.claude/skills/monodesign/reference/animate.md +0 -203
  179. package/.claude/skills/monodesign/reference/antipatterns-catalog.md +0 -410
  180. package/.claude/skills/monodesign/reference/audit.md +0 -135
  181. package/.claude/skills/monodesign/reference/audit.native.md +0 -139
  182. package/.claude/skills/monodesign/reference/bolder.md +0 -120
  183. package/.claude/skills/monodesign/reference/brand-workflow.md +0 -180
  184. package/.claude/skills/monodesign/reference/brand.md +0 -108
  185. package/.claude/skills/monodesign/reference/clarify.md +0 -288
  186. package/.claude/skills/monodesign/reference/codex.md +0 -105
  187. package/.claude/skills/monodesign/reference/cognitive-load.md +0 -106
  188. package/.claude/skills/monodesign/reference/color-and-contrast.md +0 -105
  189. package/.claude/skills/monodesign/reference/colorize.md +0 -257
  190. package/.claude/skills/monodesign/reference/component-specs.md +0 -260
  191. package/.claude/skills/monodesign/reference/component-states.md +0 -274
  192. package/.claude/skills/monodesign/reference/component-system.md +0 -358
  193. package/.claude/skills/monodesign/reference/copy-formulas.md +0 -160
  194. package/.claude/skills/monodesign/reference/craft.md +0 -123
  195. package/.claude/skills/monodesign/reference/critique.md +0 -780
  196. package/.claude/skills/monodesign/reference/delight.md +0 -302
  197. package/.claude/skills/monodesign/reference/design-principles.md +0 -246
  198. package/.claude/skills/monodesign/reference/distill.md +0 -111
  199. package/.claude/skills/monodesign/reference/document.md +0 -429
  200. package/.claude/skills/monodesign/reference/extract.md +0 -69
  201. package/.claude/skills/monodesign/reference/harden.md +0 -347
  202. package/.claude/skills/monodesign/reference/heuristics-scoring.md +0 -234
  203. package/.claude/skills/monodesign/reference/hooks.md +0 -92
  204. package/.claude/skills/monodesign/reference/image-prompts.md +0 -130
  205. package/.claude/skills/monodesign/reference/init.md +0 -221
  206. package/.claude/skills/monodesign/reference/interaction-design.md +0 -189
  207. package/.claude/skills/monodesign/reference/ios.md +0 -45
  208. package/.claude/skills/monodesign/reference/layout.md +0 -185
  209. package/.claude/skills/monodesign/reference/live.md +0 -710
  210. package/.claude/skills/monodesign/reference/motion-design.md +0 -109
  211. package/.claude/skills/monodesign/reference/onboard.md +0 -234
  212. package/.claude/skills/monodesign/reference/optimize.md +0 -258
  213. package/.claude/skills/monodesign/reference/overdrive.md +0 -130
  214. package/.claude/skills/monodesign/reference/personas.md +0 -179
  215. package/.claude/skills/monodesign/reference/polish.md +0 -241
  216. package/.claude/skills/monodesign/reference/pre-delivery-checklist.md +0 -108
  217. package/.claude/skills/monodesign/reference/product.md +0 -60
  218. package/.claude/skills/monodesign/reference/quieter.md +0 -99
  219. package/.claude/skills/monodesign/reference/responsive-design.md +0 -114
  220. package/.claude/skills/monodesign/reference/shape.md +0 -165
  221. package/.claude/skills/monodesign/reference/spatial-design.md +0 -100
  222. package/.claude/skills/monodesign/reference/teach.md +0 -10
  223. package/.claude/skills/monodesign/reference/token-architecture.md +0 -222
  224. package/.claude/skills/monodesign/reference/typeset.md +0 -301
  225. package/.claude/skills/monodesign/reference/typography.md +0 -159
  226. package/.claude/skills/monodesign/reference/ux-research.md +0 -143
  227. package/.claude/skills/monodesign/reference/ux-rules.md +0 -211
  228. package/.claude/skills/monodesign/reference/ux-writing.md +0 -107
  229. package/.claude/skills/monodesign/scripts/command-metadata.json +0 -94
  230. package/.claude/skills/monodesign/scripts/context-signals.mjs +0 -260
  231. package/.claude/skills/monodesign/scripts/context.mjs +0 -1065
  232. package/.claude/skills/monodesign/scripts/critique-storage.mjs +0 -416
  233. package/.claude/skills/monodesign/scripts/detect-csp.mjs +0 -193
  234. package/.claude/skills/monodesign/scripts/detect.mjs +0 -33
  235. package/.claude/skills/monodesign/scripts/detector/browser/injected/index.mjs +0 -1960
  236. package/.claude/skills/monodesign/scripts/detector/cli/main.mjs +0 -321
  237. package/.claude/skills/monodesign/scripts/detector/design-system.mjs +0 -814
  238. package/.claude/skills/monodesign/scripts/detector/detect-antipatterns-browser.js +0 -5628
  239. package/.claude/skills/monodesign/scripts/detector/detect-antipatterns.mjs +0 -50
  240. package/.claude/skills/monodesign/scripts/detector/engines/browser/detect-url.mjs +0 -259
  241. package/.claude/skills/monodesign/scripts/detector/engines/browser/drivers.mjs +0 -339
  242. package/.claude/skills/monodesign/scripts/detector/engines/regex/detect-text.mjs +0 -636
  243. package/.claude/skills/monodesign/scripts/detector/engines/static-html/css-cascade.mjs +0 -1016
  244. package/.claude/skills/monodesign/scripts/detector/engines/static-html/detect-html.mjs +0 -253
  245. package/.claude/skills/monodesign/scripts/detector/engines/visual/screenshot-contrast.mjs +0 -198
  246. package/.claude/skills/monodesign/scripts/detector/findings.mjs +0 -12
  247. package/.claude/skills/monodesign/scripts/detector/fix/css-regions.mjs +0 -181
  248. package/.claude/skills/monodesign/scripts/detector/fix/fixers.mjs +0 -373
  249. package/.claude/skills/monodesign/scripts/detector/fix/index.mjs +0 -426
  250. package/.claude/skills/monodesign/scripts/detector/node/file-system.mjs +0 -198
  251. package/.claude/skills/monodesign/scripts/detector/profile/profiler.mjs +0 -166
  252. package/.claude/skills/monodesign/scripts/detector/registry/antipatterns.mjs +0 -563
  253. package/.claude/skills/monodesign/scripts/detector/rules/checks.mjs +0 -3024
  254. package/.claude/skills/monodesign/scripts/detector/shared/color.mjs +0 -124
  255. package/.claude/skills/monodesign/scripts/detector/shared/constants.mjs +0 -101
  256. package/.claude/skills/monodesign/scripts/detector/shared/fonts.mjs +0 -30
  257. package/.claude/skills/monodesign/scripts/detector/shared/inline-ignores.mjs +0 -148
  258. package/.claude/skills/monodesign/scripts/detector/shared/page.mjs +0 -7
  259. package/.claude/skills/monodesign/scripts/hook-admin.mjs +0 -694
  260. package/.claude/skills/monodesign/scripts/hook-before-edit.mjs +0 -516
  261. package/.claude/skills/monodesign/scripts/hook-lib.mjs +0 -1785
  262. package/.claude/skills/monodesign/scripts/hook.mjs +0 -61
  263. package/.claude/skills/monodesign/scripts/lib/design-parser.mjs +0 -809
  264. package/.claude/skills/monodesign/scripts/lib/is-generated.mjs +0 -69
  265. package/.claude/skills/monodesign/scripts/lib/monodesign-config.mjs +0 -640
  266. package/.claude/skills/monodesign/scripts/lib/monodesign-paths.mjs +0 -129
  267. package/.claude/skills/monodesign/scripts/lib/provider.mjs +0 -4
  268. package/.claude/skills/monodesign/scripts/lib/target-args.mjs +0 -42
  269. package/.claude/skills/monodesign/scripts/live/browser-script-parts.mjs +0 -50
  270. package/.claude/skills/monodesign/scripts/live/completion.mjs +0 -19
  271. package/.claude/skills/monodesign/scripts/live/event-validation.mjs +0 -137
  272. package/.claude/skills/monodesign/scripts/live/insert-ui.mjs +0 -458
  273. package/.claude/skills/monodesign/scripts/live/manual-apply.mjs +0 -939
  274. package/.claude/skills/monodesign/scripts/live/manual-edit-routes.mjs +0 -357
  275. package/.claude/skills/monodesign/scripts/live/manual-edits-buffer.mjs +0 -152
  276. package/.claude/skills/monodesign/scripts/live/session-store.mjs +0 -293
  277. package/.claude/skills/monodesign/scripts/live/svelte-component.mjs +0 -826
  278. package/.claude/skills/monodesign/scripts/live/sveltekit-adapter.mjs +0 -279
  279. package/.claude/skills/monodesign/scripts/live/ui-core.mjs +0 -180
  280. package/.claude/skills/monodesign/scripts/live/vocabulary.mjs +0 -36
  281. package/.claude/skills/monodesign/scripts/live-accept.mjs +0 -812
  282. package/.claude/skills/monodesign/scripts/live-browser-dom.js +0 -147
  283. package/.claude/skills/monodesign/scripts/live-browser-session.js +0 -124
  284. package/.claude/skills/monodesign/scripts/live-browser.js +0 -11213
  285. package/.claude/skills/monodesign/scripts/live-commit-manual-edits.mjs +0 -1241
  286. package/.claude/skills/monodesign/scripts/live-complete.mjs +0 -75
  287. package/.claude/skills/monodesign/scripts/live-copy-edit-agent.mjs +0 -683
  288. package/.claude/skills/monodesign/scripts/live-discard-manual-edits.mjs +0 -51
  289. package/.claude/skills/monodesign/scripts/live-inject.mjs +0 -596
  290. package/.claude/skills/monodesign/scripts/live-insert.mjs +0 -272
  291. package/.claude/skills/monodesign/scripts/live-manual-edit-evidence.mjs +0 -363
  292. package/.claude/skills/monodesign/scripts/live-poll.mjs +0 -384
  293. package/.claude/skills/monodesign/scripts/live-resume.mjs +0 -94
  294. package/.claude/skills/monodesign/scripts/live-server.mjs +0 -1210
  295. package/.claude/skills/monodesign/scripts/live-status.mjs +0 -61
  296. package/.claude/skills/monodesign/scripts/live-target.mjs +0 -30
  297. package/.claude/skills/monodesign/scripts/live-wrap.mjs +0 -884
  298. package/.claude/skills/monodesign/scripts/live.mjs +0 -297
  299. package/.claude/skills/monodesign/scripts/modern-screenshot.umd.js +0 -14
  300. package/.claude/skills/monodesign/scripts/palette.mjs +0 -635
  301. package/.claude/skills/monodesign/scripts/pin.mjs +0 -221
  302. package/.claude/skills/monodesign/shape.md +0 -71
  303. package/.claude/skills/monodesign/teach.md +0 -18
  304. package/.claude/skills/monodesign/typeset.md +0 -59
@@ -0,0 +1,57 @@
1
+ import type { ArtifactIntent } from '../platform-adapters/types.js';
2
+ import { type CatalogAsset } from './snapshot.js';
3
+ export type ProjectionSurface = 'platform:claude' | 'platform:agents';
4
+ export declare const PROJECTION_SURFACES: readonly ProjectionSurface[];
5
+ export interface ProjectedPackage {
6
+ id: string;
7
+ sha256: string;
8
+ paths: string[];
9
+ }
10
+ export interface ProjectionRemoval {
11
+ id: string;
12
+ /** Package directory relative to the surface's skill root. */
13
+ dir: string;
14
+ marker: string;
15
+ /** Files of a re-projected package to leave alone; only the rest are removed. */
16
+ keep?: string[];
17
+ }
18
+ export interface ProjectionPlan {
19
+ surface: ProjectionSurface;
20
+ intents: ArtifactIntent[];
21
+ packages: ProjectedPackage[];
22
+ removals: ProjectionRemoval[];
23
+ diagnostics: string[];
24
+ }
25
+ export interface ProjectionResult extends ProjectionPlan {
26
+ dryRun: boolean;
27
+ changed: string[];
28
+ skipped: string[];
29
+ /** Where each changed file's previous content was backed up. */
30
+ backupDir: string;
31
+ /** The skill registry rebuilt after the apply, when there was one to rebuild. */
32
+ registry?: string;
33
+ }
34
+ export interface ProjectionOptions {
35
+ /** Plan only the removal of this id's package; project nothing. */
36
+ unproject?: string;
37
+ }
38
+ export declare const catalogMarker: (name: string) => string;
39
+ /** The first body line of a projected SKILL.md; `jev:` is read by build-skill-registry.cjs. */
40
+ export declare const catalogMarkerLine: (a: Pick<CatalogAsset, 'id' | 'sha256' | 'targets'>) => string;
41
+ /**
42
+ * Surfaces that still hold a projected copy of catalog skill `id` (a marked
43
+ * package dir reached without following a link). Read-only; disable/revoke use
44
+ * it to point at the `project --apply` that removes the copy.
45
+ */
46
+ export declare function projectedSurfaces(root: string, id: string): ProjectionSurface[];
47
+ /** Read-only plan: what `applyProjection` would write and remove. */
48
+ export declare function planProjection(root: string, surface: ProjectionSurface, opts?: ProjectionOptions): Promise<ProjectionPlan>;
49
+ /**
50
+ * Plans and applies in one transaction under the platform mutation lock. A dry
51
+ * run takes the same path with `dryRun` set (no lock, no writes), so its
52
+ * `changed` list is the prediction.
53
+ */
54
+ export declare function applyProjection(root: string, surface: ProjectionSurface, opts: ProjectionOptions & {
55
+ dryRun: boolean;
56
+ }): Promise<ProjectionResult>;
57
+ //# sourceMappingURL=projection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projection.d.ts","sourceRoot":"","sources":["../../../src/catalog/projection.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,cAAc,EAA8B,MAAM,+BAA+B,CAAC;AAIhG,OAAO,EAAiB,KAAK,YAAY,EAAY,MAAM,eAAe,CAAC;AAG3E,MAAM,MAAM,iBAAiB,GAAG,iBAAiB,GAAG,iBAAiB,CAAC;AACtE,eAAO,MAAM,mBAAmB,EAAE,SAAS,iBAAiB,EAG3D,CAAC;AAQF,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,8DAA8D;IAC9D,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,iFAAiF;IACjF,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,iBAAiB,CAAC;IAC3B,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,QAAQ,EAAE,gBAAgB,EAAE,CAAC;IAC7B,QAAQ,EAAE,iBAAiB,EAAE,CAAC;IAC9B,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,gBAAiB,SAAQ,cAAc;IACtD,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,gEAAgE;IAChE,SAAS,EAAE,MAAM,CAAC;IAClB,iFAAiF;IACjF,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,mEAAmE;IACnE,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,eAAO,MAAM,aAAa,SAAU,MAAM,KAAG,MAAiC,CAAC;AAE/E,+FAA+F;AAC/F,eAAO,MAAM,iBAAiB,MAAO,IAAI,CAAC,YAAY,EAAE,IAAI,GAAG,QAAQ,GAAG,SAAS,CAAC,KAAG,MACQ,CAAC;AA4KhG;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,iBAAiB,EAAE,CAU/E;AAED,qEAAqE;AACrE,wBAAsB,cAAc,CAClC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,iBAAiB,EAC1B,IAAI,GAAE,iBAAsB,GAC3B,OAAO,CAAC,cAAc,CAAC,CAEzB;AA0BD;;;;GAIG;AACH,wBAAsB,eAAe,CACnC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,iBAAiB,EAC1B,IAAI,EAAE,iBAAiB,GAAG;IAAE,MAAM,EAAE,OAAO,CAAA;CAAE,GAC5C,OAAO,CAAC,gBAAgB,CAAC,CA4B3B"}
@@ -0,0 +1,272 @@
1
+ /**
2
+ * Explicit, reversible projection of active catalog skills into the two real
3
+ * platform surfaces: `.claude/skills` (platform:claude) and the shared
4
+ * `.agents/skills` (platform:agents). Every projected file carries the stable
5
+ * managed marker `catalog:skill:<name>`; a destination without it is foreign
6
+ * and never written, and no write or removal passes through a symbolic link.
7
+ */
8
+ import { existsSync, lstatSync, readdirSync, readFileSync } from 'node:fs';
9
+ import { createRequire } from 'node:module';
10
+ import { dirname, join, relative } from 'node:path';
11
+ import { fileURLToPath } from 'node:url';
12
+ import { atomicWrite, removeManagedSkillPackage, symlinkedComponent, withMutationLock, } from '../platform-adapters/mutation.js';
13
+ import { applyIntents, resolveArtifactLocation } from '../platform-adapters/operations.js';
14
+ import { PLATFORM_REGISTRY } from '../platform-adapters/registry.js';
15
+ import { verifyEntry } from './digest.js';
16
+ import { frontmatterViolations } from './frontmatter.js';
17
+ import { shellExecSyntax } from './scan.js';
18
+ import { buildSnapshot, eligible } from './snapshot.js';
19
+ import { CatalogIdSchema } from './types.js';
20
+ export const PROJECTION_SURFACES = [
21
+ 'platform:claude',
22
+ 'platform:agents',
23
+ ];
24
+ /** Any `.agents` adapter resolves the same `.agents/skills` directory. */
25
+ const ADAPTER = {
26
+ 'platform:claude': 'claude',
27
+ 'platform:agents': 'codex',
28
+ };
29
+ export const catalogMarker = (name) => `catalog:skill:${name}`;
30
+ /** The first body line of a projected SKILL.md; `jev:` is read by build-skill-registry.cjs. */
31
+ export const catalogMarkerLine = (a) => `<!-- catalog ${a.id} sha256:${a.sha256} jev:${a.targets.includes('jev') ? 'yes' : 'no'} -->`;
32
+ /** Refusals of the package content itself (not drift or digest problems). */
33
+ const SECURITY_REFUSAL = /^(?:frontmatter-not-allowed|body-exec):/;
34
+ const FRONTMATTER = /^---\r?\n[\s\S]*?\r?\n---\r?\n/;
35
+ const isOurs = (content, name) => content.includes(`monomind:start ${catalogMarker(name)}`);
36
+ function requestFor(root, surface, dryRun) {
37
+ return { platform: ADAPTER[surface], scope: 'project', path: root, dryRun };
38
+ }
39
+ function listFiles(dir, prefix = '') {
40
+ const out = [];
41
+ for (const e of readdirSync(join(dir, prefix), { withFileTypes: true })) {
42
+ const rel = prefix ? `${prefix}/${e.name}` : e.name;
43
+ if (e.isDirectory())
44
+ out.push(...listFiles(dir, rel));
45
+ else if (e.isFile())
46
+ out.push(rel);
47
+ }
48
+ return out.sort();
49
+ }
50
+ function withMarkerLine(skillMd, line) {
51
+ const header = FRONTMATTER.exec(skillMd)?.[0];
52
+ if (!header)
53
+ return skillMd;
54
+ return `${header}\n${line}\n${skillMd.slice(header.length).replace(/^\r?\n/, '')}`;
55
+ }
56
+ /** Intents for one verified package, or the reason it is refused. */
57
+ function packageIntents(root, skillRoot, asset) {
58
+ const check = verifyEntry(root, asset);
59
+ if (!check.ok)
60
+ return { refused: check.reason };
61
+ const intents = [];
62
+ const paths = [];
63
+ const files = listFiles(check.dir);
64
+ // The same checks staging applies: stored bytes may predate them.
65
+ for (const file of files.filter((f) => f.endsWith('.md'))) {
66
+ const text = readFileSync(join(check.dir, file), 'utf8');
67
+ const nested = file !== 'SKILL.md' && file.endsWith('/SKILL.md');
68
+ if (file === 'SKILL.md' || (nested && FRONTMATTER.test(text))) {
69
+ const bad = frontmatterViolations(text);
70
+ if (bad.length)
71
+ return { refused: `frontmatter-not-allowed: ${file}: ${bad.join(', ')}` };
72
+ }
73
+ if (shellExecSyntax(text))
74
+ return { refused: `body-exec: ${file} carries shell execution syntax` };
75
+ }
76
+ for (const file of files) {
77
+ const dest = join(skillRoot, asset.name, file);
78
+ const display = relative(root, dest);
79
+ const link = symlinkedComponent(root, dest);
80
+ if (link)
81
+ return { refused: `symlinked-destination: ${relative(root, link) || link}` };
82
+ let content = readFileSync(join(check.dir, file), 'utf8');
83
+ if (file === 'SKILL.md')
84
+ content = withMarkerLine(content, catalogMarkerLine(asset));
85
+ const st = lstatSync(dest, { throwIfNoEntry: false });
86
+ if (st) {
87
+ const existing = st.isFile() ? readFileSync(dest, 'utf8') : '';
88
+ if (!isOurs(existing, asset.name))
89
+ return { refused: `not catalog-managed: ${display}` };
90
+ if (file === 'SKILL.md' && FRONTMATTER.exec(existing)?.[0] !== FRONTMATTER.exec(content)?.[0])
91
+ return {
92
+ refused: `frontmatter-drift: run catalog unproject ${asset.id} then catalog project`,
93
+ };
94
+ }
95
+ paths.push(display);
96
+ intents.push({
97
+ kind: 'skill',
98
+ locationKey: 'skill',
99
+ scope: 'project',
100
+ replace: 'managed_block',
101
+ format: 'md',
102
+ marker: catalogMarker(asset.name),
103
+ relativePath: `${asset.name}/${file}`,
104
+ content,
105
+ });
106
+ }
107
+ return { intents, paths, files };
108
+ }
109
+ /** Files below `dir` (not following links) that carry `name`'s marker. */
110
+ function markedFiles(dir, name) {
111
+ try {
112
+ return listFiles(dir).filter((f) => isOurs(readFileSync(join(dir, f), 'utf8'), name));
113
+ }
114
+ catch {
115
+ return [];
116
+ }
117
+ }
118
+ function buildPlan(root, surface, opts) {
119
+ const plan = {
120
+ surface,
121
+ intents: [],
122
+ packages: [],
123
+ removals: [],
124
+ diagnostics: [],
125
+ };
126
+ const adapter = PLATFORM_REGISTRY[ADAPTER[surface]];
127
+ const location = resolveArtifactLocation(adapter, 'skill', 'project', { root });
128
+ if (!location)
129
+ throw new Error(`no project skill location for ${surface}`);
130
+ const skillRoot = location.path;
131
+ const unprojectName = opts.unproject ? parseId(opts.unproject) : undefined;
132
+ const snapshot = buildSnapshot(root);
133
+ const wanted = unprojectName ? [] : eligible(snapshot, surface);
134
+ if (!unprojectName)
135
+ for (const d of snapshot.diagnostics) {
136
+ const a = snapshot.assets.find((x) => x.id === d.id);
137
+ if (!a || (a.status === 'active' && a.targets.includes(surface)))
138
+ plan.diagnostics.push(`${d.id}: ${d.reason}`);
139
+ }
140
+ const rootLink = symlinkedComponent(root, skillRoot);
141
+ if (rootLink) {
142
+ if (wanted.length || unprojectName || existsSync(skillRoot))
143
+ plan.diagnostics.push(`symlinked-destination: ${relative(root, rootLink)}`);
144
+ return plan;
145
+ }
146
+ const unsafe = new Set();
147
+ for (const asset of wanted) {
148
+ if (asset.kind !== 'skill') {
149
+ plan.diagnostics.push(`${asset.id}: only skills are projected`);
150
+ continue;
151
+ }
152
+ const r = packageIntents(root, skillRoot, asset);
153
+ if ('refused' in r) {
154
+ plan.diagnostics.push(`${asset.id}: ${r.refused}`);
155
+ if (SECURITY_REFUSAL.test(r.refused))
156
+ unsafe.add(asset.name);
157
+ }
158
+ else {
159
+ plan.intents.push(...r.intents);
160
+ plan.packages.push({ id: asset.id, sha256: asset.sha256, paths: r.paths });
161
+ const stale = markedFiles(join(skillRoot, asset.name), asset.name).filter((f) => !r.files.includes(f));
162
+ if (stale.length)
163
+ plan.removals.push({
164
+ id: asset.id,
165
+ dir: asset.name,
166
+ marker: catalogMarker(asset.name),
167
+ keep: r.files,
168
+ });
169
+ }
170
+ }
171
+ // Only skills own a projection. A refused skill keeps its earlier copy, unless
172
+ // the refusal is a security one: that copy may carry what is now refused.
173
+ const keep = new Set(wanted.filter((a) => a.kind === 'skill' && !unsafe.has(a.name)).map((a) => a.name));
174
+ const entries = existsSync(skillRoot) ? readdirSync(skillRoot, { withFileTypes: true }) : [];
175
+ for (const e of entries.sort((a, b) => (a.name < b.name ? -1 : 1))) {
176
+ if (unprojectName ? e.name !== unprojectName : keep.has(e.name))
177
+ continue;
178
+ if (e.isSymbolicLink()) {
179
+ if (unprojectName)
180
+ plan.diagnostics.push(`symlinked-destination: ${relative(root, join(skillRoot, e.name))}`);
181
+ continue;
182
+ }
183
+ if (e.isDirectory() && markedFiles(join(skillRoot, e.name), e.name).length)
184
+ plan.removals.push({ id: `skill:${e.name}`, dir: e.name, marker: catalogMarker(e.name) });
185
+ }
186
+ return plan;
187
+ }
188
+ function parseId(id) {
189
+ const parsed = CatalogIdSchema.safeParse(id);
190
+ if (!parsed.success || !parsed.data.startsWith('skill:'))
191
+ throw new Error(`not a skill catalog id: ${id}`);
192
+ return parsed.data.slice('skill:'.length);
193
+ }
194
+ /**
195
+ * Surfaces that still hold a projected copy of catalog skill `id` (a marked
196
+ * package dir reached without following a link). Read-only; disable/revoke use
197
+ * it to point at the `project --apply` that removes the copy.
198
+ */
199
+ export function projectedSurfaces(root, id) {
200
+ if (!id.startsWith('skill:'))
201
+ return [];
202
+ const name = id.slice('skill:'.length);
203
+ return PROJECTION_SURFACES.filter((surface) => {
204
+ const adapter = PLATFORM_REGISTRY[ADAPTER[surface]];
205
+ const location = resolveArtifactLocation(adapter, 'skill', 'project', { root });
206
+ if (!location)
207
+ return false;
208
+ const dir = join(location.path, name);
209
+ return !symlinkedComponent(root, dir) && markedFiles(dir, name).length > 0;
210
+ });
211
+ }
212
+ /** Read-only plan: what `applyProjection` would write and remove. */
213
+ export async function planProjection(root, surface, opts = {}) {
214
+ return buildPlan(root, surface, opts);
215
+ }
216
+ const HERE = dirname(fileURLToPath(import.meta.url));
217
+ /** src/catalog → ../.. is the package root; dist/src/catalog → ../../.. */
218
+ const BUILDER_CANDIDATES = [
219
+ join(HERE, '..', '..', '.claude', 'helpers', 'build-skill-registry.cjs'),
220
+ join(HERE, '..', '..', '..', '.claude', 'helpers', 'build-skill-registry.cjs'),
221
+ ];
222
+ /**
223
+ * Regenerates `<root>/.claude/helpers/skill-registry.json` with the bundled
224
+ * builder (which knows the catalog `jev:` flag) — only when the project
225
+ * already has one, so a project without the per-prompt router gains nothing.
226
+ */
227
+ function rebuildSkillRegistry(root) {
228
+ const file = join(root, '.claude', 'helpers', 'skill-registry.json');
229
+ if (!existsSync(file) || symlinkedComponent(root, file))
230
+ return undefined;
231
+ const builder = BUILDER_CANDIDATES.find((p) => existsSync(p));
232
+ if (!builder)
233
+ return undefined;
234
+ const { build } = createRequire(import.meta.url)(builder);
235
+ atomicWrite(file, `${JSON.stringify(build(root), null, 2)}\n`);
236
+ return relative(root, file);
237
+ }
238
+ /**
239
+ * Plans and applies in one transaction under the platform mutation lock. A dry
240
+ * run takes the same path with `dryRun` set (no lock, no writes), so its
241
+ * `changed` list is the prediction.
242
+ */
243
+ export async function applyProjection(root, surface, opts) {
244
+ const request = requestFor(root, surface, opts.dryRun);
245
+ const adapter = PLATFORM_REGISTRY[request.platform];
246
+ const run = (plan) => {
247
+ const applied = applyIntents(adapter, plan.intents, request);
248
+ const result = {
249
+ ...plan,
250
+ dryRun: opts.dryRun,
251
+ changed: applied.changed,
252
+ skipped: applied.skipped,
253
+ diagnostics: [...plan.diagnostics, ...applied.diagnostics],
254
+ backupDir: '.monomind/backups/',
255
+ };
256
+ for (const r of plan.removals) {
257
+ const removed = removeManagedSkillPackage(adapter, request, r.dir, r.marker, r.keep);
258
+ result.changed.push(...removed.changed);
259
+ result.skipped.push(...removed.skipped);
260
+ result.diagnostics.push(...removed.diagnostics.map((d) => `${r.id}: ${d}`));
261
+ }
262
+ if (!opts.dryRun && surface === 'platform:claude' && result.changed.length)
263
+ result.registry = rebuildSkillRegistry(root);
264
+ return result;
265
+ };
266
+ const preview = buildPlan(root, surface, opts);
267
+ // Nothing to do: return without taking the lock, so an empty apply creates nothing.
268
+ if (opts.dryRun || (preview.intents.length === 0 && preview.removals.length === 0))
269
+ return run(preview);
270
+ return withMutationLock(request, () => run(buildPlan(root, surface, opts)));
271
+ }
272
+ //# sourceMappingURL=projection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projection.js","sourceRoot":"","sources":["../../../src/catalog/projection.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import { type FenceInstance } from '../orgrt/fence.js';
2
+ import { type CatalogEntry } from './types.js';
3
+ export type CatalogFence = Pick<FenceInstance, 'detect'>;
4
+ /** Returns the scanner, or null when it is unavailable. */
5
+ export type FenceLoader = () => Promise<CatalogFence | null>;
6
+ export interface PackageInspection {
7
+ /** Set when the package as a whole is unusable; nothing may be staged. */
8
+ fatal?: string;
9
+ verdict: 'clean' | 'quarantine';
10
+ accepted: string[];
11
+ rejected: {
12
+ path: string;
13
+ reason: string;
14
+ }[];
15
+ requestedTools: string[];
16
+ scanner: {
17
+ ok: boolean;
18
+ blocked: boolean;
19
+ summary: string;
20
+ };
21
+ }
22
+ export declare const MAX_FILE_BYTES: number;
23
+ export declare const MAX_MARKDOWN_FILES = 100;
24
+ export declare const SKIP_DIRS: Set<string>;
25
+ /**
26
+ * True when `text` carries Markdown that a platform executes as a shell
27
+ * command — as written, or in the body Claude Code cuts from it (the leading
28
+ * `\n` stands in for its prefix, so a `!` at body start counts as preceded by
29
+ * whitespace).
30
+ */
31
+ export declare const shellExecSyntax: (text: string) => boolean;
32
+ /** Inspect a package directory (the staged temp copy). Never writes. */
33
+ export declare function inspectPackage(dir: string, kind: CatalogEntry['kind'], opts: {
34
+ root: string;
35
+ fence?: FenceLoader;
36
+ }): Promise<PackageInspection>;
37
+ //# sourceMappingURL=scan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["../../../src/catalog/scan.ts"],"names":[],"mappings":"AAQA,OAAO,EAAsB,KAAK,aAAa,EAAyB,MAAM,mBAAmB,CAAC;AAIlG,OAAO,EAAmB,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAEhE,MAAM,MAAM,YAAY,GAAG,IAAI,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;AACzD,2DAA2D;AAC3D,MAAM,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC;AAE7D,MAAM,WAAW,iBAAiB;IAChC,0EAA0E;IAC1E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,GAAG,YAAY,CAAC;IAChC,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC7C,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,OAAO,EAAE;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CAC7D;AAED,eAAO,MAAM,cAAc,QAAa,CAAC;AACzC,eAAO,MAAM,kBAAkB,MAAM,CAAC;AAGtC,eAAO,MAAM,SAAS,aAAoC,CAAC;AA0C3D;;;;;GAKG;AACH,eAAO,MAAM,eAAe,SAAU,MAAM,KAAG,OACsB,CAAC;AA8FtE,wEAAwE;AACxE,wBAAsB,cAAc,CAClC,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,YAAY,CAAC,MAAM,CAAC,EAC1B,IAAI,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,WAAW,CAAA;CAAE,GAC1C,OAAO,CAAC,iBAAiB,CAAC,CA6D5B"}
@@ -0,0 +1,214 @@
1
+ /**
2
+ * Package inspection: deterministic file checks first, then the monofence
3
+ * scanner over the accepted Markdown. Read-only — the caller deletes the
4
+ * rejected files. A blocked scan, a scanner error or an unavailable scanner
5
+ * all yield `verdict: 'quarantine'`; nothing here changes lifecycle status.
6
+ */
7
+ import { lstatSync, readdirSync, readFileSync } from 'node:fs';
8
+ import { join } from 'node:path';
9
+ import { createFenceForRole, loadGlobalFenceConfig } from '../orgrt/fence.js';
10
+ import { parseFrontmatter } from '../orgrt/skill-library.js';
11
+ import { BlueprintSchema } from './blueprints.js';
12
+ import { frontmatterViolations } from './frontmatter.js';
13
+ import { CATALOG_NAME_RE } from './types.js';
14
+ export const MAX_FILE_BYTES = 512 * 1024;
15
+ export const MAX_MARKDOWN_FILES = 100;
16
+ const SCAN_CHAR_CAP = 200_000;
17
+ const SUMMARY_CAP = 500;
18
+ export const SKIP_DIRS = new Set(['.git', 'node_modules']);
19
+ /** Text reserved for projection markers; a package carrying it could forge one. */
20
+ const RESERVED_MARKERS = ['<!-- catalog ', 'monomind:start', 'monomind:end'];
21
+ /**
22
+ * Claude Code runs a skill's inline !`cmd` / !$cmd (its detector:
23
+ * `(?<=^|\s)!(?=`|\$)`), every ```! run anywhere in the text (its extractor
24
+ * has no line anchor, so `> ```!`, `- ```!` and inline ```!cmd``` all execute)
25
+ * and ~~~! fenced blocks when the skill loads.
26
+ */
27
+ const SHELL_EXEC = [/(?:^|\s)!(?=[`$])/m, /```!/, /^[ \t]*~{3,}[ \t]*!/m];
28
+ /**
29
+ * What Claude Code substitutes before it extracts runs: `$ARGUMENTS`,
30
+ * `$ARGUMENTS[n]`, `$n`, `${CLAUDE_…}` (and a `\` escape that drops to the
31
+ * literal). A preload substitutes "" and an argument can be any text except a
32
+ * `!` (it escapes those), so a placeholder next to a `!` — directly after it,
33
+ * or anywhere in the run of spaces, backticks and tildes before it — can
34
+ * splice a run that the text as written does not contain.
35
+ */
36
+ // `${…}` is bounded (and stops at a `$`) so a run of `${` scans in linear time.
37
+ const PLACEHOLDER = /\\?\$(?:ARGUMENTS(?:\[\d+\])?|\d+(?!\w)|\{[^}\s$]{0,128}\})/g;
38
+ const BEFORE_BANG = ' \t`~\0';
39
+ function placeholderSplice(text) {
40
+ const t = text.replace(PLACEHOLDER, '\0');
41
+ // Runs end at a `!`, so each character is scanned at most once.
42
+ for (let i = t.indexOf('!'); i !== -1; i = t.indexOf('!', i + 1)) {
43
+ if (t[i + 1] === '\0')
44
+ return true;
45
+ for (let j = i - 1; j >= 0 && BEFORE_BANG.includes(t[j]); j--)
46
+ if (t[j] === '\0')
47
+ return true;
48
+ }
49
+ return false;
50
+ }
51
+ /**
52
+ * Claude Code's frontmatter split (/^---\s*\n([\s\S]*?)---\s*\n?/ after a BOM
53
+ * strip): it ends at the first `---` anywhere, even mid-line, and the body it
54
+ * hands on follows a "Base directory …\n\n" prefix. Same match, but the opener
55
+ * stops at its first newline so a run of blank lines cannot backtrack.
56
+ */
57
+ const CLAUDE_FRONTMATTER = /^\uFEFF?---[^\S\n]*\n[\s\S]*?---\s*/;
58
+ const execIn = (text) => SHELL_EXEC.some((re) => re.test(text)) || placeholderSplice(text);
59
+ /**
60
+ * True when `text` carries Markdown that a platform executes as a shell
61
+ * command — as written, or in the body Claude Code cuts from it (the leading
62
+ * `\n` stands in for its prefix, so a `!` at body start counts as preceded by
63
+ * whitespace).
64
+ */
65
+ export const shellExecSyntax = (text) => execIn(text) || execIn(`\n${text.replace(CLAUDE_FRONTMATTER, '')}`);
66
+ /** Every path under `dir`, relative, with its lstat kind. Skipped dirs are reported, not walked. */
67
+ function walk(dir, prefix = '') {
68
+ const out = [];
69
+ for (const name of readdirSync(join(dir, prefix)).sort()) {
70
+ const rel = prefix ? `${prefix}/${name}` : name;
71
+ const st = lstatSync(join(dir, rel));
72
+ if (st.isSymbolicLink())
73
+ out.push({ rel, kind: 'symlink' });
74
+ else if (st.isDirectory()) {
75
+ if (SKIP_DIRS.has(name))
76
+ out.push({ rel, kind: 'skipped' });
77
+ else
78
+ out.push(...walk(dir, rel));
79
+ }
80
+ else
81
+ out.push({ rel, kind: st.isFile() ? 'file' : 'other' });
82
+ }
83
+ return out;
84
+ }
85
+ function fileVerdict(rel, kind, size) {
86
+ if (rel.split('/').includes('..'))
87
+ return 'path contains ..';
88
+ // A nested `.claude/skills/…` (or any dot dir) is platform config, not package content.
89
+ if (rel.split('/').some((seg) => seg.startsWith('.')))
90
+ return 'path segment starts with "."';
91
+ const base = rel.slice(rel.lastIndexOf('/') + 1);
92
+ const allowed = base === 'LICENSE.txt' ||
93
+ (kind === 'blueprint' ? rel === 'blueprint.json' : base.endsWith('.md'));
94
+ if (!allowed)
95
+ return kind === 'blueprint'
96
+ ? 'not blueprint.json or LICENSE.txt'
97
+ : 'not Markdown or LICENSE.txt';
98
+ if (size > MAX_FILE_BYTES)
99
+ return `larger than ${MAX_FILE_BYTES / 1024} KiB`;
100
+ return undefined;
101
+ }
102
+ const str = (v) => Array.isArray(v) ? v.join(' ') : v;
103
+ const list = (v) => v === undefined ? [] : Array.isArray(v) ? v : v.split(/[,\s]+/).filter(Boolean);
104
+ /** Package-level problems of the authored metadata; `requestedTools` for skills. */
105
+ function metadata(dir, kind) {
106
+ if (kind === 'blueprint') {
107
+ try {
108
+ BlueprintSchema.parse(JSON.parse(readFileSync(join(dir, 'blueprint.json'), 'utf8')));
109
+ return { tools: [] };
110
+ }
111
+ catch (e) {
112
+ return { fatal: `invalid blueprint.json: ${e.message.slice(0, 300)}`, tools: [] };
113
+ }
114
+ }
115
+ const { data } = parseFrontmatter(readFileSync(join(dir, 'SKILL.md'), 'utf8'));
116
+ const name = str(data.name);
117
+ if (!name)
118
+ return { fatal: 'SKILL.md has no frontmatter name', tools: [] };
119
+ if (!str(data.description)?.trim())
120
+ return { fatal: 'SKILL.md has no frontmatter description', tools: [] };
121
+ if (!CATALOG_NAME_RE.test(name))
122
+ return { fatal: `name "${name}" is not a valid catalog name`, tools: [] };
123
+ return { tools: [...new Set(list(data.tools))].sort() };
124
+ }
125
+ const defaultFence = (root) => () => createFenceForRole(loadGlobalFenceConfig(root) ?? {});
126
+ async function runScanner(text, load) {
127
+ try {
128
+ const fence = await load();
129
+ if (!fence)
130
+ return {
131
+ ok: false,
132
+ blocked: false,
133
+ summary: 'scanner unavailable (monofence-ai could not be loaded)',
134
+ };
135
+ const r = await fence.detect(text);
136
+ const threats = r.threats.map((t) => `${t.type} ${t.confidence.toFixed(2)}`).join(', ');
137
+ return {
138
+ ok: true,
139
+ blocked: !r.safe,
140
+ summary: (r.safe ? `clean (risk ${r.overallRisk.toFixed(2)})` : `blocked: ${threats}`).slice(0, SUMMARY_CAP),
141
+ };
142
+ }
143
+ catch (e) {
144
+ return {
145
+ ok: false,
146
+ blocked: false,
147
+ summary: `scanner error: ${e.message}`.slice(0, SUMMARY_CAP),
148
+ };
149
+ }
150
+ }
151
+ /** Inspect a package directory (the staged temp copy). Never writes. */
152
+ export async function inspectPackage(dir, kind, opts) {
153
+ const accepted = [];
154
+ const rejected = [];
155
+ for (const { rel, kind: k } of walk(dir)) {
156
+ if (k === 'symlink')
157
+ rejected.push({ path: rel, reason: 'symlink' });
158
+ else if (k === 'skipped')
159
+ rejected.push({ path: rel, reason: 'excluded directory' });
160
+ else if (k === 'other')
161
+ rejected.push({ path: rel, reason: 'not a regular file' });
162
+ else {
163
+ const why = fileVerdict(rel, kind, lstatSync(join(dir, rel)).size);
164
+ if (why)
165
+ rejected.push({ path: rel, reason: why });
166
+ else
167
+ accepted.push(rel);
168
+ }
169
+ }
170
+ accepted.sort();
171
+ const base = { accepted, rejected, requestedTools: [] };
172
+ const refuse = (fatal) => ({
173
+ ...base,
174
+ fatal,
175
+ verdict: 'quarantine',
176
+ scanner: { ok: false, blocked: false, summary: 'not scanned' },
177
+ });
178
+ const primary = kind === 'blueprint' ? 'blueprint.json' : 'SKILL.md';
179
+ if (!accepted.includes(primary))
180
+ return refuse(`package has no usable ${primary}`);
181
+ const markdown = accepted.filter((f) => f.endsWith('.md'));
182
+ if (markdown.length > MAX_MARKDOWN_FILES)
183
+ return refuse(`more than ${MAX_MARKDOWN_FILES} Markdown files`);
184
+ const meta = metadata(dir, kind);
185
+ if (meta.fatal)
186
+ return refuse(meta.fatal);
187
+ for (const f of accepted) {
188
+ const content = readFileSync(join(dir, f), 'utf8');
189
+ const marker = RESERVED_MARKERS.find((m) => content.includes(m));
190
+ if (marker)
191
+ return refuse(`${f} contains reserved marker text "${marker.trim()}"`);
192
+ // What projection re-checks: a nested SKILL.md only when it has frontmatter.
193
+ const bad = f === 'SKILL.md' || f.endsWith('/SKILL.md') ? frontmatterViolations(content) : [];
194
+ if (bad.length && !(f !== 'SKILL.md' && bad[0] === 'SKILL.md has no frontmatter'))
195
+ return refuse(`frontmatter-not-allowed: ${f}: ${bad.join(', ')}`);
196
+ if (f.endsWith('.md') && shellExecSyntax(content))
197
+ return refuse(`body-exec: ${f} contains shell execution syntax (!\`…\`, a \`\`\`! block or a placeholder beside a !)`);
198
+ }
199
+ const scanned = accepted.filter((f) => f !== 'LICENSE.txt');
200
+ const full = scanned.map((f) => readFileSync(join(dir, f), 'utf8')).join('\n\n');
201
+ const scanner = await runScanner(full.slice(0, SCAN_CHAR_CAP), opts.fence ?? defaultFence(opts.root));
202
+ // Content past the cap was never scanned: it must not pass as clean.
203
+ const truncated = full.length > SCAN_CHAR_CAP;
204
+ if (truncated)
205
+ scanner.summary =
206
+ `not fully scanned (${full.length} chars > ${SCAN_CHAR_CAP}); ${scanner.summary}`.slice(0, SUMMARY_CAP);
207
+ return {
208
+ ...base,
209
+ requestedTools: meta.tools,
210
+ verdict: scanner.ok && !scanner.blocked && !truncated ? 'clean' : 'quarantine',
211
+ scanner,
212
+ };
213
+ }
214
+ //# sourceMappingURL=scan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan.js","sourceRoot":"","sources":["../../../src/catalog/scan.ts"],"names":[],"mappings":"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"}