@amsterdamdatalabs/enact-extensions 0.1.37 → 0.1.47
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/README.md +67 -108
- package/bundled-extensions.json +6 -0
- package/dist/create/enact.d.ts.map +1 -1
- package/dist/create/enact.js +2 -0
- package/dist/create/enact.js.map +1 -1
- package/dist/create/index.d.ts +3 -0
- package/dist/create/index.d.ts.map +1 -1
- package/dist/create/index.js +6 -0
- package/dist/create/index.js.map +1 -1
- package/dist/create/kimi.d.ts +16 -0
- package/dist/create/kimi.d.ts.map +1 -0
- package/dist/create/kimi.js +87 -0
- package/dist/create/kimi.js.map +1 -0
- package/dist/create/opencode.d.ts +129 -0
- package/dist/create/opencode.d.ts.map +1 -0
- package/dist/create/opencode.js +696 -0
- package/dist/create/opencode.js.map +1 -0
- package/dist/index.d.ts +12 -16
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -10
- package/dist/index.js.map +1 -1
- package/dist/internal/agents.d.ts +12 -2
- package/dist/internal/agents.d.ts.map +1 -1
- package/dist/internal/agents.js +119 -3
- package/dist/internal/agents.js.map +1 -1
- package/dist/internal/extensions-table.d.ts +58 -0
- package/dist/internal/extensions-table.d.ts.map +1 -0
- package/dist/internal/extensions-table.js +134 -0
- package/dist/internal/extensions-table.js.map +1 -0
- package/dist/internal/file-ops.d.ts +36 -0
- package/dist/internal/file-ops.d.ts.map +1 -0
- package/dist/internal/file-ops.js +89 -0
- package/dist/internal/file-ops.js.map +1 -0
- package/dist/internal/hooks.d.ts +56 -0
- package/dist/internal/hooks.d.ts.map +1 -0
- package/dist/internal/hooks.js +128 -0
- package/dist/internal/hooks.js.map +1 -0
- package/dist/internal/json-merge.d.ts +63 -0
- package/dist/internal/json-merge.d.ts.map +1 -0
- package/dist/internal/json-merge.js +122 -0
- package/dist/internal/json-merge.js.map +1 -0
- package/dist/internal/lock-ownership.d.ts +41 -0
- package/dist/internal/lock-ownership.d.ts.map +1 -0
- package/dist/internal/lock-ownership.js +24 -0
- package/dist/internal/lock-ownership.js.map +1 -0
- package/dist/internal/platform.d.ts.map +1 -1
- package/dist/internal/platform.js +90 -4
- package/dist/internal/platform.js.map +1 -1
- package/dist/internal/schema.js.map +1 -1
- package/dist/internal/toml-block.d.ts +59 -0
- package/dist/internal/toml-block.d.ts.map +1 -0
- package/dist/internal/toml-block.js +113 -0
- package/dist/internal/toml-block.js.map +1 -0
- package/dist/internal/types.d.ts +2 -1
- package/dist/internal/types.d.ts.map +1 -1
- package/dist/projection.d.ts +47 -0
- package/dist/projection.d.ts.map +1 -0
- package/dist/projection.js +180 -0
- package/dist/projection.js.map +1 -0
- package/dist/validate/index.d.ts +9 -4
- package/dist/validate/index.d.ts.map +1 -1
- package/dist/validate/index.js +56 -7
- package/dist/validate/index.js.map +1 -1
- package/dist/validate/kimi.d.ts +3 -0
- package/dist/validate/kimi.d.ts.map +1 -0
- package/dist/validate/kimi.js +11 -0
- package/dist/validate/kimi.js.map +1 -0
- package/dist/validate/opencode.d.ts +3 -0
- package/dist/validate/opencode.d.ts.map +1 -0
- package/dist/validate/opencode.js +11 -0
- package/dist/validate/opencode.js.map +1 -0
- package/dist/validate/run.d.ts +39 -0
- package/dist/validate/run.d.ts.map +1 -0
- package/dist/validate/run.js +63 -0
- package/dist/validate/run.js.map +1 -0
- package/extensions/enact-loop/.agents/plugin.json +12 -8
- package/extensions/enact-loop/scripts/validate.mjs +113 -2
- package/extensions/enact-loop/skills/enact-loop/SKILL.md +36 -466
- package/extensions/enact-loop/skills/enact-loop/references/loop-contract.md +114 -0
- package/extensions/enact-loop/skills/loop-budget/SKILL.md +57 -0
- package/extensions/enact-loop/skills/loop-intake/SKILL.md +59 -0
- package/extensions/enact-repo/.agents/plugin.json +55 -0
- package/extensions/enact-repo/.mcp.json +20 -0
- package/extensions/enact-repo/README.md +90 -0
- package/extensions/enact-repo/hooks/hooks.json +98 -0
- package/extensions/enact-repo/lean-ctx/config.toml +35 -0
- package/extensions/enact-repo/lean-ctx/layout.toml +5 -0
- package/extensions/enact-repo/skills/aca-sandboxes/SKILL.md +53 -0
- package/extensions/enact-repo/skills/aca-sandboxes/references/capabilities.md +52 -0
- package/extensions/enact-repo/skills/aca-sandboxes/references/install.md +87 -0
- package/extensions/enact-repo/skills/aca-sandboxes/references/prerequisites.md +52 -0
- package/extensions/enact-repo/skills/aca-sandboxes/references/quickstart.md +164 -0
- package/extensions/enact-repo/skills/aca-sandboxes/references/reference-advanced.md +251 -0
- package/extensions/enact-repo/skills/aca-sandboxes/references/reference.md +287 -0
- package/extensions/enact-repo/skills/aca-sandboxes/references/response-cues.md +71 -0
- package/extensions/enact-repo/skills/aca-sandboxes/references/scenarios.md +219 -0
- package/extensions/enact-repo/skills/aca-sandboxes/version.json +4 -0
- package/extensions/enact-repo/skills/backend-remove-deadcode/SKILL.md +96 -0
- package/extensions/enact-repo/skills/cmux-leader/SKILL.md +61 -0
- package/extensions/enact-repo/skills/cmux-send/SKILL.md +61 -0
- package/extensions/enact-repo/skills/code-review/SKILL.md +100 -0
- package/extensions/enact-repo/skills/codebase-design/SKILL.md +98 -0
- package/extensions/enact-repo/skills/codebase-design/references/DEEPENING.md +37 -0
- package/extensions/enact-repo/skills/codebase-design/references/DESIGN-IT-TWICE.md +44 -0
- package/extensions/enact-repo/skills/codebase-design/references/TESTABILITY.md +29 -0
- package/extensions/enact-repo/skills/computer-use/SKILL.md +76 -0
- package/extensions/enact-repo/skills/debug-issue/SKILL.md +40 -0
- package/extensions/enact-repo/skills/diagnosing-bugs/SKILL.md +100 -0
- package/extensions/enact-repo/skills/diagnosing-bugs/references/FEEDBACK-LOOP-TACTICS.md +34 -0
- package/extensions/enact-repo/skills/diagnosing-bugs/scripts/hitl-loop.template.sh +41 -0
- package/extensions/enact-repo/skills/domain-modeling/SKILL.md +86 -0
- package/extensions/enact-repo/skills/domain-modeling/references/ADR-FORMAT.md +47 -0
- package/extensions/enact-repo/skills/domain-modeling/references/CONTEXT-FORMAT.md +60 -0
- package/extensions/enact-repo/skills/explore-codebase/SKILL.md +41 -0
- package/extensions/enact-repo/skills/frontend-design/LICENSE.txt +177 -0
- package/extensions/enact-repo/skills/frontend-design/SKILL.md +56 -0
- package/extensions/enact-repo/skills/grill-me/SKILL.md +20 -0
- package/extensions/enact-repo/skills/grill-with-docs/SKILL.md +20 -0
- package/extensions/enact-repo/skills/handoff/SKILL.md +28 -0
- package/extensions/enact-repo/skills/http-contract-migration/SKILL.md +74 -0
- package/extensions/enact-repo/skills/http-contract-migration/references/compatibility-and-gates.md +26 -0
- package/extensions/enact-repo/skills/http-contract-migration/references/hexagonal-boundary.md +16 -0
- package/extensions/enact-repo/skills/http-contract-migration/references/publication-and-adoption.md +31 -0
- package/extensions/enact-repo/skills/http-contract-migration/references/wire-fidelity-and-dto.md +31 -0
- package/extensions/enact-repo/skills/implement/SKILL.md +28 -0
- package/extensions/enact-repo/skills/improve-codebase-architecture/SKILL.md +80 -0
- package/extensions/enact-repo/skills/improve-codebase-architecture/references/HTML-REPORT.md +123 -0
- package/extensions/enact-repo/skills/interaction-design/SKILL.md +30 -0
- package/extensions/enact-repo/skills/interaction-design/references/Workflow.md +146 -0
- package/extensions/enact-repo/skills/interaction-design/references/animation-libraries-gsap.md +220 -0
- package/extensions/enact-repo/skills/interaction-design/references/animation-libraries-native.md +110 -0
- package/extensions/enact-repo/skills/interaction-design/references/animation-libraries.md +178 -0
- package/extensions/enact-repo/skills/interaction-design/references/interaction-patterns.md +166 -0
- package/extensions/enact-repo/skills/interaction-design/references/microinteraction-patterns-advanced.md +285 -0
- package/extensions/enact-repo/skills/interaction-design/references/microinteraction-patterns.md +254 -0
- package/extensions/enact-repo/skills/interaction-design/references/scroll-animations-reveals.md +213 -0
- package/extensions/enact-repo/skills/interaction-design/references/scroll-animations.md +209 -0
- package/extensions/enact-repo/skills/lean-ctx/SKILL.md +81 -0
- package/extensions/enact-repo/skills/orca-cli/SKILL.md +88 -0
- package/extensions/enact-repo/skills/orchestration/SKILL.md +80 -0
- package/extensions/enact-repo/skills/prototype/SKILL.md +37 -0
- package/extensions/enact-repo/skills/prototype/references/LOGIC.md +79 -0
- package/extensions/enact-repo/skills/prototype/references/UI.md +112 -0
- package/extensions/enact-repo/skills/refactor-safely/SKILL.md +44 -0
- package/extensions/enact-repo/skills/remove-deadcode/SKILL.md +54 -0
- package/extensions/enact-repo/skills/research/SKILL.md +27 -0
- package/extensions/enact-repo/skills/resolving-merge-conflicts/SKILL.md +28 -0
- package/extensions/enact-repo/skills/review-changes/SKILL.md +45 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/SKILL.md +88 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/accent-color.mdx +149 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/adding-custom-styles.mdx +635 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/align-content.mdx +300 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/align-items.mdx +241 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/align-self.mdx +294 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/animation.mdx +286 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/appearance.mdx +180 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/aspect-ratio.mdx +98 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/backdrop-filter-blur.mdx +109 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/backdrop-filter-brightness.mdx +82 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/backdrop-filter-contrast.mdx +82 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/backdrop-filter-grayscale.mdx +99 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/backdrop-filter-hue-rotate.mdx +173 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/backdrop-filter-invert.mdx +99 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/backdrop-filter-opacity.mdx +103 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/backdrop-filter-saturate.mdx +98 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/backdrop-filter-sepia.mdx +95 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/backdrop-filter.mdx +113 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/backface-visibility.mdx +110 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/background-attachment.mdx +126 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/background-blend-mode.mdx +79 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/background-clip.mdx +85 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/background-color.mdx +176 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/background-image.mdx +349 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/background-origin.mdx +64 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/background-position.mdx +171 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/background-repeat.mdx +127 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/background-size.mdx +100 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/block-size.mdx +190 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/border-collapse.mdx +181 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/border-color.mdx +316 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/border-radius.mdx +347 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/border-spacing.mdx +117 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/border-style.mdx +129 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/border-width.mdx +344 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/box-decoration-break.mdx +71 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/box-shadow.mdx +497 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/box-sizing.mdx +175 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/break-after.mdx +38 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/break-before.mdx +38 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/break-inside.mdx +34 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/caption-side.mdx +190 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/caret-color.mdx +66 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/clear.mdx +224 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/color-scheme.mdx +81 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/color.mdx +125 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/colors.mdx +927 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/columns.mdx +310 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/compatibility.mdx +193 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/content.mdx +129 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/cursor.mdx +104 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/dark-mode.mdx +191 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/detecting-classes-in-source-files.mdx +315 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/display.mdx +523 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/editor-setup.mdx +90 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/field-sizing.mdx +75 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/fill.mdx +100 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/filter-blur.mdx +114 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/filter-brightness.mdx +102 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/filter-contrast.mdx +102 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/filter-drop-shadow.mdx +230 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/filter-grayscale.mdx +101 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/filter-hue-rotate.mdx +171 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/filter-invert.mdx +93 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/filter-saturate.mdx +109 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/filter-sepia.mdx +92 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/filter.mdx +113 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/flex-basis.mdx +144 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/flex-direction.mdx +130 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/flex-grow.mdx +129 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/flex-shrink.mdx +95 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/flex-wrap.mdx +118 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/flex.mdx +164 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/float.mdx +197 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/font-family.mdx +119 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/font-feature-settings.mdx +52 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/font-size.mdx +184 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/font-smoothing.mdx +67 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/font-stretch.mdx +138 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/font-style.mdx +62 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/font-variant-numeric.mdx +228 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/font-weight.mdx +105 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/forced-color-adjust.mdx +152 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/functions-and-directives.mdx +322 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/gap.mdx +100 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/grid-auto-columns.mdx +43 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/grid-auto-flow.mdx +58 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/grid-auto-rows.mdx +43 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/grid-column.mdx +124 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/grid-row.mdx +115 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/grid-template-columns.mdx +101 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/grid-template-rows.mdx +108 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/height.mdx +260 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/hover-focus-and-other-states.mdx +4935 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/hyphens.mdx +112 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/inline-size.mdx +191 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/isolation.mdx +30 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/justify-content.mdx +348 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/justify-items.mdx +286 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/justify-self.mdx +282 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/letter-spacing.mdx +100 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/line-clamp.mdx +110 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/line-height.mdx +147 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/list-style-image.mdx +80 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/list-style-position.mdx +67 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/list-style-type.mdx +86 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/margin.mdx +397 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/mask-clip.mdx +66 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/mask-composite.mdx +70 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/mask-image.mdx +933 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/mask-mode.mdx +114 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/mask-origin.mdx +66 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/mask-position.mdx +117 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/mask-repeat.mdx +169 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/mask-size.mdx +104 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/mask-type.mdx +98 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/max-block-size.mdx +153 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/max-height.mdx +164 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/max-inline-size.mdx +185 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/max-width.mdx +214 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/min-block-size.mdx +146 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/min-height.mdx +150 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/min-inline-size.mdx +153 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/min-width.mdx +153 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/mix-blend-mode.mdx +103 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/object-fit.mdx +147 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/object-position.mdx +182 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/opacity.mdx +84 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/order.mdx +94 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/outline-color.mdx +130 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/outline-offset.mdx +72 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/outline-style.mdx +134 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/outline-width.mdx +91 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/overflow-wrap.mdx +130 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/overflow.mdx +665 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/overscroll-behavior.mdx +151 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/padding.mdx +232 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/perspective-origin.mdx +127 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/perspective.mdx +137 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/place-content.mdx +257 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/place-items.mdx +269 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/place-self.mdx +257 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/pointer-events.mdx +101 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/position.mdx +399 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/preflight.mdx +291 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/resize.mdx +110 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/responsive-design.mdx +666 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/rotate.mdx +291 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/scale.mdx +360 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/scroll-behavior.mdx +39 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/scroll-margin.mdx +268 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/scroll-padding.mdx +255 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/scroll-snap-align.mdx +281 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/scroll-snap-stop.mdx +198 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/scroll-snap-type.mdx +284 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/skew.mdx +352 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/stroke-width.mdx +74 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/stroke.mdx +103 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/styling-with-utility-classes.mdx +1020 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/table-layout.mdx +212 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/text-align.mdx +162 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/text-decoration-color.mdx +155 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/text-decoration-line.mdx +143 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/text-decoration-style.mdx +75 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/text-decoration-thickness.mdx +75 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/text-indent.mdx +74 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/text-overflow.mdx +103 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/text-shadow.mdx +177 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/text-transform.mdx +106 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/text-underline-offset.mdx +74 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/text-wrap.mdx +144 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/theme.mdx +1142 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/top-right-bottom-left.mdx +296 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/touch-action.mdx +95 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/transform-origin.mdx +130 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/transform-style.mdx +110 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/transform.mdx +51 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/transition-behavior.mdx +76 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/transition-delay.mdx +76 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/transition-duration.mdx +82 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/transition-property.mdx +137 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/transition-timing-function.mdx +89 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/translate.mdx +487 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/upgrade-guide.mdx +910 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/user-select.mdx +114 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/vertical-align.mdx +194 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/visibility.mdx +287 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/white-space.mdx +211 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/width.mdx +264 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/will-change.mdx +47 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/word-break.mdx +94 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs/z-index.mdx +104 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs-catalog.md +251 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs-index.tsx +237 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/docs-source.txt +6 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/references/gotchas.md +18 -0
- package/extensions/enact-repo/skills/tailwind-4-docs/scripts/sync_tailwind_docs.py +183 -0
- package/extensions/enact-repo/skills/tdd/SKILL.md +49 -0
- package/extensions/enact-repo/skills/tdd/references/mocking.md +59 -0
- package/extensions/enact-repo/skills/tdd/references/tests.md +77 -0
- package/extensions/enact-repo/skills/teach/SKILL.md +88 -0
- package/extensions/enact-repo/skills/teach/references/GLOSSARY-FORMAT.md +35 -0
- package/extensions/enact-repo/skills/teach/references/LEARNING-RECORD-FORMAT.md +46 -0
- package/extensions/enact-repo/skills/teach/references/MISSION-FORMAT.md +31 -0
- package/extensions/enact-repo/skills/teach/references/PHILOSOPHY.md +65 -0
- package/extensions/enact-repo/skills/teach/references/RESOURCES-FORMAT.md +32 -0
- package/extensions/enact-repo/skills/testing/SKILL.md +54 -0
- package/extensions/enact-repo/skills/to-spec/SKILL.md +85 -0
- package/extensions/enact-repo/skills/to-tickets/SKILL.md +75 -0
- package/extensions/enact-repo/skills/to-tickets/references/TICKET-TEMPLATES.md +39 -0
- package/extensions/enact-repo/skills/triage/SKILL.md +99 -0
- package/extensions/enact-repo/skills/triage/references/AGENT-BRIEF.md +207 -0
- package/extensions/enact-repo/skills/triage/references/NEEDS-INFO-TEMPLATE.md +17 -0
- package/extensions/enact-repo/skills/triage/references/OUT-OF-SCOPE.md +105 -0
- package/extensions/enact-repo/skills/ui-ux-pro-max/SKILL.md +32 -0
- package/extensions/enact-repo/skills/ui-ux-pro-max/references/Workflow.md +207 -0
- package/extensions/enact-repo/skills/ui-ux-pro-max/references/workflow-reference.md +175 -0
- package/extensions/enact-repo/skills/wayfinder/SKILL.md +100 -0
- package/extensions/enact-repo/skills/wayfinder/references/TEMPLATES.md +35 -0
- package/extensions/enact-repo/skills/wayfinder/references/TICKET-TYPES.md +8 -0
- package/extensions/enact-repo/skills/writing-great-skills/SKILL.md +93 -0
- package/extensions/enact-repo/skills/writing-great-skills/references/GLOSSARY.md +201 -0
- package/package.json +18 -14
- package/scripts/enact-extensions.mjs +255 -873
- package/scripts/lib/allowed-plugins.mjs +52 -0
- package/scripts/lib/run-repo-doctor.mjs +571 -0
- package/scripts/lib/run-repo-install.mjs +1579 -0
- package/scripts/lib/run-sync.mjs +1 -1
- package/scripts/lib/run-validate.mjs +23 -37
- package/scripts/lib/skill-validator.mjs +872 -0
- package/spec/enact.json +21 -3
- package/spec/enact.md +13 -12
- package/spec/kimi.json +100 -0
- package/spec/opencode.json +64 -0
- package/dist/install.d.ts +0 -235
- package/dist/install.d.ts.map +0 -1
- package/dist/install.js +0 -697
- package/dist/install.js.map +0 -1
- package/dist/internal/claude.d.ts +0 -65
- package/dist/internal/claude.d.ts.map +0 -1
- package/dist/internal/claude.js +0 -200
- package/dist/internal/claude.js.map +0 -1
- package/dist/internal/codex.d.ts +0 -43
- package/dist/internal/codex.d.ts.map +0 -1
- package/dist/internal/codex.js +0 -211
- package/dist/internal/codex.js.map +0 -1
- package/dist/internal/cursor.d.ts +0 -2
- package/dist/internal/cursor.d.ts.map +0 -1
- package/dist/internal/cursor.js +0 -6
- package/dist/internal/cursor.js.map +0 -1
- package/dist/principles.d.ts +0 -28
- package/dist/principles.d.ts.map +0 -1
- package/dist/principles.js +0 -159
- package/dist/principles.js.map +0 -1
- package/dist/provision.d.ts +0 -30
- package/dist/provision.d.ts.map +0 -1
- package/dist/provision.js +0 -202
- package/dist/provision.js.map +0 -1
- package/extensions/dev-state/.agents/plugin.json +0 -36
- package/extensions/dev-state/skills/dev-state-plan-graduation/SKILL.md +0 -194
- package/extensions/dev-state/skills/dev-state-plan-graduation/agents/openai.yaml +0 -4
- package/extensions/dev-state/skills/dev-state-plan-graduation/references/reference.md +0 -130
- package/extensions/enact-context/.agents/plugin.json +0 -41
- package/extensions/enact-context/.mcp.json +0 -8
- package/extensions/enact-context/README.md +0 -25
- package/extensions/enact-context/assets/icon.png +0 -0
- package/extensions/enact-context/assets/logo.png +0 -0
- package/extensions/enact-context/hooks/hooks.json +0 -115
- package/extensions/enact-context/skills/enact-context/SKILL.md +0 -151
- package/extensions/enact-context/skills/enact-context/scripts/install.sh +0 -69
- package/extensions/enact-core/.agents/plugin.json +0 -40
- package/extensions/enact-core/OPERATING-PRINCIPLES.md +0 -7
- package/extensions/enact-core/hooks/hooks.json +0 -26
- package/extensions/enact-evolve/.agents/plugin.json +0 -47
- package/extensions/enact-evolve/agents/evolve-session-analyst.toml +0 -37
- package/extensions/enact-evolve/assets/icon.png +0 -0
- package/extensions/enact-evolve/assets/logo.png +0 -0
- package/extensions/enact-evolve/skills/mined-investigate-loop/SKILL.md +0 -68
- package/extensions/enact-evolve/skills/session-analysis/SKILL.md +0 -98
- package/extensions/enact-evolve/skills/session-analysis/scripts/run-evolve-analysis.sh +0 -343
- package/extensions/enact-factory/.agents/plugin.json +0 -49
- package/extensions/enact-factory/.mcp.json +0 -8
- package/extensions/enact-factory/agents/architect.toml +0 -34
- package/extensions/enact-factory/agents/code-reviewer.toml +0 -33
- package/extensions/enact-factory/agents/critic.toml +0 -39
- package/extensions/enact-factory/agents/executor.toml +0 -26
- package/extensions/enact-factory/agents/explore.toml +0 -25
- package/extensions/enact-factory/agents/planner.toml +0 -26
- package/extensions/enact-factory/agents/verifier.toml +0 -33
- package/extensions/enact-factory/assets/icon.png +0 -0
- package/extensions/enact-factory/assets/logo.png +0 -0
- package/extensions/enact-factory/skills/advisor/SKILL.md +0 -82
- package/extensions/enact-factory/skills/ai-slop-cleaner/SKILL.md +0 -57
- package/extensions/enact-factory/skills/autonomous-runner/SKILL.md +0 -353
- package/extensions/enact-factory/skills/azdo-ci-strategy/SKILL.md +0 -309
- package/extensions/enact-factory/skills/azdo-ci-strategy/references/build-failures.md +0 -60
- package/extensions/enact-factory/skills/azdo-ci-strategy/references/cli-reference.md +0 -87
- package/extensions/enact-factory/skills/azdo-ci-strategy/references/policies-and-pipelines.md +0 -132
- package/extensions/enact-factory/skills/azdo-ci-strategy/references/troubleshooting.md +0 -53
- package/extensions/enact-factory/skills/cmux-leader/SKILL.md +0 -74
- package/extensions/enact-factory/skills/cmux-send/SKILL.md +0 -50
- package/extensions/enact-factory/skills/committee/SKILL.md +0 -80
- package/extensions/enact-factory/skills/deep-interview/SKILL.md +0 -68
- package/extensions/enact-factory/skills/drive-loop/SKILL.md +0 -394
- package/extensions/enact-factory/skills/drive-loop/references/contract-schema.md +0 -127
- package/extensions/enact-factory/skills/handoff/SKILL.md +0 -75
- package/extensions/enact-factory/skills/hyperplan/SKILL.md +0 -59
- package/extensions/enact-factory/skills/looplan/SKILL.md +0 -120
- package/extensions/enact-factory/skills/plan/SKILL.md +0 -103
- package/extensions/enact-factory/skills/remove-deadcode/SKILL.md +0 -46
- package/extensions/enact-factory/skills/research/SKILL.md +0 -83
- package/extensions/enact-factory/skills/review/SKILL.md +0 -67
- package/extensions/enact-factory/skills/security-research/SKILL.md +0 -57
- package/extensions/enact-factory/skills/tdd/SKILL.md +0 -62
- package/extensions/enact-factory/skills/testing-strategy/SKILL.md +0 -172
- package/extensions/enact-factory/skills/trace/SKILL.md +0 -42
- package/extensions/enact-factory/skills/ultraqa/SKILL.md +0 -85
- package/extensions/enact-factory/skills/work-with-workitem/SKILL.md +0 -56
- package/extensions/enact-factory/skills/workitem-triage/SKILL.md +0 -42
- package/extensions/enact-wiki/.agents/plugin.json +0 -43
- package/extensions/enact-wiki/.mcp.json +0 -15
- package/extensions/enact-wiki/README.md +0 -44
- package/extensions/enact-wiki/assets/icon.png +0 -0
- package/extensions/enact-wiki/assets/logo.png +0 -0
- package/extensions/enact-wiki/skills/document-parser/SKILL.md +0 -17
- package/extensions/enact-wiki/skills/document-parser/scripts/parse.sh +0 -60
- package/extensions/enact-wiki/skills/document-parser/skill.json +0 -9
- package/extensions/enact-wiki/skills/enact-wiki/SKILL.md +0 -30
- package/extensions/enact-wiki/skills/enact-wiki/references/ingest.md +0 -62
- package/extensions/enact-wiki/skills/enact-wiki/references/manage.md +0 -34
- package/extensions/enact-wiki/skills/enact-wiki/references/query.md +0 -59
- package/extensions/enact-wiki/skills/search-lab/SKILL.md +0 -57
- package/extensions/enact-wiki/skills/search-lab/scripts/analyze.ts +0 -23
- package/extensions/enact-wiki/skills/wiki/SKILL.md +0 -42
- package/extensions/net-revenue-management/.agents/plugin.json +0 -40
- package/extensions/net-revenue-management/.mcp.json +0 -9
- package/extensions/net-revenue-management/skills/net-revenue-risks/SKILL.md +0 -30
- package/extensions/net-revenue-management/skills/net-revenue-scenario/SKILL.md +0 -31
- package/extensions/plugin-dev/.agents/plugin.json +0 -41
- package/extensions/plugin-dev/agents/agent-creator.md +0 -199
- package/extensions/plugin-dev/agents/plugin-validator.md +0 -91
- package/extensions/plugin-dev/agents/skill-reviewer.md +0 -212
- package/extensions/plugin-dev/skills/agent-development/SKILL.md +0 -641
- package/extensions/plugin-dev/skills/agent-development/examples/agent-creation-prompt.md +0 -250
- package/extensions/plugin-dev/skills/agent-development/examples/complete-agent-examples.md +0 -461
- package/extensions/plugin-dev/skills/agent-development/references/advanced-agent-fields.md +0 -246
- package/extensions/plugin-dev/skills/agent-development/references/agent-creation-system-prompt.md +0 -216
- package/extensions/plugin-dev/skills/agent-development/references/permission-modes-rules.md +0 -226
- package/extensions/plugin-dev/skills/agent-development/references/system-prompt-design.md +0 -464
- package/extensions/plugin-dev/skills/agent-development/references/triggering-examples.md +0 -474
- package/extensions/plugin-dev/skills/agent-development/scripts/create-agent-skeleton.sh +0 -176
- package/extensions/plugin-dev/skills/agent-development/scripts/test-agent-trigger.sh +0 -227
- package/extensions/plugin-dev/skills/agent-development/scripts/validate-agent.sh +0 -227
- package/extensions/plugin-dev/skills/create-plugin/SKILL.md +0 -505
- package/extensions/plugin-dev/skills/hook-development/SKILL.md +0 -861
- package/extensions/plugin-dev/skills/hook-development/examples/load-context.sh +0 -55
- package/extensions/plugin-dev/skills/hook-development/examples/validate-bash.sh +0 -57
- package/extensions/plugin-dev/skills/hook-development/examples/validate-write.sh +0 -48
- package/extensions/plugin-dev/skills/hook-development/references/advanced.md +0 -871
- package/extensions/plugin-dev/skills/hook-development/references/hook-input-schemas.md +0 -145
- package/extensions/plugin-dev/skills/hook-development/references/migration.md +0 -392
- package/extensions/plugin-dev/skills/hook-development/references/patterns.md +0 -430
- package/extensions/plugin-dev/skills/hook-development/scripts/README.md +0 -181
- package/extensions/plugin-dev/skills/hook-development/scripts/hook-linter.sh +0 -153
- package/extensions/plugin-dev/skills/hook-development/scripts/test-hook.sh +0 -276
- package/extensions/plugin-dev/skills/hook-development/scripts/validate-hook-schema.sh +0 -159
- package/extensions/plugin-dev/skills/mcp-integration/SKILL.md +0 -775
- package/extensions/plugin-dev/skills/mcp-integration/examples/http-server.json +0 -20
- package/extensions/plugin-dev/skills/mcp-integration/examples/sse-server.json +0 -19
- package/extensions/plugin-dev/skills/mcp-integration/examples/stdio-server.json +0 -38
- package/extensions/plugin-dev/skills/mcp-integration/examples/ws-server.json +0 -26
- package/extensions/plugin-dev/skills/mcp-integration/references/authentication.md +0 -601
- package/extensions/plugin-dev/skills/mcp-integration/references/server-discovery.md +0 -190
- package/extensions/plugin-dev/skills/mcp-integration/references/server-types.md +0 -572
- package/extensions/plugin-dev/skills/mcp-integration/references/tool-usage.md +0 -623
- package/extensions/plugin-dev/skills/plugin-dev-guide/SKILL.md +0 -221
- package/extensions/plugin-dev/skills/plugin-structure/SKILL.md +0 -705
- package/extensions/plugin-dev/skills/plugin-structure/examples/advanced-plugin.md +0 -774
- package/extensions/plugin-dev/skills/plugin-structure/examples/minimal-plugin.md +0 -83
- package/extensions/plugin-dev/skills/plugin-structure/examples/standard-plugin.md +0 -611
- package/extensions/plugin-dev/skills/plugin-structure/references/advanced-topics.md +0 -289
- package/extensions/plugin-dev/skills/plugin-structure/references/component-patterns.md +0 -592
- package/extensions/plugin-dev/skills/plugin-structure/references/github-actions.md +0 -233
- package/extensions/plugin-dev/skills/plugin-structure/references/headless-ci-mode.md +0 -193
- package/extensions/plugin-dev/skills/plugin-structure/references/manifest-reference.md +0 -625
- package/extensions/plugin-dev/skills/plugin-structure/references/output-styles.md +0 -116
- package/extensions/plugin-dev/skills/skill-development/SKILL.md +0 -562
- package/extensions/plugin-dev/skills/skill-development/examples/complete-skill.md +0 -465
- package/extensions/plugin-dev/skills/skill-development/examples/frontmatter-templates.md +0 -167
- package/extensions/plugin-dev/skills/skill-development/examples/minimal-skill.md +0 -111
- package/extensions/plugin-dev/skills/skill-development/references/advanced-frontmatter.md +0 -225
- package/extensions/plugin-dev/skills/skill-development/references/commands-vs-skills.md +0 -39
- package/extensions/plugin-dev/skills/skill-development/references/skill-creation-workflow.md +0 -379
- package/extensions/plugin-dev/skills/skill-development/references/skill-creator-original.md +0 -210
- package/extensions/plugin-dev/skills/start/SKILL.md +0 -82
- package/scripts/check-hooks.mjs +0 -174
- package/scripts/check-principles.mjs +0 -116
- package/scripts/hooks/session-start-drift-check.mjs +0 -48
- package/scripts/install.sh +0 -70
- package/scripts/lib/auto-update.mjs +0 -75
- package/scripts/lib/bundle-hash.mjs +0 -137
- package/scripts/lib/hooks.mjs +0 -585
- package/scripts/lib/ledger.mjs +0 -163
- package/scripts/lib/migrate-artifacts.mjs +0 -144
- package/scripts/lib/outdated.mjs +0 -144
- package/scripts/lib/postinstall-offer.mjs +0 -83
- package/scripts/lib/principles.mjs +0 -109
- package/scripts/lib/provision-mcp.mjs +0 -16
- package/scripts/lib/resolve-plugin-root.mjs +0 -9
- package/scripts/lib/run-install.mjs +0 -500
- package/scripts/lib/run-prune.mjs +0 -94
- package/scripts/lib/run-uninstall.mjs +0 -244
- package/scripts/lib/run-update.mjs +0 -152
- package/scripts/lib/serve.mjs +0 -472
- package/scripts/lib/ups-router.mjs +0 -392
- package/scripts/postinstall.mjs +0 -101
- package/scripts/setup-enact-context.sh +0 -28
- package/scripts/version-bump.sh +0 -484
- package/web/assets/README.md +0 -111
- package/web/assets/logo-full.png +0 -0
- package/web/assets/logo-slim.png +0 -0
- package/web/assets/tokens/base.css +0 -45
- package/web/assets/tokens/colors.css +0 -248
- package/web/assets/tokens/effects.css +0 -24
- package/web/assets/tokens/fonts.css +0 -8
- package/web/assets/tokens/index.css +0 -18
- package/web/assets/tokens/spacing.css +0 -50
- package/web/index.html +0 -1188
package/dist/install.js
DELETED
|
@@ -1,697 +0,0 @@
|
|
|
1
|
-
import { cpSync, existsSync, mkdirSync, readFileSync, readdirSync, rmSync, statSync, writeFileSync } from "node:fs";
|
|
2
|
-
import { dirname, join, resolve } from "node:path";
|
|
3
|
-
import { projectAgentsDir, writeCursorHooksFile } from "./internal/agents.js";
|
|
4
|
-
import { homedir } from "node:os";
|
|
5
|
-
import { defaultCodexHome, ensureMarketplace, isPluginEnabled, readCodexConfig, removePluginConfig, resolveCodexInstallHomes, setPluginEnabled, writeCodexConfig, } from "./internal/codex.js";
|
|
6
|
-
import { manifestForPlatform } from "./create/index.js";
|
|
7
|
-
import { DEFAULT_MCP_FILENAME, DEFAULT_PATHS, PROJECTION_COMPONENT_FIELDS } from "./internal/platform.js";
|
|
8
|
-
import { checkComponentPaths, readManifestFile, validateClaudeManifest, validateCodexManifest, validateCursorManifest, } from "./validate/index.js";
|
|
9
|
-
import { defaultClaudeHome, readEnabledPlugins, readKnownMarketplaces, registerLocalMarketplace, removeClaudeMarketplaceEntry, upsertClaudeMarketplaceEntry, } from "./internal/claude.js";
|
|
10
|
-
import { defaultCursorHome } from "./internal/cursor.js";
|
|
11
|
-
import { provisionMcp } from "./provision.js";
|
|
12
|
-
function readJson(path, fallback) {
|
|
13
|
-
if (!existsSync(path))
|
|
14
|
-
return fallback;
|
|
15
|
-
return JSON.parse(readFileSync(path, "utf8"));
|
|
16
|
-
}
|
|
17
|
-
function writeJson(path, value) {
|
|
18
|
-
mkdirSync(dirname(path), { recursive: true });
|
|
19
|
-
writeFileSync(path, `${JSON.stringify(value, null, 2)}\n`, "utf8");
|
|
20
|
-
}
|
|
21
|
-
function pathFieldsFromManifest(platform, manifest) {
|
|
22
|
-
const fields = PROJECTION_COMPONENT_FIELDS[platform];
|
|
23
|
-
const results = [];
|
|
24
|
-
for (const field of fields) {
|
|
25
|
-
const value = manifest[field];
|
|
26
|
-
if (typeof value === "string" && value.trim())
|
|
27
|
-
results.push(value);
|
|
28
|
-
}
|
|
29
|
-
if (platform === "cursor") {
|
|
30
|
-
const logo = manifest.logo;
|
|
31
|
-
if (typeof logo === "string" && logo.trim())
|
|
32
|
-
results.push(logo);
|
|
33
|
-
}
|
|
34
|
-
const iface = manifest.interface;
|
|
35
|
-
if (iface && typeof iface === "object" && !Array.isArray(iface)) {
|
|
36
|
-
for (const field of ["composerIcon", "logo"]) {
|
|
37
|
-
const value = iface[field];
|
|
38
|
-
if (typeof value === "string" && value.trim())
|
|
39
|
-
results.push(value);
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
return results;
|
|
43
|
-
}
|
|
44
|
-
/**
|
|
45
|
-
* Component path candidates to COPY for a surface. Derived per-surface manifests
|
|
46
|
-
* may OMIT default-path fields (claude/cursor auto-discover from default dirs),
|
|
47
|
-
* so we cannot rely on the manifest alone to know what to copy. We therefore
|
|
48
|
-
* union the manifest's declared paths with the canonical default paths for each
|
|
49
|
-
* auto-discovered component — the on-disk-existence check downstream filters out
|
|
50
|
-
* components the bundle doesn't actually ship.
|
|
51
|
-
*/
|
|
52
|
-
function copyPathCandidates(platform, manifest) {
|
|
53
|
-
const candidates = [...pathFieldsFromManifest(platform, manifest)];
|
|
54
|
-
// Fall back to canonical defaults for auto-discovered components that the
|
|
55
|
-
// derived manifest may have stripped (claude/cursor). Only consider fields the
|
|
56
|
-
// platform actually projects; codex/enact project canonical TOML agents while
|
|
57
|
-
// claude/cursor transform them to Markdown.
|
|
58
|
-
const projected = new Set(PROJECTION_COMPONENT_FIELDS[platform]);
|
|
59
|
-
for (const field of ["skills", "agents", "hooks", "mcpServers"]) {
|
|
60
|
-
if (!projected.has(field))
|
|
61
|
-
continue;
|
|
62
|
-
if (typeof manifest[field] === "string" && manifest[field].trim())
|
|
63
|
-
continue;
|
|
64
|
-
const def = DEFAULT_PATHS[field];
|
|
65
|
-
if (def)
|
|
66
|
-
candidates.push(def);
|
|
67
|
-
}
|
|
68
|
-
return candidates;
|
|
69
|
-
}
|
|
70
|
-
function normalizedProjectionEntries(platform, manifest, platformDir) {
|
|
71
|
-
const entries = new Set([platformDir, "README.md"]);
|
|
72
|
-
for (const raw of copyPathCandidates(platform, manifest)) {
|
|
73
|
-
const cleaned = raw.replace(/^\.\//, "").replace(/\/+$/, "");
|
|
74
|
-
if (!cleaned || cleaned.startsWith("../"))
|
|
75
|
-
continue;
|
|
76
|
-
entries.add(cleaned);
|
|
77
|
-
}
|
|
78
|
-
for (const hooksValue of [manifest.hooks, DEFAULT_PATHS.hooks]) {
|
|
79
|
-
if (typeof hooksValue === "string" && hooksValue.trim()) {
|
|
80
|
-
const cleaned = hooksValue.replace(/^\.\//, "").replace(/\/+$/, "");
|
|
81
|
-
if (cleaned.endsWith("/hooks.json")) {
|
|
82
|
-
const parentDir = dirname(cleaned);
|
|
83
|
-
if (parentDir !== ".")
|
|
84
|
-
entries.add(parentDir);
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
return [...entries];
|
|
89
|
-
}
|
|
90
|
-
function cleanRel(value) {
|
|
91
|
-
if (typeof value !== "string")
|
|
92
|
-
return null;
|
|
93
|
-
const cleaned = value.replace(/^\.\//, "").replace(/\/+$/, "");
|
|
94
|
-
return cleaned && !cleaned.startsWith("../") ? cleaned : null;
|
|
95
|
-
}
|
|
96
|
-
function projectBundle(sourceRoot, targetRoot, platform, manifest, platformDir) {
|
|
97
|
-
rmSync(targetRoot, { recursive: true, force: true });
|
|
98
|
-
mkdirSync(targetRoot, { recursive: true });
|
|
99
|
-
// Resolve the agents source dir even when the derived manifest omits the field
|
|
100
|
-
// (claude/cursor auto-discover agents/ from the default location).
|
|
101
|
-
const agentsEntry = cleanRel(manifest.agents) ?? cleanRel(DEFAULT_PATHS.agents);
|
|
102
|
-
// The on-disk hooks file we project from (default path; bundles use it).
|
|
103
|
-
const hooksFileRel = (cleanRel(manifest.hooks) ?? cleanRel(DEFAULT_PATHS.hooks)) ?? "hooks/hooks.json";
|
|
104
|
-
const hooksDirRel = hooksFileRel.endsWith("/hooks.json") ? dirname(hooksFileRel) : null;
|
|
105
|
-
for (const entry of normalizedProjectionEntries(platform, manifest, platformDir)) {
|
|
106
|
-
const sourcePath = resolve(sourceRoot, entry);
|
|
107
|
-
if (!existsSync(sourcePath))
|
|
108
|
-
continue;
|
|
109
|
-
// Agents are transformed per surface (canonical .toml → .md for claude/cursor),
|
|
110
|
-
// not copied verbatim. Everything else copies as-is.
|
|
111
|
-
if (entry === agentsEntry && statSync(sourcePath).isDirectory()) {
|
|
112
|
-
projectAgentsDir(sourcePath, join(targetRoot, entry), platform);
|
|
113
|
-
continue;
|
|
114
|
-
}
|
|
115
|
-
// Cursor uses a different hooks schema (flat camelCase). Skip the raw hooks
|
|
116
|
-
// dir copy here; the projected hooks.json is written below instead.
|
|
117
|
-
if (platform === "cursor" && hooksDirRel && entry === hooksDirRel) {
|
|
118
|
-
continue;
|
|
119
|
-
}
|
|
120
|
-
cpSync(sourcePath, join(targetRoot, entry), { recursive: true, force: true });
|
|
121
|
-
}
|
|
122
|
-
if (platform === "cursor") {
|
|
123
|
-
// Project the canonical hooks.json into Cursor's flat camelCase schema,
|
|
124
|
-
// preserving any non-hooks files alongside it (e.g. hook scripts).
|
|
125
|
-
const hooksSource = resolve(sourceRoot, hooksFileRel);
|
|
126
|
-
if (existsSync(hooksSource) && hooksDirRel) {
|
|
127
|
-
const targetHooksDir = join(targetRoot, hooksDirRel);
|
|
128
|
-
const sourceHooksDir = resolve(sourceRoot, hooksDirRel);
|
|
129
|
-
// Copy sibling files (scripts) verbatim, then overwrite the hooks.json.
|
|
130
|
-
if (existsSync(sourceHooksDir) && statSync(sourceHooksDir).isDirectory()) {
|
|
131
|
-
for (const f of readdirSync(sourceHooksDir, { withFileTypes: true })) {
|
|
132
|
-
if (f.name === "hooks.json")
|
|
133
|
-
continue;
|
|
134
|
-
cpSync(join(sourceHooksDir, f.name), join(targetHooksDir, f.name), {
|
|
135
|
-
recursive: true,
|
|
136
|
-
force: true,
|
|
137
|
-
});
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
writeCursorHooksFile(hooksSource, join(targetRoot, hooksFileRel));
|
|
141
|
-
}
|
|
142
|
-
// Cursor convention: the MCP config file is `mcp.json` (no leading dot).
|
|
143
|
-
const cursorMcp = DEFAULT_MCP_FILENAME.cursor;
|
|
144
|
-
const dottedMcp = resolve(sourceRoot, ".mcp.json");
|
|
145
|
-
if (cursorMcp && existsSync(dottedMcp)) {
|
|
146
|
-
cpSync(dottedMcp, join(targetRoot, cursorMcp), { force: true });
|
|
147
|
-
rmSync(join(targetRoot, ".mcp.json"), { force: true });
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
writeJson(join(targetRoot, platformDir, "plugin.json"), manifest);
|
|
151
|
-
}
|
|
152
|
-
/**
|
|
153
|
-
* Derive a per-surface plugin manifest IN MEMORY from the bundle's canonical
|
|
154
|
-
* Enact manifest. Installs must never write a `.<platform>-plugin/` projection
|
|
155
|
-
* back into the SOURCE bundle dir — the derived manifest is handed to
|
|
156
|
-
* `projectBundle`, which writes it ONLY to the install target.
|
|
157
|
-
*
|
|
158
|
-
* Backward-compat: some legacy bundles ship a pre-derived per-surface manifest
|
|
159
|
-
* (`.codex-plugin/plugin.json`) with NO canonical `.agents/plugin.json`. In that
|
|
160
|
-
* case we fall back to reading the existing per-surface manifest from source —
|
|
161
|
-
* this is a read, not a write, so the source stays clean.
|
|
162
|
-
*/
|
|
163
|
-
function deriveTargetManifest(pluginRoot, platform) {
|
|
164
|
-
const enactManifestPath = join(pluginRoot, ".agents", "plugin.json");
|
|
165
|
-
if (existsSync(enactManifestPath)) {
|
|
166
|
-
const enact = readManifestFile(pluginRoot, "enact");
|
|
167
|
-
return manifestForPlatform(platform, enact);
|
|
168
|
-
}
|
|
169
|
-
// Legacy fallback: a per-surface-only bundle (no canonical Enact manifest).
|
|
170
|
-
const surfaceManifestPath = join(pluginRoot, `.${platform}-plugin`, "plugin.json");
|
|
171
|
-
if (existsSync(surfaceManifestPath)) {
|
|
172
|
-
return readManifestFile(pluginRoot, platform);
|
|
173
|
-
}
|
|
174
|
-
throw new Error(`Cannot derive ${platform} manifest: no canonical manifest at ${enactManifestPath} ` +
|
|
175
|
-
`and no ${platform} manifest at ${surfaceManifestPath}`);
|
|
176
|
-
}
|
|
177
|
-
function stringField(manifest, key) {
|
|
178
|
-
const value = manifest[key];
|
|
179
|
-
return typeof value === "string" && value.trim() ? value : undefined;
|
|
180
|
-
}
|
|
181
|
-
export function codexMarketplaceRoot(codexHome, marketplaceName = "enact-os-plugins") {
|
|
182
|
-
return join(codexHome, "marketplaces", marketplaceName);
|
|
183
|
-
}
|
|
184
|
-
export function codexMarketplacePath(codexHome, marketplaceName = "enact-os-plugins") {
|
|
185
|
-
return join(codexMarketplaceRoot(codexHome, marketplaceName), ".agents", "plugins", "marketplace.json");
|
|
186
|
-
}
|
|
187
|
-
export function codexMarketplacePluginPath(codexHome, marketplaceName, pluginName) {
|
|
188
|
-
return join(codexMarketplaceRoot(codexHome, marketplaceName), "plugins", pluginName);
|
|
189
|
-
}
|
|
190
|
-
export function codexInstalledPluginPath(codexHome, pluginName) {
|
|
191
|
-
return join(codexHome, "plugins", pluginName);
|
|
192
|
-
}
|
|
193
|
-
export function codexPluginCachePath(codexHome, marketplaceName, pluginName, version) {
|
|
194
|
-
return join(codexHome, "plugins", "cache", marketplaceName, pluginName, version);
|
|
195
|
-
}
|
|
196
|
-
export function codexPluginCacheRoot(codexHome, marketplaceName, pluginName) {
|
|
197
|
-
return join(codexHome, "plugins", "cache", marketplaceName, pluginName);
|
|
198
|
-
}
|
|
199
|
-
export function readCodexPluginManifest(pluginRoot) {
|
|
200
|
-
const manifestPath = join(pluginRoot, ".codex-plugin", "plugin.json");
|
|
201
|
-
return readJson(manifestPath, null);
|
|
202
|
-
}
|
|
203
|
-
export function claudeMarketplaceDir(claudeHome, marketplaceName = "enact-os-plugins") {
|
|
204
|
-
return join(claudeHome, "plugins", "marketplaces", marketplaceName);
|
|
205
|
-
}
|
|
206
|
-
export function claudeInstalledPluginPath(claudeHome, marketplaceName, pluginName) {
|
|
207
|
-
return join(claudeMarketplaceDir(claudeHome, marketplaceName), "plugins", pluginName);
|
|
208
|
-
}
|
|
209
|
-
export function claudeKnownMarketplacesPath(claudeHome) {
|
|
210
|
-
return join(claudeHome, "plugins", "known_marketplaces.json");
|
|
211
|
-
}
|
|
212
|
-
export function readClaudePluginManifest(pluginRoot) {
|
|
213
|
-
const manifestPath = join(pluginRoot, ".claude-plugin", "plugin.json");
|
|
214
|
-
return readJson(manifestPath, null);
|
|
215
|
-
}
|
|
216
|
-
function marketplaceDisplayName(marketplaceName) {
|
|
217
|
-
return marketplaceName
|
|
218
|
-
.split("-")
|
|
219
|
-
.filter(Boolean)
|
|
220
|
-
.map((part) => part[0]?.toUpperCase() + part.slice(1))
|
|
221
|
-
.join(" ");
|
|
222
|
-
}
|
|
223
|
-
function categoryFrom(manifest) {
|
|
224
|
-
const iface = manifest.interface;
|
|
225
|
-
if (iface && typeof iface === "object" && !Array.isArray(iface)) {
|
|
226
|
-
const category = iface.category;
|
|
227
|
-
if (typeof category === "string" && category.trim())
|
|
228
|
-
return category;
|
|
229
|
-
}
|
|
230
|
-
return "Developer Tools";
|
|
231
|
-
}
|
|
232
|
-
function manifestForCodexInstall(manifest) {
|
|
233
|
-
return manifest;
|
|
234
|
-
}
|
|
235
|
-
function upsertMarketplaceEntry(codexHome, marketplaceName, manifest, pluginName) {
|
|
236
|
-
const path = codexMarketplacePath(codexHome, marketplaceName);
|
|
237
|
-
const current = readJson(path, {
|
|
238
|
-
name: marketplaceName,
|
|
239
|
-
interface: { displayName: marketplaceDisplayName(marketplaceName) },
|
|
240
|
-
plugins: [],
|
|
241
|
-
});
|
|
242
|
-
const entry = {
|
|
243
|
-
name: pluginName,
|
|
244
|
-
source: { source: "local", path: `./plugins/${pluginName}` },
|
|
245
|
-
policy: { installation: "AVAILABLE", authentication: "ON_INSTALL" },
|
|
246
|
-
category: categoryFrom(manifest),
|
|
247
|
-
};
|
|
248
|
-
const plugins = (current.plugins ?? []).filter((plugin) => plugin.name !== pluginName);
|
|
249
|
-
plugins.push(entry);
|
|
250
|
-
writeJson(path, {
|
|
251
|
-
name: current.name || marketplaceName,
|
|
252
|
-
interface: {
|
|
253
|
-
displayName: current.interface?.displayName || marketplaceDisplayName(marketplaceName),
|
|
254
|
-
},
|
|
255
|
-
plugins,
|
|
256
|
-
});
|
|
257
|
-
return path;
|
|
258
|
-
}
|
|
259
|
-
export function installCodexPluginBundle(options) {
|
|
260
|
-
const codexHome = options.codexHome ?? defaultCodexHome();
|
|
261
|
-
const marketplaceName = options.marketplaceName ?? "enact-os-plugins";
|
|
262
|
-
// Per-surface manifests are derived IN MEMORY; install never writes to source.
|
|
263
|
-
const codexManifest = deriveTargetManifest(options.pluginRoot, "codex");
|
|
264
|
-
const validation = validateCodexManifest(codexManifest);
|
|
265
|
-
if (!validation.ok) {
|
|
266
|
-
throw new Error(`Invalid Codex plugin manifest:\n${validation.errors.join("\n")}`);
|
|
267
|
-
}
|
|
268
|
-
const componentIssues = checkComponentPaths(options.pluginRoot, codexManifest)
|
|
269
|
-
.map((issue) => `codex ${issue}`);
|
|
270
|
-
if (componentIssues.length > 0) {
|
|
271
|
-
throw new Error(`Plugin component paths are not installable:\n${componentIssues.join("\n")}`);
|
|
272
|
-
}
|
|
273
|
-
const name = stringField(codexManifest, "name");
|
|
274
|
-
if (!name) {
|
|
275
|
-
throw new Error("Codex plugin manifest is missing name");
|
|
276
|
-
}
|
|
277
|
-
const installManifest = manifestForCodexInstall(codexManifest);
|
|
278
|
-
const version = stringField(codexManifest, "version") ?? "0.0.0";
|
|
279
|
-
const pluginConfigKey = `${name}@${marketplaceName}`;
|
|
280
|
-
const config = readCodexConfig(codexHome);
|
|
281
|
-
ensureMarketplace(config, marketplaceName, {
|
|
282
|
-
source: codexMarketplaceRoot(codexHome, marketplaceName),
|
|
283
|
-
source_type: "local",
|
|
284
|
-
});
|
|
285
|
-
if (options.enable !== false) {
|
|
286
|
-
setPluginEnabled(config, pluginConfigKey, true);
|
|
287
|
-
}
|
|
288
|
-
const configPath = writeCodexConfig(codexHome, config);
|
|
289
|
-
const mktPath = upsertMarketplaceEntry(codexHome, marketplaceName, installManifest, name);
|
|
290
|
-
const mktPluginPath = codexMarketplacePluginPath(codexHome, marketplaceName, name);
|
|
291
|
-
const installedPath = codexInstalledPluginPath(codexHome, name);
|
|
292
|
-
const cachePath = codexPluginCachePath(codexHome, marketplaceName, name, version);
|
|
293
|
-
projectBundle(options.pluginRoot, mktPluginPath, "codex", installManifest, ".codex-plugin");
|
|
294
|
-
projectBundle(options.pluginRoot, installedPath, "codex", installManifest, ".codex-plugin");
|
|
295
|
-
projectBundle(options.pluginRoot, cachePath, "codex", installManifest, ".codex-plugin");
|
|
296
|
-
return {
|
|
297
|
-
name,
|
|
298
|
-
version,
|
|
299
|
-
marketplaceName,
|
|
300
|
-
pluginConfigKey,
|
|
301
|
-
configPath,
|
|
302
|
-
marketplacePath: mktPath,
|
|
303
|
-
marketplacePluginPath: mktPluginPath,
|
|
304
|
-
installedPluginPath: installedPath,
|
|
305
|
-
cachePluginPath: cachePath,
|
|
306
|
-
refreshedPaths: [mktPluginPath, installedPath, cachePath],
|
|
307
|
-
syncResults: [],
|
|
308
|
-
};
|
|
309
|
-
}
|
|
310
|
-
export function installPluginBundle(options) {
|
|
311
|
-
const codexHomes = resolveCodexInstallHomes({
|
|
312
|
-
cwd: options.cwd ?? options.pluginRoot,
|
|
313
|
-
codexHome: options.codexHome,
|
|
314
|
-
});
|
|
315
|
-
const results = codexHomes.map((codexHome) => installCodexPluginBundle({
|
|
316
|
-
...options,
|
|
317
|
-
codexHome,
|
|
318
|
-
}));
|
|
319
|
-
return { codexHomes, results };
|
|
320
|
-
}
|
|
321
|
-
export function installCodexPluginBundleWithProvision(options) {
|
|
322
|
-
const result = installCodexPluginBundle(options);
|
|
323
|
-
const provision = provisionMcp(options.pluginRoot, {
|
|
324
|
-
noProvision: options.noProvision,
|
|
325
|
-
exec: options.provisionExec,
|
|
326
|
-
});
|
|
327
|
-
return {
|
|
328
|
-
...result,
|
|
329
|
-
provision,
|
|
330
|
-
};
|
|
331
|
-
}
|
|
332
|
-
export function installPluginBundleWithProvision(options) {
|
|
333
|
-
const result = installPluginBundle(options);
|
|
334
|
-
const provision = provisionMcp(options.pluginRoot, {
|
|
335
|
-
noProvision: options.noProvision,
|
|
336
|
-
exec: options.provisionExec,
|
|
337
|
-
});
|
|
338
|
-
return {
|
|
339
|
-
...result,
|
|
340
|
-
provision,
|
|
341
|
-
};
|
|
342
|
-
}
|
|
343
|
-
export function codexPluginStatus(codexHome, pluginName, marketplaceName = "enact-os-plugins") {
|
|
344
|
-
const pluginConfigKey = `${pluginName}@${marketplaceName}`;
|
|
345
|
-
const installedPath = codexInstalledPluginPath(codexHome, pluginName);
|
|
346
|
-
const cacheRoot = codexPluginCacheRoot(codexHome, marketplaceName, pluginName);
|
|
347
|
-
const config = readCodexConfig(codexHome);
|
|
348
|
-
const cachedVersions = existsSync(cacheRoot)
|
|
349
|
-
? readdirSync(cacheRoot, { withFileTypes: true }).filter((entry) => entry.isDirectory()).map((entry) => entry.name).sort()
|
|
350
|
-
: [];
|
|
351
|
-
const manifest = existsSync(installedPath) ? readCodexPluginManifest(installedPath) : null;
|
|
352
|
-
return {
|
|
353
|
-
name: pluginName,
|
|
354
|
-
enabled: isPluginEnabled(config, pluginConfigKey),
|
|
355
|
-
installed: existsSync(installedPath),
|
|
356
|
-
cachedVersions,
|
|
357
|
-
manifest,
|
|
358
|
-
pluginConfigKey,
|
|
359
|
-
marketplaceName,
|
|
360
|
-
installedPluginPath: installedPath,
|
|
361
|
-
marketplacePluginPath: codexMarketplacePluginPath(codexHome, marketplaceName, pluginName),
|
|
362
|
-
cacheRoot,
|
|
363
|
-
};
|
|
364
|
-
}
|
|
365
|
-
export function setInstalledCodexPluginEnabled(codexHome, pluginName, enabled, marketplaceName = "enact-os-plugins") {
|
|
366
|
-
const config = readCodexConfig(codexHome);
|
|
367
|
-
setPluginEnabled(config, `${pluginName}@${marketplaceName}`, enabled);
|
|
368
|
-
writeCodexConfig(codexHome, config);
|
|
369
|
-
return codexPluginStatus(codexHome, pluginName, marketplaceName);
|
|
370
|
-
}
|
|
371
|
-
export function runCodexPluginsDoctor(codexHome = defaultCodexHome(), marketplaceName = "enact-os-plugins") {
|
|
372
|
-
const config = readCodexConfig(codexHome);
|
|
373
|
-
const marketplace = readJson(codexMarketplacePath(codexHome, marketplaceName), {
|
|
374
|
-
name: marketplaceName,
|
|
375
|
-
interface: { displayName: marketplaceDisplayName(marketplaceName) },
|
|
376
|
-
plugins: [],
|
|
377
|
-
});
|
|
378
|
-
const installedPluginsDir = join(codexMarketplaceRoot(codexHome, marketplaceName), "plugins");
|
|
379
|
-
const installedPlugins = existsSync(installedPluginsDir)
|
|
380
|
-
? readdirSync(installedPluginsDir, { withFileTypes: true }).filter((entry) => entry.isDirectory()).map((entry) => entry.name)
|
|
381
|
-
: [];
|
|
382
|
-
const warnings = [];
|
|
383
|
-
for (const entry of marketplace.plugins) {
|
|
384
|
-
if (!installedPlugins.includes(entry.name) && isPluginEnabled(config, `${entry.name}@${marketplaceName}`)) {
|
|
385
|
-
warnings.push(`plugin ${entry.name} enabled in config but not installed locally`);
|
|
386
|
-
}
|
|
387
|
-
}
|
|
388
|
-
return {
|
|
389
|
-
configPlugins: Object.keys(config.plugins ?? {}).sort(),
|
|
390
|
-
marketplaceConfigured: Boolean(config.marketplaces?.[marketplaceName]),
|
|
391
|
-
marketplaceRoot: codexMarketplaceRoot(codexHome, marketplaceName),
|
|
392
|
-
marketplacePath: codexMarketplacePath(codexHome, marketplaceName),
|
|
393
|
-
marketplacePlugins: marketplace.plugins.map((plugin) => plugin.name).sort(),
|
|
394
|
-
installedPlugins: installedPlugins.sort(),
|
|
395
|
-
warnings,
|
|
396
|
-
};
|
|
397
|
-
}
|
|
398
|
-
export function installClaudePluginBundle(options) {
|
|
399
|
-
const claudeHome = options.claudeHome ?? defaultClaudeHome();
|
|
400
|
-
const marketplaceName = options.marketplaceName ?? "enact-os-plugins";
|
|
401
|
-
// Per-surface manifest derived IN MEMORY; install never writes to source.
|
|
402
|
-
const claudeManifest = deriveTargetManifest(options.pluginRoot, "claude");
|
|
403
|
-
const validation = validateClaudeManifest(claudeManifest);
|
|
404
|
-
if (!validation.ok) {
|
|
405
|
-
throw new Error(`Invalid Claude plugin manifest:\n${validation.errors.join("\n")}`);
|
|
406
|
-
}
|
|
407
|
-
const name = stringField(claudeManifest, "name");
|
|
408
|
-
if (!name) {
|
|
409
|
-
throw new Error("Claude plugin manifest is missing name");
|
|
410
|
-
}
|
|
411
|
-
const version = stringField(claudeManifest, "version") ?? "0.0.0";
|
|
412
|
-
const marketplaceDir = join(claudeHome, "plugins", "marketplaces", marketplaceName);
|
|
413
|
-
const installedPath = join(marketplaceDir, "plugins", name);
|
|
414
|
-
projectBundle(options.pluginRoot, installedPath, "claude", claudeManifest, ".claude-plugin");
|
|
415
|
-
// Claude discovers a directory marketplace's plugins from
|
|
416
|
-
// <marketplaceDir>/.claude-plugin/marketplace.json. Add/refresh this plugin's
|
|
417
|
-
// entry (mirrors the codex marketplace.json maintenance).
|
|
418
|
-
upsertClaudeMarketplaceEntry(marketplaceDir, marketplaceName, name, stringField(claudeManifest, "description"));
|
|
419
|
-
registerLocalMarketplace(claudeHome, marketplaceName, marketplaceDir);
|
|
420
|
-
return {
|
|
421
|
-
name,
|
|
422
|
-
version,
|
|
423
|
-
marketplaceName,
|
|
424
|
-
marketplaceDir,
|
|
425
|
-
installedPluginPath: installedPath,
|
|
426
|
-
refreshedPaths: [installedPath],
|
|
427
|
-
syncResults: [],
|
|
428
|
-
};
|
|
429
|
-
}
|
|
430
|
-
export function installClaudePluginBundleWithProvision(options) {
|
|
431
|
-
const result = installClaudePluginBundle(options);
|
|
432
|
-
const provision = provisionMcp(options.pluginRoot, {
|
|
433
|
-
noProvision: options.noProvision,
|
|
434
|
-
exec: options.provisionExec,
|
|
435
|
-
});
|
|
436
|
-
return {
|
|
437
|
-
...result,
|
|
438
|
-
provision,
|
|
439
|
-
};
|
|
440
|
-
}
|
|
441
|
-
export function claudePluginStatus(claudeHome, pluginName, marketplaceName = "enact-os-plugins") {
|
|
442
|
-
const marketplaceDir = claudeMarketplaceDir(claudeHome, marketplaceName);
|
|
443
|
-
const knownMarketplaces = readKnownMarketplaces(claudeHome);
|
|
444
|
-
const installedPath = claudeInstalledPluginPath(claudeHome, marketplaceName, pluginName);
|
|
445
|
-
const manifest = existsSync(installedPath) ? readClaudePluginManifest(installedPath) : null;
|
|
446
|
-
const enabledPlugins = readEnabledPlugins(claudeHome);
|
|
447
|
-
return {
|
|
448
|
-
name: pluginName,
|
|
449
|
-
installed: existsSync(installedPath),
|
|
450
|
-
enabled: Boolean(enabledPlugins[`${pluginName}@${marketplaceName}`]),
|
|
451
|
-
manifest,
|
|
452
|
-
marketplaceName,
|
|
453
|
-
marketplaceDir,
|
|
454
|
-
installedPluginPath: installedPath,
|
|
455
|
-
knownMarketplaceRegistered: Boolean(knownMarketplaces[marketplaceName]),
|
|
456
|
-
knownMarketplacesPath: claudeKnownMarketplacesPath(claudeHome),
|
|
457
|
-
};
|
|
458
|
-
}
|
|
459
|
-
export function runClaudePluginsDoctor(claudeHome = defaultClaudeHome(), marketplaceName = "enact-os-plugins") {
|
|
460
|
-
const marketplaceDir = claudeMarketplaceDir(claudeHome, marketplaceName);
|
|
461
|
-
const knownMarketplaces = readKnownMarketplaces(claudeHome);
|
|
462
|
-
const enabledPlugins = readEnabledPlugins(claudeHome);
|
|
463
|
-
const installedPluginsDir = join(marketplaceDir, "plugins");
|
|
464
|
-
const installedPlugins = existsSync(installedPluginsDir)
|
|
465
|
-
? readdirSync(installedPluginsDir, { withFileTypes: true })
|
|
466
|
-
.filter((entry) => entry.isDirectory())
|
|
467
|
-
.map((entry) => entry.name)
|
|
468
|
-
: [];
|
|
469
|
-
const warnings = [];
|
|
470
|
-
if (!knownMarketplaces[marketplaceName] && installedPlugins.length > 0) {
|
|
471
|
-
warnings.push(`marketplace ${marketplaceName} has installed plugins but is not registered in known_marketplaces.json`);
|
|
472
|
-
}
|
|
473
|
-
if (knownMarketplaces[marketplaceName] && !existsSync(marketplaceDir)) {
|
|
474
|
-
warnings.push(`marketplace ${marketplaceName} registered in known_marketplaces.json but install directory is missing`);
|
|
475
|
-
}
|
|
476
|
-
return {
|
|
477
|
-
marketplaceName,
|
|
478
|
-
marketplaceDir,
|
|
479
|
-
knownMarketplacesPath: claudeKnownMarketplacesPath(claudeHome),
|
|
480
|
-
marketplaceRegistered: Boolean(knownMarketplaces[marketplaceName]),
|
|
481
|
-
marketplacePlugins: installedPlugins.slice().sort(),
|
|
482
|
-
installedPlugins: installedPlugins.sort(),
|
|
483
|
-
enabledPlugins: Object.entries(enabledPlugins)
|
|
484
|
-
.filter(([pluginId, enabled]) => enabled && pluginId.endsWith(`@${marketplaceName}`))
|
|
485
|
-
.map(([pluginId]) => pluginId.slice(0, -(`@${marketplaceName}`).length))
|
|
486
|
-
.sort(),
|
|
487
|
-
warnings,
|
|
488
|
-
};
|
|
489
|
-
}
|
|
490
|
-
export function installCursorPluginBundle(options) {
|
|
491
|
-
const cursorHome = options.cursorHome ?? defaultCursorHome();
|
|
492
|
-
// Per-surface manifest derived IN MEMORY; install never writes to source.
|
|
493
|
-
const cursorManifest = deriveTargetManifest(options.pluginRoot, "cursor");
|
|
494
|
-
const validation = validateCursorManifest(cursorManifest);
|
|
495
|
-
if (!validation.ok) {
|
|
496
|
-
throw new Error(`Invalid Cursor plugin manifest:\n${validation.errors.join("\n")}`);
|
|
497
|
-
}
|
|
498
|
-
const name = stringField(cursorManifest, "name");
|
|
499
|
-
if (!name) {
|
|
500
|
-
throw new Error("Cursor plugin manifest is missing name");
|
|
501
|
-
}
|
|
502
|
-
const version = stringField(cursorManifest, "version") ?? "0.0.0";
|
|
503
|
-
const installedPath = join(cursorHome, "plugins", "local", name);
|
|
504
|
-
projectBundle(options.pluginRoot, installedPath, "cursor", cursorManifest, ".cursor-plugin");
|
|
505
|
-
return {
|
|
506
|
-
name,
|
|
507
|
-
version,
|
|
508
|
-
installedPluginPath: installedPath,
|
|
509
|
-
refreshedPaths: [installedPath],
|
|
510
|
-
syncResults: [],
|
|
511
|
-
};
|
|
512
|
-
}
|
|
513
|
-
/**
|
|
514
|
-
* Guard: ensure the target path stays within the expected base directory
|
|
515
|
-
* to prevent accidental deletion outside a known home.
|
|
516
|
-
*/
|
|
517
|
-
function assertWithinBase(base, target) {
|
|
518
|
-
const resolvedBase = resolve(base);
|
|
519
|
-
const resolvedTarget = resolve(target);
|
|
520
|
-
if (!resolvedTarget.startsWith(resolvedBase + "/") && resolvedTarget !== resolvedBase) {
|
|
521
|
-
throw new Error(`Safety check failed: resolved path ${resolvedTarget} is not within base ${resolvedBase}`);
|
|
522
|
-
}
|
|
523
|
-
}
|
|
524
|
-
/**
|
|
525
|
-
* Remove a marketplace.json entry for `pluginName`.
|
|
526
|
-
* If the file doesn't exist or the entry isn't there, this is a no-op.
|
|
527
|
-
* The marketplace registration entry (top-level name/interface fields) is preserved.
|
|
528
|
-
* Other plugin entries are preserved.
|
|
529
|
-
*/
|
|
530
|
-
function removeMarketplaceEntry(codexHome, marketplaceName, pluginName) {
|
|
531
|
-
const path = codexMarketplacePath(codexHome, marketplaceName);
|
|
532
|
-
if (!existsSync(path))
|
|
533
|
-
return;
|
|
534
|
-
const current = readJson(path, { name: marketplaceName, plugins: [] });
|
|
535
|
-
const filtered = (current.plugins ?? []).filter((p) => p.name !== pluginName);
|
|
536
|
-
writeJson(path, {
|
|
537
|
-
name: current.name || marketplaceName,
|
|
538
|
-
...(current.interface ? { interface: current.interface } : {}),
|
|
539
|
-
plugins: filtered,
|
|
540
|
-
});
|
|
541
|
-
}
|
|
542
|
-
/**
|
|
543
|
-
* Fully uninstall a Codex/Enact plugin from the given home, reversing installCodexPluginBundle:
|
|
544
|
-
* - removes <home>/plugins/<name>/ (installed dir)
|
|
545
|
-
* - removes <home>/marketplaces/<marketplace>/plugins/<name>/ (marketplace plugin dir)
|
|
546
|
-
* - removes <home>/plugins/cache/<marketplace>/<name>/ (cache dir)
|
|
547
|
-
* - removes the plugin's entry from marketplace.json (preserves other entries + marketplace reg)
|
|
548
|
-
* - removes [plugins."<name>@<marketplace>"] from config.toml (preserves [marketplaces.*] etc.)
|
|
549
|
-
*/
|
|
550
|
-
export function uninstallCodexPluginBundle(name, options = {}) {
|
|
551
|
-
const codexHome = options.codexHome ?? defaultCodexHome();
|
|
552
|
-
const mktName = options.marketplaceName ?? "enact-os-plugins";
|
|
553
|
-
const pluginConfigKey = `${name}@${mktName}`;
|
|
554
|
-
const installedPath = codexInstalledPluginPath(codexHome, name);
|
|
555
|
-
const mktPluginPath = codexMarketplacePluginPath(codexHome, mktName, name);
|
|
556
|
-
// Cache dir is versioned; remove the entire <cache>/<marketplace>/<name>/ subtree
|
|
557
|
-
const cacheDirForPlugin = join(codexHome, "plugins", "cache", mktName, name);
|
|
558
|
-
const noop = !existsSync(installedPath) &&
|
|
559
|
-
!existsSync(mktPluginPath) &&
|
|
560
|
-
!existsSync(cacheDirForPlugin);
|
|
561
|
-
const removedPaths = [];
|
|
562
|
-
if (existsSync(installedPath)) {
|
|
563
|
-
assertWithinBase(join(codexHome, "plugins"), installedPath);
|
|
564
|
-
rmSync(installedPath, { recursive: true, force: true });
|
|
565
|
-
removedPaths.push(installedPath);
|
|
566
|
-
}
|
|
567
|
-
if (existsSync(mktPluginPath)) {
|
|
568
|
-
assertWithinBase(join(codexHome, "marketplaces"), mktPluginPath);
|
|
569
|
-
rmSync(mktPluginPath, { recursive: true, force: true });
|
|
570
|
-
removedPaths.push(mktPluginPath);
|
|
571
|
-
}
|
|
572
|
-
if (existsSync(cacheDirForPlugin)) {
|
|
573
|
-
assertWithinBase(join(codexHome, "plugins", "cache"), cacheDirForPlugin);
|
|
574
|
-
rmSync(cacheDirForPlugin, { recursive: true, force: true });
|
|
575
|
-
removedPaths.push(cacheDirForPlugin);
|
|
576
|
-
}
|
|
577
|
-
// Remove plugin entry from marketplace.json (leave file + other entries intact)
|
|
578
|
-
removeMarketplaceEntry(codexHome, mktName, name);
|
|
579
|
-
// Remove [plugins."<name>@<marketplace>"] from config.toml (leave marketplaces.* intact)
|
|
580
|
-
const config = readCodexConfig(codexHome);
|
|
581
|
-
removePluginConfig(config, pluginConfigKey);
|
|
582
|
-
if (existsSync(join(codexHome, "config.toml"))) {
|
|
583
|
-
writeCodexConfig(codexHome, config);
|
|
584
|
-
}
|
|
585
|
-
return { name, marketplaceName: mktName, removedPaths, noop };
|
|
586
|
-
}
|
|
587
|
-
/**
|
|
588
|
-
* Fully uninstall a Claude plugin, reversing installClaudePluginBundle:
|
|
589
|
-
* - removes <claudeHome>/plugins/marketplaces/<marketplace>/plugins/<name>/
|
|
590
|
-
* Note: the marketplace registration in known_marketplaces.json is LEFT intact
|
|
591
|
-
* (the marketplace itself persists even after its last plugin is removed).
|
|
592
|
-
*/
|
|
593
|
-
export function uninstallClaudePluginBundle(name, options = {}) {
|
|
594
|
-
const claudeHome = options.claudeHome ?? defaultClaudeHome();
|
|
595
|
-
const mktName = options.marketplaceName ?? "enact-os-plugins";
|
|
596
|
-
const marketplaceDir = join(claudeHome, "plugins", "marketplaces", mktName);
|
|
597
|
-
const installedPath = join(marketplaceDir, "plugins", name);
|
|
598
|
-
const noop = !existsSync(installedPath);
|
|
599
|
-
const removedPaths = [];
|
|
600
|
-
if (existsSync(installedPath)) {
|
|
601
|
-
assertWithinBase(marketplaceDir, installedPath);
|
|
602
|
-
rmSync(installedPath, { recursive: true, force: true });
|
|
603
|
-
removedPaths.push(installedPath);
|
|
604
|
-
}
|
|
605
|
-
// Remove this plugin's entry from the marketplace.json (leave the file, the
|
|
606
|
-
// marketplace registration, and other plugin entries intact).
|
|
607
|
-
removeClaudeMarketplaceEntry(marketplaceDir, mktName, name);
|
|
608
|
-
return { name, removedPaths, noop };
|
|
609
|
-
}
|
|
610
|
-
/**
|
|
611
|
-
* Fully uninstall a Cursor plugin, reversing installCursorPluginBundle:
|
|
612
|
-
* - removes <cursorHome>/plugins/local/<name>/
|
|
613
|
-
*/
|
|
614
|
-
export function uninstallCursorPluginBundle(name, options = {}) {
|
|
615
|
-
const cursorHome = options.cursorHome ?? defaultCursorHome();
|
|
616
|
-
const installedPath = join(cursorHome, "plugins", "local", name);
|
|
617
|
-
const noop = !existsSync(installedPath);
|
|
618
|
-
const removedPaths = [];
|
|
619
|
-
if (existsSync(installedPath)) {
|
|
620
|
-
assertWithinBase(join(cursorHome, "plugins", "local"), installedPath);
|
|
621
|
-
rmSync(installedPath, { recursive: true, force: true });
|
|
622
|
-
removedPaths.push(installedPath);
|
|
623
|
-
}
|
|
624
|
-
return { name, removedPaths, noop };
|
|
625
|
-
}
|
|
626
|
-
/**
|
|
627
|
-
* Default global shared home base. The convention is that skills live at
|
|
628
|
-
* `~/.agents/skills/<plugin>/`, so this returns `homedir()` and the install
|
|
629
|
-
* function appends `.agents/skills/<name>`.
|
|
630
|
-
*
|
|
631
|
-
* Pass an explicit `sharedHome` to override (useful in tests or local scope).
|
|
632
|
-
*/
|
|
633
|
-
export function defaultSharedHome() {
|
|
634
|
-
return homedir();
|
|
635
|
-
}
|
|
636
|
-
/**
|
|
637
|
-
* Install the bundle's skills tree into <sharedHome>/.agents/skills/<plugin>/.
|
|
638
|
-
* Does NOT write a marketplace entry, config.toml, or any platform-specific
|
|
639
|
-
* manifest — this is a pure host-neutral skills drop that any host reading
|
|
640
|
-
* `.agents/skills/` (Codex, Cursor, Gemini, etc.) can pick up.
|
|
641
|
-
*/
|
|
642
|
-
export function installSharedPluginBundle(options) {
|
|
643
|
-
const sharedHome = options.sharedHome ?? defaultSharedHome();
|
|
644
|
-
// Read the enact manifest for name/version; fall back to codex if no enact manifest.
|
|
645
|
-
const enactManifestPath = join(options.pluginRoot, ".agents", "plugin.json");
|
|
646
|
-
let manifest;
|
|
647
|
-
if (existsSync(enactManifestPath)) {
|
|
648
|
-
manifest = readManifestFile(options.pluginRoot, "enact");
|
|
649
|
-
}
|
|
650
|
-
else {
|
|
651
|
-
manifest = readManifestFile(options.pluginRoot, "codex");
|
|
652
|
-
}
|
|
653
|
-
const name = stringField(manifest, "name");
|
|
654
|
-
if (!name) {
|
|
655
|
-
throw new Error("Plugin manifest is missing name");
|
|
656
|
-
}
|
|
657
|
-
const version = stringField(manifest, "version") ?? "0.0.0";
|
|
658
|
-
// Resolve the skills source path from the manifest
|
|
659
|
-
const rawSkills = stringField(manifest, "skills");
|
|
660
|
-
if (!rawSkills) {
|
|
661
|
-
throw new Error(`Plugin manifest for '${name}' has no 'skills' field — nothing to install for shared target`);
|
|
662
|
-
}
|
|
663
|
-
const cleanedSkills = rawSkills.replace(/^\.\//, "").replace(/\/+$/, "");
|
|
664
|
-
const skillsSource = resolve(options.pluginRoot, cleanedSkills);
|
|
665
|
-
// shared is a skills-only surface: a missing skills source is misuse.
|
|
666
|
-
// Fail loudly before touching the target rather than producing an empty dir.
|
|
667
|
-
if (!existsSync(skillsSource)) {
|
|
668
|
-
throw new Error(`Cannot install shared bundle "${name}": skills source not found at ${skillsSource}`);
|
|
669
|
-
}
|
|
670
|
-
// Target: <sharedHome>/.agents/skills/<name>/
|
|
671
|
-
const installedSkillsPath = join(sharedHome, ".agents", "skills", name);
|
|
672
|
-
rmSync(installedSkillsPath, { recursive: true, force: true });
|
|
673
|
-
mkdirSync(installedSkillsPath, { recursive: true });
|
|
674
|
-
cpSync(skillsSource, installedSkillsPath, { recursive: true, force: true });
|
|
675
|
-
return {
|
|
676
|
-
name,
|
|
677
|
-
version,
|
|
678
|
-
installedSkillsPath,
|
|
679
|
-
};
|
|
680
|
-
}
|
|
681
|
-
/**
|
|
682
|
-
* Uninstall a shared plugin by removing its skills directory.
|
|
683
|
-
* Reverses installSharedPluginBundle.
|
|
684
|
-
*/
|
|
685
|
-
export function uninstallSharedPluginBundle(name, options = {}) {
|
|
686
|
-
const sharedHome = options.sharedHome ?? defaultSharedHome();
|
|
687
|
-
const installedSkillsPath = join(sharedHome, ".agents", "skills", name);
|
|
688
|
-
const noop = !existsSync(installedSkillsPath);
|
|
689
|
-
const removedPaths = [];
|
|
690
|
-
if (existsSync(installedSkillsPath)) {
|
|
691
|
-
assertWithinBase(join(sharedHome, ".agents", "skills"), installedSkillsPath);
|
|
692
|
-
rmSync(installedSkillsPath, { recursive: true, force: true });
|
|
693
|
-
removedPaths.push(installedSkillsPath);
|
|
694
|
-
}
|
|
695
|
-
return { name, installedSkillsPath, removedPaths, noop };
|
|
696
|
-
}
|
|
697
|
-
//# sourceMappingURL=install.js.map
|