godpowers 0.15.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +37 -0
- package/CHANGELOG.md +639 -0
- package/INSPIRATION.md +52 -0
- package/LICENSE +21 -0
- package/README.md +232 -0
- package/SKILL.md +500 -0
- package/agents/god-archaeologist.md +139 -0
- package/agents/god-architect.md +92 -0
- package/agents/god-auditor.md +150 -0
- package/agents/god-browser-tester.md +144 -0
- package/agents/god-context-writer.md +137 -0
- package/agents/god-coordinator.md +138 -0
- package/agents/god-debt-assessor.md +132 -0
- package/agents/god-debugger.md +77 -0
- package/agents/god-deploy-engineer.md +87 -0
- package/agents/god-deps-auditor.md +111 -0
- package/agents/god-design-reviewer.md +137 -0
- package/agents/god-designer.md +171 -0
- package/agents/god-docs-writer.md +102 -0
- package/agents/god-executor.md +76 -0
- package/agents/god-explorer.md +110 -0
- package/agents/god-harden-auditor.md +163 -0
- package/agents/god-incident-investigator.md +144 -0
- package/agents/god-launch-strategist.md +103 -0
- package/agents/god-migration-strategist.md +126 -0
- package/agents/god-observability-engineer.md +76 -0
- package/agents/god-orchestrator.md +728 -0
- package/agents/god-org-context-loader.md +124 -0
- package/agents/god-planner.md +73 -0
- package/agents/god-pm.md +105 -0
- package/agents/god-quality-reviewer.md +74 -0
- package/agents/god-reconciler.md +230 -0
- package/agents/god-reconstructor.md +124 -0
- package/agents/god-repo-scaffolder.md +60 -0
- package/agents/god-retrospective.md +109 -0
- package/agents/god-roadmap-reconciler.md +123 -0
- package/agents/god-roadmap-updater.md +89 -0
- package/agents/god-roadmapper.md +82 -0
- package/agents/god-spec-reviewer.md +70 -0
- package/agents/god-spike-runner.md +119 -0
- package/agents/god-stack-selector.md +93 -0
- package/agents/god-standards-check.md +132 -0
- package/agents/god-storyteller.md +116 -0
- package/agents/god-updater.md +174 -0
- package/bin/install.js +514 -0
- package/extensions/data-pack/README.md +33 -0
- package/extensions/data-pack/agents/god-dashboard-builder.md +66 -0
- package/extensions/data-pack/agents/god-etl-engineer.md +64 -0
- package/extensions/data-pack/agents/god-ml-feature-engineer.md +66 -0
- package/extensions/data-pack/manifest.yaml +39 -0
- package/extensions/data-pack/package.json +42 -0
- package/extensions/data-pack/skills/god-dashboard.md +28 -0
- package/extensions/data-pack/skills/god-etl.md +28 -0
- package/extensions/data-pack/skills/god-ml-feature.md +28 -0
- package/extensions/data-pack/workflows/dashboard-arc.yaml +13 -0
- package/extensions/data-pack/workflows/etl-arc.yaml +13 -0
- package/extensions/data-pack/workflows/ml-feature-arc.yaml +13 -0
- package/extensions/launch-pack/README.md +36 -0
- package/extensions/launch-pack/agents/god-indie-hackers-strategist.md +128 -0
- package/extensions/launch-pack/agents/god-oss-release-strategist.md +125 -0
- package/extensions/launch-pack/agents/god-product-hunt-strategist.md +118 -0
- package/extensions/launch-pack/agents/god-show-hn-strategist.md +113 -0
- package/extensions/launch-pack/manifest.yaml +45 -0
- package/extensions/launch-pack/package.json +41 -0
- package/extensions/launch-pack/skills/god-indie-hackers.md +39 -0
- package/extensions/launch-pack/skills/god-oss-release.md +43 -0
- package/extensions/launch-pack/skills/god-product-hunt.md +41 -0
- package/extensions/launch-pack/skills/god-show-hn.md +40 -0
- package/extensions/launch-pack/workflows/indie-hackers.yaml +13 -0
- package/extensions/launch-pack/workflows/oss-release.yaml +13 -0
- package/extensions/launch-pack/workflows/product-hunt.yaml +13 -0
- package/extensions/launch-pack/workflows/show-hn.yaml +13 -0
- package/extensions/security-pack/README.md +48 -0
- package/extensions/security-pack/agents/god-hipaa-auditor.md +117 -0
- package/extensions/security-pack/agents/god-pci-auditor.md +100 -0
- package/extensions/security-pack/agents/god-soc2-auditor.md +107 -0
- package/extensions/security-pack/manifest.yaml +39 -0
- package/extensions/security-pack/package.json +42 -0
- package/extensions/security-pack/skills/god-hipaa-audit.md +41 -0
- package/extensions/security-pack/skills/god-pci-audit.md +40 -0
- package/extensions/security-pack/skills/god-soc2-audit.md +42 -0
- package/extensions/security-pack/workflows/hipaa-arc.yaml +15 -0
- package/extensions/security-pack/workflows/pci-arc.yaml +15 -0
- package/extensions/security-pack/workflows/soc2-arc.yaml +15 -0
- package/hooks/pre-tool-use.sh +40 -0
- package/hooks/session-start.sh +74 -0
- package/lib/README.md +28 -0
- package/lib/agent-browser-driver.js +215 -0
- package/lib/agent-cache.js +194 -0
- package/lib/agent-validator.js +275 -0
- package/lib/artifact-diff.js +168 -0
- package/lib/artifact-linter.js +142 -0
- package/lib/awesome-design.js +312 -0
- package/lib/browser-bridge.js +209 -0
- package/lib/budget.js +215 -0
- package/lib/checkpoint.js +390 -0
- package/lib/code-scanner.js +262 -0
- package/lib/context-budget.js +170 -0
- package/lib/context-writer.js +348 -0
- package/lib/cost-tracker.js +325 -0
- package/lib/cross-artifact-impact.js +162 -0
- package/lib/cross-repo-linkage.js +150 -0
- package/lib/design-detector.js +167 -0
- package/lib/design-spec.js +348 -0
- package/lib/drift-detector.js +212 -0
- package/lib/event-reader.js +174 -0
- package/lib/events.js +183 -0
- package/lib/extensions.js +257 -0
- package/lib/have-nots-validator.js +647 -0
- package/lib/impact.js +314 -0
- package/lib/impeccable-bridge.js +139 -0
- package/lib/intent.js +177 -0
- package/lib/linkage.js +232 -0
- package/lib/meta-linter.js +263 -0
- package/lib/multi-repo-detector.js +182 -0
- package/lib/otel-exporter.js +308 -0
- package/lib/recipes.js +186 -0
- package/lib/reverse-sync.js +332 -0
- package/lib/review-required.js +224 -0
- package/lib/router.js +278 -0
- package/lib/runtime-audit.js +455 -0
- package/lib/runtime-test.js +309 -0
- package/lib/skillui-bridge.js +216 -0
- package/lib/state-lock.js +201 -0
- package/lib/state.js +142 -0
- package/lib/story-validator.js +301 -0
- package/lib/suite-state.js +220 -0
- package/lib/workflow-parser.js +109 -0
- package/lib/workflow-runner.js +221 -0
- package/package.json +63 -0
- package/references/HAVE-NOTS.md +573 -0
- package/references/building/BUILD-ANTIPATTERNS.md +102 -0
- package/references/building/BUILD-VERTICAL-SLICES.md +75 -0
- package/references/building/BUILD-WAVES.md +61 -0
- package/references/building/README.md +17 -0
- package/references/design/COLOR.md +122 -0
- package/references/design/DESIGN-ANATOMY.md +121 -0
- package/references/design/DESIGN-ANTIPATTERNS.md +108 -0
- package/references/design/INTERACTION.md +148 -0
- package/references/design/MOTION.md +120 -0
- package/references/design/RESPONSIVE.md +157 -0
- package/references/design/SPATIAL.md +109 -0
- package/references/design/TYPOGRAPHY.md +121 -0
- package/references/design/UX-WRITING.md +135 -0
- package/references/orchestration/MODE-DETECTION.md +74 -0
- package/references/orchestration/README.md +18 -0
- package/references/orchestration/SCALE-DETECTION.md +81 -0
- package/references/planning/ARCH-ANATOMY.md +143 -0
- package/references/planning/ARCH-ANTIPATTERNS.md +52 -0
- package/references/planning/PRD-ANATOMY.md +117 -0
- package/references/planning/PRD-ANTIPATTERNS.md +138 -0
- package/references/planning/README.md +16 -0
- package/references/planning/ROADMAP-ANATOMY.md +43 -0
- package/references/planning/ROADMAP-ANTIPATTERNS.md +94 -0
- package/references/planning/STACK-ANATOMY.md +60 -0
- package/references/planning/STACK-ANTIPATTERNS.md +95 -0
- package/references/shared/GLOSSARY.md +80 -0
- package/references/shared/ORCHESTRATORS.md +76 -0
- package/references/shared/README.md +14 -0
- package/references/shipping/DEPLOY-ANTIPATTERNS.md +64 -0
- package/references/shipping/DEPLOY-PATTERNS.md +110 -0
- package/references/shipping/HARDEN-ANTIPATTERNS.md +66 -0
- package/references/shipping/HARDEN-OWASP-WORKSHEETS.md +89 -0
- package/references/shipping/LAUNCH-ANTIPATTERNS.md +68 -0
- package/references/shipping/OBSERVE-ANTIPATTERNS.md +62 -0
- package/references/shipping/OBSERVE-SLO-EXAMPLES.md +107 -0
- package/references/shipping/README.md +18 -0
- package/routing/god-add-backlog.yaml +24 -0
- package/routing/god-add-tests.yaml +27 -0
- package/routing/god-add-todo.yaml +24 -0
- package/routing/god-agent-audit.yaml +24 -0
- package/routing/god-arch.yaml +46 -0
- package/routing/god-archaeology.yaml +28 -0
- package/routing/god-audit.yaml +32 -0
- package/routing/god-budget.yaml +24 -0
- package/routing/god-build-agent.yaml +24 -0
- package/routing/god-build.yaml +46 -0
- package/routing/god-cache-clear.yaml +24 -0
- package/routing/god-check-todos.yaml +24 -0
- package/routing/god-context-scan.yaml +24 -0
- package/routing/god-context.yaml +44 -0
- package/routing/god-cost.yaml +24 -0
- package/routing/god-debug.yaml +28 -0
- package/routing/god-deploy.yaml +34 -0
- package/routing/god-design-impact.yaml +25 -0
- package/routing/god-design.yaml +67 -0
- package/routing/god-discuss.yaml +27 -0
- package/routing/god-docs.yaml +33 -0
- package/routing/god-doctor.yaml +27 -0
- package/routing/god-explore.yaml +27 -0
- package/routing/god-extension-add.yaml +24 -0
- package/routing/god-extension-info.yaml +24 -0
- package/routing/god-extension-list.yaml +24 -0
- package/routing/god-extension-remove.yaml +24 -0
- package/routing/god-extract-learnings.yaml +24 -0
- package/routing/god-fast.yaml +27 -0
- package/routing/god-feature.yaml +34 -0
- package/routing/god-graph.yaml +24 -0
- package/routing/god-harden.yaml +41 -0
- package/routing/god-help.yaml +27 -0
- package/routing/god-hotfix.yaml +34 -0
- package/routing/god-hygiene.yaml +28 -0
- package/routing/god-init.yaml +37 -0
- package/routing/god-intel.yaml +24 -0
- package/routing/god-launch.yaml +41 -0
- package/routing/god-lifecycle.yaml +27 -0
- package/routing/god-link.yaml +24 -0
- package/routing/god-lint.yaml +24 -0
- package/routing/god-list-assumptions.yaml +27 -0
- package/routing/god-locate.yaml +24 -0
- package/routing/god-logs.yaml +24 -0
- package/routing/god-map-codebase.yaml +24 -0
- package/routing/god-metrics.yaml +24 -0
- package/routing/god-mode.yaml +31 -0
- package/routing/god-next.yaml +27 -0
- package/routing/god-note.yaml +24 -0
- package/routing/god-observe.yaml +34 -0
- package/routing/god-org-context.yaml +28 -0
- package/routing/god-party.yaml +24 -0
- package/routing/god-pause-work.yaml +27 -0
- package/routing/god-plant-seed.yaml +24 -0
- package/routing/god-postmortem.yaml +34 -0
- package/routing/god-pr-branch.yaml +25 -0
- package/routing/god-prd.yaml +49 -0
- package/routing/god-quick.yaml +28 -0
- package/routing/god-reconcile.yaml +48 -0
- package/routing/god-reconstruct.yaml +36 -0
- package/routing/god-redo.yaml +27 -0
- package/routing/god-refactor.yaml +36 -0
- package/routing/god-repair.yaml +27 -0
- package/routing/god-repo.yaml +35 -0
- package/routing/god-restore.yaml +27 -0
- package/routing/god-resume-work.yaml +27 -0
- package/routing/god-review-changes.yaml +25 -0
- package/routing/god-review.yaml +28 -0
- package/routing/god-roadmap-check.yaml +39 -0
- package/routing/god-roadmap-update.yaml +37 -0
- package/routing/god-roadmap.yaml +42 -0
- package/routing/god-rollback.yaml +27 -0
- package/routing/god-scan.yaml +24 -0
- package/routing/god-set-profile.yaml +24 -0
- package/routing/god-settings.yaml +24 -0
- package/routing/god-skip.yaml +27 -0
- package/routing/god-smite.yaml +29 -0
- package/routing/god-spike.yaml +35 -0
- package/routing/god-sprint.yaml +25 -0
- package/routing/god-stack.yaml +41 -0
- package/routing/god-standards.yaml +24 -0
- package/routing/god-status.yaml +27 -0
- package/routing/god-stories.yaml +24 -0
- package/routing/god-story-build.yaml +25 -0
- package/routing/god-story-close.yaml +25 -0
- package/routing/god-story-verify.yaml +25 -0
- package/routing/god-story.yaml +24 -0
- package/routing/god-suite-init.yaml +24 -0
- package/routing/god-suite-patch.yaml +25 -0
- package/routing/god-suite-release.yaml +25 -0
- package/routing/god-suite-status.yaml +25 -0
- package/routing/god-suite-sync.yaml +25 -0
- package/routing/god-sync.yaml +33 -0
- package/routing/god-tech-debt.yaml +32 -0
- package/routing/god-test-extension.yaml +24 -0
- package/routing/god-test-runtime.yaml +25 -0
- package/routing/god-thread.yaml +24 -0
- package/routing/god-trace.yaml +24 -0
- package/routing/god-undo.yaml +27 -0
- package/routing/god-update-deps.yaml +39 -0
- package/routing/god-upgrade.yaml +33 -0
- package/routing/god-version.yaml +24 -0
- package/routing/god-workstream.yaml +24 -0
- package/routing/god.yaml +24 -0
- package/routing/recipes/add-feature-defer-current-milestone.yaml +21 -0
- package/routing/recipes/add-feature-future-conditional.yaml +21 -0
- package/routing/recipes/add-feature-mid-arc-pause.yaml +33 -0
- package/routing/recipes/add-feature-next-milestone.yaml +23 -0
- package/routing/recipes/add-feature-parallel.yaml +29 -0
- package/routing/recipes/add-feature-prd-update.yaml +21 -0
- package/routing/recipes/add-feature-small.yaml +24 -0
- package/routing/recipes/add-feature-tiny.yaml +24 -0
- package/routing/recipes/bluefield-org-aware.yaml +27 -0
- package/routing/recipes/broken-install.yaml +22 -0
- package/routing/recipes/brownfield-onboarding.yaml +32 -0
- package/routing/recipes/bug-no-urgency.yaml +21 -0
- package/routing/recipes/capture-idea.yaml +22 -0
- package/routing/recipes/capture-todo.yaml +21 -0
- package/routing/recipes/clean-pr.yaml +21 -0
- package/routing/recipes/code-cleanup.yaml +23 -0
- package/routing/recipes/docs-drift.yaml +21 -0
- package/routing/recipes/existing-codebase-onboarding.yaml +32 -0
- package/routing/recipes/extract-learnings.yaml +22 -0
- package/routing/recipes/greenfield-fast.yaml +25 -0
- package/routing/recipes/greenfield-manual.yaml +32 -0
- package/routing/recipes/greenfield-with-ideation.yaml +29 -0
- package/routing/recipes/incident-postmortem.yaml +24 -0
- package/routing/recipes/major-framework-upgrade.yaml +23 -0
- package/routing/recipes/monthly-deps.yaml +22 -0
- package/routing/recipes/multi-repo-suite.yaml +56 -0
- package/routing/recipes/parallel-engineers.yaml +26 -0
- package/routing/recipes/pause-handoff.yaml +21 -0
- package/routing/recipes/production-broken.yaml +26 -0
- package/routing/recipes/rerun-tier.yaml +21 -0
- package/routing/recipes/returning-after-break.yaml +31 -0
- package/routing/recipes/state-drift.yaml +21 -0
- package/routing/recipes/undo-last.yaml +21 -0
- package/routing/recipes/weekly-health-check.yaml +24 -0
- package/routing/recipes/whats-next.yaml +22 -0
- package/routing/recipes/where-am-i.yaml +21 -0
- package/schema/events.v1.json +63 -0
- package/schema/extension-manifest.v1.json +84 -0
- package/schema/intent.v1.yaml.json +116 -0
- package/schema/recipe.v1.json +120 -0
- package/schema/routing.v1.json +163 -0
- package/schema/state.v1.json +146 -0
- package/schema/workflow.v1.json +96 -0
- package/skills/god-add-backlog.md +40 -0
- package/skills/god-add-tests.md +53 -0
- package/skills/god-add-todo.md +32 -0
- package/skills/god-agent-audit.md +87 -0
- package/skills/god-arch.md +81 -0
- package/skills/god-archaeology.md +48 -0
- package/skills/god-audit.md +65 -0
- package/skills/god-budget.md +103 -0
- package/skills/god-build-agent.md +91 -0
- package/skills/god-build.md +90 -0
- package/skills/god-cache-clear.md +75 -0
- package/skills/god-check-todos.md +42 -0
- package/skills/god-context-scan.md +125 -0
- package/skills/god-context.md +147 -0
- package/skills/god-cost.md +118 -0
- package/skills/god-debug.md +30 -0
- package/skills/god-deploy.md +76 -0
- package/skills/god-design-impact.md +86 -0
- package/skills/god-design.md +275 -0
- package/skills/god-discuss.md +46 -0
- package/skills/god-docs.md +81 -0
- package/skills/god-doctor.md +94 -0
- package/skills/god-explore.md +50 -0
- package/skills/god-export-otel.md +87 -0
- package/skills/god-extension-add.md +79 -0
- package/skills/god-extension-info.md +75 -0
- package/skills/god-extension-list.md +55 -0
- package/skills/god-extension-remove.md +66 -0
- package/skills/god-extract-learnings.md +60 -0
- package/skills/god-fast.md +47 -0
- package/skills/god-feature.md +114 -0
- package/skills/god-graph.md +56 -0
- package/skills/god-harden.md +106 -0
- package/skills/god-help.md +66 -0
- package/skills/god-hotfix.md +139 -0
- package/skills/god-hygiene.md +104 -0
- package/skills/god-init.md +161 -0
- package/skills/god-intel.md +36 -0
- package/skills/god-launch.md +86 -0
- package/skills/god-lifecycle.md +119 -0
- package/skills/god-link.md +90 -0
- package/skills/god-lint.md +128 -0
- package/skills/god-list-assumptions.md +56 -0
- package/skills/god-locate.md +97 -0
- package/skills/god-logs.md +57 -0
- package/skills/god-map-codebase.md +45 -0
- package/skills/god-metrics.md +51 -0
- package/skills/god-mode.md +159 -0
- package/skills/god-next.md +257 -0
- package/skills/god-note.md +39 -0
- package/skills/god-observe.md +76 -0
- package/skills/god-org-context.md +81 -0
- package/skills/god-party.md +87 -0
- package/skills/god-pause-work.md +64 -0
- package/skills/god-plant-seed.md +59 -0
- package/skills/god-postmortem.md +103 -0
- package/skills/god-pr-branch.md +50 -0
- package/skills/god-prd.md +90 -0
- package/skills/god-quick.md +50 -0
- package/skills/god-reconcile.md +90 -0
- package/skills/god-reconstruct.md +72 -0
- package/skills/god-redo.md +73 -0
- package/skills/god-refactor.md +137 -0
- package/skills/god-repair.md +82 -0
- package/skills/god-repo.md +49 -0
- package/skills/god-restore.md +91 -0
- package/skills/god-resume-work.md +42 -0
- package/skills/god-review-changes.md +93 -0
- package/skills/god-review.md +52 -0
- package/skills/god-roadmap-check.md +66 -0
- package/skills/god-roadmap-update.md +64 -0
- package/skills/god-roadmap.md +77 -0
- package/skills/god-rollback.md +88 -0
- package/skills/god-scan.md +106 -0
- package/skills/god-set-profile.md +58 -0
- package/skills/god-settings.md +44 -0
- package/skills/god-skip.md +78 -0
- package/skills/god-smite.md +86 -0
- package/skills/god-spike.md +120 -0
- package/skills/god-sprint.md +77 -0
- package/skills/god-stack.md +74 -0
- package/skills/god-standards.md +62 -0
- package/skills/god-status.md +99 -0
- package/skills/god-stories.md +60 -0
- package/skills/god-story-build.md +76 -0
- package/skills/god-story-close.md +82 -0
- package/skills/god-story-verify.md +71 -0
- package/skills/god-story.md +55 -0
- package/skills/god-suite-init.md +75 -0
- package/skills/god-suite-patch.md +64 -0
- package/skills/god-suite-release.md +58 -0
- package/skills/god-suite-status.md +63 -0
- package/skills/god-suite-sync.md +49 -0
- package/skills/god-sync.md +102 -0
- package/skills/god-tech-debt.md +56 -0
- package/skills/god-test-extension.md +87 -0
- package/skills/god-test-runtime.md +144 -0
- package/skills/god-thread.md +39 -0
- package/skills/god-trace.md +50 -0
- package/skills/god-undo.md +68 -0
- package/skills/god-update-deps.md +134 -0
- package/skills/god-upgrade.md +139 -0
- package/skills/god-version.md +37 -0
- package/skills/god-workstream.md +61 -0
- package/skills/god.md +207 -0
- package/templates/ARCH.md +99 -0
- package/templates/DEPS-AUDIT.md +66 -0
- package/templates/DESIGN.md +71 -0
- package/templates/DOCS-UPDATE-LOG.md +64 -0
- package/templates/HARDEN-FINDINGS.md +69 -0
- package/templates/MIGRATION.md +86 -0
- package/templates/POSTMORTEM.md +88 -0
- package/templates/PRD.md +80 -0
- package/templates/PROGRESS.md +49 -0
- package/templates/ROADMAP.md +47 -0
- package/templates/SPIKE.md +72 -0
- package/templates/STACK-DECISION.md +61 -0
- package/workflows/audit-only.yaml +22 -0
- package/workflows/bluefield-arc.yaml +87 -0
- package/workflows/brownfield-arc.yaml +44 -0
- package/workflows/deps-audit.yaml +56 -0
- package/workflows/docs-arc.yaml +22 -0
- package/workflows/feature-arc.yaml +59 -0
- package/workflows/full-arc.yaml +84 -0
- package/workflows/hotfix-arc.yaml +59 -0
- package/workflows/hygiene.yaml +43 -0
- package/workflows/migration-arc.yaml +73 -0
- package/workflows/postmortem.yaml +31 -0
- package/workflows/refactor-arc.yaml +59 -0
- package/workflows/spike.yaml +23 -0
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extensions Manager
|
|
3
|
+
*
|
|
4
|
+
* Install, list, info, remove godpowers extension packs. Validates each
|
|
5
|
+
* manifest against schema/extension-manifest.v1.json. Enforces a
|
|
6
|
+
* capability handshake: an extension's `engines.godpowers` range must
|
|
7
|
+
* include the running godpowers version, or install is rejected.
|
|
8
|
+
*
|
|
9
|
+
* Extensions live under `<runtime>/godpowers-extensions/<pack-name>/`.
|
|
10
|
+
* Each pack has a `manifest.yaml`, plus copies of its agents/, skills/,
|
|
11
|
+
* workflows/, and any have-nots additions. Lazy activation means the
|
|
12
|
+
* pack's content is not loaded by the orchestrator until a skill from
|
|
13
|
+
* the pack is invoked.
|
|
14
|
+
*
|
|
15
|
+
* Public API:
|
|
16
|
+
* extensionsDir(runtimeConfigDir) -> string
|
|
17
|
+
* parseManifest(yamlText) -> { manifest, errors }
|
|
18
|
+
* validateManifest(manifest, godpowersVersion) -> errors[]
|
|
19
|
+
* list(runtimeConfigDir) -> [{ name, version, path }]
|
|
20
|
+
* info(runtimeConfigDir, packName) -> { manifest, ... }
|
|
21
|
+
* install(runtimeConfigDir, sourceDir, godpowersVersion) -> { installed, path }
|
|
22
|
+
* remove(runtimeConfigDir, packName) -> { removed, path }
|
|
23
|
+
* isCompatible(range, version) -> bool
|
|
24
|
+
*/
|
|
25
|
+
|
|
26
|
+
const fs = require('fs');
|
|
27
|
+
const path = require('path');
|
|
28
|
+
|
|
29
|
+
const intentLib = require('./intent'); // reuses parseSimpleYaml
|
|
30
|
+
|
|
31
|
+
function extensionsDir(runtimeConfigDir) {
|
|
32
|
+
return path.join(runtimeConfigDir, 'godpowers-extensions');
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Parse an extension manifest YAML. Returns { manifest, errors }.
|
|
37
|
+
*/
|
|
38
|
+
function parseManifest(yamlText) {
|
|
39
|
+
if (typeof yamlText !== 'string' || !yamlText.trim()) {
|
|
40
|
+
return { manifest: null, errors: ['empty manifest'] };
|
|
41
|
+
}
|
|
42
|
+
try {
|
|
43
|
+
const manifest = intentLib.parseSimpleYaml(yamlText);
|
|
44
|
+
return { manifest, errors: [] };
|
|
45
|
+
} catch (e) {
|
|
46
|
+
return { manifest: null, errors: ['parse error: ' + e.message] };
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Validate manifest shape + compatibility.
|
|
52
|
+
*/
|
|
53
|
+
function validateManifest(manifest, godpowersVersion) {
|
|
54
|
+
const errors = [];
|
|
55
|
+
if (!manifest) return ['null manifest'];
|
|
56
|
+
if (manifest.apiVersion !== 'godpowers/v1') {
|
|
57
|
+
errors.push("apiVersion must be 'godpowers/v1'");
|
|
58
|
+
}
|
|
59
|
+
if (manifest.kind !== 'Extension') {
|
|
60
|
+
errors.push("kind must be 'Extension'");
|
|
61
|
+
}
|
|
62
|
+
if (!manifest.metadata || !manifest.metadata.name) {
|
|
63
|
+
errors.push('metadata.name required');
|
|
64
|
+
} else if (!/^@[a-z0-9-]+\/[a-z0-9-]+$/.test(manifest.metadata.name)) {
|
|
65
|
+
errors.push(`metadata.name must be scoped npm-style; got '${manifest.metadata.name}'`);
|
|
66
|
+
}
|
|
67
|
+
if (!manifest.metadata || !manifest.metadata.version) {
|
|
68
|
+
errors.push('metadata.version required');
|
|
69
|
+
} else if (!/^\d+\.\d+\.\d+$/.test(manifest.metadata.version)) {
|
|
70
|
+
errors.push(`metadata.version must be SemVer; got '${manifest.metadata.version}'`);
|
|
71
|
+
}
|
|
72
|
+
if (!manifest.engines || !manifest.engines.godpowers) {
|
|
73
|
+
errors.push('engines.godpowers required');
|
|
74
|
+
} else if (godpowersVersion && !isCompatible(manifest.engines.godpowers, godpowersVersion)) {
|
|
75
|
+
errors.push(`engines.godpowers '${manifest.engines.godpowers}' does not satisfy running godpowers ${godpowersVersion}`);
|
|
76
|
+
}
|
|
77
|
+
if (!manifest.provides) {
|
|
78
|
+
errors.push('provides required');
|
|
79
|
+
}
|
|
80
|
+
return errors;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Minimal SemVer range check. Supports:
|
|
85
|
+
* '>=X.Y.Z'
|
|
86
|
+
* '>=X.Y.Z <A.B.C'
|
|
87
|
+
* '^X.Y.Z'
|
|
88
|
+
* '~X.Y.Z'
|
|
89
|
+
* 'X.Y.Z' (exact)
|
|
90
|
+
*
|
|
91
|
+
* Returns true if version satisfies range.
|
|
92
|
+
*/
|
|
93
|
+
function isCompatible(range, version) {
|
|
94
|
+
if (!range || !version) return false;
|
|
95
|
+
const v = parseSemver(version);
|
|
96
|
+
if (!v) return false;
|
|
97
|
+
const r = range.trim();
|
|
98
|
+
|
|
99
|
+
// Exact
|
|
100
|
+
if (/^\d+\.\d+\.\d+$/.test(r)) {
|
|
101
|
+
return r === version;
|
|
102
|
+
}
|
|
103
|
+
// ^X.Y.Z -> >=X.Y.Z <X+1.0.0 (X>0) or >=0.Y.Z <0.Y+1.0 (X==0, Y>0) or =0.0.Z
|
|
104
|
+
if (r.startsWith('^')) {
|
|
105
|
+
const base = parseSemver(r.slice(1));
|
|
106
|
+
if (!base) return false;
|
|
107
|
+
if (base.major > 0) {
|
|
108
|
+
return cmp(v, base) >= 0 && v.major === base.major;
|
|
109
|
+
}
|
|
110
|
+
if (base.minor > 0) {
|
|
111
|
+
return cmp(v, base) >= 0 && v.major === 0 && v.minor === base.minor;
|
|
112
|
+
}
|
|
113
|
+
return cmp(v, base) === 0;
|
|
114
|
+
}
|
|
115
|
+
if (r.startsWith('~')) {
|
|
116
|
+
const base = parseSemver(r.slice(1));
|
|
117
|
+
if (!base) return false;
|
|
118
|
+
return cmp(v, base) >= 0 && v.major === base.major && v.minor === base.minor;
|
|
119
|
+
}
|
|
120
|
+
// Combined: '>=X.Y.Z <A.B.C'
|
|
121
|
+
const parts = r.split(/\s+/);
|
|
122
|
+
return parts.every(p => satisfiesSingle(v, p));
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
function satisfiesSingle(v, expr) {
|
|
126
|
+
const m = expr.match(/^(>=|<=|>|<|=)?(\d+\.\d+\.\d+)$/);
|
|
127
|
+
if (!m) return false;
|
|
128
|
+
const op = m[1] || '=';
|
|
129
|
+
const target = parseSemver(m[2]);
|
|
130
|
+
const c = cmp(v, target);
|
|
131
|
+
switch (op) {
|
|
132
|
+
case '>=': return c >= 0;
|
|
133
|
+
case '<=': return c <= 0;
|
|
134
|
+
case '>': return c > 0;
|
|
135
|
+
case '<': return c < 0;
|
|
136
|
+
case '=': return c === 0;
|
|
137
|
+
}
|
|
138
|
+
return false;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
function parseSemver(s) {
|
|
142
|
+
const m = String(s).match(/^(\d+)\.(\d+)\.(\d+)$/);
|
|
143
|
+
if (!m) return null;
|
|
144
|
+
return { major: +m[1], minor: +m[2], patch: +m[3] };
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
function cmp(a, b) {
|
|
148
|
+
if (a.major !== b.major) return a.major - b.major;
|
|
149
|
+
if (a.minor !== b.minor) return a.minor - b.minor;
|
|
150
|
+
return a.patch - b.patch;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* Read all installed extensions in the runtime.
|
|
155
|
+
*/
|
|
156
|
+
function list(runtimeConfigDir) {
|
|
157
|
+
const dir = extensionsDir(runtimeConfigDir);
|
|
158
|
+
if (!fs.existsSync(dir)) return [];
|
|
159
|
+
const results = [];
|
|
160
|
+
for (const scope of fs.readdirSync(dir)) {
|
|
161
|
+
const scopePath = path.join(dir, scope);
|
|
162
|
+
if (!fs.statSync(scopePath).isDirectory()) continue;
|
|
163
|
+
if (!scope.startsWith('@')) continue;
|
|
164
|
+
for (const name of fs.readdirSync(scopePath)) {
|
|
165
|
+
const packDir = path.join(scopePath, name);
|
|
166
|
+
if (!fs.statSync(packDir).isDirectory()) continue;
|
|
167
|
+
const manifestFile = path.join(packDir, 'manifest.yaml');
|
|
168
|
+
if (!fs.existsSync(manifestFile)) continue;
|
|
169
|
+
const { manifest } = parseManifest(fs.readFileSync(manifestFile, 'utf8'));
|
|
170
|
+
if (!manifest) continue;
|
|
171
|
+
results.push({
|
|
172
|
+
name: manifest.metadata && manifest.metadata.name,
|
|
173
|
+
version: manifest.metadata && manifest.metadata.version,
|
|
174
|
+
path: packDir
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
return results;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
/**
|
|
182
|
+
* Info on a single installed extension by name (e.g. '@godpowers/security-pack').
|
|
183
|
+
*/
|
|
184
|
+
function info(runtimeConfigDir, packName) {
|
|
185
|
+
const all = list(runtimeConfigDir);
|
|
186
|
+
return all.find(e => e.name === packName) || null;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
/**
|
|
190
|
+
* Install an extension from a source directory.
|
|
191
|
+
*
|
|
192
|
+
* sourceDir must contain manifest.yaml. The pack contents (agents,
|
|
193
|
+
* skills, workflows) are copied under
|
|
194
|
+
* <runtime>/godpowers-extensions/<name>/.
|
|
195
|
+
*
|
|
196
|
+
* Returns { installed: true, path } or throws on incompatibility.
|
|
197
|
+
*/
|
|
198
|
+
function install(runtimeConfigDir, sourceDir, godpowersVersion) {
|
|
199
|
+
const manifestFile = path.join(sourceDir, 'manifest.yaml');
|
|
200
|
+
if (!fs.existsSync(manifestFile)) {
|
|
201
|
+
throw new Error(`no manifest.yaml at ${sourceDir}`);
|
|
202
|
+
}
|
|
203
|
+
const { manifest, errors: parseErrors } = parseManifest(
|
|
204
|
+
fs.readFileSync(manifestFile, 'utf8')
|
|
205
|
+
);
|
|
206
|
+
if (parseErrors.length > 0) {
|
|
207
|
+
throw new Error('manifest parse: ' + parseErrors.join('; '));
|
|
208
|
+
}
|
|
209
|
+
const errors = validateManifest(manifest, godpowersVersion);
|
|
210
|
+
if (errors.length > 0) {
|
|
211
|
+
throw new Error('manifest invalid: ' + errors.join('; '));
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
const destDir = path.join(extensionsDir(runtimeConfigDir), manifest.metadata.name);
|
|
215
|
+
fs.mkdirSync(destDir, { recursive: true });
|
|
216
|
+
|
|
217
|
+
// Copy manifest + standard pack subdirs if they exist
|
|
218
|
+
fs.copyFileSync(manifestFile, path.join(destDir, 'manifest.yaml'));
|
|
219
|
+
for (const sub of ['agents', 'skills', 'workflows', 'references']) {
|
|
220
|
+
const src = path.join(sourceDir, sub);
|
|
221
|
+
if (fs.existsSync(src)) {
|
|
222
|
+
copyDirRecursive(src, path.join(destDir, sub));
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
return { installed: true, path: destDir, manifest };
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
function copyDirRecursive(src, dest) {
|
|
229
|
+
fs.mkdirSync(dest, { recursive: true });
|
|
230
|
+
for (const entry of fs.readdirSync(src, { withFileTypes: true })) {
|
|
231
|
+
const s = path.join(src, entry.name);
|
|
232
|
+
const d = path.join(dest, entry.name);
|
|
233
|
+
if (entry.isDirectory()) copyDirRecursive(s, d);
|
|
234
|
+
else fs.copyFileSync(s, d);
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
/**
|
|
239
|
+
* Remove an installed extension by name.
|
|
240
|
+
*/
|
|
241
|
+
function remove(runtimeConfigDir, packName) {
|
|
242
|
+
const e = info(runtimeConfigDir, packName);
|
|
243
|
+
if (!e) return { removed: false, reason: 'not-installed' };
|
|
244
|
+
fs.rmSync(e.path, { recursive: true, force: true });
|
|
245
|
+
return { removed: true, path: e.path };
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
module.exports = {
|
|
249
|
+
extensionsDir,
|
|
250
|
+
parseManifest,
|
|
251
|
+
validateManifest,
|
|
252
|
+
isCompatible,
|
|
253
|
+
list,
|
|
254
|
+
info,
|
|
255
|
+
install,
|
|
256
|
+
remove
|
|
257
|
+
};
|