@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
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* allowed-plugins.mjs — the DEFAULT set of plugin bundles this package ships.
|
|
3
|
+
*
|
|
4
|
+
* Owner decision, 2026-09-15: bundled-extensions.json names the defaults; it is
|
|
5
|
+
* NOT an allow-list. Install and uninstall of ANY resolvable bundle must work
|
|
6
|
+
* from the CLI. The previous behaviour refused every name but `enact-repo`, and
|
|
7
|
+
* refused on the RESOLVED NAME before resolution ran — so even an explicit path
|
|
8
|
+
* was rejected, while the error advised passing one.
|
|
9
|
+
*
|
|
10
|
+
* bundled-extensions.json remains the single place to change which bundles ship
|
|
11
|
+
* as defaults, and is still validated loudly rather than falling back to a scan
|
|
12
|
+
* of extensions/.
|
|
13
|
+
*/
|
|
14
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
15
|
+
import { dirname, join, resolve } from "node:path";
|
|
16
|
+
import { fileURLToPath } from "node:url";
|
|
17
|
+
|
|
18
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
19
|
+
const PACKAGE_ROOT = resolve(__dirname, "..", "..");
|
|
20
|
+
|
|
21
|
+
export const BUNDLED_EXTENSIONS_PATH = join(PACKAGE_ROOT, "bundled-extensions.json");
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Read and validate bundled-extensions.json. Throws loudly (never falls back
|
|
25
|
+
* to scanning extensions/) when the file is missing or malformed.
|
|
26
|
+
*
|
|
27
|
+
* @returns {string[]} the default plugin names.
|
|
28
|
+
*/
|
|
29
|
+
export function loadBundledPluginNames() {
|
|
30
|
+
if (!existsSync(BUNDLED_EXTENSIONS_PATH)) {
|
|
31
|
+
throw new Error(
|
|
32
|
+
`[enact-extensions] ${BUNDLED_EXTENSIONS_PATH} is missing; cannot determine the default plugin set.`,
|
|
33
|
+
);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
let raw;
|
|
37
|
+
try {
|
|
38
|
+
raw = JSON.parse(readFileSync(BUNDLED_EXTENSIONS_PATH, "utf8"));
|
|
39
|
+
} catch (err) {
|
|
40
|
+
throw new Error(
|
|
41
|
+
`[enact-extensions] failed to parse ${BUNDLED_EXTENSIONS_PATH}: ${err instanceof Error ? err.message : String(err)}`,
|
|
42
|
+
);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
if (!Array.isArray(raw.bundled) || raw.bundled.some((n) => typeof n !== "string" || !n)) {
|
|
46
|
+
throw new Error(
|
|
47
|
+
`[enact-extensions] ${BUNDLED_EXTENSIONS_PATH} must contain a "bundled" array of non-empty plugin name strings.`,
|
|
48
|
+
);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
return raw.bundled;
|
|
52
|
+
}
|
|
@@ -0,0 +1,571 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `enact-extensions doctor enact-repo --repo <path> [--json]` — READ-ONLY
|
|
3
|
+
* health check for a repo-local `enact-repo` install. Never writes anything
|
|
4
|
+
* (not the lock, not any host file, not any global config). Replaces the
|
|
5
|
+
* `doctor`/`status` surface of the retired `enact-repo-controls` tool for the
|
|
6
|
+
* repo-local installer in this package.
|
|
7
|
+
*
|
|
8
|
+
* Checks:
|
|
9
|
+
* - installed? (lock present)
|
|
10
|
+
* - plugin version vs bundle version (outdated?), plus per-file content
|
|
11
|
+
* drift against what the CURRENT
|
|
12
|
+
* bundle would generate
|
|
13
|
+
* - lock integrity (every managed file present + hash
|
|
14
|
+
* match; every merged JSON entry /
|
|
15
|
+
* TOML block present; list drifted
|
|
16
|
+
* or missing)
|
|
17
|
+
* - per-host status: claude (marketplace + settings present; trust +
|
|
18
|
+
* "start a new session" note), codex (files present; read-only
|
|
19
|
+
* ~/.codex/config.toml projects."<repo>".trust_level; hooks-review-
|
|
20
|
+
* pending note), cursor (files present; MCP approval note), kimi
|
|
21
|
+
* (.kimi-code/mcp.json present; global hooks are enact-vps-owned, so we
|
|
22
|
+
* only report whether ~/.kimi-code/config.toml has the
|
|
23
|
+
* `# BEGIN ENACT KIMI HOOKS` block; PLUS a read-only Kimi Code
|
|
24
|
+
* workspace-trust check — Kimi only loads project MCP servers, including
|
|
25
|
+
* `.kimi-code/mcp.json`, once the workspace is trusted), opencode
|
|
26
|
+
* (plugin file present and generated from the current bundle)
|
|
27
|
+
* - required global binaries on PATH (enact-hook, lean-ctx,
|
|
28
|
+
* code-review-graph/crg, azure-devops-mcp) with versions
|
|
29
|
+
* - root `enact-config.toml` marker: present, parses as TOML, has our
|
|
30
|
+
* `[extensions]` table (other tools' tables are never inspected); a leftover
|
|
31
|
+
* `.agents/enact-repo.toml` is reported as stale (existence only, never
|
|
32
|
+
* read -- HARDCUT, no fallback)
|
|
33
|
+
* - `enact-hook doctor --repo <path>` passthrough, best-effort (never a
|
|
34
|
+
* hard requirement — reports "not available" when the binary or that
|
|
35
|
+
* sub-command isn't there)
|
|
36
|
+
* - enact-hook per-repo logs (informational, read-only): both log paths
|
|
37
|
+
* (`.agents/hooks/hooks.log` deny log, `.agents/hooks/hooks-activity.log`
|
|
38
|
+
* activity log), whether each exists, its row count, and (deny log only)
|
|
39
|
+
* the last 5 rows parsed into named columns
|
|
40
|
+
*
|
|
41
|
+
* Non-zero exit (report.exitCode = 1) ONLY for hard requirements: not
|
|
42
|
+
* installed, lock integrity failure, a missing required global binary, or an
|
|
43
|
+
* invalid/missing `enact-config.toml` marker. Everything else (outdated
|
|
44
|
+
* version, host trust/approval notes, hookDoctor unavailability, a stale
|
|
45
|
+
* `.agents/enact-repo.toml`) is informational.
|
|
46
|
+
*/
|
|
47
|
+
import { createHash } from "node:crypto";
|
|
48
|
+
import { existsSync, lstatSync, readFileSync, readlinkSync } from "node:fs";
|
|
49
|
+
import { spawnSync } from "node:child_process";
|
|
50
|
+
import { homedir } from "node:os";
|
|
51
|
+
import { basename, join } from "node:path";
|
|
52
|
+
import * as TOML from "@iarna/toml";
|
|
53
|
+
import { entryPresent, findBlock } from "../../dist/index.js";
|
|
54
|
+
import {
|
|
55
|
+
CONFIG_PATH,
|
|
56
|
+
HOOK_LOG_FILES,
|
|
57
|
+
REPO_HOSTS,
|
|
58
|
+
abs,
|
|
59
|
+
buildPlan,
|
|
60
|
+
fileSha,
|
|
61
|
+
lockRel,
|
|
62
|
+
readBundle,
|
|
63
|
+
readJsonStrict,
|
|
64
|
+
readLock,
|
|
65
|
+
resolveRepoRoot,
|
|
66
|
+
sha256,
|
|
67
|
+
} from "./run-repo-install.mjs";
|
|
68
|
+
|
|
69
|
+
const STALE_MARKER_PATH = ".agents/enact-repo.toml";
|
|
70
|
+
const KIMI_HOOKS_MARKER = "# BEGIN ENACT KIMI HOOKS";
|
|
71
|
+
const REQUIRED_BINARIES = ["enact-hook", "lean-ctx", "azure-devops-mcp"];
|
|
72
|
+
|
|
73
|
+
// enact-hook per-repo logs: `.agents/hooks/hooks.log` (deny log CSV) and
|
|
74
|
+
// `.agents/hooks/hooks-activity.log` (activity log CSV -- deny columns plus
|
|
75
|
+
// host/kind/event/tool/session/downstream/duration_ms). Written by the
|
|
76
|
+
// global `enact-hook` runtime, never by this package; reported read-only.
|
|
77
|
+
const [DENY_LOG_REL, ACTIVITY_LOG_REL] = HOOK_LOG_FILES;
|
|
78
|
+
const DENY_LOG_COLUMNS = ["timestamp", "surface", "reason_id", "command", "agent_message"];
|
|
79
|
+
const ACTIVITY_LOG_COLUMNS = [...DENY_LOG_COLUMNS, "host", "kind", "event", "tool", "session", "downstream", "duration_ms"];
|
|
80
|
+
const DENY_LOG_LAST_ROWS = 5;
|
|
81
|
+
|
|
82
|
+
// ---------------------------------------------------------------------------
|
|
83
|
+
// small read-only helpers
|
|
84
|
+
// ---------------------------------------------------------------------------
|
|
85
|
+
|
|
86
|
+
function checkBinary(name) {
|
|
87
|
+
const which = spawnSync("which", [name], { encoding: "utf8" });
|
|
88
|
+
if (which.status !== 0 || !which.stdout.trim()) return { found: false };
|
|
89
|
+
const path = which.stdout.trim();
|
|
90
|
+
const ver = spawnSync(name, ["--version"], { encoding: "utf8", timeout: 5000 });
|
|
91
|
+
const version = ver.status === 0 ? `${ver.stdout || ver.stderr || ""}`.trim().split("\n")[0] : null;
|
|
92
|
+
return { found: true, path, version };
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
function checkCrgBinary() {
|
|
96
|
+
for (const name of ["crg", "code-review-graph"]) {
|
|
97
|
+
const r = checkBinary(name);
|
|
98
|
+
if (r.found) return { ...r, name };
|
|
99
|
+
}
|
|
100
|
+
return { found: false, name: "crg (or code-review-graph)" };
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
function computeCurrentPlanHashes(pluginRoot, bundle, hosts, repo) {
|
|
104
|
+
const plan = buildPlan(pluginRoot, bundle, hosts, repo);
|
|
105
|
+
const map = new Map();
|
|
106
|
+
for (const [rel, content] of plan.files) map.set(rel, sha256(content));
|
|
107
|
+
return map;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
// Codex: read-only check of ~/.codex/config.toml `projects."<path>".trust_level`
|
|
111
|
+
// for this EXACT repo path. Never writes.
|
|
112
|
+
function checkCodexTrust(repo, home) {
|
|
113
|
+
const configPath = join(home, ".codex", "config.toml");
|
|
114
|
+
if (!existsSync(configPath)) {
|
|
115
|
+
return { configFound: false, trustLevel: null, note: `${configPath} not found` };
|
|
116
|
+
}
|
|
117
|
+
let doc;
|
|
118
|
+
try {
|
|
119
|
+
doc = TOML.parse(readFileSync(configPath, "utf8"));
|
|
120
|
+
} catch (err) {
|
|
121
|
+
return { configFound: true, trustLevel: null, note: `cannot parse ${configPath}: ${err instanceof Error ? err.message : String(err)}` };
|
|
122
|
+
}
|
|
123
|
+
const entry = doc.projects && typeof doc.projects === "object" ? doc.projects[repo] : undefined;
|
|
124
|
+
const trustLevel = entry && typeof entry === "object" && typeof entry.trust_level === "string" ? entry.trust_level : null;
|
|
125
|
+
return {
|
|
126
|
+
configFound: true,
|
|
127
|
+
trustLevel,
|
|
128
|
+
note: trustLevel
|
|
129
|
+
? undefined
|
|
130
|
+
: `repo not marked trusted in ${configPath} (projects."${repo}".trust_level) -- Codex hooks/config load only after you trust this project`,
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
// Kimi hooks are global-only (installed by enact-vps); we only REPORT whether
|
|
135
|
+
// the global block is present, never write it ourselves.
|
|
136
|
+
function checkKimiGlobalHooks(home) {
|
|
137
|
+
const configPath = join(home, ".kimi-code", "config.toml");
|
|
138
|
+
if (!existsSync(configPath)) return { configFound: false, hooksBlockPresent: false, configPath };
|
|
139
|
+
const text = readFileSync(configPath, "utf8");
|
|
140
|
+
return { configFound: true, hooksBlockPresent: text.includes(KIMI_HOOKS_MARKER), configPath };
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
function kimiCodeHome() {
|
|
144
|
+
return process.env.KIMI_CODE_HOME || join(homedir(), ".kimi-code");
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
function kimiWorkspaceTrustSlug(repo) {
|
|
148
|
+
return basename(repo)
|
|
149
|
+
.toLowerCase()
|
|
150
|
+
.replace(/[^a-z0-9]+/g, "-")
|
|
151
|
+
.replace(/^-+|-+$/g, "");
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
// Kimi Code v0.39.1 loads project MCP servers (`.kimi-code/mcp.json` included)
|
|
155
|
+
// ONLY when the workspace is trusted:
|
|
156
|
+
// `loadMcpServers({ includeProject: trust.isTrusted() })`. Trust record:
|
|
157
|
+
// `${KIMI_CODE_HOME:-~/.kimi-code}/workspace-trust/wd_<slug>_<sha256(absRoot)[:12]>`
|
|
158
|
+
// containing `{"root": "<abs path>", "trustedAt": <ms>}`. READ-ONLY: never
|
|
159
|
+
// creates or modifies the trust record -- granting trust is the user's own
|
|
160
|
+
// action in Kimi Code ("Trust this folder").
|
|
161
|
+
function checkKimiWorkspaceTrust(repo) {
|
|
162
|
+
const home = kimiCodeHome();
|
|
163
|
+
const slug = kimiWorkspaceTrustSlug(repo);
|
|
164
|
+
const hash = createHash("sha256").update(repo).digest("hex").slice(0, 12);
|
|
165
|
+
const recordPath = join(home, "workspace-trust", `wd_${slug}_${hash}`);
|
|
166
|
+
const untrustedNote = (why) =>
|
|
167
|
+
`${why} -- open ${repo} in Kimi Code once and accept "Trust this folder"; until then Kimi loads no enact-repo MCP servers (project MCP, including .kimi-code/mcp.json, is skipped for untrusted workspaces)`;
|
|
168
|
+
|
|
169
|
+
if (!existsSync(recordPath)) {
|
|
170
|
+
return { trusted: false, recordPath, note: untrustedNote(`not trusted (no trust record at ${recordPath})`) };
|
|
171
|
+
}
|
|
172
|
+
let record;
|
|
173
|
+
try {
|
|
174
|
+
record = JSON.parse(readFileSync(recordPath, "utf8"));
|
|
175
|
+
} catch (err) {
|
|
176
|
+
return {
|
|
177
|
+
trusted: false,
|
|
178
|
+
recordPath,
|
|
179
|
+
note: untrustedNote(`trust record at ${recordPath} is malformed JSON (${err instanceof Error ? err.message : String(err)})`),
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
if (!record || record.root !== repo) {
|
|
183
|
+
return {
|
|
184
|
+
trusted: false,
|
|
185
|
+
recordPath,
|
|
186
|
+
note: untrustedNote(`trust record at ${recordPath} is for a different root (${record?.root ?? "(none)"}), not ${repo}`),
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
return { trusted: true, recordPath, trustedAt: record.trustedAt ?? null };
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
// ---------------------------------------------------------------------------
|
|
193
|
+
// enact-hook per-repo logs (read-only) — robust CSV parsing: quoted fields
|
|
194
|
+
// (so a quoted `command`/`agent_message` may embed commas, or even raw
|
|
195
|
+
// newlines) plus plain unquoted fields (the common case, already flattened
|
|
196
|
+
// to a single line by the writer). RFC4180-shaped, minus a header row (both
|
|
197
|
+
// logs are append-only data rows, no header).
|
|
198
|
+
// ---------------------------------------------------------------------------
|
|
199
|
+
function parseCsvRows(text) {
|
|
200
|
+
const rows = [];
|
|
201
|
+
let row = [];
|
|
202
|
+
let field = "";
|
|
203
|
+
let inQuotes = false;
|
|
204
|
+
for (let i = 0; i < text.length; i++) {
|
|
205
|
+
const c = text[i];
|
|
206
|
+
if (inQuotes) {
|
|
207
|
+
if (c === '"') {
|
|
208
|
+
if (text[i + 1] === '"') {
|
|
209
|
+
field += '"';
|
|
210
|
+
i++;
|
|
211
|
+
} else {
|
|
212
|
+
inQuotes = false;
|
|
213
|
+
}
|
|
214
|
+
} else {
|
|
215
|
+
field += c;
|
|
216
|
+
}
|
|
217
|
+
continue;
|
|
218
|
+
}
|
|
219
|
+
if (c === '"') {
|
|
220
|
+
inQuotes = true;
|
|
221
|
+
continue;
|
|
222
|
+
}
|
|
223
|
+
if (c === ",") {
|
|
224
|
+
row.push(field);
|
|
225
|
+
field = "";
|
|
226
|
+
continue;
|
|
227
|
+
}
|
|
228
|
+
if (c === "\r") continue;
|
|
229
|
+
if (c === "\n") {
|
|
230
|
+
row.push(field);
|
|
231
|
+
rows.push(row);
|
|
232
|
+
row = [];
|
|
233
|
+
field = "";
|
|
234
|
+
continue;
|
|
235
|
+
}
|
|
236
|
+
field += c;
|
|
237
|
+
}
|
|
238
|
+
if (field.length > 0 || row.length > 0) {
|
|
239
|
+
row.push(field);
|
|
240
|
+
rows.push(row);
|
|
241
|
+
}
|
|
242
|
+
// Drop blank trailing/interstitial lines (a single empty field).
|
|
243
|
+
return rows.filter((r) => r.length > 1 || r[0] !== "");
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
function readHookLogSummary(repo, rel, columns, lastN) {
|
|
247
|
+
const path = abs(repo, rel);
|
|
248
|
+
if (!existsSync(path)) return { path: rel, exists: false, rowCount: 0, lastRows: [] };
|
|
249
|
+
const rows = parseCsvRows(readFileSync(path, "utf8"));
|
|
250
|
+
const lastRows =
|
|
251
|
+
lastN > 0 ? rows.slice(-lastN).map((cols) => Object.fromEntries(columns.map((name, i) => [name, cols[i] ?? ""]))) : [];
|
|
252
|
+
return { path: rel, exists: true, rowCount: rows.length, lastRows };
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
// Informational only (never affects `problems`/exitCode) -- these logs are
|
|
256
|
+
// the runtime's own operational history, not an install-health signal.
|
|
257
|
+
function checkHookLogs(repo) {
|
|
258
|
+
return {
|
|
259
|
+
denyLog: readHookLogSummary(repo, DENY_LOG_REL, DENY_LOG_COLUMNS, DENY_LOG_LAST_ROWS),
|
|
260
|
+
activityLog: readHookLogSummary(repo, ACTIVITY_LOG_REL, ACTIVITY_LOG_COLUMNS, 0),
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
function runHookDoctor(repo, enactHook) {
|
|
265
|
+
if (!enactHook?.found) {
|
|
266
|
+
return { available: false, note: "enact-hook not found on PATH; skipping `enact-hook doctor --repo`" };
|
|
267
|
+
}
|
|
268
|
+
const res = spawnSync("enact-hook", ["doctor", "--repo", repo], { encoding: "utf8", timeout: 10000 });
|
|
269
|
+
if (res.error) {
|
|
270
|
+
return { available: false, note: `could not run enact-hook doctor --repo: ${res.error.message}` };
|
|
271
|
+
}
|
|
272
|
+
const combined = `${res.stdout ?? ""}${res.stderr ?? ""}`;
|
|
273
|
+
if (res.status !== 0 && /unknown or missing hook kind/i.test(combined)) {
|
|
274
|
+
return { available: false, note: "the installed enact-hook does not support the 'doctor' sub-command yet" };
|
|
275
|
+
}
|
|
276
|
+
return { available: true, exitCode: res.status, stdout: res.stdout ?? "", stderr: res.stderr ?? "" };
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
// ---------------------------------------------------------------------------
|
|
280
|
+
// lock integrity — every managed file present + hash match; every merged
|
|
281
|
+
// JSON entry / TOML block present; lists drifted/missing.
|
|
282
|
+
// ---------------------------------------------------------------------------
|
|
283
|
+
function checkLockIntegrity(repo, name, lock) {
|
|
284
|
+
const missingFiles = [];
|
|
285
|
+
const driftedFiles = [];
|
|
286
|
+
for (const [rel, { sha256: want }] of Object.entries(lock.files)) {
|
|
287
|
+
if (!existsSync(abs(repo, rel))) missingFiles.push(rel);
|
|
288
|
+
else if (fileSha(repo, rel) !== want) driftedFiles.push(rel);
|
|
289
|
+
}
|
|
290
|
+
const jsonIssues = [];
|
|
291
|
+
for (const [rel, record] of Object.entries(lock.merged)) {
|
|
292
|
+
const path = abs(repo, rel);
|
|
293
|
+
if (!existsSync(path)) {
|
|
294
|
+
jsonIssues.push(`${rel} (file missing)`);
|
|
295
|
+
continue;
|
|
296
|
+
}
|
|
297
|
+
let doc;
|
|
298
|
+
try {
|
|
299
|
+
doc = readJsonStrict(path, rel);
|
|
300
|
+
} catch (err) {
|
|
301
|
+
jsonIssues.push(`${rel} (${err instanceof Error ? err.message : String(err)})`);
|
|
302
|
+
continue;
|
|
303
|
+
}
|
|
304
|
+
for (const entry of record.entries) {
|
|
305
|
+
if (!entryPresent(doc, entry)) jsonIssues.push(`${rel} (${entry.path.join(".")})`);
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
const tomlIssues = [];
|
|
309
|
+
for (const [rel, record] of Object.entries(lock.toml)) {
|
|
310
|
+
const path = abs(repo, rel);
|
|
311
|
+
const found = existsSync(path) ? findBlock(readFileSync(path, "utf8"), name) : null;
|
|
312
|
+
if (!found || sha256(found.block) !== record.sha256) tomlIssues.push(rel);
|
|
313
|
+
}
|
|
314
|
+
// Managed symlinks (today: the Claude plugin's skills -> ../../.agents/skills
|
|
315
|
+
// link). These carry no content hash, so `lock.files`-style verification does
|
|
316
|
+
// not reach them: a broken or retargeted link is invisible to every other
|
|
317
|
+
// check here. It is not a cosmetic gap -- a dangling link makes Claude Code
|
|
318
|
+
// report `Skills (0)` while the repo still looks installed, which is exactly
|
|
319
|
+
// the "presence is not armedness" failure AGENTS.md exists to catch. Verify
|
|
320
|
+
// by the link's own mechanism: it must BE a symlink, point where the lock
|
|
321
|
+
// says, and actually resolve.
|
|
322
|
+
//
|
|
323
|
+
// lstatSync, never existsSync: existsSync follows the link and returns false
|
|
324
|
+
// for a dangling one, so it cannot tell "absent" from "present but broken".
|
|
325
|
+
const symlinkIssues = [];
|
|
326
|
+
for (const [rel, record] of Object.entries(lock.symlinks ?? {})) {
|
|
327
|
+
const path = abs(repo, rel);
|
|
328
|
+
const st = lstatSync(path, { throwIfNoEntry: false });
|
|
329
|
+
if (!st) {
|
|
330
|
+
symlinkIssues.push(`${rel} (missing)`);
|
|
331
|
+
continue;
|
|
332
|
+
}
|
|
333
|
+
if (!st.isSymbolicLink()) {
|
|
334
|
+
symlinkIssues.push(`${rel} (not a symlink)`);
|
|
335
|
+
continue;
|
|
336
|
+
}
|
|
337
|
+
const target = readlinkSync(path);
|
|
338
|
+
if (target !== record.target) {
|
|
339
|
+
symlinkIssues.push(`${rel} (target is ${target}, expected ${record.target})`);
|
|
340
|
+
continue;
|
|
341
|
+
}
|
|
342
|
+
if (!existsSync(path)) symlinkIssues.push(`${rel} (dangling -> ${target})`);
|
|
343
|
+
}
|
|
344
|
+
const valid =
|
|
345
|
+
missingFiles.length === 0 &&
|
|
346
|
+
driftedFiles.length === 0 &&
|
|
347
|
+
jsonIssues.length === 0 &&
|
|
348
|
+
tomlIssues.length === 0 &&
|
|
349
|
+
symlinkIssues.length === 0;
|
|
350
|
+
return { valid, missingFiles, driftedFiles, jsonIssues, tomlIssues, symlinkIssues };
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
// ---------------------------------------------------------------------------
|
|
354
|
+
// per-host status
|
|
355
|
+
// ---------------------------------------------------------------------------
|
|
356
|
+
function checkHosts(repo, lock, home, contentOutdated) {
|
|
357
|
+
const hosts = {};
|
|
358
|
+
for (const host of REPO_HOSTS) {
|
|
359
|
+
const targeted = lock.hosts.includes(host);
|
|
360
|
+
if (host === "claude") {
|
|
361
|
+
const present = !targeted || (existsSync(abs(repo, ".claude-plugin/marketplace.json")) && existsSync(abs(repo, ".claude/settings.json")));
|
|
362
|
+
hosts.claude = {
|
|
363
|
+
targeted,
|
|
364
|
+
present,
|
|
365
|
+
note: targeted
|
|
366
|
+
? "loads only after you TRUST this folder in Claude Code -- the marketplace registers on first launch; if hooks/skills are missing in that FIRST session, start a NEW session in this folder"
|
|
367
|
+
: "not targeted by this install",
|
|
368
|
+
};
|
|
369
|
+
} else if (host === "codex") {
|
|
370
|
+
const present = !targeted || existsSync(abs(repo, ".codex/hooks.json")) || existsSync(abs(repo, ".codex/config.toml"));
|
|
371
|
+
hosts.codex = {
|
|
372
|
+
targeted,
|
|
373
|
+
present,
|
|
374
|
+
trust: checkCodexTrust(repo, home),
|
|
375
|
+
note: targeted
|
|
376
|
+
? "config/hooks load only after you trust this project; hooks review (/hooks) is pending until you review them in Codex"
|
|
377
|
+
: "not targeted by this install",
|
|
378
|
+
};
|
|
379
|
+
} else if (host === "cursor") {
|
|
380
|
+
const present = !targeted || existsSync(abs(repo, ".cursor/hooks.json")) || existsSync(abs(repo, ".cursor/mcp.json"));
|
|
381
|
+
hosts.cursor = {
|
|
382
|
+
targeted,
|
|
383
|
+
present,
|
|
384
|
+
note: targeted
|
|
385
|
+
? "Cursor prompts for MCP server approval on first use -- approve code-review-graph/lean-ctx in Cursor's MCP settings"
|
|
386
|
+
: "not targeted by this install",
|
|
387
|
+
};
|
|
388
|
+
} else if (host === "kimi") {
|
|
389
|
+
const present = !targeted || existsSync(abs(repo, ".kimi-code/mcp.json"));
|
|
390
|
+
const globalHooks = checkKimiGlobalHooks(home);
|
|
391
|
+
hosts.kimi = {
|
|
392
|
+
targeted,
|
|
393
|
+
present,
|
|
394
|
+
globalHooksInstalled: globalHooks.hooksBlockPresent,
|
|
395
|
+
globalHooksNote: !globalHooks.configFound
|
|
396
|
+
? `${globalHooks.configPath} not found`
|
|
397
|
+
: globalHooks.hooksBlockPresent
|
|
398
|
+
? "global Kimi hooks block present (owned + installed by enact-vps)"
|
|
399
|
+
: `global Kimi hooks block ("${KIMI_HOOKS_MARKER}") not found in ${globalHooks.configPath} -- hooks are global-only and enact-vps-owned; this repo install never writes them`,
|
|
400
|
+
workspaceTrust: checkKimiWorkspaceTrust(repo),
|
|
401
|
+
};
|
|
402
|
+
} else if (host === "opencode") {
|
|
403
|
+
const rel = `.opencode/plugins/${lock.plugin}.ts`;
|
|
404
|
+
const present = !targeted || existsSync(abs(repo, rel));
|
|
405
|
+
const generatedFromCurrentBundle = targeted && present ? !contentOutdated.includes(rel) : null;
|
|
406
|
+
hosts.opencode = {
|
|
407
|
+
targeted,
|
|
408
|
+
present,
|
|
409
|
+
generatedFromCurrentBundle,
|
|
410
|
+
note: targeted ? "one generated plugin file; re-run install after a bundle update to regenerate it" : "not targeted by this install",
|
|
411
|
+
};
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
return hosts;
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
// ---------------------------------------------------------------------------
|
|
418
|
+
// managed-repo marker
|
|
419
|
+
// ---------------------------------------------------------------------------
|
|
420
|
+
function checkMarker(repo) {
|
|
421
|
+
const path = abs(repo, CONFIG_PATH);
|
|
422
|
+
const base = { path: CONFIG_PATH };
|
|
423
|
+
if (!existsSync(path)) {
|
|
424
|
+
return {
|
|
425
|
+
...base,
|
|
426
|
+
present: false,
|
|
427
|
+
parses: false,
|
|
428
|
+
extensionsPresent: false,
|
|
429
|
+
valid: false,
|
|
430
|
+
note: "missing -- enact-hook only acts in repos containing this file; re-run install",
|
|
431
|
+
};
|
|
432
|
+
}
|
|
433
|
+
let doc;
|
|
434
|
+
try {
|
|
435
|
+
doc = TOML.parse(readFileSync(path, "utf8"));
|
|
436
|
+
} catch (err) {
|
|
437
|
+
return {
|
|
438
|
+
...base,
|
|
439
|
+
present: true,
|
|
440
|
+
parses: false,
|
|
441
|
+
extensionsPresent: false,
|
|
442
|
+
valid: false,
|
|
443
|
+
note: `cannot parse: ${err instanceof Error ? err.message : String(err)}`,
|
|
444
|
+
};
|
|
445
|
+
}
|
|
446
|
+
// `[extensions]` is the marker: its presence is what makes a repo
|
|
447
|
+
// enact-hook-managed, and its sub-tables are the declared extension set.
|
|
448
|
+
const extensionsPresent = doc.extensions !== undefined;
|
|
449
|
+
const declared = extensionsPresent
|
|
450
|
+
? Object.entries(doc.extensions).filter(([, v]) => v && typeof v === "object" && !Array.isArray(v)).map(([k]) => k)
|
|
451
|
+
: [];
|
|
452
|
+
return {
|
|
453
|
+
...base,
|
|
454
|
+
present: true,
|
|
455
|
+
parses: true,
|
|
456
|
+
extensionsPresent,
|
|
457
|
+
declared,
|
|
458
|
+
valid: extensionsPresent,
|
|
459
|
+
note: extensionsPresent ? undefined : "present but has no [extensions] table -- re-run install",
|
|
460
|
+
};
|
|
461
|
+
}
|
|
462
|
+
|
|
463
|
+
// Existence check only: the old marker is never read (HARDCUT, no dual-read).
|
|
464
|
+
function checkStaleMarker(repo) {
|
|
465
|
+
const present = existsSync(abs(repo, STALE_MARKER_PATH));
|
|
466
|
+
return {
|
|
467
|
+
path: STALE_MARKER_PATH,
|
|
468
|
+
present,
|
|
469
|
+
note: present ? `stale leftover from the pre-${CONFIG_PATH} installer; nothing reads it -- safe to delete` : undefined,
|
|
470
|
+
};
|
|
471
|
+
}
|
|
472
|
+
|
|
473
|
+
// ---------------------------------------------------------------------------
|
|
474
|
+
// entrypoint
|
|
475
|
+
// ---------------------------------------------------------------------------
|
|
476
|
+
export function runRepoDoctor(pluginRoot, options = {}) {
|
|
477
|
+
// Derived from the bundle being doctored, never hardcoded: any plugin is
|
|
478
|
+
// installable from the CLI, so doctoring `enact-loop` must read
|
|
479
|
+
// `.agents/enact-loop.lock.json`, not enact-repo's. A hardcoded name here
|
|
480
|
+
// reported "not installed" for a plugin that was installed perfectly well.
|
|
481
|
+
const name = readBundle(pluginRoot).name;
|
|
482
|
+
const repo = resolveRepoRoot(options.repo);
|
|
483
|
+
const home = options.home ?? homedir();
|
|
484
|
+
const problems = [];
|
|
485
|
+
|
|
486
|
+
const lock = readLock(repo, name);
|
|
487
|
+
if (!lock) {
|
|
488
|
+
return {
|
|
489
|
+
name,
|
|
490
|
+
repo,
|
|
491
|
+
installed: false,
|
|
492
|
+
problems: [`${name} is not installed in ${repo} (no ${lockRel(name)}) -- install with: enact-extensions install ${name} --repo ${repo}`],
|
|
493
|
+
exitCode: 1,
|
|
494
|
+
};
|
|
495
|
+
}
|
|
496
|
+
|
|
497
|
+
let bundle = null;
|
|
498
|
+
let bundleError = null;
|
|
499
|
+
try {
|
|
500
|
+
bundle = readBundle(pluginRoot);
|
|
501
|
+
} catch (err) {
|
|
502
|
+
bundleError = err instanceof Error ? err.message : String(err);
|
|
503
|
+
}
|
|
504
|
+
|
|
505
|
+
let contentOutdated = [];
|
|
506
|
+
if (bundle) {
|
|
507
|
+
try {
|
|
508
|
+
const currentHashes = computeCurrentPlanHashes(pluginRoot, bundle, lock.hosts, repo);
|
|
509
|
+
for (const [rel, want] of currentHashes) {
|
|
510
|
+
const have = lock.files[rel]?.sha256;
|
|
511
|
+
if (have && have !== want) contentOutdated.push(rel);
|
|
512
|
+
}
|
|
513
|
+
} catch {
|
|
514
|
+
// Best-effort enrichment only; lock-integrity below is the hard check.
|
|
515
|
+
contentOutdated = [];
|
|
516
|
+
}
|
|
517
|
+
}
|
|
518
|
+
|
|
519
|
+
const version = {
|
|
520
|
+
installed: lock.version,
|
|
521
|
+
bundle: bundle ? bundle.version : null,
|
|
522
|
+
outdated: bundle ? bundle.version !== lock.version : null,
|
|
523
|
+
contentOutdated,
|
|
524
|
+
note: bundleError,
|
|
525
|
+
};
|
|
526
|
+
|
|
527
|
+
const lockIntegrity = checkLockIntegrity(repo, name, lock);
|
|
528
|
+
if (!lockIntegrity.valid) {
|
|
529
|
+
problems.push(
|
|
530
|
+
`lock integrity: ${lockIntegrity.missingFiles.length} missing + ${lockIntegrity.driftedFiles.length} drifted managed file(s), ` +
|
|
531
|
+
`${lockIntegrity.jsonIssues.length} json + ${lockIntegrity.tomlIssues.length} toml + ` +
|
|
532
|
+
`${lockIntegrity.symlinkIssues.length} symlink issue(s) -- ` +
|
|
533
|
+
`re-run "install --force" to repair or "uninstall --force" to remove`,
|
|
534
|
+
);
|
|
535
|
+
}
|
|
536
|
+
|
|
537
|
+
const hosts = checkHosts(repo, lock, home, contentOutdated);
|
|
538
|
+
|
|
539
|
+
const binaries = {};
|
|
540
|
+
for (const bin of REQUIRED_BINARIES) binaries[bin] = checkBinary(bin);
|
|
541
|
+
binaries.crg = checkCrgBinary();
|
|
542
|
+
const missingBinaries = Object.entries(binaries)
|
|
543
|
+
.filter(([, v]) => !v.found)
|
|
544
|
+
.map(([k, v]) => v.name ?? k);
|
|
545
|
+
if (missingBinaries.length > 0) {
|
|
546
|
+
problems.push(`missing required global binaries on PATH: ${missingBinaries.join(", ")}`);
|
|
547
|
+
}
|
|
548
|
+
|
|
549
|
+
const marker = checkMarker(repo);
|
|
550
|
+
if (!marker.valid) problems.push(`${CONFIG_PATH}: ${marker.note}`);
|
|
551
|
+
const staleMarker = checkStaleMarker(repo);
|
|
552
|
+
|
|
553
|
+
const hookDoctor = runHookDoctor(repo, binaries["enact-hook"]);
|
|
554
|
+
const hookLogs = checkHookLogs(repo);
|
|
555
|
+
|
|
556
|
+
return {
|
|
557
|
+
name,
|
|
558
|
+
repo,
|
|
559
|
+
installed: true,
|
|
560
|
+
version,
|
|
561
|
+
lock: lockIntegrity,
|
|
562
|
+
hosts,
|
|
563
|
+
binaries,
|
|
564
|
+
marker,
|
|
565
|
+
staleMarker,
|
|
566
|
+
hookDoctor,
|
|
567
|
+
hookLogs,
|
|
568
|
+
problems,
|
|
569
|
+
exitCode: problems.length > 0 ? 1 : 0,
|
|
570
|
+
};
|
|
571
|
+
}
|