@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/scripts/check-hooks.mjs
DELETED
|
@@ -1,174 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
/**
|
|
3
|
-
* Repo guard: validate every plugin's hooks before they ship.
|
|
4
|
-
*
|
|
5
|
-
* Born from real breakage: a bundle shipped hook entries for a deleted
|
|
6
|
-
* CLI (module-not-found at runtime), and an npm package omitted `extensions/`
|
|
7
|
-
* from its files whitelist so its hook command could never load. Both passed
|
|
8
|
-
* every static check yet failed the moment Claude Code fired the hook.
|
|
9
|
-
* plugin-dev meanwhile
|
|
10
|
-
* declared a `hooks` component whose hooks.json was `{ "hooks": {} }` — a
|
|
11
|
-
* component that installs nothing.
|
|
12
|
-
*
|
|
13
|
-
* Two passes:
|
|
14
|
-
* STATIC (always, no binaries): every plugin that declares a `hooks` manifest
|
|
15
|
-
* field must have a hooks file that is valid JSON, has a NON-EMPTY `hooks`
|
|
16
|
-
* object, and whose every entry is a well-formed `command` hook.
|
|
17
|
-
* SMOKE (--smoke, best-effort): for each distinct hook command whose binary
|
|
18
|
-
* resolves on PATH, actually run it with a synthetic payload in an isolated
|
|
19
|
-
* HOME/TMPDIR and fail if it crashes on module resolution (the exact class
|
|
20
|
-
* of bug above). Binaries that aren't installed are skipped, so this stays
|
|
21
|
-
* green in CI where the plugin CLIs are absent.
|
|
22
|
-
*
|
|
23
|
-
* Run via `npm run check:hooks` (static) or `npm run check:hooks:smoke`.
|
|
24
|
-
*/
|
|
25
|
-
import { readFileSync, existsSync, readdirSync, statSync, mkdtempSync, rmSync } from "node:fs";
|
|
26
|
-
import { join, dirname, resolve } from "node:path";
|
|
27
|
-
import { fileURLToPath } from "node:url";
|
|
28
|
-
import { tmpdir } from "node:os";
|
|
29
|
-
import { spawnSync, execSync } from "node:child_process";
|
|
30
|
-
|
|
31
|
-
const ROOT = join(dirname(fileURLToPath(import.meta.url)), "..");
|
|
32
|
-
const EXT = join(ROOT, "extensions");
|
|
33
|
-
const SMOKE = process.argv.includes("--smoke");
|
|
34
|
-
|
|
35
|
-
const errors = [];
|
|
36
|
-
const warnings = [];
|
|
37
|
-
const notes = [];
|
|
38
|
-
const err = (p, m) => errors.push(`[ERROR] ${p}: ${m}`);
|
|
39
|
-
const warn = (p, m) => warnings.push(`[warn] ${p}: ${m}`);
|
|
40
|
-
const note = (m) => notes.push(`[note] ${m}`);
|
|
41
|
-
|
|
42
|
-
function isDir(p) {
|
|
43
|
-
try { return statSync(p).isDirectory(); } catch { return false; }
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
// Module-resolution / load crash signatures — the failure class this guard exists for.
|
|
47
|
-
const CRASH = [
|
|
48
|
-
"Cannot find module",
|
|
49
|
-
"Cannot find package",
|
|
50
|
-
"ERR_MODULE_NOT_FOUND",
|
|
51
|
-
"MODULE_NOT_FOUND",
|
|
52
|
-
"ERR_REQUIRE_ESM",
|
|
53
|
-
"ERR_PACKAGE_PATH_NOT_EXPORTED",
|
|
54
|
-
];
|
|
55
|
-
|
|
56
|
-
function onPath(bin) {
|
|
57
|
-
try { execSync(`command -v ${bin}`, { stdio: "ignore", shell: "/bin/sh" }); return true; }
|
|
58
|
-
catch { return false; }
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
// Walk a hooks.json object, yielding { event, command } for every command entry.
|
|
62
|
-
function* commandEntries(hooks, id) {
|
|
63
|
-
for (const [event, groups] of Object.entries(hooks)) {
|
|
64
|
-
if (!Array.isArray(groups)) { err(id, `hooks.${event} is not an array`); continue; }
|
|
65
|
-
for (const g of groups) {
|
|
66
|
-
const list = g && g.hooks;
|
|
67
|
-
if (!Array.isArray(list)) { err(id, `hooks.${event} group has no hooks[] array`); continue; }
|
|
68
|
-
for (const h of list) {
|
|
69
|
-
if (!h || h.type !== "command") { err(id, `hooks.${event} entry is not a command hook (type="${h && h.type}")`); continue; }
|
|
70
|
-
if (typeof h.command !== "string" || !h.command.trim()) { err(id, `hooks.${event} command hook has empty command`); continue; }
|
|
71
|
-
yield { event, command: h.command.trim() };
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
const smokePayload = JSON.stringify({
|
|
78
|
-
session_id: "hooks-smoke",
|
|
79
|
-
transcript_path: "/dev/null",
|
|
80
|
-
cwd: ROOT,
|
|
81
|
-
hook_event_name: "Smoke",
|
|
82
|
-
tool_name: "Bash",
|
|
83
|
-
tool_input: { command: "true" },
|
|
84
|
-
tool_response: {},
|
|
85
|
-
});
|
|
86
|
-
|
|
87
|
-
function smokeRun(command) {
|
|
88
|
-
const parts = command.split(/\s+/);
|
|
89
|
-
const bin = parts[0];
|
|
90
|
-
const args = parts.slice(1);
|
|
91
|
-
const home = mkdtempSync(join(tmpdir(), "hooks-smoke-"));
|
|
92
|
-
try {
|
|
93
|
-
const r = spawnSync(bin, args, {
|
|
94
|
-
input: smokePayload,
|
|
95
|
-
timeout: 8000,
|
|
96
|
-
encoding: "utf8",
|
|
97
|
-
env: { ...process.env, HOME: home, TMPDIR: home, XDG_CONFIG_HOME: join(home, ".config"), XDG_STATE_HOME: join(home, ".state") },
|
|
98
|
-
});
|
|
99
|
-
const out = `${r.stdout || ""}\n${r.stderr || ""}`;
|
|
100
|
-
if (r.error && r.error.code === "ETIMEDOUT") return { ok: true, soft: "timed out (hook may wait on stdin/state) — not a crash" };
|
|
101
|
-
if (r.error) return { ok: false, why: r.error.message };
|
|
102
|
-
const hit = CRASH.find((s) => out.includes(s));
|
|
103
|
-
if (hit) return { ok: false, why: `module-load crash: "${hit}"` };
|
|
104
|
-
if (r.signal) return { ok: false, why: `killed by signal ${r.signal}` };
|
|
105
|
-
return { ok: true };
|
|
106
|
-
} finally {
|
|
107
|
-
rmSync(home, { recursive: true, force: true });
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
if (!existsSync(EXT)) {
|
|
112
|
-
console.error(`No extensions dir at ${EXT}`);
|
|
113
|
-
process.exit(1);
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
const smokeCommands = new Set();
|
|
117
|
-
|
|
118
|
-
for (const name of readdirSync(EXT)) {
|
|
119
|
-
const root = join(EXT, name);
|
|
120
|
-
if (!isDir(root)) continue;
|
|
121
|
-
const manifestPath = join(root, ".agents", "plugin.json");
|
|
122
|
-
if (!existsSync(manifestPath)) continue;
|
|
123
|
-
const id = `extensions/${name}`;
|
|
124
|
-
let m;
|
|
125
|
-
try { m = JSON.parse(readFileSync(manifestPath, "utf8")); }
|
|
126
|
-
catch (e) { err(id, `unreadable .agents/plugin.json: ${e.message}`); continue; }
|
|
127
|
-
|
|
128
|
-
const field = m.hooks;
|
|
129
|
-
if (!field) continue; // no hooks declared — nothing to validate here (E2 in check-principles covers undeclared dirs)
|
|
130
|
-
|
|
131
|
-
const hooksPath = resolve(root, field);
|
|
132
|
-
if (!existsSync(hooksPath)) { err(id, `manifest hooks -> "${field}" but file is missing at ${hooksPath}`); continue; }
|
|
133
|
-
|
|
134
|
-
let doc;
|
|
135
|
-
try { doc = JSON.parse(readFileSync(hooksPath, "utf8")); }
|
|
136
|
-
catch (e) { err(id, `${field} is not valid JSON: ${e.message}`); continue; }
|
|
137
|
-
|
|
138
|
-
const hooks = doc && doc.hooks;
|
|
139
|
-
if (!hooks || typeof hooks !== "object") { err(id, `${field} has no "hooks" object`); continue; }
|
|
140
|
-
if (Object.keys(hooks).length === 0) {
|
|
141
|
-
err(id, `${field} declares an empty hooks object — a hooks component that registers nothing; drop the "hooks" manifest field and the file`);
|
|
142
|
-
continue;
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
for (const { command } of commandEntries(hooks, id)) {
|
|
146
|
-
smokeCommands.add(command);
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
if (SMOKE) {
|
|
151
|
-
const cmds = [...smokeCommands].sort();
|
|
152
|
-
const bins = new Set(cmds.map((c) => c.split(/\s+/)[0]));
|
|
153
|
-
const present = new Set([...bins].filter(onPath));
|
|
154
|
-
for (const b of bins) if (!present.has(b)) note(`smoke skipped for "${b}" — not on PATH (can't test what isn't installed)`);
|
|
155
|
-
for (const c of cmds) {
|
|
156
|
-
const bin = c.split(/\s+/)[0];
|
|
157
|
-
if (!present.has(bin)) continue;
|
|
158
|
-
const r = smokeRun(c);
|
|
159
|
-
if (r.ok && r.soft) warn(`smoke`, `\`${c}\` ${r.soft}`);
|
|
160
|
-
else if (!r.ok) err(`smoke`, `\`${c}\` ${r.why}`);
|
|
161
|
-
}
|
|
162
|
-
} else {
|
|
163
|
-
note(`static only — run with --smoke to exercise installed hook binaries (${smokeCommands.size} distinct commands)`);
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
for (const n of notes) console.log(n);
|
|
167
|
-
for (const w of warnings) console.log(w);
|
|
168
|
-
for (const e of errors) console.log(e);
|
|
169
|
-
console.log(
|
|
170
|
-
errors.length
|
|
171
|
-
? `\n✗ hooks check FAILED: ${errors.length} error(s), ${warnings.length} warning(s)`
|
|
172
|
-
: `\n✓ hooks check passed (${warnings.length} warning(s))`,
|
|
173
|
-
);
|
|
174
|
-
process.exit(errors.length ? 1 : 0);
|
|
@@ -1,116 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
/**
|
|
3
|
-
* Repo guard: enforce the authoring principles in docs/AUTHORING-GUIDELINES.md.
|
|
4
|
-
* Fails (exit 1) on any ERROR. Pure Node, no deps. Run via `npm run
|
|
5
|
-
* check:principles`; also wired into `test` and `prepublishOnly`, and the
|
|
6
|
-
* optional `.githooks/pre-commit`.
|
|
7
|
-
*
|
|
8
|
-
* Rules:
|
|
9
|
-
* E1 No commands. A `commands/` dir or a `commands` manifest field is banned —
|
|
10
|
-
* commands are skills.
|
|
11
|
-
* E2 Declare every component. A `skills/`, `agents/`, or `hooks/` dir on disk
|
|
12
|
-
* must be named by the matching manifest field (else it silently doesn't
|
|
13
|
-
* install).
|
|
14
|
-
* E3 Skill hygiene. Each `skills/<dir>/` needs a `SKILL.md` with `name` +
|
|
15
|
-
* `description` frontmatter, and no `README.md`.
|
|
16
|
-
* E4 Surface targets are normalized repo-wide:
|
|
17
|
-
* - every bundled plugin targets claude/codex/cursor/enact
|
|
18
|
-
*/
|
|
19
|
-
import { readFileSync, existsSync, readdirSync, statSync } from "node:fs";
|
|
20
|
-
import { join, dirname } from "node:path";
|
|
21
|
-
import { fileURLToPath } from "node:url";
|
|
22
|
-
|
|
23
|
-
const ROOT = join(dirname(fileURLToPath(import.meta.url)), "..");
|
|
24
|
-
const EXT = join(ROOT, "extensions");
|
|
25
|
-
|
|
26
|
-
const errors = [];
|
|
27
|
-
const warnings = [];
|
|
28
|
-
const err = (p, m) => errors.push(`[ERROR] ${p}: ${m}`);
|
|
29
|
-
const warn = (p, m) => warnings.push(`[warn] ${p}: ${m}`);
|
|
30
|
-
const ALL_SURFACE_TARGETS = ["claude", "codex", "cursor", "enact"];
|
|
31
|
-
|
|
32
|
-
function frontmatter(file) {
|
|
33
|
-
const t = readFileSync(file, "utf8");
|
|
34
|
-
if (!t.startsWith("---")) return null;
|
|
35
|
-
const m = /^---\n([\s\S]*?)\n---/.exec(t);
|
|
36
|
-
if (!m) return null;
|
|
37
|
-
const body = m[1];
|
|
38
|
-
return {
|
|
39
|
-
name: /(^|\n)name:/.test(body),
|
|
40
|
-
description: /(^|\n)description:/.test(body),
|
|
41
|
-
};
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
function isDir(p) {
|
|
45
|
-
try { return statSync(p).isDirectory(); } catch { return false; }
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
function normalizedTargets(value) {
|
|
49
|
-
if (!Array.isArray(value)) return null;
|
|
50
|
-
return value.filter((entry) => typeof entry === "string");
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
if (!existsSync(EXT)) {
|
|
54
|
-
console.error(`No extensions dir at ${EXT}`);
|
|
55
|
-
process.exit(1);
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
for (const name of readdirSync(EXT)) {
|
|
59
|
-
const root = join(EXT, name);
|
|
60
|
-
if (!isDir(root)) continue;
|
|
61
|
-
const manifestPath = join(root, ".agents", "plugin.json");
|
|
62
|
-
if (!existsSync(manifestPath)) continue;
|
|
63
|
-
const id = `extensions/${name}`;
|
|
64
|
-
let m;
|
|
65
|
-
try { m = JSON.parse(readFileSync(manifestPath, "utf8")); }
|
|
66
|
-
catch (e) { err(id, `unreadable .agents/plugin.json: ${e.message}`); continue; }
|
|
67
|
-
|
|
68
|
-
// E1 — no commands
|
|
69
|
-
if ("commands" in m) err(id, `manifest declares "commands" — commands are skills; remove it`);
|
|
70
|
-
if (isDir(join(root, "commands"))) err(id, `has a commands/ dir — commands are skills; migrate to skills/`);
|
|
71
|
-
|
|
72
|
-
// E4 — repo-wide surface targeting contract
|
|
73
|
-
const expectedTargets = ALL_SURFACE_TARGETS;
|
|
74
|
-
const actualTargets = normalizedTargets(m.targets);
|
|
75
|
-
if (!actualTargets) {
|
|
76
|
-
err(id, `manifest must declare "targets": ${JSON.stringify(expectedTargets)}`);
|
|
77
|
-
} else if (JSON.stringify(actualTargets) !== JSON.stringify(expectedTargets)) {
|
|
78
|
-
err(
|
|
79
|
-
id,
|
|
80
|
-
`targets must be ${JSON.stringify(expectedTargets)}; found ${JSON.stringify(actualTargets)}`,
|
|
81
|
-
);
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
// E2 — declare components that exist on disk
|
|
85
|
-
for (const comp of ["skills", "agents", "hooks"]) {
|
|
86
|
-
if (isDir(join(root, comp)) && !m[comp])
|
|
87
|
-
err(id, `${comp}/ exists on disk but manifest has no "${comp}" field → it will NOT install`);
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
// E3 — skill hygiene
|
|
91
|
-
const skillsDir = join(root, "skills");
|
|
92
|
-
if (isDir(skillsDir)) {
|
|
93
|
-
for (const s of readdirSync(skillsDir)) {
|
|
94
|
-
const sp = join(skillsDir, s);
|
|
95
|
-
if (!isDir(sp)) { warn(id, `skills/${s} is a loose file, not a skill dir`); continue; }
|
|
96
|
-
const smd = join(sp, "SKILL.md");
|
|
97
|
-
if (!existsSync(smd)) { err(id, `skills/${s} has no SKILL.md`); continue; }
|
|
98
|
-
const fm = frontmatter(smd);
|
|
99
|
-
if (!fm) err(id, `skills/${s}/SKILL.md has no YAML frontmatter`);
|
|
100
|
-
else {
|
|
101
|
-
if (!fm.name) err(id, `skills/${s}/SKILL.md frontmatter missing "name"`);
|
|
102
|
-
if (!fm.description) err(id, `skills/${s}/SKILL.md frontmatter missing "description"`);
|
|
103
|
-
}
|
|
104
|
-
if (existsSync(join(sp, "README.md"))) err(id, `skills/${s} contains README.md (not allowed in a skill)`);
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
for (const w of warnings) console.log(w);
|
|
110
|
-
for (const e of errors) console.log(e);
|
|
111
|
-
console.log(
|
|
112
|
-
errors.length
|
|
113
|
-
? `\n✗ principles check FAILED: ${errors.length} error(s), ${warnings.length} warning(s)`
|
|
114
|
-
: `\n✓ principles check passed (${warnings.length} warning(s))`,
|
|
115
|
-
);
|
|
116
|
-
process.exit(errors.length ? 1 : 0);
|
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
/**
|
|
3
|
-
* session-start-drift-check.mjs — Enact Extensions session-start drift hook.
|
|
4
|
-
*
|
|
5
|
-
* Registered as a session-start hook for Claude, Codex, Cursor, and Enact.
|
|
6
|
-
* Checks whether any installed enact-extensions plugins have drifted from
|
|
7
|
-
* their canonical source (i.e. are outdated) and prints a concise advisory
|
|
8
|
-
* if so. When the user opts in via ENACT_EXTENSIONS_AUTO_UPDATE, the drifted
|
|
9
|
-
* surfaces are refreshed in place instead of merely advised.
|
|
10
|
-
*
|
|
11
|
-
* Design constraints:
|
|
12
|
-
* - FAIL-SILENT: wrap everything in try/catch; never throw; always exit 0.
|
|
13
|
-
* - FAST: imports the helper directly (no subprocess) for speed.
|
|
14
|
-
* - READ-ONLY by default: only mutates state when the user opts into auto-apply.
|
|
15
|
-
* - NO OUTPUT on success (or error): only print when there are outdated entries.
|
|
16
|
-
* - DEPENDENCY-FREE: only node builtins + enact-extensions own modules.
|
|
17
|
-
*/
|
|
18
|
-
|
|
19
|
-
import { dirname, resolve, join } from "node:path";
|
|
20
|
-
import { fileURLToPath } from "node:url";
|
|
21
|
-
|
|
22
|
-
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
23
|
-
// Navigate from scripts/hooks/ up to the repo root so we can import lib modules.
|
|
24
|
-
const REPO_ROOT = resolve(__dirname, "..", "..");
|
|
25
|
-
|
|
26
|
-
try {
|
|
27
|
-
// Dynamically import so any module-load failure is caught by the outer try/catch.
|
|
28
|
-
const { handleSessionStartDrift } = await import(join(REPO_ROOT, "scripts", "lib", "auto-update.mjs"));
|
|
29
|
-
|
|
30
|
-
// Opt-in is the USER's: gate auto-apply on the env var they set.
|
|
31
|
-
const autoApply = !!process.env.ENACT_EXTENSIONS_AUTO_UPDATE;
|
|
32
|
-
|
|
33
|
-
let result;
|
|
34
|
-
try {
|
|
35
|
-
result = handleSessionStartDrift({ autoApply });
|
|
36
|
-
} catch {
|
|
37
|
-
// Drift resolution threw (ledger missing, I/O error, etc.) — stay silent.
|
|
38
|
-
process.exit(0);
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
if (result.line) {
|
|
42
|
-
process.stdout.write(`${result.line}\n`);
|
|
43
|
-
}
|
|
44
|
-
} catch {
|
|
45
|
-
// Any top-level error (import failure, parse error, etc.) — silent exit 0.
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
process.exit(0);
|
package/scripts/install.sh
DELETED
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
set -euo pipefail
|
|
3
|
-
|
|
4
|
-
REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
|
5
|
-
|
|
6
|
-
# ── Node.js version check ──────────────────────────────────────────────────────
|
|
7
|
-
NODE_MAJOR="$(node --version 2>/dev/null | sed 's/v//' | cut -d. -f1)"
|
|
8
|
-
if [ -z "$NODE_MAJOR" ] || [ "$NODE_MAJOR" -lt 22 ]; then
|
|
9
|
-
echo "error: Node.js >= 22 is required (found: $(node --version 2>/dev/null || echo 'none'))" >&2
|
|
10
|
-
exit 1
|
|
11
|
-
fi
|
|
12
|
-
|
|
13
|
-
cd "$REPO_ROOT"
|
|
14
|
-
|
|
15
|
-
# ── Install dependencies ───────────────────────────────────────────────────────
|
|
16
|
-
echo "→ npm install"
|
|
17
|
-
npm install --no-audit --no-fund
|
|
18
|
-
|
|
19
|
-
# ── Build TypeScript ───────────────────────────────────────────────────────────
|
|
20
|
-
echo "→ npm run build"
|
|
21
|
-
npm run build
|
|
22
|
-
|
|
23
|
-
# ── Bundle into a single file ─────────────────────────────────────────────────
|
|
24
|
-
echo "→ bundling"
|
|
25
|
-
# Bundle the CLI and all JS/TS dependencies into one ESM file.
|
|
26
|
-
# The bundle is installed into <support>/dist/internal/ so that import.meta.url
|
|
27
|
-
# resolves ../../ to <support>/ — matching the dist/internal/schema.js assumption
|
|
28
|
-
# about where spec/ lives relative to the compiled output.
|
|
29
|
-
SUPPORT_DIR="$HOME/.local/share/enact-extensions"
|
|
30
|
-
BUNDLE_DIR="$SUPPORT_DIR/dist/internal"
|
|
31
|
-
mkdir -p "$BUNDLE_DIR"
|
|
32
|
-
|
|
33
|
-
npx --yes esbuild scripts/enact-extensions.mjs \
|
|
34
|
-
--bundle \
|
|
35
|
-
--platform=node \
|
|
36
|
-
--format=cjs \
|
|
37
|
-
"--banner:js=const __import_meta_url=require('url').pathToFileURL(__filename).href;" \
|
|
38
|
-
"--define:import.meta.url=__import_meta_url" \
|
|
39
|
-
--outfile="$BUNDLE_DIR/enact-extensions.js"
|
|
40
|
-
|
|
41
|
-
chmod +x "$BUNDLE_DIR/enact-extensions.js"
|
|
42
|
-
|
|
43
|
-
# ── Copy spec/ alongside the bundle ───────────────────────────────────────────
|
|
44
|
-
# schema.ts resolves spec/ as ../../spec/ relative to dist/internal/ — keep that layout.
|
|
45
|
-
rm -rf "$SUPPORT_DIR/spec"
|
|
46
|
-
cp -r "$REPO_ROOT/spec" "$SUPPORT_DIR/spec"
|
|
47
|
-
|
|
48
|
-
# ── Install launcher ───────────────────────────────────────────────────────────
|
|
49
|
-
if [ "$(id -u)" = "0" ]; then
|
|
50
|
-
INSTALL_DIR="/usr/local/bin"
|
|
51
|
-
else
|
|
52
|
-
INSTALL_DIR="$HOME/.local/bin"
|
|
53
|
-
mkdir -p "$INSTALL_DIR"
|
|
54
|
-
fi
|
|
55
|
-
|
|
56
|
-
LAUNCHER="$INSTALL_DIR/enact-extensions"
|
|
57
|
-
{
|
|
58
|
-
echo '#!/usr/bin/env bash'
|
|
59
|
-
echo "exec node \"$BUNDLE_DIR/enact-extensions.js\" \"\$@\""
|
|
60
|
-
} > "$LAUNCHER"
|
|
61
|
-
chmod +x "$LAUNCHER"
|
|
62
|
-
|
|
63
|
-
echo ""
|
|
64
|
-
echo "installed: $LAUNCHER"
|
|
65
|
-
|
|
66
|
-
if [ "$(id -u)" != "0" ] && [[ ":$PATH:" != *":$HOME/.local/bin:"* ]]; then
|
|
67
|
-
echo ""
|
|
68
|
-
echo " Add to your shell profile to use the command:"
|
|
69
|
-
echo " export PATH=\"\$HOME/.local/bin:\$PATH\""
|
|
70
|
-
fi
|
|
@@ -1,75 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* auto-update.mjs — SessionStart drift resolution: advise by default, or
|
|
3
|
-
* auto-apply when opted in via ENACT_EXTENSIONS_AUTO_UPDATE.
|
|
4
|
-
*
|
|
5
|
-
* Single export:
|
|
6
|
-
* handleSessionStartDrift({ autoApply, home, cwd }) → { outdated, applied, updated, line }
|
|
7
|
-
*
|
|
8
|
-
* Behaviour:
|
|
9
|
-
* - Compute the outdated (drifted) surfaces from the ledger vs canonical source.
|
|
10
|
-
* - No outdated surfaces → { outdated: [], applied: false, line: null }.
|
|
11
|
-
* - Outdated + autoApply=false → advisory line (default; mutates nothing).
|
|
12
|
-
* - Outdated + autoApply=true → runUpdate({ all: true }); summary line naming
|
|
13
|
-
* what was refreshed. If the refresh updated
|
|
14
|
-
* nothing actionable (e.g. all orphaned), fall
|
|
15
|
-
* back to the advisory line.
|
|
16
|
-
*
|
|
17
|
-
* The opt-in is the USER's: callers derive `autoApply` from
|
|
18
|
-
* process.env.ENACT_EXTENSIONS_AUTO_UPDATE. This module never reads env itself.
|
|
19
|
-
* Reuses computeOutdated + runUpdate; it adds no new install/refresh logic.
|
|
20
|
-
*/
|
|
21
|
-
|
|
22
|
-
import { computeOutdated } from "./outdated.mjs";
|
|
23
|
-
import { runUpdate } from "./run-update.mjs";
|
|
24
|
-
|
|
25
|
-
/** Format the "name/platform, ..." pair list for a set of entries. */
|
|
26
|
-
function pairs(entries) {
|
|
27
|
-
return entries.map((e) => `${e.name}/${e.platform}`).join(", ");
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
/** The default advisory line (unchanged wording: names surfaces + manual command). */
|
|
31
|
-
export function driftAdvisoryLine(outdated) {
|
|
32
|
-
return (
|
|
33
|
-
`[enact-extensions] ${outdated.length} plugin surface${outdated.length === 1 ? "" : "s"} ` +
|
|
34
|
-
`outdated: ${pairs(outdated)}. Run: enact-extensions update --all`
|
|
35
|
-
);
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
/** The auto-apply summary line, naming the surfaces that were refreshed. */
|
|
39
|
-
export function autoUpdateSummaryLine(updated) {
|
|
40
|
-
return (
|
|
41
|
-
`[enact-extensions] auto-updated ${updated.length} plugin surface${updated.length === 1 ? "" : "s"}: ` +
|
|
42
|
-
`${pairs(updated)}`
|
|
43
|
-
);
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
/**
|
|
47
|
-
* Resolve SessionStart drift: advise by default, or auto-apply when opted in.
|
|
48
|
-
*
|
|
49
|
-
* @param {object} [opts]
|
|
50
|
-
* @param {boolean} [opts.autoApply] — when true, refresh outdated surfaces in place.
|
|
51
|
-
* @param {string} [opts.home] — ledger home override (defaults to os.homedir()).
|
|
52
|
-
* @param {string} [opts.cwd] — canonical-source resolution dir (defaults to cwd).
|
|
53
|
-
* @returns {{ outdated: object[], applied: boolean, updated: object[], line: string|null }}
|
|
54
|
-
*/
|
|
55
|
-
export function handleSessionStartDrift({ autoApply, home, cwd } = {}) {
|
|
56
|
-
const outdated = (computeOutdated({ home, cwd }) ?? []).filter(
|
|
57
|
-
(e) => e && e.status === "outdated",
|
|
58
|
-
);
|
|
59
|
-
|
|
60
|
-
if (outdated.length === 0) {
|
|
61
|
-
return { outdated, applied: false, updated: [], line: null };
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
if (autoApply) {
|
|
65
|
-
const summary = runUpdate({ all: true, home, cwd });
|
|
66
|
-
const updated = summary?.updated ?? [];
|
|
67
|
-
if (updated.length === 0) {
|
|
68
|
-
// Nothing actionable was refreshed (e.g. orphaned source) — advise instead.
|
|
69
|
-
return { outdated, applied: false, updated, line: driftAdvisoryLine(outdated) };
|
|
70
|
-
}
|
|
71
|
-
return { outdated, applied: true, updated, line: autoUpdateSummaryLine(updated) };
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
return { outdated, applied: false, updated: [], line: driftAdvisoryLine(outdated) };
|
|
75
|
-
}
|
|
@@ -1,137 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* bundle-hash.mjs — deterministic content hash for a plugin bundle.
|
|
3
|
-
*
|
|
4
|
-
* bundleHash(pluginRoot) → sha256 hex string
|
|
5
|
-
*
|
|
6
|
-
* The hash covers the CANONICAL bundle content only:
|
|
7
|
-
* - .agents/plugin.json (the manifest itself)
|
|
8
|
-
* - Component dirs/files referenced in the manifest:
|
|
9
|
-
* skills, mcpServers, apps, commands, hooks, agents, _agents, rules
|
|
10
|
-
* - .mcp.json (if present at pluginRoot root)
|
|
11
|
-
*
|
|
12
|
-
* EXCLUDED (generated / derived surfaces, never present in canonical source):
|
|
13
|
-
* - .claude-plugin/
|
|
14
|
-
* - .codex-plugin/
|
|
15
|
-
* - .cursor-plugin/
|
|
16
|
-
*
|
|
17
|
-
* Algorithm:
|
|
18
|
-
* 1. Collect the set of paths to include (manifest + referenced component paths).
|
|
19
|
-
* 2. Walk each path recursively; collect all (relativePath, bytes) pairs.
|
|
20
|
-
* 3. Sort by relative path (order-independence).
|
|
21
|
-
* 4. Feed path + bytes for each file into a single sha256 digest.
|
|
22
|
-
* 5. Return the hex digest.
|
|
23
|
-
*
|
|
24
|
-
* Pure, no writes, synchronous.
|
|
25
|
-
*/
|
|
26
|
-
|
|
27
|
-
import { createHash } from "node:crypto";
|
|
28
|
-
import { existsSync, readdirSync, readFileSync, statSync } from "node:fs";
|
|
29
|
-
import { join, relative } from "node:path";
|
|
30
|
-
|
|
31
|
-
// ---------------------------------------------------------------------------
|
|
32
|
-
// Canonical component field names (mirrors pathFieldsFromManifest in install.ts)
|
|
33
|
-
// ---------------------------------------------------------------------------
|
|
34
|
-
const COMPONENT_FIELDS = [
|
|
35
|
-
"skills",
|
|
36
|
-
"mcpServers",
|
|
37
|
-
"apps",
|
|
38
|
-
"commands",
|
|
39
|
-
"hooks",
|
|
40
|
-
"agents",
|
|
41
|
-
"_agents",
|
|
42
|
-
"rules",
|
|
43
|
-
];
|
|
44
|
-
|
|
45
|
-
// Generated platform dirs — always excluded from the canonical hash.
|
|
46
|
-
const EXCLUDED_DIRS = new Set([".claude-plugin", ".codex-plugin", ".cursor-plugin"]);
|
|
47
|
-
|
|
48
|
-
/**
|
|
49
|
-
* Recursively collect all file entries under `root`.
|
|
50
|
-
* Returns an array of { rel: string, abs: string } sorted by rel.
|
|
51
|
-
* Silently skips non-file, non-directory entries.
|
|
52
|
-
*
|
|
53
|
-
* @param {string} abs - absolute path to walk
|
|
54
|
-
* @param {string} base - the pluginRoot (for computing relative paths)
|
|
55
|
-
* @param {string[]} acc - accumulator
|
|
56
|
-
*/
|
|
57
|
-
function walkFiles(abs, base, acc) {
|
|
58
|
-
if (!existsSync(abs)) return;
|
|
59
|
-
const stat = statSync(abs);
|
|
60
|
-
if (stat.isFile()) {
|
|
61
|
-
acc.push(relative(base, abs));
|
|
62
|
-
return;
|
|
63
|
-
}
|
|
64
|
-
if (!stat.isDirectory()) return;
|
|
65
|
-
const entries = readdirSync(abs).sort(); // sort for determinism
|
|
66
|
-
for (const name of entries) {
|
|
67
|
-
walkFiles(join(abs, name), base, acc);
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
/**
|
|
72
|
-
* Collect the canonical set of relative paths to include in the hash.
|
|
73
|
-
*
|
|
74
|
-
* @param {string} pluginRoot
|
|
75
|
-
* @param {object} manifest - parsed .agents/plugin.json
|
|
76
|
-
* @returns {string[]} sorted relative paths (relative to pluginRoot)
|
|
77
|
-
*/
|
|
78
|
-
function canonicalPaths(pluginRoot, manifest) {
|
|
79
|
-
// Always include the manifest itself.
|
|
80
|
-
const collected = [];
|
|
81
|
-
|
|
82
|
-
// 1. Always walk .agents/plugin.json (the manifest).
|
|
83
|
-
walkFiles(join(pluginRoot, ".agents", "plugin.json"), pluginRoot, collected);
|
|
84
|
-
|
|
85
|
-
// 2. Walk each component path that exists.
|
|
86
|
-
for (const field of COMPONENT_FIELDS) {
|
|
87
|
-
const raw = manifest[field];
|
|
88
|
-
if (typeof raw !== "string" || !raw.trim()) continue;
|
|
89
|
-
// Normalise: strip leading ./ and trailing /
|
|
90
|
-
const cleaned = raw.replace(/^\.\//, "").replace(/\/+$/, "");
|
|
91
|
-
if (!cleaned || cleaned.startsWith("../")) continue;
|
|
92
|
-
// Refuse to hash generated platform dirs even if the manifest references them.
|
|
93
|
-
const topSegment = cleaned.split("/")[0];
|
|
94
|
-
if (EXCLUDED_DIRS.has(topSegment)) continue;
|
|
95
|
-
walkFiles(join(pluginRoot, cleaned), pluginRoot, collected);
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
// 3. .mcp.json at pluginRoot root (included if present, regardless of manifest field)
|
|
99
|
-
walkFiles(join(pluginRoot, ".mcp.json"), pluginRoot, collected);
|
|
100
|
-
|
|
101
|
-
// Sort for order-independence, then deduplicate.
|
|
102
|
-
const unique = [...new Set(collected)].sort();
|
|
103
|
-
return unique;
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
/**
|
|
107
|
-
* Compute a deterministic sha256 hex hash of the canonical plugin bundle.
|
|
108
|
-
*
|
|
109
|
-
* @param {string} pluginRoot - absolute path to the bundle root
|
|
110
|
-
* @returns {string} sha256 hex digest (64 lowercase hex chars)
|
|
111
|
-
* @throws {Error} if the manifest cannot be read (ENOENT, parse error, etc.)
|
|
112
|
-
*/
|
|
113
|
-
export function bundleHash(pluginRoot) {
|
|
114
|
-
// Read and parse the manifest first — this is the anchor; if it's missing
|
|
115
|
-
// we cannot know which component paths to include, so we throw.
|
|
116
|
-
const manifestPath = join(pluginRoot, ".agents", "plugin.json");
|
|
117
|
-
if (!existsSync(manifestPath)) {
|
|
118
|
-
throw new Error(`Cannot compute bundle hash: manifest not found at ${manifestPath}`);
|
|
119
|
-
}
|
|
120
|
-
const manifest = JSON.parse(readFileSync(manifestPath, "utf8"));
|
|
121
|
-
|
|
122
|
-
// Collect the sorted list of relative paths.
|
|
123
|
-
const paths = canonicalPaths(pluginRoot, manifest);
|
|
124
|
-
|
|
125
|
-
// Hash all paths and their contents in sorted order.
|
|
126
|
-
const hash = createHash("sha256");
|
|
127
|
-
for (const rel of paths) {
|
|
128
|
-
const abs = join(pluginRoot, rel);
|
|
129
|
-
// Feed the relative path as a NUL-terminated string to make path changes
|
|
130
|
-
// visible even when content is identical.
|
|
131
|
-
hash.update(rel + "\0", "utf8");
|
|
132
|
-
// Feed the file bytes.
|
|
133
|
-
hash.update(readFileSync(abs));
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
return hash.digest("hex");
|
|
137
|
-
}
|