@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.
- package/.claude/helpers/build-skill-registry.cjs +23 -2
- package/.claude/helpers/handlers/route-handler.cjs +89 -3
- package/.claude/helpers/handlers/session-restore-handler.cjs +1 -1
- package/.claude/helpers/jev-picker.cjs +499 -0
- package/.claude/helpers/redact-secrets.cjs +69 -0
- package/.claude/skills/mastermind-agent-select/SKILL.md +28 -0
- package/dist/src/catalog/blueprints.d.ts +39 -0
- package/dist/src/catalog/blueprints.d.ts.map +1 -0
- package/dist/src/catalog/blueprints.js +78 -0
- package/dist/src/catalog/blueprints.js.map +1 -0
- package/dist/src/catalog/digest.d.ts +16 -0
- package/dist/src/catalog/digest.d.ts.map +1 -0
- package/dist/src/catalog/digest.js +62 -0
- package/dist/src/catalog/digest.js.map +1 -0
- package/dist/src/catalog/frontmatter.d.ts +23 -0
- package/dist/src/catalog/frontmatter.d.ts.map +1 -0
- package/dist/src/catalog/frontmatter.js +80 -0
- package/dist/src/catalog/frontmatter.js.map +1 -0
- package/dist/src/catalog/lifecycle.d.ts +31 -0
- package/dist/src/catalog/lifecycle.d.ts.map +1 -0
- package/dist/src/catalog/lifecycle.js +78 -0
- package/dist/src/catalog/lifecycle.js.map +1 -0
- package/dist/src/catalog/projection.d.ts +57 -0
- package/dist/src/catalog/projection.d.ts.map +1 -0
- package/dist/src/catalog/projection.js +272 -0
- package/dist/src/catalog/projection.js.map +1 -0
- package/dist/src/catalog/scan.d.ts +37 -0
- package/dist/src/catalog/scan.d.ts.map +1 -0
- package/dist/src/catalog/scan.js +214 -0
- package/dist/src/catalog/scan.js.map +1 -0
- package/dist/src/catalog/snapshot.d.ts +62 -0
- package/dist/src/catalog/snapshot.d.ts.map +1 -0
- package/dist/src/catalog/snapshot.js +183 -0
- package/dist/src/catalog/snapshot.js.map +1 -0
- package/dist/src/catalog/stage.d.ts +26 -0
- package/dist/src/catalog/stage.d.ts.map +1 -0
- package/dist/src/catalog/stage.js +316 -0
- package/dist/src/catalog/stage.js.map +1 -0
- package/dist/src/catalog/state.d.ts +23 -0
- package/dist/src/catalog/state.d.ts.map +1 -0
- package/dist/src/catalog/state.js +102 -0
- package/dist/src/catalog/state.js.map +1 -0
- package/dist/src/catalog/types.d.ts +289 -0
- package/dist/src/catalog/types.d.ts.map +1 -0
- package/dist/src/catalog/types.js +118 -0
- package/dist/src/catalog/types.js.map +1 -0
- package/dist/src/commands/catalog.d.ts +14 -0
- package/dist/src/commands/catalog.d.ts.map +1 -0
- package/dist/src/commands/catalog.js +392 -0
- package/dist/src/commands/catalog.js.map +1 -0
- package/dist/src/commands/doctor-catalog-checks.d.ts +3 -0
- package/dist/src/commands/doctor-catalog-checks.d.ts.map +1 -0
- package/dist/src/commands/doctor-catalog-checks.js +69 -0
- package/dist/src/commands/doctor-catalog-checks.js.map +1 -0
- package/dist/src/commands/doctor-decision-checks.d.ts +10 -0
- package/dist/src/commands/doctor-decision-checks.d.ts.map +1 -0
- package/dist/src/commands/doctor-decision-checks.js +82 -0
- package/dist/src/commands/doctor-decision-checks.js.map +1 -0
- package/dist/src/commands/doctor.d.ts.map +1 -1
- package/dist/src/commands/doctor.js +9 -1
- package/dist/src/commands/doctor.js.map +1 -1
- package/dist/src/commands/index.d.ts +2 -2
- package/dist/src/commands/index.d.ts.map +1 -1
- package/dist/src/commands/index.js +4 -1
- package/dist/src/commands/index.js.map +1 -1
- package/dist/src/commands/org-observe.d.ts.map +1 -1
- package/dist/src/commands/org-observe.js +7 -1
- package/dist/src/commands/org-observe.js.map +1 -1
- package/dist/src/commands/org-skills.d.ts.map +1 -1
- package/dist/src/commands/org-skills.js +14 -4
- package/dist/src/commands/org-skills.js.map +1 -1
- package/dist/src/commands/org.d.ts.map +1 -1
- package/dist/src/commands/org.js +8 -1
- package/dist/src/commands/org.js.map +1 -1
- package/dist/src/commands/pick.d.ts +4 -0
- package/dist/src/commands/pick.d.ts.map +1 -0
- package/dist/src/commands/pick.js +77 -0
- package/dist/src/commands/pick.js.map +1 -0
- package/dist/src/commands/route.js +1 -1
- package/dist/src/commands/route.js.map +1 -1
- package/dist/src/decision/catalogs.d.ts +20 -0
- package/dist/src/decision/catalogs.d.ts.map +1 -0
- package/dist/src/decision/catalogs.js +64 -0
- package/dist/src/decision/catalogs.js.map +1 -0
- package/dist/src/decision/jev.d.ts +85 -0
- package/dist/src/decision/jev.d.ts.map +1 -0
- package/dist/src/decision/jev.js +72 -0
- package/dist/src/decision/jev.js.map +1 -0
- package/dist/src/decision/picks.d.ts +50 -0
- package/dist/src/decision/picks.d.ts.map +1 -0
- package/dist/src/decision/picks.js +100 -0
- package/dist/src/decision/picks.js.map +1 -0
- package/dist/src/init/helpers-generator.d.ts.map +1 -1
- package/dist/src/init/helpers-generator.js +7 -0
- package/dist/src/init/helpers-generator.js.map +1 -1
- package/dist/src/orgrt/checkpoint-ops.d.ts.map +1 -1
- package/dist/src/orgrt/checkpoint-ops.js +6 -1
- package/dist/src/orgrt/checkpoint-ops.js.map +1 -1
- package/dist/src/orgrt/completion-gate.d.ts +15 -0
- package/dist/src/orgrt/completion-gate.d.ts.map +1 -1
- package/dist/src/orgrt/completion-gate.js +59 -3
- package/dist/src/orgrt/completion-gate.js.map +1 -1
- package/dist/src/orgrt/daemon.d.ts +18 -1
- package/dist/src/orgrt/daemon.d.ts.map +1 -1
- package/dist/src/orgrt/daemon.js +33 -3
- package/dist/src/orgrt/daemon.js.map +1 -1
- package/dist/src/orgrt/decisions.d.ts +24 -0
- package/dist/src/orgrt/decisions.d.ts.map +1 -1
- package/dist/src/orgrt/decisions.js +164 -18
- package/dist/src/orgrt/decisions.js.map +1 -1
- package/dist/src/orgrt/review-packet.d.ts +1 -1
- package/dist/src/orgrt/review-packet.d.ts.map +1 -1
- package/dist/src/orgrt/review-packet.js +2 -2
- package/dist/src/orgrt/review-packet.js.map +1 -1
- package/dist/src/orgrt/session.d.ts +9 -0
- package/dist/src/orgrt/session.d.ts.map +1 -1
- package/dist/src/orgrt/session.js +24 -2
- package/dist/src/orgrt/session.js.map +1 -1
- package/dist/src/orgrt/skill-library.d.ts +10 -1
- package/dist/src/orgrt/skill-library.d.ts.map +1 -1
- package/dist/src/orgrt/skill-library.js +53 -4
- package/dist/src/orgrt/skill-library.js.map +1 -1
- package/dist/src/orgrt/task-dag.d.ts +3 -0
- package/dist/src/orgrt/task-dag.d.ts.map +1 -1
- package/dist/src/orgrt/task-dag.js +6 -0
- package/dist/src/orgrt/task-dag.js.map +1 -1
- package/dist/src/orgrt/types.d.ts +2 -0
- package/dist/src/orgrt/types.d.ts.map +1 -1
- package/dist/src/orgrt/types.js +4 -0
- package/dist/src/orgrt/types.js.map +1 -1
- package/dist/src/platform-adapters/mutation.d.ts +34 -0
- package/dist/src/platform-adapters/mutation.d.ts.map +1 -0
- package/dist/src/platform-adapters/mutation.js +188 -0
- package/dist/src/platform-adapters/mutation.js.map +1 -0
- package/dist/src/platform-adapters/operations.d.ts +7 -1
- package/dist/src/platform-adapters/operations.d.ts.map +1 -1
- package/dist/src/platform-adapters/operations.js +18 -76
- package/dist/src/platform-adapters/operations.js.map +1 -1
- package/dist/src/routing/jev-step.d.ts +17 -0
- package/dist/src/routing/jev-step.d.ts.map +1 -0
- package/dist/src/routing/jev-step.js +27 -0
- package/dist/src/routing/jev-step.js.map +1 -0
- package/dist/src/routing/route-layer-factory.d.ts.map +1 -1
- package/dist/src/routing/route-layer-factory.js +16 -1
- package/dist/src/routing/route-layer-factory.js.map +1 -1
- package/dist/src/utils/redaction.d.ts.map +1 -1
- package/dist/src/utils/redaction.js +19 -4
- package/dist/src/utils/redaction.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +4 -4
- package/.claude/skills/monodesign/SKILL.md +0 -257
- package/.claude/skills/monodesign/adapt.md +0 -53
- package/.claude/skills/monodesign/agents/monodesign-asset-producer.md +0 -100
- package/.claude/skills/monodesign/agents/monodesign-manual-edit-applier.md +0 -103
- package/.claude/skills/monodesign/animate.md +0 -65
- package/.claude/skills/monodesign/audit.md +0 -89
- package/.claude/skills/monodesign/bolder.md +0 -50
- package/.claude/skills/monodesign/clarify.md +0 -64
- package/.claude/skills/monodesign/colorize.md +0 -68
- package/.claude/skills/monodesign/craft.md +0 -51
- package/.claude/skills/monodesign/critique.md +0 -66
- package/.claude/skills/monodesign/delight.md +0 -47
- package/.claude/skills/monodesign/distill.md +0 -56
- package/.claude/skills/monodesign/document.md +0 -83
- package/.claude/skills/monodesign/extract.md +0 -74
- package/.claude/skills/monodesign/harden.md +0 -65
- package/.claude/skills/monodesign/init.md +0 -30
- package/.claude/skills/monodesign/layout.md +0 -36
- package/.claude/skills/monodesign/live.md +0 -34
- package/.claude/skills/monodesign/onboard.md +0 -50
- package/.claude/skills/monodesign/optimize.md +0 -64
- package/.claude/skills/monodesign/overdrive.md +0 -56
- package/.claude/skills/monodesign/polish.md +0 -68
- package/.claude/skills/monodesign/quieter.md +0 -57
- package/.claude/skills/monodesign/reference/adapt.md +0 -312
- package/.claude/skills/monodesign/reference/adapt.native.md +0 -58
- package/.claude/skills/monodesign/reference/android.md +0 -40
- package/.claude/skills/monodesign/reference/animate.md +0 -203
- package/.claude/skills/monodesign/reference/antipatterns-catalog.md +0 -410
- package/.claude/skills/monodesign/reference/audit.md +0 -135
- package/.claude/skills/monodesign/reference/audit.native.md +0 -139
- package/.claude/skills/monodesign/reference/bolder.md +0 -120
- package/.claude/skills/monodesign/reference/brand-workflow.md +0 -180
- package/.claude/skills/monodesign/reference/brand.md +0 -108
- package/.claude/skills/monodesign/reference/clarify.md +0 -288
- package/.claude/skills/monodesign/reference/codex.md +0 -105
- package/.claude/skills/monodesign/reference/cognitive-load.md +0 -106
- package/.claude/skills/monodesign/reference/color-and-contrast.md +0 -105
- package/.claude/skills/monodesign/reference/colorize.md +0 -257
- package/.claude/skills/monodesign/reference/component-specs.md +0 -260
- package/.claude/skills/monodesign/reference/component-states.md +0 -274
- package/.claude/skills/monodesign/reference/component-system.md +0 -358
- package/.claude/skills/monodesign/reference/copy-formulas.md +0 -160
- package/.claude/skills/monodesign/reference/craft.md +0 -123
- package/.claude/skills/monodesign/reference/critique.md +0 -780
- package/.claude/skills/monodesign/reference/delight.md +0 -302
- package/.claude/skills/monodesign/reference/design-principles.md +0 -246
- package/.claude/skills/monodesign/reference/distill.md +0 -111
- package/.claude/skills/monodesign/reference/document.md +0 -429
- package/.claude/skills/monodesign/reference/extract.md +0 -69
- package/.claude/skills/monodesign/reference/harden.md +0 -347
- package/.claude/skills/monodesign/reference/heuristics-scoring.md +0 -234
- package/.claude/skills/monodesign/reference/hooks.md +0 -92
- package/.claude/skills/monodesign/reference/image-prompts.md +0 -130
- package/.claude/skills/monodesign/reference/init.md +0 -221
- package/.claude/skills/monodesign/reference/interaction-design.md +0 -189
- package/.claude/skills/monodesign/reference/ios.md +0 -45
- package/.claude/skills/monodesign/reference/layout.md +0 -185
- package/.claude/skills/monodesign/reference/live.md +0 -710
- package/.claude/skills/monodesign/reference/motion-design.md +0 -109
- package/.claude/skills/monodesign/reference/onboard.md +0 -234
- package/.claude/skills/monodesign/reference/optimize.md +0 -258
- package/.claude/skills/monodesign/reference/overdrive.md +0 -130
- package/.claude/skills/monodesign/reference/personas.md +0 -179
- package/.claude/skills/monodesign/reference/polish.md +0 -241
- package/.claude/skills/monodesign/reference/pre-delivery-checklist.md +0 -108
- package/.claude/skills/monodesign/reference/product.md +0 -60
- package/.claude/skills/monodesign/reference/quieter.md +0 -99
- package/.claude/skills/monodesign/reference/responsive-design.md +0 -114
- package/.claude/skills/monodesign/reference/shape.md +0 -165
- package/.claude/skills/monodesign/reference/spatial-design.md +0 -100
- package/.claude/skills/monodesign/reference/teach.md +0 -10
- package/.claude/skills/monodesign/reference/token-architecture.md +0 -222
- package/.claude/skills/monodesign/reference/typeset.md +0 -301
- package/.claude/skills/monodesign/reference/typography.md +0 -159
- package/.claude/skills/monodesign/reference/ux-research.md +0 -143
- package/.claude/skills/monodesign/reference/ux-rules.md +0 -211
- package/.claude/skills/monodesign/reference/ux-writing.md +0 -107
- package/.claude/skills/monodesign/scripts/command-metadata.json +0 -94
- package/.claude/skills/monodesign/scripts/context-signals.mjs +0 -260
- package/.claude/skills/monodesign/scripts/context.mjs +0 -1065
- package/.claude/skills/monodesign/scripts/critique-storage.mjs +0 -416
- package/.claude/skills/monodesign/scripts/detect-csp.mjs +0 -193
- package/.claude/skills/monodesign/scripts/detect.mjs +0 -33
- package/.claude/skills/monodesign/scripts/detector/browser/injected/index.mjs +0 -1960
- package/.claude/skills/monodesign/scripts/detector/cli/main.mjs +0 -321
- package/.claude/skills/monodesign/scripts/detector/design-system.mjs +0 -814
- package/.claude/skills/monodesign/scripts/detector/detect-antipatterns-browser.js +0 -5628
- package/.claude/skills/monodesign/scripts/detector/detect-antipatterns.mjs +0 -50
- package/.claude/skills/monodesign/scripts/detector/engines/browser/detect-url.mjs +0 -259
- package/.claude/skills/monodesign/scripts/detector/engines/browser/drivers.mjs +0 -339
- package/.claude/skills/monodesign/scripts/detector/engines/regex/detect-text.mjs +0 -636
- package/.claude/skills/monodesign/scripts/detector/engines/static-html/css-cascade.mjs +0 -1016
- package/.claude/skills/monodesign/scripts/detector/engines/static-html/detect-html.mjs +0 -253
- package/.claude/skills/monodesign/scripts/detector/engines/visual/screenshot-contrast.mjs +0 -198
- package/.claude/skills/monodesign/scripts/detector/findings.mjs +0 -12
- package/.claude/skills/monodesign/scripts/detector/fix/css-regions.mjs +0 -181
- package/.claude/skills/monodesign/scripts/detector/fix/fixers.mjs +0 -373
- package/.claude/skills/monodesign/scripts/detector/fix/index.mjs +0 -426
- package/.claude/skills/monodesign/scripts/detector/node/file-system.mjs +0 -198
- package/.claude/skills/monodesign/scripts/detector/profile/profiler.mjs +0 -166
- package/.claude/skills/monodesign/scripts/detector/registry/antipatterns.mjs +0 -563
- package/.claude/skills/monodesign/scripts/detector/rules/checks.mjs +0 -3024
- package/.claude/skills/monodesign/scripts/detector/shared/color.mjs +0 -124
- package/.claude/skills/monodesign/scripts/detector/shared/constants.mjs +0 -101
- package/.claude/skills/monodesign/scripts/detector/shared/fonts.mjs +0 -30
- package/.claude/skills/monodesign/scripts/detector/shared/inline-ignores.mjs +0 -148
- package/.claude/skills/monodesign/scripts/detector/shared/page.mjs +0 -7
- package/.claude/skills/monodesign/scripts/hook-admin.mjs +0 -694
- package/.claude/skills/monodesign/scripts/hook-before-edit.mjs +0 -516
- package/.claude/skills/monodesign/scripts/hook-lib.mjs +0 -1785
- package/.claude/skills/monodesign/scripts/hook.mjs +0 -61
- package/.claude/skills/monodesign/scripts/lib/design-parser.mjs +0 -809
- package/.claude/skills/monodesign/scripts/lib/is-generated.mjs +0 -69
- package/.claude/skills/monodesign/scripts/lib/monodesign-config.mjs +0 -640
- package/.claude/skills/monodesign/scripts/lib/monodesign-paths.mjs +0 -129
- package/.claude/skills/monodesign/scripts/lib/provider.mjs +0 -4
- package/.claude/skills/monodesign/scripts/lib/target-args.mjs +0 -42
- package/.claude/skills/monodesign/scripts/live/browser-script-parts.mjs +0 -50
- package/.claude/skills/monodesign/scripts/live/completion.mjs +0 -19
- package/.claude/skills/monodesign/scripts/live/event-validation.mjs +0 -137
- package/.claude/skills/monodesign/scripts/live/insert-ui.mjs +0 -458
- package/.claude/skills/monodesign/scripts/live/manual-apply.mjs +0 -939
- package/.claude/skills/monodesign/scripts/live/manual-edit-routes.mjs +0 -357
- package/.claude/skills/monodesign/scripts/live/manual-edits-buffer.mjs +0 -152
- package/.claude/skills/monodesign/scripts/live/session-store.mjs +0 -293
- package/.claude/skills/monodesign/scripts/live/svelte-component.mjs +0 -826
- package/.claude/skills/monodesign/scripts/live/sveltekit-adapter.mjs +0 -279
- package/.claude/skills/monodesign/scripts/live/ui-core.mjs +0 -180
- package/.claude/skills/monodesign/scripts/live/vocabulary.mjs +0 -36
- package/.claude/skills/monodesign/scripts/live-accept.mjs +0 -812
- package/.claude/skills/monodesign/scripts/live-browser-dom.js +0 -147
- package/.claude/skills/monodesign/scripts/live-browser-session.js +0 -124
- package/.claude/skills/monodesign/scripts/live-browser.js +0 -11213
- package/.claude/skills/monodesign/scripts/live-commit-manual-edits.mjs +0 -1241
- package/.claude/skills/monodesign/scripts/live-complete.mjs +0 -75
- package/.claude/skills/monodesign/scripts/live-copy-edit-agent.mjs +0 -683
- package/.claude/skills/monodesign/scripts/live-discard-manual-edits.mjs +0 -51
- package/.claude/skills/monodesign/scripts/live-inject.mjs +0 -596
- package/.claude/skills/monodesign/scripts/live-insert.mjs +0 -272
- package/.claude/skills/monodesign/scripts/live-manual-edit-evidence.mjs +0 -363
- package/.claude/skills/monodesign/scripts/live-poll.mjs +0 -384
- package/.claude/skills/monodesign/scripts/live-resume.mjs +0 -94
- package/.claude/skills/monodesign/scripts/live-server.mjs +0 -1210
- package/.claude/skills/monodesign/scripts/live-status.mjs +0 -61
- package/.claude/skills/monodesign/scripts/live-target.mjs +0 -30
- package/.claude/skills/monodesign/scripts/live-wrap.mjs +0 -884
- package/.claude/skills/monodesign/scripts/live.mjs +0 -297
- package/.claude/skills/monodesign/scripts/modern-screenshot.umd.js +0 -14
- package/.claude/skills/monodesign/scripts/palette.mjs +0 -635
- package/.claude/skills/monodesign/scripts/pin.mjs +0 -221
- package/.claude/skills/monodesign/shape.md +0 -71
- package/.claude/skills/monodesign/teach.md +0 -18
- 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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"}
|