eai-cli 0.0.0-bootstrap.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/LICENSE +183 -0
- package/NOTICE +4 -0
- package/README.md +14 -0
- package/dist/commands/agent.d.ts +3 -0
- package/dist/commands/agent.d.ts.map +1 -0
- package/dist/commands/agent.js +69 -0
- package/dist/commands/agent.js.map +1 -0
- package/dist/commands/blocks.d.ts +3 -0
- package/dist/commands/blocks.d.ts.map +1 -0
- package/dist/commands/blocks.js +249 -0
- package/dist/commands/blocks.js.map +1 -0
- package/dist/commands/chat.d.ts +6 -0
- package/dist/commands/chat.d.ts.map +1 -0
- package/dist/commands/chat.js +105 -0
- package/dist/commands/chat.js.map +1 -0
- package/dist/commands/deploy.d.ts +36 -0
- package/dist/commands/deploy.d.ts.map +1 -0
- package/dist/commands/deploy.js +712 -0
- package/dist/commands/deploy.js.map +1 -0
- package/dist/commands/dev.d.ts +15 -0
- package/dist/commands/dev.d.ts.map +1 -0
- package/dist/commands/dev.js +133 -0
- package/dist/commands/dev.js.map +1 -0
- package/dist/commands/docs.d.ts +6 -0
- package/dist/commands/docs.d.ts.map +1 -0
- package/dist/commands/docs.js +118 -0
- package/dist/commands/docs.js.map +1 -0
- package/dist/commands/env.d.ts +10 -0
- package/dist/commands/env.d.ts.map +1 -0
- package/dist/commands/env.js +200 -0
- package/dist/commands/env.js.map +1 -0
- package/dist/commands/errors.d.ts +3 -0
- package/dist/commands/errors.d.ts.map +1 -0
- package/dist/commands/errors.js +72 -0
- package/dist/commands/errors.js.map +1 -0
- package/dist/commands/gofer.d.ts +3 -0
- package/dist/commands/gofer.d.ts.map +1 -0
- package/dist/commands/gofer.js +134 -0
- package/dist/commands/gofer.js.map +1 -0
- package/dist/commands/init.d.ts +14 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +1437 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/login.d.ts +7 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +117 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/provision.d.ts +6 -0
- package/dist/commands/provision.d.ts.map +1 -0
- package/dist/commands/provision.js +855 -0
- package/dist/commands/provision.js.map +1 -0
- package/dist/commands/publicapi.d.ts +6 -0
- package/dist/commands/publicapi.d.ts.map +1 -0
- package/dist/commands/publicapi.js +184 -0
- package/dist/commands/publicapi.js.map +1 -0
- package/dist/commands/resources.d.ts +38 -0
- package/dist/commands/resources.d.ts.map +1 -0
- package/dist/commands/resources.js +1010 -0
- package/dist/commands/resources.js.map +1 -0
- package/dist/commands/runtime.d.ts +3 -0
- package/dist/commands/runtime.d.ts.map +1 -0
- package/dist/commands/runtime.js +78 -0
- package/dist/commands/runtime.js.map +1 -0
- package/dist/commands/template.d.ts +3 -0
- package/dist/commands/template.d.ts.map +1 -0
- package/dist/commands/template.js +365 -0
- package/dist/commands/template.js.map +1 -0
- package/dist/commands/tenant.d.ts +45 -0
- package/dist/commands/tenant.d.ts.map +1 -0
- package/dist/commands/tenant.js +1036 -0
- package/dist/commands/tenant.js.map +1 -0
- package/dist/commands/types.d.ts +130 -0
- package/dist/commands/types.d.ts.map +1 -0
- package/dist/commands/types.js +1636 -0
- package/dist/commands/types.js.map +1 -0
- package/dist/commands/update.d.ts +13 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +163 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/commands/user.d.ts +6 -0
- package/dist/commands/user.d.ts.map +1 -0
- package/dist/commands/user.js +359 -0
- package/dist/commands/user.js.map +1 -0
- package/dist/commands/verify.d.ts +40 -0
- package/dist/commands/verify.d.ts.map +1 -0
- package/dist/commands/verify.js +1442 -0
- package/dist/commands/verify.js.map +1 -0
- package/dist/commands/vertical.d.ts +24 -0
- package/dist/commands/vertical.d.ts.map +1 -0
- package/dist/commands/vertical.js +301 -0
- package/dist/commands/vertical.js.map +1 -0
- package/dist/commands/whoami.d.ts +6 -0
- package/dist/commands/whoami.d.ts.map +1 -0
- package/dist/commands/whoami.js +73 -0
- package/dist/commands/whoami.js.map +1 -0
- package/dist/commands/workflow.d.ts +6 -0
- package/dist/commands/workflow.d.ts.map +1 -0
- package/dist/commands/workflow.js +400 -0
- package/dist/commands/workflow.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +272 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/agent-guide.d.ts +24 -0
- package/dist/lib/agent-guide.d.ts.map +1 -0
- package/dist/lib/agent-guide.js +155 -0
- package/dist/lib/agent-guide.js.map +1 -0
- package/dist/lib/api.d.ts +338 -0
- package/dist/lib/api.d.ts.map +1 -0
- package/dist/lib/api.js +991 -0
- package/dist/lib/api.js.map +1 -0
- package/dist/lib/auth.d.ts +65 -0
- package/dist/lib/auth.d.ts.map +1 -0
- package/dist/lib/auth.js +592 -0
- package/dist/lib/auth.js.map +1 -0
- package/dist/lib/azure-cli.d.ts +6 -0
- package/dist/lib/azure-cli.d.ts.map +1 -0
- package/dist/lib/azure-cli.js +13 -0
- package/dist/lib/azure-cli.js.map +1 -0
- package/dist/lib/block-catalog-normalize.d.ts +47 -0
- package/dist/lib/block-catalog-normalize.d.ts.map +1 -0
- package/dist/lib/block-catalog-normalize.js +355 -0
- package/dist/lib/block-catalog-normalize.js.map +1 -0
- package/dist/lib/block-catalog-types.d.ts +111 -0
- package/dist/lib/block-catalog-types.d.ts.map +1 -0
- package/dist/lib/block-catalog-types.js +41 -0
- package/dist/lib/block-catalog-types.js.map +1 -0
- package/dist/lib/block-catalog-utils.d.ts +7 -0
- package/dist/lib/block-catalog-utils.d.ts.map +1 -0
- package/dist/lib/block-catalog-utils.js +47 -0
- package/dist/lib/block-catalog-utils.js.map +1 -0
- package/dist/lib/block-catalog-validation.d.ts +5 -0
- package/dist/lib/block-catalog-validation.d.ts.map +1 -0
- package/dist/lib/block-catalog-validation.js +112 -0
- package/dist/lib/block-catalog-validation.js.map +1 -0
- package/dist/lib/block-catalog.d.ts +3 -0
- package/dist/lib/block-catalog.d.ts.map +1 -0
- package/dist/lib/block-catalog.js +284 -0
- package/dist/lib/block-catalog.js.map +1 -0
- package/dist/lib/cloud-env.d.ts +25 -0
- package/dist/lib/cloud-env.d.ts.map +1 -0
- package/dist/lib/cloud-env.js +79 -0
- package/dist/lib/cloud-env.js.map +1 -0
- package/dist/lib/config.d.ts +116 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +195 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/context.d.ts +43 -0
- package/dist/lib/context.d.ts.map +1 -0
- package/dist/lib/context.js +68 -0
- package/dist/lib/context.js.map +1 -0
- package/dist/lib/error-codes.d.ts +56 -0
- package/dist/lib/error-codes.d.ts.map +1 -0
- package/dist/lib/error-codes.js +211 -0
- package/dist/lib/error-codes.js.map +1 -0
- package/dist/lib/error-guidance/catalog.d.ts +648 -0
- package/dist/lib/error-guidance/catalog.d.ts.map +1 -0
- package/dist/lib/error-guidance/catalog.js +940 -0
- package/dist/lib/error-guidance/catalog.js.map +1 -0
- package/dist/lib/error-guidance/match.d.ts +3 -0
- package/dist/lib/error-guidance/match.d.ts.map +1 -0
- package/dist/lib/error-guidance/match.js +46 -0
- package/dist/lib/error-guidance/match.js.map +1 -0
- package/dist/lib/error-guidance/render.d.ts +5 -0
- package/dist/lib/error-guidance/render.d.ts.map +1 -0
- package/dist/lib/error-guidance/render.js +92 -0
- package/dist/lib/error-guidance/render.js.map +1 -0
- package/dist/lib/error-guidance/types.d.ts +76 -0
- package/dist/lib/error-guidance/types.d.ts.map +1 -0
- package/dist/lib/error-guidance/types.js +2 -0
- package/dist/lib/error-guidance/types.js.map +1 -0
- package/dist/lib/error-guidance/validate.d.ts +3 -0
- package/dist/lib/error-guidance/validate.d.ts.map +1 -0
- package/dist/lib/error-guidance/validate.js +59 -0
- package/dist/lib/error-guidance/validate.js.map +1 -0
- package/dist/lib/gofer-installer.d.ts +32 -0
- package/dist/lib/gofer-installer.d.ts.map +1 -0
- package/dist/lib/gofer-installer.js +589 -0
- package/dist/lib/gofer-installer.js.map +1 -0
- package/dist/lib/gofer-refresh.d.ts +46 -0
- package/dist/lib/gofer-refresh.d.ts.map +1 -0
- package/dist/lib/gofer-refresh.js +536 -0
- package/dist/lib/gofer-refresh.js.map +1 -0
- package/dist/lib/next-route-exports.d.ts +6 -0
- package/dist/lib/next-route-exports.d.ts.map +1 -0
- package/dist/lib/next-route-exports.js +127 -0
- package/dist/lib/next-route-exports.js.map +1 -0
- package/dist/lib/npm.d.ts +2 -0
- package/dist/lib/npm.d.ts.map +1 -0
- package/dist/lib/npm.js +4 -0
- package/dist/lib/npm.js.map +1 -0
- package/dist/lib/object-type-defaults.d.ts +4 -0
- package/dist/lib/object-type-defaults.d.ts.map +1 -0
- package/dist/lib/object-type-defaults.js +72 -0
- package/dist/lib/object-type-defaults.js.map +1 -0
- package/dist/lib/output.d.ts +35 -0
- package/dist/lib/output.d.ts.map +1 -0
- package/dist/lib/output.js +166 -0
- package/dist/lib/output.js.map +1 -0
- package/dist/lib/profile.d.ts +52 -0
- package/dist/lib/profile.d.ts.map +1 -0
- package/dist/lib/profile.js +116 -0
- package/dist/lib/profile.js.map +1 -0
- package/dist/lib/project-manifest.d.ts +42 -0
- package/dist/lib/project-manifest.d.ts.map +1 -0
- package/dist/lib/project-manifest.js +191 -0
- package/dist/lib/project-manifest.js.map +1 -0
- package/dist/lib/resourceapi-bundle.d.ts +33 -0
- package/dist/lib/resourceapi-bundle.d.ts.map +1 -0
- package/dist/lib/resourceapi-bundle.js +79 -0
- package/dist/lib/resourceapi-bundle.js.map +1 -0
- package/dist/lib/runtime-contract.d.ts +84 -0
- package/dist/lib/runtime-contract.d.ts.map +1 -0
- package/dist/lib/runtime-contract.js +318 -0
- package/dist/lib/runtime-contract.js.map +1 -0
- package/dist/lib/schema-builder.d.ts +28 -0
- package/dist/lib/schema-builder.d.ts.map +1 -0
- package/dist/lib/schema-builder.js +69 -0
- package/dist/lib/schema-builder.js.map +1 -0
- package/dist/lib/tenant-context.d.ts +127 -0
- package/dist/lib/tenant-context.d.ts.map +1 -0
- package/dist/lib/tenant-context.js +573 -0
- package/dist/lib/tenant-context.js.map +1 -0
- package/dist/lib/update-check.d.ts +52 -0
- package/dist/lib/update-check.d.ts.map +1 -0
- package/dist/lib/update-check.js +271 -0
- package/dist/lib/update-check.js.map +1 -0
- package/dist/lib/update-maintenance.d.ts +15 -0
- package/dist/lib/update-maintenance.d.ts.map +1 -0
- package/dist/lib/update-maintenance.js +187 -0
- package/dist/lib/update-maintenance.js.map +1 -0
- package/dist/lib/utils.d.ts +23 -0
- package/dist/lib/utils.d.ts.map +1 -0
- package/dist/lib/utils.js +48 -0
- package/dist/lib/utils.js.map +1 -0
- package/dist/lib/workflow-provisioning.d.ts +54 -0
- package/dist/lib/workflow-provisioning.d.ts.map +1 -0
- package/dist/lib/workflow-provisioning.js +281 -0
- package/dist/lib/workflow-provisioning.js.map +1 -0
- package/package.json +51 -0
- package/resources/gofer/.gofer-version +7 -0
- package/resources/gofer/agents-skills/0_gofer_start/SKILL.md +1287 -0
- package/resources/gofer/agents-skills/0a_problem_validation/SKILL.md +429 -0
- package/resources/gofer/agents-skills/10_gofer_cloud/SKILL.md +635 -0
- package/resources/gofer/agents-skills/1_gofer_research/SKILL.md +1159 -0
- package/resources/gofer/agents-skills/2_gofer_specify/SKILL.md +860 -0
- package/resources/gofer/agents-skills/3_gofer_plan/SKILL.md +886 -0
- package/resources/gofer/agents-skills/4_gofer_tasks/SKILL.md +748 -0
- package/resources/gofer/agents-skills/5_gofer_implement/SKILL.md +924 -0
- package/resources/gofer/agents-skills/6_gofer_validate/SKILL.md +2269 -0
- package/resources/gofer/agents-skills/7_gofer_save/SKILL.md +423 -0
- package/resources/gofer/agents-skills/7a_stakeholder_comms/SKILL.md +508 -0
- package/resources/gofer/agents-skills/8_gofer_branding/SKILL.md +315 -0
- package/resources/gofer/agents-skills/9_gofer_tests/SKILL.md +558 -0
- package/resources/gofer/agents-skills/gofer_bootstrap_workspace/SKILL.md +148 -0
- package/resources/gofer/agents-skills/gofer_check_workspace/SKILL.md +119 -0
- package/resources/gofer/agents-skills/gofer_constitution/SKILL.md +612 -0
- package/resources/gofer/agents-skills/gofer_diagnose/SKILL.md +114 -0
- package/resources/gofer/agents-skills/gofer_eai_first_run/SKILL.md +397 -0
- package/resources/gofer/agents-skills/gofer_hydrate/SKILL.md +561 -0
- package/resources/gofer/agents-skills/gofer_personality/SKILL.md +44 -0
- package/resources/gofer/agents-skills/gofer_plan/SKILL.md +40 -0
- package/resources/gofer/agents-skills/gofer_side/SKILL.md +45 -0
- package/resources/gofer/agents-skills/gofer_spec_summary/SKILL.md +112 -0
- package/resources/gofer/agents-skills/gofer_tdd/SKILL.md +112 -0
- package/resources/gofer/agents-skills/gofer_vocabulary/SKILL.md +112 -0
- package/resources/gofer/agents-skills/gofer_zoom_out/SKILL.md +112 -0
- package/resources/gofer/bash-scripts/check-context-health.sh +365 -0
- package/resources/gofer/bash-scripts/check-persona-pack.sh +81 -0
- package/resources/gofer/bash-scripts/check-prerequisites.sh +168 -0
- package/resources/gofer/bash-scripts/common.sh +192 -0
- package/resources/gofer/bash-scripts/create-new-feature.sh +260 -0
- package/resources/gofer/bash-scripts/install-optional-tools.sh +270 -0
- package/resources/gofer/bash-scripts/log-stage.sh +224 -0
- package/resources/gofer/bash-scripts/mark-task-complete.sh +74 -0
- package/resources/gofer/bash-scripts/pipeline-state.sh +306 -0
- package/resources/gofer/bash-scripts/read-failed-approaches.sh +114 -0
- package/resources/gofer/bash-scripts/read-session-memories.sh +96 -0
- package/resources/gofer/bash-scripts/save-checkpoint.sh +407 -0
- package/resources/gofer/bash-scripts/setup-plan.sh +62 -0
- package/resources/gofer/bash-scripts/sync-implementation-status.sh +47 -0
- package/resources/gofer/bash-scripts/update-agent-context.sh +772 -0
- package/resources/gofer/bash-scripts/validate-artifact.sh +335 -0
- package/resources/gofer/bash-scripts/verify-task.sh +384 -0
- package/resources/gofer/bash-scripts/write-failed-approach.sh +110 -0
- package/resources/gofer/bash-scripts/write-periodic-checkpoint.sh +128 -0
- package/resources/gofer/bash-scripts/write-session-memory.sh +118 -0
- package/resources/gofer/claude-agents/assumption-tracker.md +168 -0
- package/resources/gofer/claude-agents/business-metrics-analyzer.md +169 -0
- package/resources/gofer/claude-agents/business-problem-validator.md +168 -0
- package/resources/gofer/claude-agents/codebase-analyzer.md +124 -0
- package/resources/gofer/claude-agents/codebase-locator.md +95 -0
- package/resources/gofer/claude-agents/codebase-pattern-finder.md +180 -0
- package/resources/gofer/claude-agents/comms-writer.md +158 -0
- package/resources/gofer/claude-agents/engineer-review.md +169 -0
- package/resources/gofer/claude-agents/implement-bug-triangulator.md +94 -0
- package/resources/gofer/claude-agents/implement-code-review-council.md +89 -0
- package/resources/gofer/claude-agents/implement-doc-writer.md +89 -0
- package/resources/gofer/claude-agents/implement-error-hardener.md +84 -0
- package/resources/gofer/claude-agents/implement-performance-explorer.md +95 -0
- package/resources/gofer/claude-agents/implement-test-diversifier.md +82 -0
- package/resources/gofer/claude-agents/implement-variant-generator.md +80 -0
- package/resources/gofer/claude-agents/multi-perspective-judge.md +114 -0
- package/resources/gofer/claude-agents/plan-api-comparator.md +90 -0
- package/resources/gofer/claude-agents/plan-architecture-diverger.md +100 -0
- package/resources/gofer/claude-agents/plan-data-model-stress-tester.md +95 -0
- package/resources/gofer/claude-agents/plan-migration-path-finder.md +95 -0
- package/resources/gofer/claude-agents/plan-refactor-rewrite-advisor.md +97 -0
- package/resources/gofer/claude-agents/research-dependency-evaluator.md +106 -0
- package/resources/gofer/claude-agents/research-horizon-scanner.md +100 -0
- package/resources/gofer/claude-agents/research-market-scanner.md +137 -0
- package/resources/gofer/claude-agents/research-perspective-multiplier.md +102 -0
- package/resources/gofer/claude-agents/scope-creep-detector.md +152 -0
- package/resources/gofer/claude-agents/specify-ambiguity-detector.md +95 -0
- package/resources/gofer/claude-agents/specify-journey-stress-tester.md +92 -0
- package/resources/gofer/claude-agents/tasks-cross-cutting-scanner.md +91 -0
- package/resources/gofer/claude-agents/tasks-rollback-planner.md +89 -0
- package/resources/gofer/claude-agents/validate-security-red-team.md +102 -0
- package/resources/gofer/claude-agents/validation-correctness.md +103 -0
- package/resources/gofer/claude-agents/validation-integration.md +129 -0
- package/resources/gofer/claude-agents/validation-performance.md +120 -0
- package/resources/gofer/claude-agents/validation-security.md +115 -0
- package/resources/gofer/claude-agents/validation-standards.md +151 -0
- package/resources/gofer/claude-agents/validation-test-quality.md +146 -0
- package/resources/gofer/claude-agents/visual-bounded-context-writer.md +40 -0
- package/resources/gofer/claude-agents/visual-c4-writer.md +45 -0
- package/resources/gofer/claude-agents/visual-erd-writer.md +34 -0
- package/resources/gofer/claude-agents/visual-heatmap-writer.md +63 -0
- package/resources/gofer/claude-agents/visual-risk-writer.md +64 -0
- package/resources/gofer/claude-commands/0_gofer_start.md +1282 -0
- package/resources/gofer/claude-commands/0a_problem_validation.md +424 -0
- package/resources/gofer/claude-commands/10_gofer_cloud.md +630 -0
- package/resources/gofer/claude-commands/1_gofer_research.md +1154 -0
- package/resources/gofer/claude-commands/2_gofer_specify.md +855 -0
- package/resources/gofer/claude-commands/3_gofer_plan.md +881 -0
- package/resources/gofer/claude-commands/4_gofer_tasks.md +743 -0
- package/resources/gofer/claude-commands/5_gofer_implement.md +919 -0
- package/resources/gofer/claude-commands/6_gofer_validate.md +2264 -0
- package/resources/gofer/claude-commands/7_gofer_save.md +418 -0
- package/resources/gofer/claude-commands/7a_stakeholder_comms.md +503 -0
- package/resources/gofer/claude-commands/8_gofer_branding.md +310 -0
- package/resources/gofer/claude-commands/9_gofer_tests.md +553 -0
- package/resources/gofer/claude-commands/gofer_bootstrap_workspace.md +143 -0
- package/resources/gofer/claude-commands/gofer_check_workspace.md +114 -0
- package/resources/gofer/claude-commands/gofer_constitution.md +607 -0
- package/resources/gofer/claude-commands/gofer_diagnose.md +109 -0
- package/resources/gofer/claude-commands/gofer_eai_first_run.md +392 -0
- package/resources/gofer/claude-commands/gofer_hydrate.md +556 -0
- package/resources/gofer/claude-commands/gofer_personality.md +39 -0
- package/resources/gofer/claude-commands/gofer_plan.md +35 -0
- package/resources/gofer/claude-commands/gofer_side.md +40 -0
- package/resources/gofer/claude-commands/gofer_spec_summary.md +107 -0
- package/resources/gofer/claude-commands/gofer_tdd.md +107 -0
- package/resources/gofer/claude-commands/gofer_vocabulary.md +107 -0
- package/resources/gofer/claude-commands/gofer_zoom_out.md +107 -0
- package/resources/gofer/claude-skills/eai-gofer/SKILL.md +56 -0
- package/resources/gofer/commands/.gitkeep +0 -0
- package/resources/gofer/commands/0_gofer_start.md +1299 -0
- package/resources/gofer/commands/0a_problem_validation.md +405 -0
- package/resources/gofer/commands/10_gofer_cloud.md +611 -0
- package/resources/gofer/commands/1_gofer_research.md +1135 -0
- package/resources/gofer/commands/2_gofer_specify.md +836 -0
- package/resources/gofer/commands/3_gofer_plan.md +862 -0
- package/resources/gofer/commands/4_gofer_tasks.md +724 -0
- package/resources/gofer/commands/5_gofer_implement.md +900 -0
- package/resources/gofer/commands/6_gofer_validate.md +2245 -0
- package/resources/gofer/commands/7_gofer_save.md +399 -0
- package/resources/gofer/commands/7a_stakeholder_comms.md +484 -0
- package/resources/gofer/commands/8_gofer_branding.md +291 -0
- package/resources/gofer/commands/9_gofer_tests.md +534 -0
- package/resources/gofer/commands/gofer_bootstrap_workspace.md +159 -0
- package/resources/gofer/commands/gofer_check_workspace.md +130 -0
- package/resources/gofer/commands/gofer_constitution.md +588 -0
- package/resources/gofer/commands/gofer_diagnose.md +89 -0
- package/resources/gofer/commands/gofer_eai_first_run.md +392 -0
- package/resources/gofer/commands/gofer_hydrate.md +537 -0
- package/resources/gofer/commands/gofer_personality.md +61 -0
- package/resources/gofer/commands/gofer_plan.md +51 -0
- package/resources/gofer/commands/gofer_side.md +56 -0
- package/resources/gofer/commands/gofer_spec_summary.md +87 -0
- package/resources/gofer/commands/gofer_tdd.md +87 -0
- package/resources/gofer/commands/gofer_vocabulary.md +87 -0
- package/resources/gofer/commands/gofer_zoom_out.md +87 -0
- package/resources/gofer/copilot-instructions/gofer-cost.instructions.md +13 -0
- package/resources/gofer/copilot-instructions/language-server.instructions.md +49 -0
- package/resources/gofer/copilot-instructions/typescript.instructions.md +47 -0
- package/resources/gofer/copilot-instructions/vscode-extension.instructions.md +46 -0
- package/resources/gofer/copilot-prompts/0_gofer_start.prompt.md +1308 -0
- package/resources/gofer/copilot-prompts/0a_problem_validation.prompt.md +429 -0
- package/resources/gofer/copilot-prompts/10_gofer_cloud.prompt.md +644 -0
- package/resources/gofer/copilot-prompts/1_gofer_research.prompt.md +1177 -0
- package/resources/gofer/copilot-prompts/2_gofer_specify.prompt.md +878 -0
- package/resources/gofer/copilot-prompts/3_gofer_plan.prompt.md +904 -0
- package/resources/gofer/copilot-prompts/4_gofer_tasks.prompt.md +766 -0
- package/resources/gofer/copilot-prompts/5_gofer_implement.prompt.md +942 -0
- package/resources/gofer/copilot-prompts/6_gofer_validate.prompt.md +2277 -0
- package/resources/gofer/copilot-prompts/7_gofer_save.prompt.md +433 -0
- package/resources/gofer/copilot-prompts/7a_stakeholder_comms.prompt.md +516 -0
- package/resources/gofer/copilot-prompts/8_gofer_branding.prompt.md +323 -0
- package/resources/gofer/copilot-prompts/9_gofer_tests.prompt.md +566 -0
- package/resources/gofer/copilot-prompts/gofer_bootstrap_workspace.prompt.md +161 -0
- package/resources/gofer/copilot-prompts/gofer_check_workspace.prompt.md +132 -0
- package/resources/gofer/copilot-prompts/gofer_constitution.prompt.md +621 -0
- package/resources/gofer/copilot-prompts/gofer_diagnose.prompt.md +127 -0
- package/resources/gofer/copilot-prompts/gofer_eai_first_run.prompt.md +410 -0
- package/resources/gofer/copilot-prompts/gofer_hydrate.prompt.md +571 -0
- package/resources/gofer/copilot-prompts/gofer_personality.prompt.md +57 -0
- package/resources/gofer/copilot-prompts/gofer_plan.prompt.md +53 -0
- package/resources/gofer/copilot-prompts/gofer_side.prompt.md +58 -0
- package/resources/gofer/copilot-prompts/gofer_spec_summary.prompt.md +125 -0
- package/resources/gofer/copilot-prompts/gofer_tdd.prompt.md +125 -0
- package/resources/gofer/copilot-prompts/gofer_vocabulary.prompt.md +125 -0
- package/resources/gofer/copilot-prompts/gofer_zoom_out.prompt.md +125 -0
- package/resources/gofer/gemini/agents/assumption-tracker.md +171 -0
- package/resources/gofer/gemini/agents/business-metrics-analyzer.md +172 -0
- package/resources/gofer/gemini/agents/business-problem-validator.md +171 -0
- package/resources/gofer/gemini/agents/codebase-analyzer.md +127 -0
- package/resources/gofer/gemini/agents/codebase-locator.md +98 -0
- package/resources/gofer/gemini/agents/codebase-pattern-finder.md +183 -0
- package/resources/gofer/gemini/agents/comms-writer.md +161 -0
- package/resources/gofer/gemini/agents/engineer-review.md +172 -0
- package/resources/gofer/gemini/agents/implement-bug-triangulator.md +97 -0
- package/resources/gofer/gemini/agents/implement-code-review-council.md +92 -0
- package/resources/gofer/gemini/agents/implement-doc-writer.md +92 -0
- package/resources/gofer/gemini/agents/implement-error-hardener.md +87 -0
- package/resources/gofer/gemini/agents/implement-performance-explorer.md +98 -0
- package/resources/gofer/gemini/agents/implement-test-diversifier.md +85 -0
- package/resources/gofer/gemini/agents/implement-variant-generator.md +83 -0
- package/resources/gofer/gemini/agents/multi-perspective-judge.md +117 -0
- package/resources/gofer/gemini/agents/plan-api-comparator.md +93 -0
- package/resources/gofer/gemini/agents/plan-architecture-diverger.md +103 -0
- package/resources/gofer/gemini/agents/plan-data-model-stress-tester.md +98 -0
- package/resources/gofer/gemini/agents/plan-migration-path-finder.md +98 -0
- package/resources/gofer/gemini/agents/plan-refactor-rewrite-advisor.md +100 -0
- package/resources/gofer/gemini/agents/research-dependency-evaluator.md +109 -0
- package/resources/gofer/gemini/agents/research-horizon-scanner.md +103 -0
- package/resources/gofer/gemini/agents/research-market-scanner.md +140 -0
- package/resources/gofer/gemini/agents/research-perspective-multiplier.md +105 -0
- package/resources/gofer/gemini/agents/scope-creep-detector.md +155 -0
- package/resources/gofer/gemini/agents/specify-ambiguity-detector.md +98 -0
- package/resources/gofer/gemini/agents/specify-journey-stress-tester.md +95 -0
- package/resources/gofer/gemini/agents/tasks-cross-cutting-scanner.md +94 -0
- package/resources/gofer/gemini/agents/tasks-rollback-planner.md +92 -0
- package/resources/gofer/gemini/agents/validate-security-red-team.md +105 -0
- package/resources/gofer/gemini/agents/validation-correctness.md +106 -0
- package/resources/gofer/gemini/agents/validation-integration.md +132 -0
- package/resources/gofer/gemini/agents/validation-performance.md +123 -0
- package/resources/gofer/gemini/agents/validation-security.md +118 -0
- package/resources/gofer/gemini/agents/validation-standards.md +154 -0
- package/resources/gofer/gemini/agents/validation-test-quality.md +149 -0
- package/resources/gofer/gemini/agents/visual-bounded-context-writer.md +40 -0
- package/resources/gofer/gemini/agents/visual-c4-writer.md +44 -0
- package/resources/gofer/gemini/agents/visual-erd-writer.md +36 -0
- package/resources/gofer/gemini/agents/visual-heatmap-writer.md +63 -0
- package/resources/gofer/gemini/agents/visual-risk-writer.md +64 -0
- package/resources/gofer/gemini/commands/gofer/.gitkeep +0 -0
- package/resources/gofer/gemini/commands/gofer/0_gofer_start.md +1282 -0
- package/resources/gofer/gemini/commands/gofer/0_gofer_start.toml +2 -0
- package/resources/gofer/gemini/commands/gofer/0a_problem_validation.md +424 -0
- package/resources/gofer/gemini/commands/gofer/0a_problem_validation.toml +2 -0
- package/resources/gofer/gemini/commands/gofer/10_gofer_cloud.md +630 -0
- package/resources/gofer/gemini/commands/gofer/10_gofer_cloud.toml +2 -0
- package/resources/gofer/gemini/commands/gofer/1_gofer_research.md +1154 -0
- package/resources/gofer/gemini/commands/gofer/1_gofer_research.toml +2 -0
- package/resources/gofer/gemini/commands/gofer/2_gofer_specify.md +855 -0
- package/resources/gofer/gemini/commands/gofer/2_gofer_specify.toml +2 -0
- package/resources/gofer/gemini/commands/gofer/3_gofer_plan.md +881 -0
- package/resources/gofer/gemini/commands/gofer/3_gofer_plan.toml +2 -0
- package/resources/gofer/gemini/commands/gofer/4_gofer_tasks.md +743 -0
- package/resources/gofer/gemini/commands/gofer/4_gofer_tasks.toml +2 -0
- package/resources/gofer/gemini/commands/gofer/5_gofer_implement.md +919 -0
- package/resources/gofer/gemini/commands/gofer/5_gofer_implement.toml +2 -0
- package/resources/gofer/gemini/commands/gofer/6_gofer_validate.md +2264 -0
- package/resources/gofer/gemini/commands/gofer/6_gofer_validate.toml +2 -0
- package/resources/gofer/gemini/commands/gofer/7_gofer_save.md +418 -0
- package/resources/gofer/gemini/commands/gofer/7_gofer_save.toml +2 -0
- package/resources/gofer/gemini/commands/gofer/7a_stakeholder_comms.md +503 -0
- package/resources/gofer/gemini/commands/gofer/7a_stakeholder_comms.toml +2 -0
- package/resources/gofer/gemini/commands/gofer/8_gofer_branding.md +310 -0
- package/resources/gofer/gemini/commands/gofer/8_gofer_branding.toml +2 -0
- package/resources/gofer/gemini/commands/gofer/9_gofer_tests.md +553 -0
- package/resources/gofer/gemini/commands/gofer/9_gofer_tests.toml +2 -0
- package/resources/gofer/gemini/commands/gofer/gofer_bootstrap_workspace.md +143 -0
- package/resources/gofer/gemini/commands/gofer/gofer_bootstrap_workspace.toml +2 -0
- package/resources/gofer/gemini/commands/gofer/gofer_check_workspace.md +114 -0
- package/resources/gofer/gemini/commands/gofer/gofer_check_workspace.toml +2 -0
- package/resources/gofer/gemini/commands/gofer/gofer_constitution.md +607 -0
- package/resources/gofer/gemini/commands/gofer/gofer_constitution.toml +2 -0
- package/resources/gofer/gemini/commands/gofer/gofer_diagnose.md +109 -0
- package/resources/gofer/gemini/commands/gofer/gofer_diagnose.toml +2 -0
- package/resources/gofer/gemini/commands/gofer/gofer_eai_first_run.md +392 -0
- package/resources/gofer/gemini/commands/gofer/gofer_eai_first_run.toml +2 -0
- package/resources/gofer/gemini/commands/gofer/gofer_hydrate.md +556 -0
- package/resources/gofer/gemini/commands/gofer/gofer_hydrate.toml +2 -0
- package/resources/gofer/gemini/commands/gofer/gofer_personality.md +39 -0
- package/resources/gofer/gemini/commands/gofer/gofer_personality.toml +2 -0
- package/resources/gofer/gemini/commands/gofer/gofer_plan.md +35 -0
- package/resources/gofer/gemini/commands/gofer/gofer_plan.toml +2 -0
- package/resources/gofer/gemini/commands/gofer/gofer_side.md +40 -0
- package/resources/gofer/gemini/commands/gofer/gofer_side.toml +2 -0
- package/resources/gofer/gemini/commands/gofer/gofer_spec_summary.md +107 -0
- package/resources/gofer/gemini/commands/gofer/gofer_spec_summary.toml +2 -0
- package/resources/gofer/gemini/commands/gofer/gofer_tdd.md +107 -0
- package/resources/gofer/gemini/commands/gofer/gofer_tdd.toml +2 -0
- package/resources/gofer/gemini/commands/gofer/gofer_vocabulary.md +107 -0
- package/resources/gofer/gemini/commands/gofer/gofer_vocabulary.toml +2 -0
- package/resources/gofer/gemini/commands/gofer/gofer_zoom_out.md +107 -0
- package/resources/gofer/gemini/commands/gofer/gofer_zoom_out.toml +2 -0
- package/resources/gofer/gemini/commands/gofer/manifest.json +32 -0
- package/resources/gofer/gemini/extension.json +16 -0
- package/resources/gofer/github-agents/gofer-business.agent.md +20 -0
- package/resources/gofer/github-agents/gofer-implement.agent.md +15 -0
- package/resources/gofer/github-agents/gofer-plan.agent.md +15 -0
- package/resources/gofer/github-agents/gofer-research.agent.md +15 -0
- package/resources/gofer/github-agents/gofer-validate.agent.md +10 -0
- package/resources/gofer/github-skills/eai-gofer/SKILL.md +56 -0
- package/resources/gofer/hook-scripts/agent-stop.mjs +655 -0
- package/resources/gofer/hook-scripts/log-stage-launch-time.mjs +77 -0
- package/resources/gofer/hook-scripts/post-tool-use.mjs +333 -0
- package/resources/gofer/hook-scripts/queued-input.mjs +188 -0
- package/resources/gofer/hook-scripts/session-lifecycle.mjs +93 -0
- package/resources/gofer/hook-scripts/user-prompt-submit.mjs +228 -0
- package/resources/gofer/instruction-templates/base/agents-base.md +37 -0
- package/resources/gofer/instruction-templates/base/claude-base.md +7 -0
- package/resources/gofer/instruction-templates/base/copilot-base.md +26 -0
- package/resources/gofer/instruction-templates/gofer/gofer-claude.md +5 -0
- package/resources/gofer/instruction-templates/gofer/gofer-copilot.md +9 -0
- package/resources/gofer/instruction-templates/languages/generic.md +7 -0
- package/resources/gofer/instruction-templates/languages/go.md +8 -0
- package/resources/gofer/instruction-templates/languages/java.md +8 -0
- package/resources/gofer/instruction-templates/languages/python.md +9 -0
- package/resources/gofer/instruction-templates/languages/rust.md +9 -0
- package/resources/gofer/instruction-templates/languages/typescript.md +19 -0
- package/resources/gofer/instruction-templates/workflow/principles.md +52 -0
- package/resources/gofer/memory/constitution.md +391 -0
- package/resources/gofer/memory/context-profiles.yaml +74 -0
- package/resources/gofer/memory/decisions/000-use-adr-for-decisions.md +67 -0
- package/resources/gofer/memory/decisions/001-di-framework.md +190 -0
- package/resources/gofer/memory/decisions/002-module-extraction.md +305 -0
- package/resources/gofer/memory/decisions/003-error-handling.md +368 -0
- package/resources/gofer/memory/decisions/004-cache-eviction.md +436 -0
- package/resources/gofer/memory/decisions/005-constants-management.md +520 -0
- package/resources/gofer/memory/decisions/README.md +129 -0
- package/resources/gofer/memory/diagrams/di-container.mmd +321 -0
- package/resources/gofer/memory/diagrams/extension-activation.mmd +184 -0
- package/resources/gofer/memory/diagrams/module-dependencies.mmd +264 -0
- package/resources/gofer/memory/gofer-model-policy.yaml +97 -0
- package/resources/gofer/memory/lessons.md +46 -0
- package/resources/gofer/node-scripts/canonical-descriptions.mjs +86 -0
- package/resources/gofer/node-scripts/check-version-alignment.mjs +131 -0
- package/resources/gofer/node-scripts/codex-doctor.mjs +425 -0
- package/resources/gofer/node-scripts/generate-commands.mjs +1366 -0
- package/resources/gofer/node-scripts/generate-issues.js +563 -0
- package/resources/gofer/node-scripts/gofer-closed-loop-audit.mjs +893 -0
- package/resources/gofer/node-scripts/gofer-loop-audit.mjs +541 -0
- package/resources/gofer/node-scripts/gofer-performance-report.mjs +306 -0
- package/resources/gofer/node-scripts/gofer-workspace-bootstrap.mjs +56 -0
- package/resources/gofer/node-scripts/gofer-workspace-check.mjs +56 -0
- package/resources/gofer/node-scripts/lib/ai-leverage-tagger.mjs +103 -0
- package/resources/gofer/node-scripts/lib/assemble-stakeholder-pack.mjs +114 -0
- package/resources/gofer/node-scripts/lib/marp-deck.mjs +87 -0
- package/resources/gofer/node-scripts/lib/mermaid-tabular-fallback.mjs +264 -0
- package/resources/gofer/node-scripts/lib/render-visual.mjs +54 -0
- package/resources/gofer/node-scripts/lib/validate-aliases.mjs +85 -0
- package/resources/gofer/node-scripts/lib/visual-counts.mjs +44 -0
- package/resources/gofer/node-scripts/lib/visual-pass-pipeline.mjs +134 -0
- package/resources/gofer/node-scripts/mermaid-export.mjs +72 -0
- package/resources/gofer/node-scripts/package-agent-plugin.mjs +940 -0
- package/resources/gofer/node-scripts/parse-stage-command.mjs +211 -0
- package/resources/gofer/node-scripts/schemas/.gitkeep +0 -0
- package/resources/gofer/node-scripts/schemas/stage-command.schema.json +72 -0
- package/resources/gofer/node-scripts/sync-extension-resources.mjs +110 -0
- package/resources/gofer/node-scripts/workspace-bootstrap-lib.mjs +1166 -0
- package/resources/gofer/powershell-scripts/install-optional-tools.ps1 +214 -0
- package/resources/gofer/references/platform/README.md +17 -0
- package/resources/gofer/references/platform/deployment-repo.md +9 -0
- package/resources/gofer/references/platform/eai-app-template.md +45 -0
- package/resources/gofer/references/platform/eai-config-driven-ui.md +156 -0
- package/resources/gofer/references/platform/eai-error-catalog.yaml +197 -0
- package/resources/gofer/references/platform/eai-repo-contract.md +134 -0
- package/resources/gofer/references/platform/eai-service-patterns.md +56 -0
- package/resources/gofer/references/platform/eai.md +85 -0
- package/resources/gofer/references/platform/vertical-template.md +49 -0
- package/resources/gofer/specify-commands/.gitkeep +0 -0
- package/resources/gofer/specify-commands/0_gofer_start.md +1299 -0
- package/resources/gofer/specify-commands/0a_problem_validation.md +405 -0
- package/resources/gofer/specify-commands/10_gofer_cloud.md +611 -0
- package/resources/gofer/specify-commands/1_gofer_research.md +1135 -0
- package/resources/gofer/specify-commands/2_gofer_specify.md +836 -0
- package/resources/gofer/specify-commands/3_gofer_plan.md +862 -0
- package/resources/gofer/specify-commands/4_gofer_tasks.md +724 -0
- package/resources/gofer/specify-commands/5_gofer_implement.md +900 -0
- package/resources/gofer/specify-commands/6_gofer_validate.md +2245 -0
- package/resources/gofer/specify-commands/7_gofer_save.md +399 -0
- package/resources/gofer/specify-commands/7a_stakeholder_comms.md +484 -0
- package/resources/gofer/specify-commands/8_gofer_branding.md +291 -0
- package/resources/gofer/specify-commands/9_gofer_tests.md +534 -0
- package/resources/gofer/specify-commands/gofer_bootstrap_workspace.md +159 -0
- package/resources/gofer/specify-commands/gofer_check_workspace.md +130 -0
- package/resources/gofer/specify-commands/gofer_constitution.md +588 -0
- package/resources/gofer/specify-commands/gofer_diagnose.md +89 -0
- package/resources/gofer/specify-commands/gofer_eai_first_run.md +392 -0
- package/resources/gofer/specify-commands/gofer_hydrate.md +537 -0
- package/resources/gofer/specify-commands/gofer_personality.md +61 -0
- package/resources/gofer/specify-commands/gofer_plan.md +51 -0
- package/resources/gofer/specify-commands/gofer_side.md +56 -0
- package/resources/gofer/specify-commands/gofer_spec_summary.md +87 -0
- package/resources/gofer/specify-commands/gofer_tdd.md +87 -0
- package/resources/gofer/specify-commands/gofer_vocabulary.md +87 -0
- package/resources/gofer/specify-commands/gofer_zoom_out.md +87 -0
- package/resources/gofer/system-skills/0_gofer_start/SKILL.md +1287 -0
- package/resources/gofer/system-skills/0a_problem_validation/SKILL.md +429 -0
- package/resources/gofer/system-skills/10_gofer_cloud/SKILL.md +635 -0
- package/resources/gofer/system-skills/1_gofer_research/SKILL.md +1159 -0
- package/resources/gofer/system-skills/2_gofer_specify/SKILL.md +860 -0
- package/resources/gofer/system-skills/3_gofer_plan/SKILL.md +886 -0
- package/resources/gofer/system-skills/4_gofer_tasks/SKILL.md +748 -0
- package/resources/gofer/system-skills/5_gofer_implement/SKILL.md +924 -0
- package/resources/gofer/system-skills/6_gofer_validate/SKILL.md +2269 -0
- package/resources/gofer/system-skills/7_gofer_save/SKILL.md +423 -0
- package/resources/gofer/system-skills/7a_stakeholder_comms/SKILL.md +508 -0
- package/resources/gofer/system-skills/8_gofer_branding/SKILL.md +315 -0
- package/resources/gofer/system-skills/9_gofer_tests/SKILL.md +558 -0
- package/resources/gofer/system-skills/gofer_bootstrap_workspace/SKILL.md +148 -0
- package/resources/gofer/system-skills/gofer_check_workspace/SKILL.md +119 -0
- package/resources/gofer/system-skills/gofer_constitution/SKILL.md +612 -0
- package/resources/gofer/system-skills/gofer_diagnose/SKILL.md +114 -0
- package/resources/gofer/system-skills/gofer_eai_first_run/SKILL.md +397 -0
- package/resources/gofer/system-skills/gofer_hydrate/SKILL.md +561 -0
- package/resources/gofer/system-skills/gofer_personality/SKILL.md +44 -0
- package/resources/gofer/system-skills/gofer_plan/SKILL.md +40 -0
- package/resources/gofer/system-skills/gofer_side/SKILL.md +45 -0
- package/resources/gofer/system-skills/gofer_spec_summary/SKILL.md +112 -0
- package/resources/gofer/system-skills/gofer_tdd/SKILL.md +112 -0
- package/resources/gofer/system-skills/gofer_vocabulary/SKILL.md +112 -0
- package/resources/gofer/system-skills/gofer_zoom_out/SKILL.md +112 -0
- package/resources/gofer/templates/agent-file-template.md +28 -0
- package/resources/gofer/templates/assumptions-template.md +94 -0
- package/resources/gofer/templates/audit-history-template.md +35 -0
- package/resources/gofer/templates/brand/brand-profile-template.json +45 -0
- package/resources/gofer/templates/brand/document-style-template.md +50 -0
- package/resources/gofer/templates/brand/marp-theme-template.css +58 -0
- package/resources/gofer/templates/brownfield-analysis.md +44 -0
- package/resources/gofer/templates/business-metrics-template.md +120 -0
- package/resources/gofer/templates/business-owner-summary-template.md +83 -0
- package/resources/gofer/templates/checklist-template.md +40 -0
- package/resources/gofer/templates/ciso-security-summary-template.md +70 -0
- package/resources/gofer/templates/context-bundle-template.md +76 -0
- package/resources/gofer/templates/contract-pack-template.md +109 -0
- package/resources/gofer/templates/cto-architecture-summary-template.md +83 -0
- package/resources/gofer/templates/discovery-template.md +92 -0
- package/resources/gofer/templates/eai-preflight-template.md +144 -0
- package/resources/gofer/templates/goal-ledger-template.json +69 -0
- package/resources/gofer/templates/gofer-model-policy.yaml +97 -0
- package/resources/gofer/templates/issues-template.md +106 -0
- package/resources/gofer/templates/journey/base-journey.md +95 -0
- package/resources/gofer/templates/journey/industry-variants.yaml +277 -0
- package/resources/gofer/templates/loop-contract-template.json +68 -0
- package/resources/gofer/templates/plan-template.md +215 -0
- package/resources/gofer/templates/problem-brief-template.md +85 -0
- package/resources/gofer/templates/proposal-review-template.md +79 -0
- package/resources/gofer/templates/research-template.md +222 -0
- package/resources/gofer/templates/reuse-scan-template.md +43 -0
- package/resources/gofer/templates/sequence-diagrams/option-spectrum.yaml +178 -0
- package/resources/gofer/templates/service-fit-matrix-template.md +29 -0
- package/resources/gofer/templates/session-handoff-template.md +172 -0
- package/resources/gofer/templates/spec-summary-template.md +118 -0
- package/resources/gofer/templates/spec-template.md +196 -0
- package/resources/gofer/templates/stakeholder-comms-template.md +330 -0
- package/resources/gofer/templates/stakeholder-review-index-template.md +54 -0
- package/resources/gofer/templates/tasks-template.md +323 -0
- package/resources/gofer/templates/ui-approval-template.md +32 -0
- package/resources/gofer/templates/ui-preview-brief-template.md +65 -0
- package/resources/gofer/templates/ui-review-log-template.md +11 -0
- package/resources/gofer/templates/visuals/.gitkeep +0 -0
- package/resources/gofer/templates/visuals/bounded-context-map.md +19 -0
- package/resources/gofer/templates/visuals/bounded-context-template.md +47 -0
- package/resources/gofer/templates/visuals/c4-container-template.md +38 -0
- package/resources/gofer/templates/visuals/c4-container.md +20 -0
- package/resources/gofer/templates/visuals/c4-context-template.md +46 -0
- package/resources/gofer/templates/visuals/capability-heatmap-template.md +54 -0
- package/resources/gofer/templates/visuals/data-model-erd-template.md +41 -0
- package/resources/gofer/templates/visuals/erd.md +19 -0
- package/resources/gofer/templates/visuals/impact-canvas.md +40 -0
- package/resources/gofer/templates/visuals/risk-heatmap-template.md +51 -0
- package/resources/gofer/templates/visuals/roi-projection.md +17 -0
- package/resources/gofer/templates/visuals/value-stream-asis.md +16 -0
- package/resources/gofer/templates/visuals/value-stream-tobe.md +18 -0
- package/resources/gofer/templates/working-backwards-prfaq-template.md +165 -0
- package/resources/linked-sources.json +25 -0
|
@@ -0,0 +1,940 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Builds the installable Gofer plugin bundle for supported AI coding apps.
|
|
4
|
+
*
|
|
5
|
+
* Canonical command sources live in `.specify/commands/`. This script stages a
|
|
6
|
+
* portable plugin under `dist/` and, when requested, refreshes the repo-local
|
|
7
|
+
* marketplace plugin under `plugins/eai-gofer/`.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { execFile } from 'node:child_process';
|
|
11
|
+
import { promises as fs } from 'node:fs';
|
|
12
|
+
import path from 'node:path';
|
|
13
|
+
import { promisify } from 'node:util';
|
|
14
|
+
import { parseStageCommand } from './parse-stage-command.mjs';
|
|
15
|
+
|
|
16
|
+
const execFileAsync = promisify(execFile);
|
|
17
|
+
|
|
18
|
+
const GENERATED_MARKER = 'generated-by-eai-gofer';
|
|
19
|
+
const PLUGIN_NAME = 'eai-gofer';
|
|
20
|
+
const PLUGIN_DISPLAY_NAME = 'Gofer';
|
|
21
|
+
const UMBRELLA_SKILLS_DIR = 'plugin-skills';
|
|
22
|
+
const PLUGIN_ICON_SOURCE = 'extension/icon.png';
|
|
23
|
+
const PLUGIN_ICON_TARGET = 'assets/eai-gofer-icon.png';
|
|
24
|
+
const REPOSITORY_URL = 'https://github.com/eai-tools/eai-gofer';
|
|
25
|
+
const PUBLIC_SITE_URL = 'https://eai-tools.github.io/eai-gofer';
|
|
26
|
+
const PUBLIC_RELEASES_URL = `${PUBLIC_SITE_URL}/releases`;
|
|
27
|
+
const PUBLIC_PLUGIN_URL = `${PUBLIC_RELEASES_URL}/plugins/${PLUGIN_NAME}`;
|
|
28
|
+
const CLAUDE_MARKETPLACE_URL = `${PUBLIC_PLUGIN_URL}/claude-marketplace.json`;
|
|
29
|
+
const CODEX_PLUGIN_MANIFEST_URL = `${PUBLIC_PLUGIN_URL}/codex-plugin.json`;
|
|
30
|
+
const COPILOT_MARKETPLACE_URL = `${PUBLIC_PLUGIN_URL}/copilot-marketplace.json`;
|
|
31
|
+
const GEMINI_EXTENSION_URL = `${PUBLIC_PLUGIN_URL}/gemini-extension.json`;
|
|
32
|
+
const WINDOWS_FORBIDDEN_SEGMENT_CHARS = new Set(['<', '>', ':', '"', '\\', '|', '?', '*']);
|
|
33
|
+
const WINDOWS_RESERVED_BASENAME = /^(con|prn|aux|nul|com[1-9]|lpt[1-9])(?:\..*)?$/i;
|
|
34
|
+
const WINDOWS_SAFE_RELATIVE_PATH_LIMIT = 240;
|
|
35
|
+
const PERSONAL_PATH_PATTERN =
|
|
36
|
+
/(^|[\s"'])(\/Users\/[^/\s"']+|\/home\/[^/\s"']+|[A-Za-z]:\\Users\\[^\\\s"']+)/;
|
|
37
|
+
const WORKSPACE_PREFLIGHT_EXCLUDED_COMMANDS = new Set([
|
|
38
|
+
'gofer:plan',
|
|
39
|
+
'gofer:side',
|
|
40
|
+
'gofer:personality',
|
|
41
|
+
'gofer:check-workspace',
|
|
42
|
+
'gofer:bootstrap-workspace',
|
|
43
|
+
'gofer:eai-first-run',
|
|
44
|
+
]);
|
|
45
|
+
|
|
46
|
+
function parseArgs(argv) {
|
|
47
|
+
const args = {
|
|
48
|
+
root: process.cwd(),
|
|
49
|
+
outDir: 'dist',
|
|
50
|
+
version: null,
|
|
51
|
+
syncRepo: false,
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
for (let i = 0; i < argv.length; i++) {
|
|
55
|
+
const arg = argv[i];
|
|
56
|
+
if (arg === '--root' && argv[i + 1]) {
|
|
57
|
+
args.root = argv[++i];
|
|
58
|
+
} else if (arg === '--out-dir' && argv[i + 1]) {
|
|
59
|
+
args.outDir = argv[++i];
|
|
60
|
+
} else if (arg === '--version' && argv[i + 1]) {
|
|
61
|
+
args.version = argv[++i].replace(/^v/, '');
|
|
62
|
+
} else if (arg === '--sync-repo') {
|
|
63
|
+
args.syncRepo = true;
|
|
64
|
+
} else if (arg === '--help' || arg === '-h') {
|
|
65
|
+
args.help = true;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
return args;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
function usage() {
|
|
73
|
+
return [
|
|
74
|
+
'Usage: node .specify/scripts/node/package-agent-plugin.mjs --version <x.y.z>',
|
|
75
|
+
'',
|
|
76
|
+
'Options:',
|
|
77
|
+
' --version <x.y.z> Release/package version to stamp into plugin manifests.',
|
|
78
|
+
' --out-dir <dir> Output directory for the staged folder and zip. Default: dist',
|
|
79
|
+
' --root <dir> Gofer repository root. Default: current working directory',
|
|
80
|
+
' --sync-repo Refresh root manifests and plugins/eai-gofer marketplace bundle.',
|
|
81
|
+
].join('\n');
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
function assertSemver(version) {
|
|
85
|
+
if (!/^\d+\.\d+\.\d+(-[0-9A-Za-z.-]+)?$/.test(version ?? '')) {
|
|
86
|
+
throw new Error(`Plugin version must look like 3.4.0; got '${version ?? ''}'.`);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
async function readJson(filePath) {
|
|
91
|
+
return JSON.parse(await fs.readFile(filePath, 'utf8'));
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
async function loadStages(root) {
|
|
95
|
+
const commandsDir = path.join(root, '.specify', 'commands');
|
|
96
|
+
const entries = (await fs.readdir(commandsDir))
|
|
97
|
+
.filter((entry) => entry.endsWith('.md') && entry !== '.gitkeep')
|
|
98
|
+
.sort((left, right) => left.localeCompare(right, undefined, { numeric: true }));
|
|
99
|
+
|
|
100
|
+
const stages = [];
|
|
101
|
+
for (const entry of entries) {
|
|
102
|
+
const filePath = path.join(commandsDir, entry);
|
|
103
|
+
const parsed = await parseStageCommand(filePath);
|
|
104
|
+
stages.push({
|
|
105
|
+
stem: path.basename(entry, '.md'),
|
|
106
|
+
sourceFile: entry,
|
|
107
|
+
filePath,
|
|
108
|
+
...parsed,
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
return stages;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
function yamlString(value) {
|
|
116
|
+
return JSON.stringify(String(value));
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
function stageNames(stages) {
|
|
120
|
+
return stages.map((stage) => String(stage.frontmatter.name));
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
function buildPublicVsixUrl(version) {
|
|
124
|
+
return `${PUBLIC_RELEASES_URL}/eai-gofer-${version}.vsix`;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
function buildPublicAgentPluginZipUrl(version) {
|
|
128
|
+
return `${PUBLIC_RELEASES_URL}/eai-gofer-agent-plugin-${version}.zip`;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
function buildLatestPublicVsixUrl() {
|
|
132
|
+
return `${PUBLIC_RELEASES_URL}/eai-gofer-latest.vsix`;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
function buildLatestPublicAgentPluginZipUrl() {
|
|
136
|
+
return `${PUBLIC_RELEASES_URL}/eai-gofer-agent-plugin-latest.zip`;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
function buildCodexManifest(version, stages, paths = {}) {
|
|
140
|
+
return {
|
|
141
|
+
name: PLUGIN_NAME,
|
|
142
|
+
version,
|
|
143
|
+
description:
|
|
144
|
+
'Gofer core pipeline and helper commands for Claude, Codex, Copilot, Gemini, and VS Code.',
|
|
145
|
+
author: {
|
|
146
|
+
name: 'EAI Tools',
|
|
147
|
+
url: REPOSITORY_URL,
|
|
148
|
+
},
|
|
149
|
+
homepage: REPOSITORY_URL,
|
|
150
|
+
repository: REPOSITORY_URL,
|
|
151
|
+
license: 'Apache-2.0',
|
|
152
|
+
keywords: [
|
|
153
|
+
'eai-gofer',
|
|
154
|
+
'gofer',
|
|
155
|
+
'codex',
|
|
156
|
+
'claude',
|
|
157
|
+
'copilot',
|
|
158
|
+
'gemini',
|
|
159
|
+
'spec-driven-development',
|
|
160
|
+
],
|
|
161
|
+
skills: paths.skills ?? `./${UMBRELLA_SKILLS_DIR}/`,
|
|
162
|
+
interface: {
|
|
163
|
+
displayName: PLUGIN_DISPLAY_NAME,
|
|
164
|
+
shortDescription: 'Spec-driven delivery workflow for agentic coding',
|
|
165
|
+
longDescription:
|
|
166
|
+
'Run Gofer’s core /0_gofer_start → /6_gofer_validate workflow, with optional bootstrap, save/resume, testing, and communications helpers.',
|
|
167
|
+
developerName: 'EAI Tools',
|
|
168
|
+
category: 'Coding',
|
|
169
|
+
capabilities: ['Interactive', 'Write'],
|
|
170
|
+
websiteURL: REPOSITORY_URL,
|
|
171
|
+
defaultPrompt: [
|
|
172
|
+
'Set up my first EAI Platform app with Gofer',
|
|
173
|
+
'Run Gofer research for this feature',
|
|
174
|
+
'Create a Gofer implementation plan',
|
|
175
|
+
'Validate this branch with Gofer',
|
|
176
|
+
],
|
|
177
|
+
brandColor: '#145DA0',
|
|
178
|
+
composerIcon: paths.icon ?? `./${PLUGIN_ICON_TARGET}`,
|
|
179
|
+
logo: paths.icon ?? `./${PLUGIN_ICON_TARGET}`,
|
|
180
|
+
},
|
|
181
|
+
gofer: {
|
|
182
|
+
stages: stageNames(stages),
|
|
183
|
+
marketplacePath: PUBLIC_PLUGIN_URL,
|
|
184
|
+
releaseAsset: buildPublicAgentPluginZipUrl(version),
|
|
185
|
+
vsixAsset: buildPublicVsixUrl(version),
|
|
186
|
+
},
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
function buildGeminiManifest(version, paths = {}) {
|
|
191
|
+
return {
|
|
192
|
+
name: PLUGIN_NAME,
|
|
193
|
+
version,
|
|
194
|
+
description: 'Gofer core pipeline and helper commands as a Gemini CLI extension',
|
|
195
|
+
license: 'Apache-2.0',
|
|
196
|
+
commands: paths.commands ?? '.gemini/commands/gofer/',
|
|
197
|
+
gofer: {
|
|
198
|
+
bundle_url: PUBLIC_PLUGIN_URL,
|
|
199
|
+
manifest_url: `${PUBLIC_PLUGIN_URL}/gemini-extension.json`,
|
|
200
|
+
commands_manifest_url: `${PUBLIC_PLUGIN_URL}/gemini-commands-manifest.json`,
|
|
201
|
+
download_url: buildPublicAgentPluginZipUrl(version),
|
|
202
|
+
latest_download_url: buildLatestPublicAgentPluginZipUrl(),
|
|
203
|
+
vsix_url: buildPublicVsixUrl(version),
|
|
204
|
+
latest_vsix_url: buildLatestPublicVsixUrl(),
|
|
205
|
+
},
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
function buildPluginManifest(version, paths = {}) {
|
|
210
|
+
return {
|
|
211
|
+
name: PLUGIN_NAME,
|
|
212
|
+
version,
|
|
213
|
+
description:
|
|
214
|
+
'Gofer core pipeline and helper commands for Claude, Gemini, Codex, Copilot, and VS Code.',
|
|
215
|
+
author: {
|
|
216
|
+
name: 'EAI Tools',
|
|
217
|
+
url: REPOSITORY_URL,
|
|
218
|
+
},
|
|
219
|
+
homepage: REPOSITORY_URL,
|
|
220
|
+
repository: REPOSITORY_URL,
|
|
221
|
+
license: 'Apache-2.0',
|
|
222
|
+
keywords: [
|
|
223
|
+
'eai-gofer',
|
|
224
|
+
'gofer',
|
|
225
|
+
'claude-code',
|
|
226
|
+
'codex',
|
|
227
|
+
'copilot',
|
|
228
|
+
'gemini',
|
|
229
|
+
'spec-driven-development',
|
|
230
|
+
],
|
|
231
|
+
skills: paths.skills ?? `./${UMBRELLA_SKILLS_DIR}/`,
|
|
232
|
+
agents: paths.agents ?? './agents/',
|
|
233
|
+
commands: paths.commands ?? './commands/',
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
function buildClaudeManifest(version, paths = {}) {
|
|
238
|
+
return {
|
|
239
|
+
name: PLUGIN_NAME,
|
|
240
|
+
version,
|
|
241
|
+
description:
|
|
242
|
+
'Gofer core pipeline: /0_gofer_start through /6_gofer_validate, plus optional helper commands.',
|
|
243
|
+
author: {
|
|
244
|
+
name: 'EAI Tools',
|
|
245
|
+
url: REPOSITORY_URL,
|
|
246
|
+
},
|
|
247
|
+
homepage: REPOSITORY_URL,
|
|
248
|
+
repository: REPOSITORY_URL,
|
|
249
|
+
license: 'Apache-2.0',
|
|
250
|
+
keywords: ['eai-gofer', 'gofer', 'claude-code', 'spec-driven-development'],
|
|
251
|
+
skills: paths.skills ?? './skills/',
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
function buildBundleMarketplace(version) {
|
|
256
|
+
return {
|
|
257
|
+
name: 'eai-gofer',
|
|
258
|
+
owner: {
|
|
259
|
+
name: 'EAI Tools',
|
|
260
|
+
url: REPOSITORY_URL,
|
|
261
|
+
},
|
|
262
|
+
metadata: {
|
|
263
|
+
description:
|
|
264
|
+
'Public Gofer bundle for Claude Code, Gemini CLI, Codex, and Copilot workflows.',
|
|
265
|
+
version,
|
|
266
|
+
},
|
|
267
|
+
plugins: [
|
|
268
|
+
{
|
|
269
|
+
name: PLUGIN_NAME,
|
|
270
|
+
source: './plugins/eai-gofer',
|
|
271
|
+
description:
|
|
272
|
+
'Gofer core pipeline from /0_gofer_start through /6_gofer_validate, with optional helper commands.',
|
|
273
|
+
version,
|
|
274
|
+
author: {
|
|
275
|
+
name: 'EAI Tools',
|
|
276
|
+
url: REPOSITORY_URL,
|
|
277
|
+
},
|
|
278
|
+
homepage: REPOSITORY_URL,
|
|
279
|
+
repository: REPOSITORY_URL,
|
|
280
|
+
category: 'Coding',
|
|
281
|
+
tags: [
|
|
282
|
+
'eai-gofer',
|
|
283
|
+
'gofer',
|
|
284
|
+
'claude',
|
|
285
|
+
'codex',
|
|
286
|
+
'copilot',
|
|
287
|
+
'gemini',
|
|
288
|
+
'spec-driven-development',
|
|
289
|
+
],
|
|
290
|
+
},
|
|
291
|
+
],
|
|
292
|
+
};
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
function buildRepoMarketplace(version) {
|
|
296
|
+
return {
|
|
297
|
+
name: 'eai-gofer',
|
|
298
|
+
owner: {
|
|
299
|
+
name: 'EAI Tools',
|
|
300
|
+
url: REPOSITORY_URL,
|
|
301
|
+
},
|
|
302
|
+
metadata: {
|
|
303
|
+
description:
|
|
304
|
+
'Install the Gofer repo marketplace for Claude Code, Gemini CLI, Codex, or Copilot CLI from the public GitHub repository.',
|
|
305
|
+
version,
|
|
306
|
+
},
|
|
307
|
+
plugins: [
|
|
308
|
+
{
|
|
309
|
+
name: PLUGIN_NAME,
|
|
310
|
+
source: './plugins/eai-gofer',
|
|
311
|
+
description:
|
|
312
|
+
'Gofer core pipeline from /0_gofer_start through /6_gofer_validate, with optional helper commands.',
|
|
313
|
+
version,
|
|
314
|
+
author: {
|
|
315
|
+
name: 'EAI Tools',
|
|
316
|
+
url: REPOSITORY_URL,
|
|
317
|
+
},
|
|
318
|
+
homepage: REPOSITORY_URL,
|
|
319
|
+
repository: REPOSITORY_URL,
|
|
320
|
+
license: 'Apache-2.0',
|
|
321
|
+
category: 'Coding',
|
|
322
|
+
tags: [
|
|
323
|
+
'eai-gofer',
|
|
324
|
+
'gofer',
|
|
325
|
+
'claude',
|
|
326
|
+
'codex',
|
|
327
|
+
'copilot',
|
|
328
|
+
'gemini',
|
|
329
|
+
'spec-driven-development',
|
|
330
|
+
],
|
|
331
|
+
},
|
|
332
|
+
],
|
|
333
|
+
};
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
function buildRepoCodexMarketplace(version) {
|
|
337
|
+
return {
|
|
338
|
+
name: 'eai-gofer',
|
|
339
|
+
interface: {
|
|
340
|
+
displayName: 'Gofer',
|
|
341
|
+
},
|
|
342
|
+
plugins: [
|
|
343
|
+
{
|
|
344
|
+
name: PLUGIN_NAME,
|
|
345
|
+
source: {
|
|
346
|
+
source: 'local',
|
|
347
|
+
path: './plugins/eai-gofer',
|
|
348
|
+
},
|
|
349
|
+
policy: {
|
|
350
|
+
installation: 'AVAILABLE',
|
|
351
|
+
authentication: 'ON_INSTALL',
|
|
352
|
+
},
|
|
353
|
+
category: 'Coding',
|
|
354
|
+
version,
|
|
355
|
+
},
|
|
356
|
+
],
|
|
357
|
+
};
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
function buildBundleCodexMarketplace(version) {
|
|
361
|
+
return {
|
|
362
|
+
name: 'eai-gofer',
|
|
363
|
+
interface: {
|
|
364
|
+
displayName: 'Gofer',
|
|
365
|
+
},
|
|
366
|
+
plugins: [
|
|
367
|
+
{
|
|
368
|
+
name: PLUGIN_NAME,
|
|
369
|
+
source: {
|
|
370
|
+
source: 'local',
|
|
371
|
+
path: './plugins/eai-gofer',
|
|
372
|
+
},
|
|
373
|
+
policy: {
|
|
374
|
+
installation: 'AVAILABLE',
|
|
375
|
+
authentication: 'ON_INSTALL',
|
|
376
|
+
},
|
|
377
|
+
category: 'Coding',
|
|
378
|
+
version,
|
|
379
|
+
},
|
|
380
|
+
],
|
|
381
|
+
};
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
function buildUmbrellaSkill(version, stages) {
|
|
385
|
+
const stageList = stages
|
|
386
|
+
.map((stage) => `- \`${stage.frontmatter.name}\` - ${stage.frontmatter.description}`)
|
|
387
|
+
.join('\n');
|
|
388
|
+
|
|
389
|
+
return `---\nname: eai-gofer\ndescription: "Run the public Gofer core pipeline and helper commands in Claude, Gemini, Codex, or Copilot."\n---\n\n# Gofer\n\nVersion: ${version}\n\nUse this skill when the user asks to run, install, update, or understand Gofer without the VS Code extension UI.\n\n## Workspace First\n\nBefore stage work, resolve the repository root and run \`node .specify/scripts/node/gofer-workspace-check.mjs --host auto --json\` when available. If the repo is missing or stale, ask before running \`node .specify/scripts/node/gofer-workspace-bootstrap.mjs --host auto --include-mirrors\`, then resume the original command.\n\n## First EAI Platform App\n\nIf the user is starting a first EAI Platform app, run \`/gofer:eai-first-run\` before \`/0_gofer_start\`. It is allowed to run before \`.specify/\` exists and checks Git, Node.js, npm, the scoped EAI registry, EAI CLI, login, tenant, \`eai init\`, and Gofer scaffold readiness with user approval gates.\n\n## EAI CLI Discovery And Recovery\n\n- Run \`eai whoami\` before Gofer pipeline work and require a valid login plus an active tenant.\n- Run \`eai update --check\` before first EAI platform work when the CLI may be stale.\n- Run \`eai --describe\` before assuming command syntax.\n- If advertised, run \`eai agent guide --format json\` before planning or fixing EAI workflows.\n- After any \`eai\` error, run \`eai errors explain <code-or-reason> --format json\` before guessing remediation.\n- If \`eai errors explain\` is unavailable, match \`.specify/references/platform/eai-error-catalog.yaml\`, run read-only diagnostics before mutating fixes, and stop at the retry or escalation condition.\n- For \`eai user invite\` 5xx or \`EXTERNAL_SERVICE_ERROR\`, check existing members with \`eai user list --tenant <tenant-id> --search <email> --format json\`; use \`eai user role set --tenant <tenant-id> --member-id <member-id> --role tenant-admin --format json\` only after verification and user approval, then tell the app user to sign out and sign back in.\n- Use \`eai publicapi\` only for authorized PublicAPI \`/v4/...\` routes.\n\n## Token And Cost Policy\n\n- Treat \`.specify/memory/gofer-model-policy.yaml\` as the repo-owned source of truth for simple, medium, hard, and arbiter model routing. Run \`/gofer:bootstrap-workspace\` if it is missing.\n- Use the cheapest capable model first. Escalate only when a cheaper pass is low-confidence, contradictory, security-sensitive, release-critical, or blocking quality.\n- Keep raw search, build, and test output out of the main chat context. Write stable findings to \`.specify/specs/{feature}/context-bundle.md\` and continue from summaries.\n- Prefer provider prompt/context caching for stable non-secret prefixes: Gofer scaffold, repository instructions, constitution, repo map, stage contracts, and validation rubric.\n- After large research, planning, implementation, or validation bursts, checkpoint artifacts and compact/clear/resume context when the host supports it.\n\n## Core Pipeline And Helpers\n\n${stageList}\n\n## Stable Local Install Path\n\nInstall or update this plugin by replacing the stable local folder:\n\n\`\`\`text\n~/plugins/eai-gofer\n\`\`\`\n\nThe public release feed is available at:\n\n\`\`\`text\n${PUBLIC_SITE_URL}/releases.json\n\`\`\`\n\nGemini CLI users can also copy the bundled \`.gemini/\` directory into a repository root to activate the same command set there.\n`;
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
function buildWorkspacePreflightSection() {
|
|
393
|
+
return `
|
|
394
|
+
## Workspace Preflight
|
|
395
|
+
|
|
396
|
+
Before doing stage/helper work:
|
|
397
|
+
|
|
398
|
+
1. Resolve the repository root.
|
|
399
|
+
2. Check the core Gofer sentinels:
|
|
400
|
+
- \`.specify/.gofer-version\`
|
|
401
|
+
- \`.specify/commands/0_gofer_start.md\`
|
|
402
|
+
- \`.specify/templates/spec-template.md\`
|
|
403
|
+
- \`.specify/templates/loop-contract-template.json\`
|
|
404
|
+
- \`.specify/templates/working-backwards-prfaq-template.md\`
|
|
405
|
+
- \`.specify/scripts/node/gofer-workspace-check.mjs\`
|
|
406
|
+
- \`.specify/scripts/node/gofer-workspace-bootstrap.mjs\`
|
|
407
|
+
- \`.specify/specs/\`
|
|
408
|
+
- \`.specify/memory/\`
|
|
409
|
+
3. If the repo has the workspace checker script, prefer running:
|
|
410
|
+
- \`node .specify/scripts/node/gofer-workspace-check.mjs --host auto --json\`
|
|
411
|
+
4. If the workspace is missing or stale, ask exactly:
|
|
412
|
+
- **"This repo is missing or stale for Gofer. Initialize/update it now?"**
|
|
413
|
+
5. If the user says yes, run the Gofer workspace bootstrap helper and then resume this command from the top.
|
|
414
|
+
6. If the user says no, stop and explain that Gofer stage/helper work depends on the repo-owned scaffold.
|
|
415
|
+
`.trim();
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
function injectWorkspacePreflight(stage, body) {
|
|
419
|
+
if (WORKSPACE_PREFLIGHT_EXCLUDED_COMMANDS.has(String(stage.frontmatter.name))) {
|
|
420
|
+
return body;
|
|
421
|
+
}
|
|
422
|
+
if (body.includes('## Workspace Preflight')) {
|
|
423
|
+
return body;
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
const headingMatch = body.match(/^# [^\n]+\n*/);
|
|
427
|
+
if (!headingMatch) {
|
|
428
|
+
return `${buildWorkspacePreflightSection()}\n\n${body}`;
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
const insertAt = headingMatch[0].length;
|
|
432
|
+
return `${body.slice(0, insertAt).trimEnd()}\n\n${buildWorkspacePreflightSection()}\n\n${body
|
|
433
|
+
.slice(insertAt)
|
|
434
|
+
.replace(/^\n+/, '')}`;
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
function buildStageSkill(stage) {
|
|
438
|
+
const body = injectWorkspacePreflight(stage, stage.body.trim());
|
|
439
|
+
return `---\nname: ${stage.frontmatter.name}\ndescription: ${yamlString(stage.frontmatter.description)}\n---\n\n${body}\n`;
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
function buildPluginReadmeBase(version) {
|
|
443
|
+
return `# Gofer Agent Plugin
|
|
444
|
+
|
|
445
|
+
Version: ${version}
|
|
446
|
+
|
|
447
|
+
This package is the portable Claude, Gemini, Codex, and Copilot workflow layer for Gofer. It is released beside the VS Code extension, but it does not replace the VSIX UI, status views, updater, or language-server features.
|
|
448
|
+
|
|
449
|
+
## Public Sources
|
|
450
|
+
|
|
451
|
+
Use the public GitHub repository as the install source for Claude Code, Codex, Copilot CLI, and Gemini CLI:
|
|
452
|
+
|
|
453
|
+
\`\`\`text
|
|
454
|
+
${REPOSITORY_URL}
|
|
455
|
+
\`\`\`
|
|
456
|
+
|
|
457
|
+
Use the public release host for downloadable artifacts:
|
|
458
|
+
|
|
459
|
+
\`\`\`text
|
|
460
|
+
${PUBLIC_RELEASES_URL}
|
|
461
|
+
\`\`\`
|
|
462
|
+
|
|
463
|
+
That host publishes:
|
|
464
|
+
|
|
465
|
+
- Latest VS Code extension: \`${buildLatestPublicVsixUrl()}\`
|
|
466
|
+
- Latest agent bundle zip: \`${buildLatestPublicAgentPluginZipUrl()}\`
|
|
467
|
+
- This release VS Code extension: \`${buildPublicVsixUrl(version)}\`
|
|
468
|
+
- This release agent bundle zip: \`${buildPublicAgentPluginZipUrl(version)}\`
|
|
469
|
+
- Claude marketplace manifest: \`${CLAUDE_MARKETPLACE_URL}\`
|
|
470
|
+
- Codex manifest: \`${CODEX_PLUGIN_MANIFEST_URL}\`
|
|
471
|
+
- Copilot marketplace manifest: \`${COPILOT_MARKETPLACE_URL}\`
|
|
472
|
+
- Gemini extension manifest: \`${GEMINI_EXTENSION_URL}\`
|
|
473
|
+
|
|
474
|
+
## First EAI Platform App
|
|
475
|
+
|
|
476
|
+
Run \`/gofer:eai-first-run\` before \`/0_gofer_start\` when a new user, machine, repo, tenant, or EAI app template is not ready. The command is allowed to run before \`.specify/\` exists. It checks Git, Node.js, npm, EAI CLI, registry, \`eai update --check\`, \`eai --describe\`, \`eai agent guide --format json\` when advertised, login, tenant, \`eai init <project-name> --skip-prompts --company-tenant <active-tenant-id>\`, Gofer scaffold readiness, and \`eai errors explain <code-or-reason> --format json\` for recovery across macOS, Linux, Windows, and GitHub Codespaces.
|
|
477
|
+
|
|
478
|
+
For EAI errors, Gofer expects agents to run live EAI guidance first, use \`.specify/references/platform/eai-error-catalog.yaml\` as fallback, run read-only diagnostics before mutating fixes, and stop at the retry/escalation condition. For \`eai user invite\` 5xx or \`EXTERNAL_SERVICE_ERROR\`, check existing members with \`eai user list --tenant <tenant-id> --search <email> --format json\`; use \`eai user role set --tenant <tenant-id> --member-id <member-id> --role tenant-admin --format json\` only after verification and user approval.
|
|
479
|
+
|
|
480
|
+
If \`/0_gofer_start\` is unknown in a new repo, install or update this plugin first, then run \`/gofer:eai-first-run\`.
|
|
481
|
+
|
|
482
|
+
## App-Native Surfaces And Repo Scripts
|
|
483
|
+
|
|
484
|
+
Gofer keeps repo-owned scripts and canonical command files as the source of truth. App plugins, skills, agents, and MCP tools are thin entry points that call or explain those repo scripts.
|
|
485
|
+
|
|
486
|
+
| Surface | Best entry point | Repo-owned files used |
|
|
487
|
+
| ------- | ---------------- | --------------------- |
|
|
488
|
+
| Codex App / Codex IDE | Umbrella \`eai-gofer\` plugin skill plus repo \`.agents/skills\` when a workspace is open | \`AGENTS.md\`, \`.agents/skills/\`, \`.specify/scripts/\`, \`.vscode/mcp.json\` |
|
|
489
|
+
| GitHub Copilot app / VS Code agent mode | Custom Gofer agents and one umbrella skill, not a duplicate slash-command list | \`.github/agents/\`, \`.github/skills/\`, \`.github/prompts/\`, \`.github/instructions/\`, \`.vscode/mcp.json\` |
|
|
490
|
+
| Claude Code app | Plugin umbrella skill for discovery; repo slash commands remain the fast command path | \`.claude/skills/\`, \`.claude/commands/\`, \`.claude/agents/\`, \`.specify/scripts/\` |
|
|
491
|
+
| Gemini CLI / Gemini Code Assist | Gemini extension commands and workspace MCP/customization when available | \`.gemini/\`, \`.specify/scripts/\`, \`.vscode/mcp.json\` |
|
|
492
|
+
|
|
493
|
+
The clean UX rule is: use plain numbered stage commands in initialized repos, and use app/plugin skills for setup, diagnostics, and routing when those stage commands are not loaded yet.
|
|
494
|
+
|
|
495
|
+
## Core Pipeline
|
|
496
|
+
|
|
497
|
+
| Stage | Command | Main output |
|
|
498
|
+
| ----- | ------- | ----------- |
|
|
499
|
+
| Gofer Start | \`/0_gofer_start\` | Full pipeline kickoff |
|
|
500
|
+
| Research | \`/1_gofer_research\` | \`research.md\` |
|
|
501
|
+
| Specify | \`/2_gofer_specify\` | \`spec.md\` |
|
|
502
|
+
| Plan | \`/3_gofer_plan\` | \`plan.md\`, \`data-model.md\`, \`contracts/\` |
|
|
503
|
+
| Tasks | \`/4_gofer_tasks\` | \`tasks.md\`, \`traceability.md\`, \`issues.md\` |
|
|
504
|
+
| Implement | \`/5_gofer_implement\` | Code and doc changes |
|
|
505
|
+
| Validate | \`/6_gofer_validate\` | Validation artifacts and final review evidence |
|
|
506
|
+
|
|
507
|
+
\`/6_gofer_validate\` is the terminal quality gate. It includes the final engineering review loop and replaces the old standalone review stage in the core pipeline.
|
|
508
|
+
|
|
509
|
+
Optional helpers like \`/0a_problem_validation\`, \`/7_gofer_save\`, \`/8_gofer_branding\`, \`/9_gofer_tests\`, \`/7a_stakeholder_comms\`, \`/gofer:check-workspace\`, \`/gofer:bootstrap-workspace\`, and \`/gofer:eai-first-run\` remain available outside the core 0-6 stage sequence.
|
|
510
|
+
|
|
511
|
+
## Distribution Modes
|
|
512
|
+
|
|
513
|
+
| Surface | Public install / update path | Stable local path |
|
|
514
|
+
| ------- | ---------------------------- | ----------------- |
|
|
515
|
+
| Claude Code | \`claude plugin marketplace add ${REPOSITORY_URL} --scope user --sparse .claude-plugin --sparse plugins/eai-gofer\` then \`claude plugin install eai-gofer@eai-gofer --scope user\` | Unzip to \`~/plugins/eai-gofer\`, then \`claude plugin marketplace add ~/plugins/eai-gofer --scope user\` |
|
|
516
|
+
| Codex | \`codex plugin marketplace add ${REPOSITORY_URL} --sparse .agents/plugins --sparse plugins/eai-gofer\` then \`codex plugin add eai-gofer@eai-gofer\` | Unzip to \`~/plugins/eai-gofer\`, then \`codex plugin marketplace add ~/plugins/eai-gofer\` |
|
|
517
|
+
| GitHub Copilot CLI | \`copilot plugin marketplace add ${REPOSITORY_URL}\` then \`copilot plugin install eai-gofer@eai-gofer\` | Unzip to \`~/plugins/eai-gofer\`, then \`copilot plugin marketplace add ~/plugins/eai-gofer\` |
|
|
518
|
+
| Gemini CLI | \`gemini extensions install ${REPOSITORY_URL} --auto-update\` | Unzip to \`~/plugins/eai-gofer\`, then \`gemini extensions install ~/plugins/eai-gofer\` |
|
|
519
|
+
|
|
520
|
+
## Download And Replace The Local Bundle Folder
|
|
521
|
+
|
|
522
|
+
Keep the downloaded bundle path stable:
|
|
523
|
+
|
|
524
|
+
\`\`\`text
|
|
525
|
+
~/plugins/eai-gofer
|
|
526
|
+
\`\`\`
|
|
527
|
+
|
|
528
|
+
Download the public release asset, remove the old folder, unzip the package into \`~/plugins\`.
|
|
529
|
+
|
|
530
|
+
\`\`\`bash
|
|
531
|
+
curl -fsSL ${buildLatestPublicAgentPluginZipUrl()} -o /tmp/eai-gofer-agent-plugin-latest.zip
|
|
532
|
+
|
|
533
|
+
rm -rf ~/plugins/eai-gofer
|
|
534
|
+
unzip /tmp/eai-gofer-agent-plugin-latest.zip -d ~/plugins
|
|
535
|
+
\`\`\`
|
|
536
|
+
|
|
537
|
+
## Claude Code
|
|
538
|
+
|
|
539
|
+
Recommended public install:
|
|
540
|
+
|
|
541
|
+
\`\`\`bash
|
|
542
|
+
claude plugin marketplace add ${REPOSITORY_URL} --scope user --sparse .claude-plugin --sparse plugins/eai-gofer
|
|
543
|
+
claude plugin install eai-gofer@eai-gofer --scope user
|
|
544
|
+
\`\`\`
|
|
545
|
+
|
|
546
|
+
Downloaded bundle install:
|
|
547
|
+
|
|
548
|
+
\`\`\`bash
|
|
549
|
+
claude plugin marketplace add ~/plugins/eai-gofer --scope user
|
|
550
|
+
claude plugin install eai-gofer@eai-gofer --scope user
|
|
551
|
+
\`\`\`
|
|
552
|
+
|
|
553
|
+
## Codex
|
|
554
|
+
|
|
555
|
+
Recommended public install:
|
|
556
|
+
|
|
557
|
+
\`\`\`bash
|
|
558
|
+
codex plugin marketplace add ${REPOSITORY_URL} --sparse .agents/plugins --sparse plugins/eai-gofer
|
|
559
|
+
codex plugin add eai-gofer@eai-gofer
|
|
560
|
+
\`\`\`
|
|
561
|
+
|
|
562
|
+
Downloaded bundle install:
|
|
563
|
+
|
|
564
|
+
\`\`\`bash
|
|
565
|
+
codex plugin marketplace add ~/plugins/eai-gofer
|
|
566
|
+
codex plugin add eai-gofer@eai-gofer
|
|
567
|
+
\`\`\`
|
|
568
|
+
|
|
569
|
+
The Codex plugin keeps the slash-command stage entrypoints as the primary user surface. The plugin skill registry only exposes the umbrella \`eai-gofer\` skill so Codex does not show both \`/0_gofer_start\` and \`eai-gofer:0_gofer_start\` for every stage.
|
|
570
|
+
|
|
571
|
+
## Copilot CLI
|
|
572
|
+
|
|
573
|
+
Recommended public install:
|
|
574
|
+
|
|
575
|
+
\`\`\`bash
|
|
576
|
+
copilot plugin marketplace add ${REPOSITORY_URL}
|
|
577
|
+
copilot plugin install eai-gofer@eai-gofer
|
|
578
|
+
\`\`\`
|
|
579
|
+
|
|
580
|
+
Downloaded bundle install:
|
|
581
|
+
|
|
582
|
+
\`\`\`bash
|
|
583
|
+
copilot plugin marketplace add ~/plugins/eai-gofer
|
|
584
|
+
copilot plugin install eai-gofer@eai-gofer
|
|
585
|
+
\`\`\`
|
|
586
|
+
|
|
587
|
+
## Gemini CLI
|
|
588
|
+
|
|
589
|
+
Recommended public install:
|
|
590
|
+
|
|
591
|
+
\`\`\`bash
|
|
592
|
+
gemini extensions install ${REPOSITORY_URL} --auto-update
|
|
593
|
+
\`\`\`
|
|
594
|
+
|
|
595
|
+
Downloaded bundle install:
|
|
596
|
+
|
|
597
|
+
\`\`\`bash
|
|
598
|
+
gemini extensions install ~/plugins/eai-gofer
|
|
599
|
+
\`\`\`
|
|
600
|
+
`;
|
|
601
|
+
}
|
|
602
|
+
|
|
603
|
+
function buildPluginReadme(version) {
|
|
604
|
+
return `${buildPluginReadmeBase(version).trimEnd()}
|
|
605
|
+
|
|
606
|
+
## Model Policy
|
|
607
|
+
|
|
608
|
+
After bootstrap, each repository gets a user-owned model policy at:
|
|
609
|
+
|
|
610
|
+
\`\`\`text
|
|
611
|
+
.specify/memory/gofer-model-policy.yaml
|
|
612
|
+
\`\`\`
|
|
613
|
+
|
|
614
|
+
The shipped default is copied from \`.specify/templates/gofer-model-policy.yaml\`
|
|
615
|
+
and is not overwritten by bootstrap. Use it to tune simple, medium, hard, and
|
|
616
|
+
arbiter model routes for Claude, Codex/OpenAI, Gemini, and Copilot. Copilot
|
|
617
|
+
defaults to \`Auto\` for simple/default work because exact model availability is
|
|
618
|
+
controlled by the Copilot client, plan, and organization policy.
|
|
619
|
+
`;
|
|
620
|
+
}
|
|
621
|
+
|
|
622
|
+
async function writeJson(filePath, payload) {
|
|
623
|
+
await fs.mkdir(path.dirname(filePath), { recursive: true });
|
|
624
|
+
await fs.writeFile(filePath, `${JSON.stringify(payload, null, 2)}\n`, 'utf8');
|
|
625
|
+
}
|
|
626
|
+
|
|
627
|
+
async function writeText(filePath, content) {
|
|
628
|
+
await fs.mkdir(path.dirname(filePath), { recursive: true });
|
|
629
|
+
await fs.writeFile(filePath, content, 'utf8');
|
|
630
|
+
}
|
|
631
|
+
|
|
632
|
+
async function copyIfExists(root, relativePath, pluginRoot) {
|
|
633
|
+
const source = path.join(root, relativePath);
|
|
634
|
+
const target = path.join(pluginRoot, relativePath);
|
|
635
|
+
try {
|
|
636
|
+
await fs.cp(source, target, { recursive: true, force: true, dereference: false });
|
|
637
|
+
} catch (error) {
|
|
638
|
+
if (error?.code !== 'ENOENT') {
|
|
639
|
+
throw error;
|
|
640
|
+
}
|
|
641
|
+
}
|
|
642
|
+
}
|
|
643
|
+
|
|
644
|
+
async function copyIfExistsAs(root, sourceRelativePath, targetRelativePath, pluginRoot) {
|
|
645
|
+
const source = path.join(root, sourceRelativePath);
|
|
646
|
+
const target = path.join(pluginRoot, targetRelativePath);
|
|
647
|
+
try {
|
|
648
|
+
await fs.cp(source, target, { recursive: true, force: true, dereference: false });
|
|
649
|
+
} catch (error) {
|
|
650
|
+
if (error?.code !== 'ENOENT') {
|
|
651
|
+
throw error;
|
|
652
|
+
}
|
|
653
|
+
}
|
|
654
|
+
}
|
|
655
|
+
|
|
656
|
+
async function copyPluginAssets(root, pluginRoot) {
|
|
657
|
+
const source = path.join(root, PLUGIN_ICON_SOURCE);
|
|
658
|
+
const target = path.join(pluginRoot, PLUGIN_ICON_TARGET);
|
|
659
|
+
await fs.mkdir(path.dirname(target), { recursive: true });
|
|
660
|
+
await fs.copyFile(source, target);
|
|
661
|
+
}
|
|
662
|
+
|
|
663
|
+
async function walkFiles(root) {
|
|
664
|
+
const files = [];
|
|
665
|
+
|
|
666
|
+
async function visit(current) {
|
|
667
|
+
const entries = await fs.readdir(current, { withFileTypes: true });
|
|
668
|
+
for (const entry of entries) {
|
|
669
|
+
const fullPath = path.join(current, entry.name);
|
|
670
|
+
if (entry.isDirectory()) {
|
|
671
|
+
await visit(fullPath);
|
|
672
|
+
} else if (entry.isFile()) {
|
|
673
|
+
files.push(fullPath);
|
|
674
|
+
}
|
|
675
|
+
}
|
|
676
|
+
}
|
|
677
|
+
|
|
678
|
+
await visit(root);
|
|
679
|
+
return files;
|
|
680
|
+
}
|
|
681
|
+
|
|
682
|
+
async function walkRelativePaths(root) {
|
|
683
|
+
const relativePaths = [];
|
|
684
|
+
|
|
685
|
+
async function visit(current) {
|
|
686
|
+
const entries = await fs.readdir(current, { withFileTypes: true });
|
|
687
|
+
for (const entry of entries) {
|
|
688
|
+
const fullPath = path.join(current, entry.name);
|
|
689
|
+
relativePaths.push(path.relative(root, fullPath).split(path.sep).join('/'));
|
|
690
|
+
if (entry.isDirectory()) {
|
|
691
|
+
await visit(fullPath);
|
|
692
|
+
}
|
|
693
|
+
}
|
|
694
|
+
}
|
|
695
|
+
|
|
696
|
+
await visit(root);
|
|
697
|
+
return relativePaths;
|
|
698
|
+
}
|
|
699
|
+
|
|
700
|
+
function describeWindowsUnsafePath(relativePath) {
|
|
701
|
+
if (relativePath.length > WINDOWS_SAFE_RELATIVE_PATH_LIMIT) {
|
|
702
|
+
return `longer than ${WINDOWS_SAFE_RELATIVE_PATH_LIMIT} characters`;
|
|
703
|
+
}
|
|
704
|
+
|
|
705
|
+
const segments = relativePath.split('/').filter(Boolean);
|
|
706
|
+
for (const segment of segments) {
|
|
707
|
+
if (hasWindowsForbiddenSegmentChar(segment)) {
|
|
708
|
+
return `segment "${segment}" contains a Windows-forbidden character`;
|
|
709
|
+
}
|
|
710
|
+
if (/[ .]$/.test(segment)) {
|
|
711
|
+
return `segment "${segment}" ends with a dot or space`;
|
|
712
|
+
}
|
|
713
|
+
if (WINDOWS_RESERVED_BASENAME.test(segment)) {
|
|
714
|
+
return `segment "${segment}" is a Windows reserved device name`;
|
|
715
|
+
}
|
|
716
|
+
}
|
|
717
|
+
|
|
718
|
+
return null;
|
|
719
|
+
}
|
|
720
|
+
|
|
721
|
+
function hasWindowsForbiddenSegmentChar(segment) {
|
|
722
|
+
for (const char of segment) {
|
|
723
|
+
if (WINDOWS_FORBIDDEN_SEGMENT_CHARS.has(char) || char.charCodeAt(0) < 32) {
|
|
724
|
+
return true;
|
|
725
|
+
}
|
|
726
|
+
}
|
|
727
|
+
|
|
728
|
+
return false;
|
|
729
|
+
}
|
|
730
|
+
|
|
731
|
+
async function assertWindowsPortablePaths(pluginRoot) {
|
|
732
|
+
const offenders = [];
|
|
733
|
+
for (const relativePath of await walkRelativePaths(pluginRoot)) {
|
|
734
|
+
const reason = describeWindowsUnsafePath(relativePath);
|
|
735
|
+
if (reason) {
|
|
736
|
+
offenders.push(`${relativePath} (${reason})`);
|
|
737
|
+
}
|
|
738
|
+
}
|
|
739
|
+
|
|
740
|
+
if (offenders.length > 0) {
|
|
741
|
+
throw new Error(`Plugin package contains Windows-unsafe paths: ${offenders.join(', ')}`);
|
|
742
|
+
}
|
|
743
|
+
}
|
|
744
|
+
|
|
745
|
+
async function assertNoPersonalPaths(pluginRoot) {
|
|
746
|
+
const files = await walkFiles(pluginRoot);
|
|
747
|
+
const offenders = [];
|
|
748
|
+
for (const file of files) {
|
|
749
|
+
let content;
|
|
750
|
+
try {
|
|
751
|
+
content = await fs.readFile(file, 'utf8');
|
|
752
|
+
} catch {
|
|
753
|
+
continue;
|
|
754
|
+
}
|
|
755
|
+
|
|
756
|
+
if (PERSONAL_PATH_PATTERN.test(content)) {
|
|
757
|
+
offenders.push(path.relative(pluginRoot, file));
|
|
758
|
+
}
|
|
759
|
+
}
|
|
760
|
+
|
|
761
|
+
if (offenders.length > 0) {
|
|
762
|
+
throw new Error(`Plugin package contains personal absolute paths: ${offenders.join(', ')}`);
|
|
763
|
+
}
|
|
764
|
+
}
|
|
765
|
+
|
|
766
|
+
async function writePluginFolder(pluginRoot, root, version, stages) {
|
|
767
|
+
await fs.rm(pluginRoot, { recursive: true, force: true });
|
|
768
|
+
await fs.mkdir(pluginRoot, { recursive: true });
|
|
769
|
+
|
|
770
|
+
const pluginManifest = buildPluginManifest(version);
|
|
771
|
+
const claudeManifest = buildClaudeManifest(version);
|
|
772
|
+
const codexManifest = buildCodexManifest(version, stages);
|
|
773
|
+
const geminiManifest = buildGeminiManifest(version);
|
|
774
|
+
const bundleMarketplace = buildBundleMarketplace(version);
|
|
775
|
+
|
|
776
|
+
await writeJson(path.join(pluginRoot, 'plugin.json'), pluginManifest);
|
|
777
|
+
await writeJson(path.join(pluginRoot, '.github', 'plugin', 'plugin.json'), pluginManifest);
|
|
778
|
+
await writeJson(
|
|
779
|
+
path.join(pluginRoot, '.github', 'plugin', 'marketplace.json'),
|
|
780
|
+
bundleMarketplace
|
|
781
|
+
);
|
|
782
|
+
await writeJson(path.join(pluginRoot, '.codex-plugin', 'plugin.json'), codexManifest);
|
|
783
|
+
await writeJson(path.join(pluginRoot, '.claude-plugin', 'plugin.json'), claudeManifest);
|
|
784
|
+
await writeJson(path.join(pluginRoot, '.claude-plugin', 'marketplace.json'), bundleMarketplace);
|
|
785
|
+
await writeJson(path.join(pluginRoot, '.gemini', 'extension.json'), geminiManifest);
|
|
786
|
+
await writeJson(path.join(pluginRoot, 'gemini-extension.json'), geminiManifest);
|
|
787
|
+
await writeJson(
|
|
788
|
+
path.join(pluginRoot, '.agents', 'plugins', 'marketplace.json'),
|
|
789
|
+
buildBundleCodexMarketplace(version)
|
|
790
|
+
);
|
|
791
|
+
|
|
792
|
+
await writeText(path.join(pluginRoot, 'skills', 'eai-gofer', 'SKILL.md'), buildUmbrellaSkill(version, stages));
|
|
793
|
+
await writeText(
|
|
794
|
+
path.join(pluginRoot, UMBRELLA_SKILLS_DIR, 'eai-gofer', 'SKILL.md'),
|
|
795
|
+
buildUmbrellaSkill(version, stages)
|
|
796
|
+
);
|
|
797
|
+
for (const stage of stages) {
|
|
798
|
+
await writeText(path.join(pluginRoot, 'skills', stage.stem, 'SKILL.md'), buildStageSkill(stage));
|
|
799
|
+
}
|
|
800
|
+
|
|
801
|
+
await writeText(path.join(pluginRoot, 'README.md'), buildPluginReadme(version));
|
|
802
|
+
await writeText(path.join(pluginRoot, '.eai-gofer-plugin-version'), `${version}\n${GENERATED_MARKER}\n`);
|
|
803
|
+
|
|
804
|
+
const copiedResources = [
|
|
805
|
+
'.specify/commands',
|
|
806
|
+
'.specify/references',
|
|
807
|
+
'.specify/templates',
|
|
808
|
+
'.specify/scripts/bash',
|
|
809
|
+
'.specify/scripts/node',
|
|
810
|
+
'.specify/scripts/hooks',
|
|
811
|
+
'.specify/scripts/powershell',
|
|
812
|
+
'.github/prompts',
|
|
813
|
+
'.github/agents',
|
|
814
|
+
'.github/skills',
|
|
815
|
+
'.claude/skills',
|
|
816
|
+
'.gemini',
|
|
817
|
+
'.vscode/mcp.json',
|
|
818
|
+
'AGENTS.md',
|
|
819
|
+
'LICENSE',
|
|
820
|
+
'NOTICE',
|
|
821
|
+
'TRADEMARKS.md',
|
|
822
|
+
'codex-config.toml',
|
|
823
|
+
];
|
|
824
|
+
for (const relativePath of copiedResources) {
|
|
825
|
+
await copyIfExists(root, relativePath, pluginRoot);
|
|
826
|
+
}
|
|
827
|
+
await writeJson(path.join(pluginRoot, '.gemini', 'extension.json'), geminiManifest);
|
|
828
|
+
await copyIfExistsAs(root, '.claude/commands', 'commands', pluginRoot);
|
|
829
|
+
await copyIfExistsAs(root, '.claude/agents', 'agents', pluginRoot);
|
|
830
|
+
await copyPluginAssets(root, pluginRoot);
|
|
831
|
+
|
|
832
|
+
const nestedPluginRoot = path.join(pluginRoot, 'plugins', PLUGIN_NAME);
|
|
833
|
+
await fs.rm(nestedPluginRoot, { recursive: true, force: true });
|
|
834
|
+
await fs.mkdir(nestedPluginRoot, { recursive: true });
|
|
835
|
+
for (const entry of await fs.readdir(pluginRoot)) {
|
|
836
|
+
if (entry === 'plugins') {
|
|
837
|
+
continue;
|
|
838
|
+
}
|
|
839
|
+
|
|
840
|
+
const source = path.join(pluginRoot, entry);
|
|
841
|
+
const target = path.join(nestedPluginRoot, entry);
|
|
842
|
+
await fs.cp(source, target, { recursive: true, force: true, dereference: false });
|
|
843
|
+
}
|
|
844
|
+
}
|
|
845
|
+
|
|
846
|
+
async function syncRepoManifests(root, version, stages, stagedPluginRoot) {
|
|
847
|
+
await writeJson(
|
|
848
|
+
path.join(root, '.codex-plugin', 'plugin.json'),
|
|
849
|
+
buildCodexManifest(version, stages, {
|
|
850
|
+
skills: `./${UMBRELLA_SKILLS_DIR}/`,
|
|
851
|
+
icon: './assets/eai-gofer-icon.png',
|
|
852
|
+
})
|
|
853
|
+
);
|
|
854
|
+
await writeJson(
|
|
855
|
+
path.join(root, 'plugin.json'),
|
|
856
|
+
buildPluginManifest(version, {
|
|
857
|
+
skills: `./${UMBRELLA_SKILLS_DIR}/`,
|
|
858
|
+
agents: './.claude/agents/',
|
|
859
|
+
commands: './.claude/commands/',
|
|
860
|
+
})
|
|
861
|
+
);
|
|
862
|
+
await writeJson(
|
|
863
|
+
path.join(root, '.github', 'plugin', 'plugin.json'),
|
|
864
|
+
buildPluginManifest(version, {
|
|
865
|
+
skills: `./${UMBRELLA_SKILLS_DIR}/`,
|
|
866
|
+
agents: './.claude/agents/',
|
|
867
|
+
commands: './.claude/commands/',
|
|
868
|
+
})
|
|
869
|
+
);
|
|
870
|
+
await writeJson(path.join(root, '.github', 'plugin', 'marketplace.json'), buildRepoMarketplace(version));
|
|
871
|
+
await writeJson(
|
|
872
|
+
path.join(root, '.agents', 'plugins', 'marketplace.json'),
|
|
873
|
+
buildRepoCodexMarketplace(version)
|
|
874
|
+
);
|
|
875
|
+
await writeJson(
|
|
876
|
+
path.join(root, '.claude-plugin', 'plugin.json'),
|
|
877
|
+
buildClaudeManifest(version, {
|
|
878
|
+
skills: './.agents/skills/',
|
|
879
|
+
})
|
|
880
|
+
);
|
|
881
|
+
await writeJson(path.join(root, '.claude-plugin', 'marketplace.json'), buildRepoMarketplace(version));
|
|
882
|
+
await writeJson(path.join(root, '.gemini', 'extension.json'), buildGeminiManifest(version));
|
|
883
|
+
await writeJson(path.join(root, 'gemini-extension.json'), buildGeminiManifest(version));
|
|
884
|
+
await writeText(
|
|
885
|
+
path.join(root, UMBRELLA_SKILLS_DIR, 'eai-gofer', 'SKILL.md'),
|
|
886
|
+
buildUmbrellaSkill(version, stages)
|
|
887
|
+
);
|
|
888
|
+
|
|
889
|
+
const iconSource = path.join(root, PLUGIN_ICON_SOURCE);
|
|
890
|
+
const iconTarget = path.join(root, PLUGIN_ICON_TARGET);
|
|
891
|
+
await fs.mkdir(path.dirname(iconTarget), { recursive: true });
|
|
892
|
+
await fs.copyFile(iconSource, iconTarget);
|
|
893
|
+
|
|
894
|
+
const repoPluginDir = path.join(root, 'plugins', PLUGIN_NAME);
|
|
895
|
+
await fs.rm(repoPluginDir, { recursive: true, force: true });
|
|
896
|
+
await fs.mkdir(path.dirname(repoPluginDir), { recursive: true });
|
|
897
|
+
await fs.cp(stagedPluginRoot, repoPluginDir, { recursive: true, force: true, dereference: false });
|
|
898
|
+
}
|
|
899
|
+
|
|
900
|
+
async function main() {
|
|
901
|
+
const args = parseArgs(process.argv.slice(2));
|
|
902
|
+
if (args.help) {
|
|
903
|
+
console.log(usage());
|
|
904
|
+
return;
|
|
905
|
+
}
|
|
906
|
+
|
|
907
|
+
const root = path.resolve(args.root);
|
|
908
|
+
const extensionPackage = await readJson(path.join(root, 'extension', 'package.json'));
|
|
909
|
+
const version = args.version ?? extensionPackage.version;
|
|
910
|
+
assertSemver(version);
|
|
911
|
+
|
|
912
|
+
const stages = await loadStages(root);
|
|
913
|
+
const outDir = path.resolve(root, args.outDir);
|
|
914
|
+
const packageName = `eai-gofer-agent-plugin-${version}`;
|
|
915
|
+
const stageParent = path.join(outDir, packageName);
|
|
916
|
+
const pluginRoot = path.join(stageParent, PLUGIN_NAME);
|
|
917
|
+
const zipPath = path.join(outDir, `${packageName}.zip`);
|
|
918
|
+
|
|
919
|
+
await fs.rm(stageParent, { recursive: true, force: true });
|
|
920
|
+
await fs.rm(zipPath, { force: true });
|
|
921
|
+
await writePluginFolder(pluginRoot, root, version, stages);
|
|
922
|
+
await assertWindowsPortablePaths(pluginRoot);
|
|
923
|
+
await assertNoPersonalPaths(pluginRoot);
|
|
924
|
+
await execFileAsync('zip', ['-qr', zipPath, PLUGIN_NAME], { cwd: stageParent });
|
|
925
|
+
|
|
926
|
+
if (args.syncRepo) {
|
|
927
|
+
await syncRepoManifests(root, version, stages, pluginRoot);
|
|
928
|
+
}
|
|
929
|
+
|
|
930
|
+
console.log(`plugin: staged ${pluginRoot}`);
|
|
931
|
+
console.log(`plugin: wrote ${zipPath}`);
|
|
932
|
+
if (args.syncRepo) {
|
|
933
|
+
console.log(`plugin: synced ${path.join(root, 'plugins', PLUGIN_NAME)}`);
|
|
934
|
+
}
|
|
935
|
+
}
|
|
936
|
+
|
|
937
|
+
main().catch((error) => {
|
|
938
|
+
console.error(error instanceof Error ? error.message : String(error));
|
|
939
|
+
process.exit(1);
|
|
940
|
+
});
|