session-orchestrator 3.16.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/.claude-plugin/marketplace.json +29 -0
- package/.claude-plugin/plugin.json +18 -0
- package/.codex-plugin/agents/explorer.toml +14 -0
- package/.codex-plugin/agents/session-reviewer.toml +23 -0
- package/.codex-plugin/agents/wave-worker.toml +15 -0
- package/.codex-plugin/config.toml +20 -0
- package/.codex-plugin/plugin.json +37 -0
- package/.cursor/rules/000-session-orchestrator.mdc +73 -0
- package/.cursor/rules/010-session-workflow.mdc +170 -0
- package/.cursor/rules/020-quality-gates.mdc +128 -0
- package/.cursor/rules/030-wave-execution.mdc +216 -0
- package/.cursor/rules/040-discovery.mdc +242 -0
- package/.cursor/rules/050-plan.mdc +235 -0
- package/.cursor/rules/060-evolve.mdc +232 -0
- package/.cursor/rules/070-gitlab-ops.mdc +246 -0
- package/.cursor/rules/080-ecosystem-health.mdc +145 -0
- package/.mcp.json +8 -0
- package/CHANGELOG.md +1544 -0
- package/LICENSE +21 -0
- package/NOTICE +64 -0
- package/README.md +242 -0
- package/SECURITY.md +90 -0
- package/agents/AGENTS.md +136 -0
- package/agents/analyst.md +99 -0
- package/agents/architect-reviewer.md +93 -0
- package/agents/code-implementer.md +106 -0
- package/agents/db-specialist.md +104 -0
- package/agents/dialectic-deriver.md +139 -0
- package/agents/docs-writer.md +113 -0
- package/agents/eval-judge.md +146 -0
- package/agents/memory-proposal-collector.md +297 -0
- package/agents/qa-strategist.md +102 -0
- package/agents/schemas/analyst.schema.json +46 -0
- package/agents/schemas/architect-reviewer.schema.json +50 -0
- package/agents/schemas/code-implementer.schema.json +61 -0
- package/agents/schemas/db-specialist.schema.json +80 -0
- package/agents/schemas/docs-writer.schema.json +56 -0
- package/agents/schemas/persona-panel-sidecar.schema.json +245 -0
- package/agents/schemas/qa-strategist.schema.json +46 -0
- package/agents/schemas/security-reviewer.schema.json +86 -0
- package/agents/schemas/session-reviewer.schema.json +69 -0
- package/agents/schemas/test-writer.schema.json +69 -0
- package/agents/schemas/ui-developer.schema.json +90 -0
- package/agents/schemas/ux-evaluator.schema.json +51 -0
- package/agents/security-reviewer.md +236 -0
- package/agents/session-reviewer.md +201 -0
- package/agents/skill-applied-judge.md +122 -0
- package/agents/test-writer.md +123 -0
- package/agents/ui-developer.md +109 -0
- package/agents/ux-evaluator.md +161 -0
- package/assets/icon.svg +11 -0
- package/assets/og-card.png +0 -0
- package/assets/og-card.svg +47 -0
- package/commands/autopilot-multi.md +74 -0
- package/commands/autopilot.md +80 -0
- package/commands/bootstrap.md +56 -0
- package/commands/brainstorm.md +48 -0
- package/commands/close.md +24 -0
- package/commands/debug.md +36 -0
- package/commands/discovery.md +32 -0
- package/commands/dispatcher.md +59 -0
- package/commands/eval.md +28 -0
- package/commands/evolve.md +10 -0
- package/commands/go.md +41 -0
- package/commands/grill.md +45 -0
- package/commands/harness-audit.md +26 -0
- package/commands/memory-cleanup.md +25 -0
- package/commands/persona-panel.md +121 -0
- package/commands/plan.md +15 -0
- package/commands/portfolio.md +97 -0
- package/commands/reconcile.md +23 -0
- package/commands/repo-audit.md +24 -0
- package/commands/session.md +30 -0
- package/commands/spinout.md +15 -0
- package/commands/sunset-review.md +27 -0
- package/commands/templates-ack.md +96 -0
- package/commands/test.md +97 -0
- package/docs/README.md +105 -0
- package/docs/USER-GUIDE.md +1403 -0
- package/docs/ci-setup.md +81 -0
- package/docs/codex-setup.md +142 -0
- package/docs/components.md +74 -0
- package/docs/cursor-setup.md +104 -0
- package/docs/events-schema.md +81 -0
- package/docs/migration-v3.md +148 -0
- package/docs/owner-config-schema.md +154 -0
- package/docs/persona-panel.md +433 -0
- package/docs/pi-setup.md +115 -0
- package/docs/plugin-architecture-v3.md +296 -0
- package/docs/pm-skills-marketplace.md +114 -0
- package/docs/policy-cache-validation-2026-04-28.md +118 -0
- package/docs/rule-authoring.md +316 -0
- package/docs/session-config-reference.md +1439 -0
- package/docs/session-config-template.md +961 -0
- package/docs/vault-docs-architecture.md +297 -0
- package/hooks/_lib/lock-bootstrap.mjs +272 -0
- package/hooks/_lib/lock-reconcile.mjs +93 -0
- package/hooks/_lib/profile-gate.mjs +95 -0
- package/hooks/_lib/transcript-history.mjs +211 -0
- package/hooks/agent-teams-h3-test.sh +362 -0
- package/hooks/config-protection.mjs +0 -0
- package/hooks/cwd-change-restore.mjs +131 -0
- package/hooks/enforce-commands.mjs +179 -0
- package/hooks/enforce-scope.mjs +273 -0
- package/hooks/hooks-codex.json +60 -0
- package/hooks/hooks-cursor.json +15 -0
- package/hooks/hooks-pi.json +115 -0
- package/hooks/hooks.json +215 -0
- package/hooks/loop-guard.mjs +260 -0
- package/hooks/on-session-end.mjs +217 -0
- package/hooks/on-session-start.mjs +660 -0
- package/hooks/on-stop.mjs +294 -0
- package/hooks/operator-steer.mjs +64 -0
- package/hooks/post-edit-validate.mjs +225 -0
- package/hooks/post-subagent-discovery-validator.mjs +398 -0
- package/hooks/post-tool-batch-wave-signal.mjs +328 -0
- package/hooks/post-tool-failure-corrective-context.mjs +248 -0
- package/hooks/post-tooluse-frontend-slop.mjs +184 -0
- package/hooks/pre-bash-destructive-guard.mjs +515 -0
- package/hooks/pre-bash-memory-propose-audit.mjs +206 -0
- package/hooks/pre-bash-staging-fence.mjs +223 -0
- package/hooks/pre-bash-templates-first.mjs +404 -0
- package/hooks/run-node.sh +72 -0
- package/hooks/skill-invocation-telemetry.mjs +99 -0
- package/hooks/subagent-telemetry.mjs +249 -0
- package/hooks/wave-scope-commit-guard.mjs +191 -0
- package/monitors/monitors.json +14 -0
- package/output-styles/finding-report.md +48 -0
- package/output-styles/session-report.md +53 -0
- package/output-styles/wave-summary.md +38 -0
- package/package.json +94 -0
- package/pi/extensions/session-orchestrator.ts +25 -0
- package/pi/prompts/autopilot-multi.md +12 -0
- package/pi/prompts/autopilot.md +12 -0
- package/pi/prompts/bootstrap.md +12 -0
- package/pi/prompts/brainstorm.md +12 -0
- package/pi/prompts/close.md +11 -0
- package/pi/prompts/debug.md +12 -0
- package/pi/prompts/discovery.md +12 -0
- package/pi/prompts/dispatcher.md +12 -0
- package/pi/prompts/eval.md +12 -0
- package/pi/prompts/evolve.md +12 -0
- package/pi/prompts/go.md +12 -0
- package/pi/prompts/grill.md +12 -0
- package/pi/prompts/harness-audit.md +12 -0
- package/pi/prompts/memory-cleanup.md +12 -0
- package/pi/prompts/persona-panel.md +12 -0
- package/pi/prompts/plan.md +12 -0
- package/pi/prompts/portfolio.md +12 -0
- package/pi/prompts/reconcile.md +12 -0
- package/pi/prompts/repo-audit.md +12 -0
- package/pi/prompts/session.md +12 -0
- package/pi/prompts/spinout.md +12 -0
- package/pi/prompts/sunset-review.md +12 -0
- package/pi/prompts/templates-ack.md +12 -0
- package/pi/prompts/test.md +12 -0
- package/rules/_index.md +51 -0
- package/rules/always-on/commit-discipline.md +26 -0
- package/rules/always-on/npm-quality-gates.md +26 -0
- package/rules/always-on/parallel-sessions.md +43 -0
- package/rules/opt-in-domain/prompt-caching.md +270 -0
- package/rules/opt-in-stack/backend-data.md +188 -0
- package/rules/opt-in-stack/backend.md +390 -0
- package/rules/opt-in-stack/frontend.md +98 -0
- package/rules/opt-in-stack/security-web.md +194 -0
- package/rules/opt-in-stack/swift.md +65 -0
- package/scripts/archive-closed-prds.mjs +416 -0
- package/scripts/autopilot-multi.mjs +802 -0
- package/scripts/autopilot.mjs +383 -0
- package/scripts/backfill-abandoned-sessions.mjs +265 -0
- package/scripts/backfill-learnings-expires.mjs +196 -0
- package/scripts/backfill-learnings.mjs +203 -0
- package/scripts/backfill-sessions.mjs +282 -0
- package/scripts/check-doc-consistency.sh +279 -0
- package/scripts/check-package-manager.mjs +445 -0
- package/scripts/ci/assert-vitest-green.mjs +267 -0
- package/scripts/codex-install.mjs +435 -0
- package/scripts/compute-grounding-injection.sh +186 -0
- package/scripts/cursor-install.mjs +113 -0
- package/scripts/dialectic-deriver.mjs +573 -0
- package/scripts/emit-event.mjs +160 -0
- package/scripts/emit-session.mjs +212 -0
- package/scripts/eval-session.mjs +262 -0
- package/scripts/export-hw-learnings.mjs +437 -0
- package/scripts/gc-stale-worktrees.mjs +666 -0
- package/scripts/generate-pi-prompts.mjs +127 -0
- package/scripts/harness-audit.mjs +287 -0
- package/scripts/lib/agent-frontmatter.mjs +266 -0
- package/scripts/lib/agent-output-schema.mjs +166 -0
- package/scripts/lib/agent-status.mjs +303 -0
- package/scripts/lib/ajv-loader.mjs +34 -0
- package/scripts/lib/auto-dialectic.mjs +382 -0
- package/scripts/lib/auto-dream.mjs +471 -0
- package/scripts/lib/autonomy/suitability.mjs +212 -0
- package/scripts/lib/autopilot/dep-graph.mjs +417 -0
- package/scripts/lib/autopilot/durable-telemetry.mjs +121 -0
- package/scripts/lib/autopilot/flags.mjs +104 -0
- package/scripts/lib/autopilot/kill-switches.mjs +174 -0
- package/scripts/lib/autopilot/loop.mjs +320 -0
- package/scripts/lib/autopilot/mr-draft.mjs +520 -0
- package/scripts/lib/autopilot/multi-killswitch.mjs +184 -0
- package/scripts/lib/autopilot/recent-runs.mjs +106 -0
- package/scripts/lib/autopilot/stall-sampler.mjs +97 -0
- package/scripts/lib/autopilot/telemetry.mjs +224 -0
- package/scripts/lib/autopilot/worktree-pipeline.mjs +605 -0
- package/scripts/lib/autopilot-telemetry.mjs +11 -0
- package/scripts/lib/autopilot.mjs +39 -0
- package/scripts/lib/backlog-scan.mjs +179 -0
- package/scripts/lib/bootstrap-lock-freshness.mjs +260 -0
- package/scripts/lib/bootstrap-lock-refresh.mjs +186 -0
- package/scripts/lib/build-live-signals.mjs +150 -0
- package/scripts/lib/ci-status-banner.mjs +425 -0
- package/scripts/lib/claude-md-budget-lint.mjs +246 -0
- package/scripts/lib/cli-flags.mjs +158 -0
- package/scripts/lib/codex/plugin-contract.mjs +610 -0
- package/scripts/lib/cold-start-detector.mjs +240 -0
- package/scripts/lib/command-blocker.mjs +458 -0
- package/scripts/lib/common.mjs +333 -0
- package/scripts/lib/config/auto-dream.mjs +77 -0
- package/scripts/lib/config/block-header.mjs +94 -0
- package/scripts/lib/config/broken-window.mjs +114 -0
- package/scripts/lib/config/coercers.mjs +248 -0
- package/scripts/lib/config/cold-start.mjs +92 -0
- package/scripts/lib/config/config-protection.mjs +120 -0
- package/scripts/lib/config/cross-repo.mjs +104 -0
- package/scripts/lib/config/custom-phases.mjs +213 -0
- package/scripts/lib/config/dialectic.mjs +92 -0
- package/scripts/lib/config/discovery-validator.mjs +75 -0
- package/scripts/lib/config/dispatcher-autonomy-capture.mjs +240 -0
- package/scripts/lib/config/dispatcher-autonomy.mjs +152 -0
- package/scripts/lib/config/docs-orchestrator.mjs +90 -0
- package/scripts/lib/config/docs-staleness.mjs +96 -0
- package/scripts/lib/config/drift-check.mjs +155 -0
- package/scripts/lib/config/eval.mjs +130 -0
- package/scripts/lib/config/events-rotation.mjs +74 -0
- package/scripts/lib/config/evolve.mjs +308 -0
- package/scripts/lib/config/frontend-slop-hook.mjs +104 -0
- package/scripts/lib/config/gitlab-portfolio.mjs +150 -0
- package/scripts/lib/config/handover-gate.mjs +106 -0
- package/scripts/lib/config/host-paths.mjs +76 -0
- package/scripts/lib/config/io.mjs +54 -0
- package/scripts/lib/config/loop-guard.mjs +117 -0
- package/scripts/lib/config/memory.mjs +150 -0
- package/scripts/lib/config/persona-gate-wave.mjs +258 -0
- package/scripts/lib/config/reconcile.mjs +205 -0
- package/scripts/lib/config/section-extractor.mjs +100 -0
- package/scripts/lib/config/skill-evolution.mjs +112 -0
- package/scripts/lib/config/slopcheck.mjs +99 -0
- package/scripts/lib/config/state-md-lock.mjs +83 -0
- package/scripts/lib/config/templates-first.mjs +94 -0
- package/scripts/lib/config/test.mjs +113 -0
- package/scripts/lib/config/vault-integration.mjs +201 -0
- package/scripts/lib/config/vault-mirror-quality.mjs +99 -0
- package/scripts/lib/config/vault-staleness.mjs +84 -0
- package/scripts/lib/config/vault-sync.mjs +96 -0
- package/scripts/lib/config/verification-auto-fix.mjs +84 -0
- package/scripts/lib/config/wave-reviewers.mjs +133 -0
- package/scripts/lib/config-schema.mjs +345 -0
- package/scripts/lib/config.mjs +474 -0
- package/scripts/lib/convergence-monitor.mjs +389 -0
- package/scripts/lib/coordinator-snapshot.mjs +371 -0
- package/scripts/lib/crypto-digest-utils.mjs +91 -0
- package/scripts/lib/discovery/helpers.mjs +127 -0
- package/scripts/lib/discovery/triage-state.mjs +279 -0
- package/scripts/lib/dispatcher/cli.mjs +257 -0
- package/scripts/lib/dispatcher/enumerate.mjs +243 -0
- package/scripts/lib/dispatcher/rank.mjs +363 -0
- package/scripts/lib/ecosystem-health.mjs +224 -0
- package/scripts/lib/ecosystem-wizard/ci-detector.mjs +18 -0
- package/scripts/lib/ecosystem-wizard/config-parser.mjs +54 -0
- package/scripts/lib/ecosystem-wizard/config-writer.mjs +287 -0
- package/scripts/lib/ecosystem-wizard/package-manager-detector.mjs +42 -0
- package/scripts/lib/ecosystem-wizard/wizard-prompt.mjs +246 -0
- package/scripts/lib/ecosystem-wizard.mjs +48 -0
- package/scripts/lib/env-check.mjs +89 -0
- package/scripts/lib/eval/engine.mjs +605 -0
- package/scripts/lib/eval/judge.mjs +433 -0
- package/scripts/lib/eval/report.mjs +367 -0
- package/scripts/lib/eval/schema.mjs +618 -0
- package/scripts/lib/eval/session-resolve.mjs +137 -0
- package/scripts/lib/eval/sink.mjs +77 -0
- package/scripts/lib/events-rotation.mjs +86 -0
- package/scripts/lib/events-schema.mjs +81 -0
- package/scripts/lib/events.mjs +80 -0
- package/scripts/lib/evolve/autonomy-verdict.mjs +461 -0
- package/scripts/lib/evolve/autopilot-effectiveness.mjs +293 -0
- package/scripts/lib/exclusivity-matrix.mjs +68 -0
- package/scripts/lib/fetch-baseline.mjs +311 -0
- package/scripts/lib/file-lock.mjs +512 -0
- package/scripts/lib/frontend-detect/detect.mjs +138 -0
- package/scripts/lib/frontend-detect/rules.mjs +295 -0
- package/scripts/lib/frontmatter-guard.mjs +241 -0
- package/scripts/lib/gates/echo-stub-detect.mjs +39 -0
- package/scripts/lib/gates/gate-baseline.mjs +42 -0
- package/scripts/lib/gates/gate-full.mjs +85 -0
- package/scripts/lib/gates/gate-helpers.mjs +231 -0
- package/scripts/lib/gates/gate-incremental.mjs +76 -0
- package/scripts/lib/gates/gate-per-file.mjs +55 -0
- package/scripts/lib/gitlab-ops/stale-mr-sweep.mjs +447 -0
- package/scripts/lib/gitlab-portfolio/aggregator.mjs +383 -0
- package/scripts/lib/gitlab-portfolio/cli.mjs +428 -0
- package/scripts/lib/gitlab-portfolio/markdown-writer.mjs +289 -0
- package/scripts/lib/gitlab-portfolio/vcs-detect.mjs +182 -0
- package/scripts/lib/handover-gate.mjs +222 -0
- package/scripts/lib/hardening.mjs +43 -0
- package/scripts/lib/hardware-pattern-detector.mjs +238 -0
- package/scripts/lib/harness-audit/categories/category1.mjs +123 -0
- package/scripts/lib/harness-audit/categories/category2.mjs +145 -0
- package/scripts/lib/harness-audit/categories/category3.mjs +143 -0
- package/scripts/lib/harness-audit/categories/category4.mjs +202 -0
- package/scripts/lib/harness-audit/categories/category5.mjs +152 -0
- package/scripts/lib/harness-audit/categories/category6.mjs +211 -0
- package/scripts/lib/harness-audit/categories/category7.mjs +125 -0
- package/scripts/lib/harness-audit/categories/category8.mjs +328 -0
- package/scripts/lib/harness-audit/categories/category9.mjs +294 -0
- package/scripts/lib/harness-audit/categories/helpers.mjs +165 -0
- package/scripts/lib/harness-audit/categories.mjs +19 -0
- package/scripts/lib/historical-guard.mjs +15 -0
- package/scripts/lib/host-identity.mjs +262 -0
- package/scripts/lib/instruction-budget-guard.mjs +332 -0
- package/scripts/lib/io.mjs +304 -0
- package/scripts/lib/issue-close-strip-labels.mjs +161 -0
- package/scripts/lib/language-mappers/README.md +57 -0
- package/scripts/lib/language-mappers/index.mjs +165 -0
- package/scripts/lib/language-mappers/markdown.mjs +149 -0
- package/scripts/lib/language-mappers/python.mjs +249 -0
- package/scripts/lib/language-mappers/swift.mjs +201 -0
- package/scripts/lib/language-mappers/typescript.mjs +433 -0
- package/scripts/lib/learnings/expiry-sweep.mjs +164 -0
- package/scripts/lib/learnings/filters.mjs +43 -0
- package/scripts/lib/learnings/io.mjs +255 -0
- package/scripts/lib/learnings/schema.mjs +518 -0
- package/scripts/lib/learnings/surface.mjs +207 -0
- package/scripts/lib/learnings.mjs +42 -0
- package/scripts/lib/lock-reaper.mjs +648 -0
- package/scripts/lib/locks/index.mjs +31 -0
- package/scripts/lib/locks/lock-body.mjs +62 -0
- package/scripts/lib/locks/staging-fence-lock.mjs +267 -0
- package/scripts/lib/locks/state-md-lock.mjs +351 -0
- package/scripts/lib/loop-readiness-banner.mjs +144 -0
- package/scripts/lib/memory-banner.mjs +478 -0
- package/scripts/lib/memory-cleanup/worktree-sweep.mjs +108 -0
- package/scripts/lib/memory-cleanup-stamp.mjs +56 -0
- package/scripts/lib/memory-paths.mjs +31 -0
- package/scripts/lib/memory-proposals/collector.mjs +334 -0
- package/scripts/lib/memory-proposals/schema.mjs +289 -0
- package/scripts/lib/memory-proposals/sink.mjs +507 -0
- package/scripts/lib/memory-proposals/store.mjs +441 -0
- package/scripts/lib/mission-status-schema.mjs +114 -0
- package/scripts/lib/mode-selector/alternatives.mjs +64 -0
- package/scripts/lib/mode-selector/constants.mjs +29 -0
- package/scripts/lib/mode-selector/context-pressure.mjs +157 -0
- package/scripts/lib/mode-selector/rationale.mjs +55 -0
- package/scripts/lib/mode-selector/scoring.mjs +221 -0
- package/scripts/lib/mode-selector-accuracy.mjs +121 -0
- package/scripts/lib/mode-selector.mjs +160 -0
- package/scripts/lib/multi-provider-build/providers.mjs +64 -0
- package/scripts/lib/multi-provider-build/templating.mjs +130 -0
- package/scripts/lib/named-baseline-resolver.mjs +233 -0
- package/scripts/lib/named-vault-resolver.mjs +433 -0
- package/scripts/lib/owner-config/coerce.mjs +29 -0
- package/scripts/lib/owner-config/constants.mjs +21 -0
- package/scripts/lib/owner-config/defaults.mjs +50 -0
- package/scripts/lib/owner-config/error.mjs +19 -0
- package/scripts/lib/owner-config/index.mjs +13 -0
- package/scripts/lib/owner-config/merge.mjs +52 -0
- package/scripts/lib/owner-config/validate.mjs +259 -0
- package/scripts/lib/owner-config-banner.mjs +126 -0
- package/scripts/lib/owner-config-loader.mjs +159 -0
- package/scripts/lib/owner-config.example.yaml +72 -0
- package/scripts/lib/owner-config.mjs +28 -0
- package/scripts/lib/owner-interview.mjs +243 -0
- package/scripts/lib/owner-yaml.mjs +571 -0
- package/scripts/lib/package-manager.mjs +160 -0
- package/scripts/lib/path-utils.mjs +217 -0
- package/scripts/lib/peer-cards/merger.mjs +310 -0
- package/scripts/lib/peer-cards/reader.mjs +125 -0
- package/scripts/lib/peer-cards/schema.mjs +230 -0
- package/scripts/lib/peer-cards/staleness-banner.mjs +86 -0
- package/scripts/lib/peer-cards/writer.mjs +138 -0
- package/scripts/lib/peer-discovery.mjs +200 -0
- package/scripts/lib/persona-panel/catalog-loader.mjs +577 -0
- package/scripts/lib/persona-panel/consolidator.mjs +370 -0
- package/scripts/lib/persona-panel/persona-runner.mjs +375 -0
- package/scripts/lib/persona-panel/threshold.mjs +130 -0
- package/scripts/lib/pi-hook-bridge.mjs +328 -0
- package/scripts/lib/platform.mjs +266 -0
- package/scripts/lib/playwright-driver/runner.mjs +297 -0
- package/scripts/lib/plugin-root.mjs +210 -0
- package/scripts/lib/pre-dispatch-check.mjs +126 -0
- package/scripts/lib/product-repo-detect.mjs +121 -0
- package/scripts/lib/profiles/registry.mjs +176 -0
- package/scripts/lib/profiles/schema.mjs +209 -0
- package/scripts/lib/qg-command-drift-banner.mjs +88 -0
- package/scripts/lib/quality-gate/diagnostics.mjs +92 -0
- package/scripts/lib/quality-gate.mjs +536 -0
- package/scripts/lib/quality-gates-cache.mjs +228 -0
- package/scripts/lib/quality-gates-policy.mjs +95 -0
- package/scripts/lib/recommendations-v0.mjs +156 -0
- package/scripts/lib/reconcile/eligibility.mjs +203 -0
- package/scripts/lib/reconcile/emitter.mjs +244 -0
- package/scripts/lib/reconcile/engine.mjs +412 -0
- package/scripts/lib/reconcile/idempotency.mjs +239 -0
- package/scripts/lib/reconcile/renderer.mjs +211 -0
- package/scripts/lib/reconcile/writer.mjs +293 -0
- package/scripts/lib/reconcile-nudge-banner.mjs +284 -0
- package/scripts/lib/resource-probe/evaluate.mjs +190 -0
- package/scripts/lib/resource-probe/parsers.mjs +181 -0
- package/scripts/lib/resource-probe/probe-platform.mjs +300 -0
- package/scripts/lib/resource-probe.mjs +95 -0
- package/scripts/lib/rule-loader.mjs +552 -0
- package/scripts/lib/rules-sync.mjs +439 -0
- package/scripts/lib/scope-gate.mjs +496 -0
- package/scripts/lib/session-close-backfill.mjs +539 -0
- package/scripts/lib/session-discovery.mjs +256 -0
- package/scripts/lib/session-end/phase-skip.mjs +357 -0
- package/scripts/lib/session-end/worktree-cleanup.mjs +112 -0
- package/scripts/lib/session-id.mjs +362 -0
- package/scripts/lib/session-lock.mjs +703 -0
- package/scripts/lib/session-registry.mjs +355 -0
- package/scripts/lib/session-schema/aliases.mjs +71 -0
- package/scripts/lib/session-schema/constants.mjs +115 -0
- package/scripts/lib/session-schema/normalizer.mjs +66 -0
- package/scripts/lib/session-schema/timestamps.mjs +64 -0
- package/scripts/lib/session-schema/validator.mjs +453 -0
- package/scripts/lib/session-schema.mjs +71 -0
- package/scripts/lib/session-token-rollup.mjs +137 -0
- package/scripts/lib/sessions-staleness-banner.mjs +247 -0
- package/scripts/lib/skill-evolution/blast-radius-classifier.mjs +114 -0
- package/scripts/lib/skill-evolution/candidate-intake.mjs +270 -0
- package/scripts/lib/skill-evolution/config-validation-gate.mjs +279 -0
- package/scripts/lib/skill-evolution/engine.mjs +719 -0
- package/scripts/lib/skill-evolution/idempotency.mjs +279 -0
- package/scripts/lib/skill-evolution/mr-opener.mjs +507 -0
- package/scripts/lib/skill-health/join.mjs +181 -0
- package/scripts/lib/skill-health/score.mjs +123 -0
- package/scripts/lib/skill-invocations-schema.mjs +214 -0
- package/scripts/lib/skill-judge.mjs +348 -0
- package/scripts/lib/skill-judgments-schema.mjs +264 -0
- package/scripts/lib/slopcheck.mjs +501 -0
- package/scripts/lib/soul-resolve.mjs +118 -0
- package/scripts/lib/spiral-carryover.mjs +495 -0
- package/scripts/lib/state-md/body-sections.mjs +851 -0
- package/scripts/lib/state-md/frontmatter-mutators.mjs +453 -0
- package/scripts/lib/state-md/mission-status.mjs +247 -0
- package/scripts/lib/state-md/recommendations.mjs +57 -0
- package/scripts/lib/state-md/yaml-parser.mjs +234 -0
- package/scripts/lib/state-md-peer-guard.mjs +232 -0
- package/scripts/lib/state-md.mjs +53 -0
- package/scripts/lib/subagents-schema.mjs +309 -0
- package/scripts/lib/sunset/walker.mjs +1192 -0
- package/scripts/lib/test-runner/artifact-paths.mjs +94 -0
- package/scripts/lib/test-runner/fingerprint.mjs +33 -0
- package/scripts/lib/test-runner/issue-reconcile.mjs +770 -0
- package/scripts/lib/tmux-layout/layouts.mjs +224 -0
- package/scripts/lib/tmux-layout/telemetry-stats.mjs +100 -0
- package/scripts/lib/tmux-layout/telemetry.mjs +88 -0
- package/scripts/lib/tmux-layout/tmux-shell.mjs +82 -0
- package/scripts/lib/tmux-layout/vcs-detector.mjs +88 -0
- package/scripts/lib/validate/check-agents.mjs +457 -0
- package/scripts/lib/validate/check-codex-plugin.mjs +37 -0
- package/scripts/lib/validate/check-commands.mjs +148 -0
- package/scripts/lib/validate/check-component-paths.mjs +112 -0
- package/scripts/lib/validate/check-dead-bridge.mjs +180 -0
- package/scripts/lib/validate/check-hooks-symmetry.mjs +258 -0
- package/scripts/lib/validate/check-json-files.mjs +116 -0
- package/scripts/lib/validate/check-owner-leakage.mjs +1011 -0
- package/scripts/lib/validate/check-path-utils-canary.mjs +175 -0
- package/scripts/lib/validate/check-peekaboo-driver-canary.mjs +201 -0
- package/scripts/lib/validate/check-pi-package.mjs +110 -0
- package/scripts/lib/validate/check-pi-prompts.mjs +43 -0
- package/scripts/lib/validate/check-playwright-mcp-canary.mjs +154 -0
- package/scripts/lib/validate/check-plugin-json.mjs +96 -0
- package/scripts/lib/validate/check-plugin-monitors.mjs +206 -0
- package/scripts/lib/validate/check-plugin-schema.mjs +137 -0
- package/scripts/lib/validate/check-rules.mjs +143 -0
- package/scripts/lib/validate/check-session-plan-routing.mjs +154 -0
- package/scripts/lib/validate/check-test-fixture-shapes.mjs +280 -0
- package/scripts/lib/validate/check-unicode-safety.mjs +533 -0
- package/scripts/lib/validate/confidential-names.mjs +169 -0
- package/scripts/lib/validate/dead-bridge-corpus.mjs +141 -0
- package/scripts/lib/validate/dead-bridge-detectors.mjs +568 -0
- package/scripts/lib/validate/tier-inference.mjs +100 -0
- package/scripts/lib/validate-vendored-rules.mjs +519 -0
- package/scripts/lib/vault-archive.mjs +404 -0
- package/scripts/lib/vault-backfill/glab.mjs +164 -0
- package/scripts/lib/vault-backfill/manifest.mjs +75 -0
- package/scripts/lib/vault-backfill/template.mjs +130 -0
- package/scripts/lib/vault-consolidate-fs.mjs +331 -0
- package/scripts/lib/vault-migration-rules.mjs +155 -0
- package/scripts/lib/vault-mirror/auto-commit.mjs +203 -0
- package/scripts/lib/vault-mirror/namespace.mjs +152 -0
- package/scripts/lib/vault-mirror/process.mjs +567 -0
- package/scripts/lib/vault-mirror/pseudonym-map.mjs +164 -0
- package/scripts/lib/vault-mirror/render-learnings.mjs +201 -0
- package/scripts/lib/vault-mirror/render-sessions.mjs +367 -0
- package/scripts/lib/vault-mirror/render.mjs +8 -0
- package/scripts/lib/vault-mirror/utils.mjs +217 -0
- package/scripts/lib/vault-relocation-rules.mjs +555 -0
- package/scripts/lib/vault-repo-backfill.mjs +235 -0
- package/scripts/lib/vault-staleness-banner.mjs +142 -0
- package/scripts/lib/vault-status/board-writer.mjs +769 -0
- package/scripts/lib/vault-status/narrative-mirror.mjs +544 -0
- package/scripts/lib/vault-sync-baseline.mjs +152 -0
- package/scripts/lib/wave-context.mjs +29 -0
- package/scripts/lib/wave-executor/pool.mjs +248 -0
- package/scripts/lib/wave-resource-gate.mjs +204 -0
- package/scripts/lib/wave-sizing.mjs +75 -0
- package/scripts/lib/webhook-url.mjs +105 -0
- package/scripts/lib/workspace.mjs +198 -0
- package/scripts/lib/worktree/constants.mjs +35 -0
- package/scripts/lib/worktree/index.mjs +17 -0
- package/scripts/lib/worktree/lifecycle.mjs +287 -0
- package/scripts/lib/worktree/listing.mjs +118 -0
- package/scripts/lib/worktree/meta.mjs +64 -0
- package/scripts/lib/worktree-freshness.mjs +313 -0
- package/scripts/lib/worktree.mjs +15 -0
- package/scripts/lifecycle-sim-v6.mjs +347 -0
- package/scripts/lock-reaper.mjs +185 -0
- package/scripts/mcp-server.sh +241 -0
- package/scripts/measure-policy-cache-effectiveness.mjs +427 -0
- package/scripts/memory-propose.mjs +464 -0
- package/scripts/migrate-cold-start-seed.mjs +404 -0
- package/scripts/migrate-learnings-jsonl.mjs +189 -0
- package/scripts/migrate-legacy-learnings.sh +61 -0
- package/scripts/migrate-sessions-jsonl.mjs +448 -0
- package/scripts/migrate-subagents-jsonl.mjs +196 -0
- package/scripts/migrate-vault-paths.mjs +796 -0
- package/scripts/parse-config.mjs +149 -0
- package/scripts/pi-install.mjs +117 -0
- package/scripts/print-applicable-rules.mjs +247 -0
- package/scripts/promote-vault-strict.mjs +496 -0
- package/scripts/relocate-vault-corpus.mjs +1178 -0
- package/scripts/run-migrate-v2-cross-repo.mjs +385 -0
- package/scripts/run-quality-gate.mjs +216 -0
- package/scripts/spikes/h3-agent-teams/preflight.sh +53 -0
- package/scripts/spikes/h3-agent-teams/run-h3.sh +112 -0
- package/scripts/spikes/h3-agent-teams/setup.sh +137 -0
- package/scripts/spikes/h3-agent-teams/toggle.sh +38 -0
- package/scripts/sweep-expired-learnings.mjs +135 -0
- package/scripts/sync-vault-schema.mjs +376 -0
- package/scripts/tests/fixtures/fetch-baseline/sample-rule.md +8 -0
- package/scripts/tmux-layout.mjs +245 -0
- package/scripts/token-audit.sh +191 -0
- package/scripts/typecheck.mjs +42 -0
- package/scripts/upload-social-preview.mjs +316 -0
- package/scripts/validate-config.mjs +46 -0
- package/scripts/validate-plugin-manifests.mjs +163 -0
- package/scripts/validate-plugin.mjs +264 -0
- package/scripts/validate-wave-scope.mjs +289 -0
- package/scripts/vault-backfill.mjs +404 -0
- package/scripts/vault-consolidate.mjs +596 -0
- package/scripts/vault-integration-watcher.mjs +394 -0
- package/scripts/vault-mirror.mjs +430 -0
- package/skills/_shared/bootstrap-gate.md +111 -0
- package/skills/_shared/config-reading.md +226 -0
- package/skills/_shared/instruction-file-resolution.md +79 -0
- package/skills/_shared/model-selection.md +64 -0
- package/skills/_shared/monitor-patterns.md +300 -0
- package/skills/_shared/parallel-aware-auq.md +121 -0
- package/skills/_shared/parallel-aware-preamble.md +185 -0
- package/skills/_shared/platform-tools.md +96 -0
- package/skills/_shared/state-ownership.md +221 -0
- package/skills/architecture/DEEPENING.md +37 -0
- package/skills/architecture/INTERFACE-DESIGN.md +44 -0
- package/skills/architecture/LANGUAGE.md +53 -0
- package/skills/architecture/SKILL.md +92 -0
- package/skills/autopilot/SKILL.md +419 -0
- package/skills/bootstrap/SKILL.md +592 -0
- package/skills/bootstrap/STATE.md.template +24 -0
- package/skills/bootstrap/_shared-template.md +243 -0
- package/skills/bootstrap/deep-template.md +659 -0
- package/skills/bootstrap/fast-template.md +251 -0
- package/skills/bootstrap/intensity-heuristic.md +80 -0
- package/skills/bootstrap/public-fallback.md +342 -0
- package/skills/bootstrap/standard-template.md +736 -0
- package/skills/bootstrap/templates/agents/project-code-review.md +18 -0
- package/skills/bootstrap/templates/agents/project-discovery.md +18 -0
- package/skills/bootstrap/templates/agents/project-quality-gate.md +18 -0
- package/skills/brainstorm/SKILL.md +268 -0
- package/skills/brainstorm/soul.md +49 -0
- package/skills/claude-md-drift-check/SKILL.md +186 -0
- package/skills/claude-md-drift-check/checker.mjs +1380 -0
- package/skills/claude-md-drift-check/checker.sh +37 -0
- package/skills/claude-md-drift-check/package.json +16 -0
- package/skills/convergence-monitoring/README.md +39 -0
- package/skills/convergence-monitoring/SIGNALS.md +246 -0
- package/skills/convergence-monitoring/SKILL.md +285 -0
- package/skills/daily/SKILL.md +222 -0
- package/skills/daily/generate.sh +92 -0
- package/skills/daily/templates/daily.md.tpl +36 -0
- package/skills/debug/SKILL.md +188 -0
- package/skills/debug/soul.md +35 -0
- package/skills/discovery/SKILL.md +567 -0
- package/skills/discovery/issue-templates.md +237 -0
- package/skills/discovery/probes/docs-staleness.mjs +195 -0
- package/skills/discovery/probes/frontend-slop.mjs +186 -0
- package/skills/discovery/probes/ssot-code-diff.mjs +310 -0
- package/skills/discovery/probes/supply-chain-slopcheck.mjs +440 -0
- package/skills/discovery/probes/vault-narrative-staleness.mjs +355 -0
- package/skills/discovery/probes/vault-staleness.mjs +272 -0
- package/skills/discovery/probes-arch.md +252 -0
- package/skills/discovery/probes-audit.md +95 -0
- package/skills/discovery/probes-code.md +329 -0
- package/skills/discovery/probes-docs.md +76 -0
- package/skills/discovery/probes-feature.md +150 -0
- package/skills/discovery/probes-infra.md +138 -0
- package/skills/discovery/probes-intro.md +25 -0
- package/skills/discovery/probes-session.md +495 -0
- package/skills/discovery/probes-supply-chain.md +94 -0
- package/skills/discovery/probes-ui.md +147 -0
- package/skills/discovery/probes-vault.md +64 -0
- package/skills/discovery/slop-patterns.md +115 -0
- package/skills/dispatcher/SKILL.md +173 -0
- package/skills/docs-orchestrator/SKILL.md +362 -0
- package/skills/docs-orchestrator/audience-mapping.md +140 -0
- package/skills/domain-model/ADR-FORMAT.md +47 -0
- package/skills/domain-model/CONTEXT-FORMAT.md +77 -0
- package/skills/domain-model/SKILL.md +85 -0
- package/skills/ecosystem-health/SKILL.md +119 -0
- package/skills/ecosystem-health/wizard.md +193 -0
- package/skills/eval/SKILL.md +293 -0
- package/skills/eval/rubric-v1.md +218 -0
- package/skills/evolve/SKILL.md +546 -0
- package/skills/frontmatter-guard/SKILL.md +126 -0
- package/skills/gitlab-ops/SKILL.md +368 -0
- package/skills/gitlab-portfolio/SKILL.md +196 -0
- package/skills/grill/SKILL.md +185 -0
- package/skills/grill/soul.md +55 -0
- package/skills/hook-development/SKILL.md +413 -0
- package/skills/mcp-builder/SKILL.md +260 -0
- package/skills/memory-cleanup/SKILL.md +310 -0
- package/skills/mode-selector/SKILL.md +226 -0
- package/skills/peekaboo-driver/SKILL.md +237 -0
- package/skills/peekaboo-driver/soul.md +32 -0
- package/skills/persona-panel/SKILL.md +365 -0
- package/skills/persona-panel/persona-format.md +205 -0
- package/skills/persona-panel/presets/designer-lens.md +87 -0
- package/skills/persona-panel/presets/engineer-lens.md +88 -0
- package/skills/persona-panel/presets/pm-lens.md +86 -0
- package/skills/plan/SKILL.md +496 -0
- package/skills/plan/mode-feature.md +141 -0
- package/skills/plan/mode-new.md +297 -0
- package/skills/plan/mode-retro.md +271 -0
- package/skills/plan/prd-feature-template.md +132 -0
- package/skills/plan/prd-full-template.md +151 -0
- package/skills/plan/prd-reviewer-prompt.md +103 -0
- package/skills/plan/retro-template.md +75 -0
- package/skills/plan/soul.md +62 -0
- package/skills/playwright-driver/SKILL.md +226 -0
- package/skills/playwright-driver/soul.md +30 -0
- package/skills/quality-gates/SKILL.md +212 -0
- package/skills/reconcile/SKILL.md +324 -0
- package/skills/repo-audit/SKILL.md +272 -0
- package/skills/session-end/SKILL.md +1044 -0
- package/skills/session-end/discovery-scan.md +37 -0
- package/skills/session-end/drift-operations.md +97 -0
- package/skills/session-end/learning-patterns.md +78 -0
- package/skills/session-end/metrics-collection.md +175 -0
- package/skills/session-end/phase-3-2-docs-verification.md +148 -0
- package/skills/session-end/phase-3-6-tail.md +344 -0
- package/skills/session-end/phase-3-7a-recommendations.md +86 -0
- package/skills/session-end/plan-verification.md +288 -0
- package/skills/session-end/session-metrics-write.md +223 -0
- package/skills/session-end/vault-operations.md +50 -0
- package/skills/session-end/verification-checklist.md +20 -0
- package/skills/session-plan/SKILL.md +554 -0
- package/skills/session-plan/wave-template.md +37 -0
- package/skills/session-start/SKILL.md +1043 -0
- package/skills/session-start/phase-2-5-docs-planning.md +119 -0
- package/skills/session-start/phase-4-5-resource-health.md +49 -0
- package/skills/session-start/phase-7-1-premise-check.md +47 -0
- package/skills/session-start/phase-7-5-mode-selector.md +237 -0
- package/skills/session-start/phase-8-5-express-path.md +61 -0
- package/skills/session-start/presentation-format.md +81 -0
- package/skills/session-start/soul.md +57 -0
- package/skills/skill-creator/SKILL.md +168 -0
- package/skills/spinout/SKILL.md +76 -0
- package/skills/sunset-review/SKILL.md +96 -0
- package/skills/test-runner/SKILL.md +362 -0
- package/skills/test-runner/rubric-v1.md +388 -0
- package/skills/test-runner/soul.md +46 -0
- package/skills/tmux-layout/SKILL.md +104 -0
- package/skills/ubiquitous-language/SKILL.md +97 -0
- package/skills/using-orchestrator/SKILL.md +144 -0
- package/skills/vault-mirror/SKILL.md +234 -0
- package/skills/vault-sync/SKILL.md +319 -0
- package/skills/vault-sync/package-lock.json +40 -0
- package/skills/vault-sync/package.json +11 -0
- package/skills/vault-sync/tests/fixtures/archive-test-vault/90-archive/bad-archived.md +8 -0
- package/skills/vault-sync/tests/fixtures/archive-test-vault/_meta/.gitkeep +0 -0
- package/skills/vault-sync/tests/fixtures/archive-test-vault/live-note.md +8 -0
- package/skills/vault-sync/tests/fixtures/broken-frontmatter-vault/_meta/.gitkeep +0 -0
- package/skills/vault-sync/tests/fixtures/broken-frontmatter-vault/bad-type.md +8 -0
- package/skills/vault-sync/tests/fixtures/broken-frontmatter-vault/good-note.md +8 -0
- package/skills/vault-sync/tests/fixtures/clean-vault/.obsidian/config.md +8 -0
- package/skills/vault-sync/tests/fixtures/clean-vault/01-projects/foo/projects-baseline.md +10 -0
- package/skills/vault-sync/tests/fixtures/clean-vault/03-daily/daily-2026-04-13.md +8 -0
- package/skills/vault-sync/tests/fixtures/clean-vault/README.md +3 -0
- package/skills/vault-sync/tests/fixtures/clean-vault/hello-world.md +11 -0
- package/skills/vault-sync/tests/fixtures/dangling-link-vault/_meta/.gitkeep +0 -0
- package/skills/vault-sync/tests/fixtures/dangling-link-vault/has-dangling.md +9 -0
- package/skills/vault-sync/tests/fixtures/dangling-link-vault/real-target.md +8 -0
- package/skills/vault-sync/tests/fixtures/empty-vault/_meta/.gitkeep +0 -0
- package/skills/vault-sync/tests/fixtures/missing-field-vault/_meta/.gitkeep +0 -0
- package/skills/vault-sync/tests/fixtures/missing-field-vault/missing-id.md +7 -0
- package/skills/vault-sync/tests/fixtures/nested-tag-vault/03-daily/daily-2026-04-13.md +9 -0
- package/skills/vault-sync/tests/fixtures/nested-tag-vault/_meta/.gitkeep +0 -0
- package/skills/vault-sync/tests/fixtures/nested-tag-vault/nested-tags-note.md +11 -0
- package/skills/vault-sync/tests/fixtures/no-frontmatter-vault/README.md +3 -0
- package/skills/vault-sync/tests/fixtures/no-frontmatter-vault/_MOC.md +3 -0
- package/skills/vault-sync/tests/fixtures/no-frontmatter-vault/_meta/.gitkeep +0 -0
- package/skills/vault-sync/tests/fixtures/with-moc-vault/_MOC.md +11 -0
- package/skills/vault-sync/tests/fixtures/with-moc-vault/_meta/.gitkeep +0 -0
- package/skills/vault-sync/tests/fixtures/with-moc-vault/hello-world.md +11 -0
- package/skills/vault-sync/tests/schema-drift.test.mjs +133 -0
- package/skills/vault-sync/validator.mjs +658 -0
- package/skills/vault-sync/validator.sh +55 -0
- package/skills/wave-executor/SKILL.md +496 -0
- package/skills/wave-executor/circuit-breaker.md +169 -0
- package/skills/wave-executor/wave-loop.md +1043 -0
- package/skills/write-executable-plan/SKILL.md +237 -0
- package/skills/write-executable-plan/plan-template.md +154 -0
- package/templates/_minimal/CLAUDE.md.tmpl +41 -0
- package/templates/_minimal/README.md.tmpl +15 -0
- package/templates/_minimal/gitignore.tmpl +47 -0
- package/templates/_shared/harte-regeln.md +16 -0
- package/templates/_shared/loop.md +90 -0
- package/templates/_shared/rules/parallel-sessions.md +77 -0
- package/templates/nextjs-minimal/README.md +30 -0
- package/templates/nextjs-minimal/app/layout.tsx +18 -0
- package/templates/nextjs-minimal/app/page.tsx +7 -0
- package/templates/nextjs-minimal/eslint.config.mjs +16 -0
- package/templates/nextjs-minimal/next.config.mjs +4 -0
- package/templates/nextjs-minimal/package.json +27 -0
- package/templates/nextjs-minimal/tsconfig.json +23 -0
- package/templates/node-minimal/README.md +33 -0
- package/templates/node-minimal/eslint.config.mjs +10 -0
- package/templates/node-minimal/package.json +21 -0
- package/templates/node-minimal/src/index.ts +1 -0
- package/templates/node-minimal/tests/sanity.test.ts +5 -0
- package/templates/node-minimal/tsconfig.json +17 -0
- package/templates/personas/README.md +150 -0
- package/templates/personas/accounting-compliance.v1.md +120 -0
- package/templates/personas/accounting-tax-advisor.v1.md +116 -0
- package/templates/personas/buyer-p1-cto.v1.md +125 -0
- package/templates/personas/buyer-p2-kanzlei.v1.md +134 -0
- package/templates/personas/buyer-p3-build.v1.md +130 -0
- package/templates/personas/buyer-p4-tech-veto.v1.md +130 -0
- package/templates/personas/buyer-p5-solo.v1.md +132 -0
- package/templates/personas/buyer-p6-ld.v1.md +130 -0
- package/templates/personas/klima-ai-expert.v1.md +114 -0
- package/templates/personas/klima-physicist.v1.md +117 -0
- package/templates/python-uv/README.md +28 -0
- package/templates/python-uv/pyproject.toml +32 -0
- package/templates/python-uv/src/__PROJECT_NAME__/__init__.py +0 -0
- package/templates/python-uv/src/__PROJECT_NAME__/main.py +6 -0
- package/templates/python-uv/tests/test_sanity.py +2 -0
- package/templates/static-html/README.md +19 -0
- package/templates/static-html/index.html +15 -0
- package/templates/static-html/script.js +1 -0
- package/templates/static-html/styles.css +26 -0
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
# Bootstrap Fast Template
|
|
2
|
+
|
|
3
|
+
> Scaffold instructions for the Fast tier.
|
|
4
|
+
> Called from `skills/bootstrap/SKILL.md` Phase 3 when `CONFIRMED_TIER = fast`.
|
|
5
|
+
|
|
6
|
+
## What Fast Tier Creates
|
|
7
|
+
|
|
8
|
+
| File | Purpose |
|
|
9
|
+
|------|---------|
|
|
10
|
+
| `CLAUDE.md` (or `AGENTS.md` on Codex) | Project instruction file with `## Session Config` |
|
|
11
|
+
| `.gitignore` | Platform-appropriate minimal ignore rules |
|
|
12
|
+
| `README.md` | One-line stub with project name and description |
|
|
13
|
+
| `.orchestrator/bootstrap.lock` | Gate marker — committed to git |
|
|
14
|
+
|
|
15
|
+
Intentionally absent: `package.json`, frameworks, tests, CI config. The feature that follows brings its own stack.
|
|
16
|
+
|
|
17
|
+
## Step 1: Ensure Git Repo is Initialized
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
cd "$REPO_ROOT"
|
|
21
|
+
if [[ ! -d ".git" ]]; then
|
|
22
|
+
git init
|
|
23
|
+
echo "Git repo initialized."
|
|
24
|
+
fi
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## Step 2: Generate CLAUDE.md (or AGENTS.md)
|
|
28
|
+
|
|
29
|
+
**If `PATH_TYPE = public`:**
|
|
30
|
+
|
|
31
|
+
Defer entirely to `skills/bootstrap/public-fallback.md` — "Public Path — Fast Tier" section. That file is the single source of truth for Public-path CLAUDE.md generation (claude init path for Claude Code; `_minimal` template synthesis for Codex/Cursor; Session Config injection). Do not duplicate its logic here.
|
|
32
|
+
|
|
33
|
+
**`claude init` overwrite guard:** `public-fallback.md` Fast Tier runs `claude init` only when
|
|
34
|
+
`CLAUDE.md` does not already exist (`[[ ! -f "$REPO_ROOT/CLAUDE.md" ]]`). This prevents
|
|
35
|
+
overwriting project-specific customisations on re-runs (issue #108).
|
|
36
|
+
|
|
37
|
+
After `public-fallback.md` completes CLAUDE.md generation, continue to Step 2b to verify the Session Config block.
|
|
38
|
+
|
|
39
|
+
**If `PATH_TYPE = private`:**
|
|
40
|
+
|
|
41
|
+
Use the baseline scripts at `$BASELINE_PATH` as directed by the baseline's own documentation. Proceed with baseline-driven CLAUDE.md generation, then continue to Step 2b.
|
|
42
|
+
|
|
43
|
+
**Step 2b: Verify Session Config block.** After writing or updating CLAUDE.md, check for the sentinel string `## Session Config`:
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
if grep -q "^## Session Config" CLAUDE.md; then
|
|
47
|
+
echo "Session Config block confirmed."
|
|
48
|
+
else
|
|
49
|
+
# Sentinel absent — claude init did NOT populate the file (or wrote minimal content).
|
|
50
|
+
# Fall back to plugin-template generation: append canonical Harte-Regeln block
|
|
51
|
+
# BEFORE the Session Config block (pattern: the templates/_shared/... cp steps
|
|
52
|
+
# in Step 3a below).
|
|
53
|
+
if ! grep -q "^## Harte Regeln" CLAUDE.md 2>/dev/null; then
|
|
54
|
+
cat "$PLUGIN_ROOT/templates/_shared/harte-regeln.md" >> CLAUDE.md
|
|
55
|
+
fi
|
|
56
|
+
# Fall back to plugin-template generation: append canonical Session Config block
|
|
57
|
+
# (issue #182: 7 mandatory fields enforced by scripts/lib/config-schema.mjs).
|
|
58
|
+
cat >> CLAUDE.md <<'EOF'
|
|
59
|
+
|
|
60
|
+
## Session Config
|
|
61
|
+
|
|
62
|
+
project-name: <PROJECT_NAME>
|
|
63
|
+
vcs: <VCS>
|
|
64
|
+
persistence: true
|
|
65
|
+
enforcement: warn # strict | warn | off
|
|
66
|
+
waves: 5
|
|
67
|
+
agents-per-wave: 6
|
|
68
|
+
test-command: <detect per package-manager>
|
|
69
|
+
typecheck-command: <detect>
|
|
70
|
+
lint-command: <detect>
|
|
71
|
+
recent-commits: 20
|
|
72
|
+
stale-branch-days: 7
|
|
73
|
+
skill-evolution:
|
|
74
|
+
autonomy: off # off | advisory | autonomous-gated — opt-in self-evolution (default off)
|
|
75
|
+
EOF
|
|
76
|
+
fi
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
If `## Session Config` is present, confirm the 7 mandatory fields (per issue #182, enforced by `scripts/lib/config-schema.mjs`) plus `project-name` and `vcs` are present. Mandatory: `test-command`, `typecheck-command`, `lint-command`, `agents-per-wave`, `waves`, `persistence`, `enforcement`. If any are missing, append them.
|
|
80
|
+
|
|
81
|
+
**Config file selection by platform:**
|
|
82
|
+
- Claude Code → `CLAUDE.md`
|
|
83
|
+
- Codex CLI → `AGENTS.md`
|
|
84
|
+
- Cursor IDE → `CLAUDE.md`
|
|
85
|
+
|
|
86
|
+
**Step 2c: CLAUDE.md budget lint.** After Step 2b confirms/repairs the Session Config block, run the raw-file-property lint against the freshly written instruction file:
|
|
87
|
+
|
|
88
|
+
```bash
|
|
89
|
+
node "$PLUGIN_ROOT/scripts/lib/claude-md-budget-lint.mjs" --repo-root "$REPO_ROOT" --require-provenance --mode warn --json
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
`--mode warn` is deliberate at Anlage-time — the lint informs, the operator decides; it never blocks the scaffold. Interpret the JSON `violations[]`:
|
|
93
|
+
- `max-lines` — the instruction file is already over the lean-root ceiling (150 lines default). Recommend trimming to pointers per the lean-root convention (delegate detail to `README.md` / `.orchestrator/steering/` / `.claude/rules/*.md` — see this plugin's own `CLAUDE.md` for a worked example of the pointer pattern — note it predates the lint and currently exceeds the 150-line ceiling itself).
|
|
94
|
+
- `max-line-chars` — a single line exceeds the char ceiling (400 default); surface the line number for a quick manual wrap.
|
|
95
|
+
- `provenance-header` — line 1 lacks a `<!-- source: ...` attribution. On the `claude init` path (Public Fast Tier, Claude Code) this is a WARN only, never a hard failure — `claude init` output is not plugin-authored and has no reason to carry the plugin's provenance convention.
|
|
96
|
+
|
|
97
|
+
Report any violations to the user as part of the bootstrap summary; do not block or retry on them.
|
|
98
|
+
|
|
99
|
+
## Step 3: Generate .gitignore
|
|
100
|
+
|
|
101
|
+
Detect the platform from existing files in the repo root (best-effort, repo may be empty):
|
|
102
|
+
|
|
103
|
+
```bash
|
|
104
|
+
# Detection order — first match wins
|
|
105
|
+
if ls *.py pyproject.toml setup.py 2>/dev/null | head -1 | grep -q .; then STACK="python"
|
|
106
|
+
elif ls *.ts *.js package.json 2>/dev/null | head -1 | grep -q .; then STACK="node"
|
|
107
|
+
else STACK="generic"; fi
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
Write `.gitignore` with the appropriate content:
|
|
111
|
+
|
|
112
|
+
**Generic (no stack detected):**
|
|
113
|
+
```gitignore
|
|
114
|
+
# OS
|
|
115
|
+
.DS_Store
|
|
116
|
+
Thumbs.db
|
|
117
|
+
|
|
118
|
+
# Editor
|
|
119
|
+
.vscode/
|
|
120
|
+
.idea/
|
|
121
|
+
*.swp
|
|
122
|
+
*.swo
|
|
123
|
+
|
|
124
|
+
# Logs
|
|
125
|
+
*.log
|
|
126
|
+
|
|
127
|
+
# Environment
|
|
128
|
+
.env
|
|
129
|
+
.env.local
|
|
130
|
+
.env.*.local
|
|
131
|
+
|
|
132
|
+
# Session Orchestrator state (platform-specific, not committed)
|
|
133
|
+
.claude/
|
|
134
|
+
.codex/
|
|
135
|
+
.cursor/
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
**Node/TypeScript (append to generic):**
|
|
139
|
+
```gitignore
|
|
140
|
+
# Node
|
|
141
|
+
node_modules/
|
|
142
|
+
dist/
|
|
143
|
+
build/
|
|
144
|
+
.next/
|
|
145
|
+
coverage/
|
|
146
|
+
*.tsbuildinfo
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
**Python (append to generic):**
|
|
150
|
+
```gitignore
|
|
151
|
+
# Python
|
|
152
|
+
__pycache__/
|
|
153
|
+
*.py[cod]
|
|
154
|
+
*.egg-info/
|
|
155
|
+
.venv/
|
|
156
|
+
dist/
|
|
157
|
+
build/
|
|
158
|
+
.pytest_cache/
|
|
159
|
+
.mypy_cache/
|
|
160
|
+
.ruff_cache/
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
Note: `.orchestrator/` is NOT gitignored — `bootstrap.lock` must be committed. Only the platform state dirs (`.claude/`, `.codex/`, `.cursor/`) are excluded.
|
|
164
|
+
|
|
165
|
+
## Step 3a: Install Parallel-Sessions Rule
|
|
166
|
+
|
|
167
|
+
Write the vendored rule from `$PLUGIN_ROOT/templates/_shared/rules/parallel-sessions.md` to `$REPO_ROOT/.claude/rules/parallel-sessions.md`.
|
|
168
|
+
|
|
169
|
+
Idempotency:
|
|
170
|
+
- Missing → create
|
|
171
|
+
- Exists and byte-identical → skip silently
|
|
172
|
+
- Exists and differs → overwrite (vendored is canonical)
|
|
173
|
+
|
|
174
|
+
Shell:
|
|
175
|
+
```bash
|
|
176
|
+
mkdir -p "$REPO_ROOT/.claude/rules"
|
|
177
|
+
cp "$PLUGIN_ROOT/templates/_shared/rules/parallel-sessions.md" "$REPO_ROOT/.claude/rules/parallel-sessions.md"
|
|
178
|
+
cp "$PLUGIN_ROOT/templates/_shared/loop.md" "$REPO_ROOT/.claude/loop.md"
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
Why: PSA-003 destructive-command safeguards require every consumer repo to carry the rule. See issue #155. The `loop.md` vendor gives bare `/loop` a repo-aware maintenance prompt (issue #633 Hebel 3).
|
|
182
|
+
|
|
183
|
+
## Step 4: Generate README.md
|
|
184
|
+
|
|
185
|
+
```markdown
|
|
186
|
+
# <REPO_NAME>
|
|
187
|
+
|
|
188
|
+
<One-sentence description — same as used in CLAUDE.md.>
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
Keep it minimal. One heading, one sentence. The feature that follows will expand it.
|
|
192
|
+
|
|
193
|
+
## Step 5: Create .orchestrator Directory and bootstrap.lock
|
|
194
|
+
|
|
195
|
+
```bash
|
|
196
|
+
mkdir -p "$REPO_ROOT/.orchestrator"
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
Write `.orchestrator/bootstrap.lock` **atomically** (mktemp + mv prevents a corrupt lock if the
|
|
200
|
+
process is interrupted mid-write):
|
|
201
|
+
|
|
202
|
+
```bash
|
|
203
|
+
_LOCK_TMP=$(mktemp "$REPO_ROOT/.orchestrator/bootstrap.lock.XXXXXX")
|
|
204
|
+
cat > "$_LOCK_TMP" << LOCK
|
|
205
|
+
# .orchestrator/bootstrap.lock
|
|
206
|
+
version: 1
|
|
207
|
+
tier: fast
|
|
208
|
+
archetype: null
|
|
209
|
+
timestamp: <current ISO 8601 UTC — e.g., 2026-04-16T09:30:00Z>
|
|
210
|
+
source: <claude-init | plugin-template>
|
|
211
|
+
plugin-version: <session-orchestrator plugin version — read from $PLUGIN_ROOT/package.json .version field>
|
|
212
|
+
bootstrapped-at: <current ISO 8601 UTC — same value as timestamp; distinct field for age-validation probe>
|
|
213
|
+
LOCK
|
|
214
|
+
mv "$_LOCK_TMP" "$REPO_ROOT/.orchestrator/bootstrap.lock"
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
Set `source`:
|
|
218
|
+
- `claude-init` if CLAUDE.md contained `## Session Config` before Step 2b's sentinel check (i.e., `claude init` populated it)
|
|
219
|
+
- `plugin-template` if the sentinel was absent and the fallback path wrote the block
|
|
220
|
+
|
|
221
|
+
## Step 6: Initial Git Commit
|
|
222
|
+
|
|
223
|
+
Stage all created files and commit:
|
|
224
|
+
|
|
225
|
+
```bash
|
|
226
|
+
cd "$REPO_ROOT"
|
|
227
|
+
BOOTSTRAP_FILES=(CLAUDE.md AGENTS.md .gitignore README.md .orchestrator/bootstrap.lock .claude/rules/parallel-sessions.md)
|
|
228
|
+
# Add only the files bootstrap created — no sweeping -u/-A to avoid catching pre-existing files
|
|
229
|
+
for _f in "${BOOTSTRAP_FILES[@]}"; do
|
|
230
|
+
[[ -e "$_f" ]] && git add -- "$_f"
|
|
231
|
+
done
|
|
232
|
+
git commit -m "chore: bootstrap (fast)"
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
The commit message is fixed — do not vary it. It is the artifact that documents bootstrap provenance in `git log`.
|
|
236
|
+
|
|
237
|
+
## Step 7: Report Created Files
|
|
238
|
+
|
|
239
|
+
After the commit succeeds, output a concise summary:
|
|
240
|
+
|
|
241
|
+
```
|
|
242
|
+
Bootstrap (fast) complete. Created:
|
|
243
|
+
CLAUDE.md (or AGENTS.md) — Session Config with project-name, vcs
|
|
244
|
+
.gitignore — <stack>-appropriate minimal rules
|
|
245
|
+
README.md — one-line stub
|
|
246
|
+
.claude/rules/parallel-sessions.md — vendored PSA rule (issue #155)
|
|
247
|
+
.orchestrator/bootstrap.lock — version: 1, tier: fast
|
|
248
|
+
Committed: "chore: bootstrap (fast)"
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
Then return control to `SKILL.md` Phase 5.
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
# Bootstrap Intensity Heuristic
|
|
2
|
+
|
|
3
|
+
> Tier + archetype recommendation logic for the bootstrap skill.
|
|
4
|
+
> Called from `skills/bootstrap/SKILL.md` Phase 1.
|
|
5
|
+
|
|
6
|
+
## Outputs
|
|
7
|
+
|
|
8
|
+
After executing this algorithm, report:
|
|
9
|
+
|
|
10
|
+
- `RECOMMENDED_TIER`: `fast` | `standard` | `deep`
|
|
11
|
+
- `RECOMMENDED_ARCHETYPE`: `static-html` | `node-minimal` | `nextjs-minimal` | `python-uv` | `null`
|
|
12
|
+
- `HEURISTIC_REASON`: one sentence explaining the recommendation (shown to user)
|
|
13
|
+
- `ARCHETYPE_CONFIDENCE`: `high` | `low` (used to decide whether to ask the optional second question)
|
|
14
|
+
|
|
15
|
+
## Step 1: Primary Tier Signal (from user prompt)
|
|
16
|
+
|
|
17
|
+
Scan the user's first prompt for these keyword groups. Match is case-insensitive; German and English terms are equivalent.
|
|
18
|
+
|
|
19
|
+
| Keywords | Tier |
|
|
20
|
+
|----------|------|
|
|
21
|
+
| demo, prototype, prototyp, spike, playground, spielwiese, test, versuch, probier, ausprobier, mini, schnell, quick, klein, small, simple, einfach, poc, proof-of-concept, draft, skizze, scratch | `fast` |
|
|
22
|
+
| mvp, minimum-viable, produkt, product, saas, app, application, service, platform, plattform, tool, fullstack, webapp, api, backend, frontend | `standard` |
|
|
23
|
+
| kunden, customer, production, produktiv, team, enterprise, skalierbar, scalable, compliance, soc2, gdpr, dsgvo, multi-tenant, long-term, langfristig, langlebig | `deep` |
|
|
24
|
+
|
|
25
|
+
**Match priority:** If multiple groups match, use the highest-intensity tier that matched. If no group matches → default to `standard`.
|
|
26
|
+
|
|
27
|
+
## Step 2: Secondary Signals (adjust recommendation)
|
|
28
|
+
|
|
29
|
+
Apply these modifiers after Step 1. Each modifier can shift the recommendation up or down one level.
|
|
30
|
+
|
|
31
|
+
| Signal | Adjustment |
|
|
32
|
+
|--------|-----------|
|
|
33
|
+
| Repo name starts with `demo-`, `playground-`, `scratch-`, `poc-`, `test-`, `spike-` | Force `fast`, regardless of prompt |
|
|
34
|
+
| Repo name starts with `demo-`, `playground-` AND prompt contains production signals | Hold at `fast` (name wins) |
|
|
35
|
+
| Prompt mentions specific integrations: Stripe, Auth0, Supabase, Postgres, Redis, Firebase, Clerk, Prisma | Minimum `standard` (shift up if currently `fast`) |
|
|
36
|
+
| Prompt mentions CI, pipeline, monitoring, observability, Sentry, Datadog, alerting | Shift up one level (fast→standard, standard→deep) |
|
|
37
|
+
| Prompt mentions CODEOWNERS, branch protection, multiple contributors, team review | Shift to `deep` |
|
|
38
|
+
| `plan-baseline-path` is configured and user names a specific baseline archetype | Minimum `standard` |
|
|
39
|
+
| Existing repo has `package.json`, `pyproject.toml`, or `Cargo.toml` already committed | Minimum `standard` (repo is already structured) |
|
|
40
|
+
| Existing repo has a CI file (`.github/workflows/`, `.gitlab-ci.yml`) | Minimum `deep` |
|
|
41
|
+
|
|
42
|
+
## Step 3: Resolve Final Tier
|
|
43
|
+
|
|
44
|
+
After applying all modifiers, clamp the result to `fast` | `standard` | `deep`.
|
|
45
|
+
|
|
46
|
+
Set `HEURISTIC_REASON` to one sentence that references the signals that drove the recommendation:
|
|
47
|
+
|
|
48
|
+
Examples:
|
|
49
|
+
- *"Basierend auf 'animiertes Glücksrad' (Signal: Demo/Spike) empfehle ich Fast."*
|
|
50
|
+
- *"Basierend auf 'SaaS mit Stripe-Integration' (Signal: Produkt + externe Integration) empfehle ich Standard."*
|
|
51
|
+
- *"Basierend auf 'Kundenprojekt mit Compliance-Anforderungen' (Signal: Production/Team) empfehle ich Deep."*
|
|
52
|
+
|
|
53
|
+
## Step 4: Archetype Selection
|
|
54
|
+
|
|
55
|
+
**Fast tier:** Always `RECOMMENDED_ARCHETYPE = null`, `ARCHETYPE_CONFIDENCE = high`. No stack needed — skip to output.
|
|
56
|
+
|
|
57
|
+
**Private path (baseline configured):** Always `RECOMMENDED_ARCHETYPE = null` at this stage. The baseline's own archetype selector is used during Standard/Deep scaffolding. Set `ARCHETYPE_CONFIDENCE = high`.
|
|
58
|
+
|
|
59
|
+
**Public path + Standard or Deep:** Scan the prompt for these signals:
|
|
60
|
+
|
|
61
|
+
| Prompt signals | Archetype | Confidence |
|
|
62
|
+
|----------------|-----------|------------|
|
|
63
|
+
| html, canvas, svg, animation, animier, static, statisch, landing, landingpage, visualization, visualisierung, glücksrad, wheel, chart, graph (no backend mention) | `static-html` | high |
|
|
64
|
+
| next.js, nextjs, react, saas fullstack, webapp, web app, app with frontend | `nextjs-minimal` | high |
|
|
65
|
+
| cli, command-line, script, utility, library, bibliothek, tool, npm package, node (no frontend) | `node-minimal` | high |
|
|
66
|
+
| python, py, data, daten, ml, machine learning, api (python context), django, fastapi, flask, pandas, numpy | `python-uv` | high |
|
|
67
|
+
| Ambiguous — prompt mentions multiple stacks, no clear frontend/backend split, or is too vague (e.g., "Ich brauche ein Projekt", "neues Repo", "etwas bauen") | `node-minimal` (safe default) | `low` |
|
|
68
|
+
|
|
69
|
+
When `ARCHETYPE_CONFIDENCE = low`, the bootstrap skill will ask a second `AskUserQuestion` to confirm the archetype. `node-minimal` is the pre-selected default for that question.
|
|
70
|
+
|
|
71
|
+
## Step 5: Output
|
|
72
|
+
|
|
73
|
+
Return all four values to `SKILL.md` Phase 1:
|
|
74
|
+
|
|
75
|
+
```
|
|
76
|
+
RECOMMENDED_TIER: fast | standard | deep
|
|
77
|
+
RECOMMENDED_ARCHETYPE: static-html | node-minimal | nextjs-minimal | python-uv | null
|
|
78
|
+
HEURISTIC_REASON: <one sentence>
|
|
79
|
+
ARCHETYPE_CONFIDENCE: high | low
|
|
80
|
+
```
|
|
@@ -0,0 +1,342 @@
|
|
|
1
|
+
# Bootstrap Public Fallback
|
|
2
|
+
|
|
3
|
+
> Support file for `skills/bootstrap/SKILL.md`.
|
|
4
|
+
> Defines the Private vs. Public path decision and the Public path scaffold logic for all tiers.
|
|
5
|
+
|
|
6
|
+
## Step 1: Detect PATH_TYPE (Silent — No User Interaction)
|
|
7
|
+
|
|
8
|
+
Read `plan-baseline-path` from Session Config in `CLAUDE.md` (or `AGENTS.md` on Codex):
|
|
9
|
+
|
|
10
|
+
```bash
|
|
11
|
+
BASELINE_PATH=$(grep -m1 "^plan-baseline-path:" "$REPO_ROOT/CLAUDE.md" 2>/dev/null | awk '{print $2}')
|
|
12
|
+
# Expand leading ~ to $HOME so paths like ~/Projects/projects-baseline work correctly
|
|
13
|
+
BASELINE_PATH="${BASELINE_PATH/#\~/$HOME}"
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
Decision logic (evaluated in order — first match wins):
|
|
17
|
+
|
|
18
|
+
| Condition | PATH_TYPE |
|
|
19
|
+
|-----------|-----------|
|
|
20
|
+
| `plan-baseline-path` key is absent in Session Config | `public` |
|
|
21
|
+
| `plan-baseline-path` key is present but value is empty | `public` |
|
|
22
|
+
| Key is present, value is non-empty, AND `test -d "$BASELINE_PATH"` succeeds | `private` |
|
|
23
|
+
| Key is present, value is non-empty, BUT path does not exist on disk | `public` |
|
|
24
|
+
|
|
25
|
+
Set `PATH_TYPE = private | public`. Do not report this detection to the user — it is silent.
|
|
26
|
+
|
|
27
|
+
> **Note on rules-fetch (Phase 3.5 of SKILL.md):** The optional rules-fetch step runs regardless of `PATH_TYPE`. Both private (with `plan-baseline-path` set) and public (without it) repos can opt into the fetch by setting `baseline-ref` in Session Config. The fetch is independent of how the initial scaffold was generated.
|
|
28
|
+
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
## Private Path
|
|
32
|
+
|
|
33
|
+
When `PATH_TYPE = private`, the baseline templates are used directly. No new logic is needed here — the existing tier-template flow (`fast-template.md`, `standard-template.md`, `deep-template.md`) already calls `$BASELINE_PATH` scripts for CLAUDE.md generation and archetype file sourcing. Continue with the calling template file's steps unchanged.
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## Public Path
|
|
38
|
+
|
|
39
|
+
When `PATH_TYPE = public`, no `projects-baseline` is available. Use the plugin-bundled templates and platform-appropriate CLAUDE.md generation described below.
|
|
40
|
+
|
|
41
|
+
### Detect Platform
|
|
42
|
+
|
|
43
|
+
Read the current platform using the patterns from `skills/_shared/platform-tools.md`:
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
if [[ -n "${CLAUDE_PLUGIN_ROOT:-}" ]]; then
|
|
47
|
+
PLATFORM="claude"
|
|
48
|
+
elif [[ -n "${CODEX_PLUGIN_ROOT:-}" ]]; then
|
|
49
|
+
PLATFORM="codex"
|
|
50
|
+
elif [[ -n "${CURSOR_RULES_DIR:-}" ]]; then
|
|
51
|
+
PLATFORM="cursor"
|
|
52
|
+
else
|
|
53
|
+
# Fallback: inspect running process name or default to claude
|
|
54
|
+
PLATFORM="claude"
|
|
55
|
+
fi
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
---
|
|
59
|
+
|
|
60
|
+
### Public Path — Fast Tier
|
|
61
|
+
|
|
62
|
+
#### If `PLATFORM = claude`
|
|
63
|
+
|
|
64
|
+
Run `claude init` to generate `CLAUDE.md`, **but only if `CLAUDE.md` does not already exist**.
|
|
65
|
+
Skipping when the file is present prevents `claude init` from overwriting project-specific
|
|
66
|
+
customisations on bootstrap re-runs or Upgrade Flow passes (issue #108):
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
cd "$REPO_ROOT"
|
|
70
|
+
if [[ ! -f "$REPO_ROOT/CLAUDE.md" ]]; then
|
|
71
|
+
claude init 2>/dev/null
|
|
72
|
+
fi
|
|
73
|
+
CLAUDE_INIT_STATUS=$?
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
If `claude init` exits 0 and produces a non-empty `CLAUDE.md`, it is the base. Proceed to inject the Harte Regeln block, then the Session Config block.
|
|
77
|
+
|
|
78
|
+
**Inject `## Harte Regeln` section** — append the canonical hard-rules content BEFORE the Session Config block, if the section is absent:
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
if ! grep -q "^## Harte Regeln" "$REPO_ROOT/CLAUDE.md" 2>/dev/null; then
|
|
82
|
+
cat "$PLUGIN_ROOT/templates/_shared/harte-regeln.md" >> "$REPO_ROOT/CLAUDE.md"
|
|
83
|
+
fi
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
**Inject `## Session Config` section** — append after the last line of the generated CLAUDE.md if the section is absent:
|
|
87
|
+
|
|
88
|
+
```markdown
|
|
89
|
+
## Session Config
|
|
90
|
+
|
|
91
|
+
project-name: <REPO_NAME>
|
|
92
|
+
vcs: <detect: "gitlab" | "github" | "none" — see VCS detection below>
|
|
93
|
+
persistence: true
|
|
94
|
+
enforcement: warn # strict | warn | off
|
|
95
|
+
waves: 5
|
|
96
|
+
agents-per-wave: 6
|
|
97
|
+
test-command: <detect per package-manager — e.g., "npm test">
|
|
98
|
+
typecheck-command: <detect — e.g., "npm run typecheck">
|
|
99
|
+
lint-command: <detect — e.g., "npm run lint">
|
|
100
|
+
recent-commits: 20
|
|
101
|
+
stale-branch-days: 7
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
Note: `plan-baseline-path` is intentionally omitted on the Public path. The 7 mandatory fields enforced by the Session Config validator (`scripts/lib/config-schema.mjs`, issue #182) are: `test-command`, `typecheck-command`, `lint-command`, `agents-per-wave`, `waves`, `persistence`, `enforcement`.
|
|
105
|
+
|
|
106
|
+
If `claude init` fails (non-zero exit or empty output), fall through to the Codex/Cursor path below.
|
|
107
|
+
|
|
108
|
+
#### If `PLATFORM = codex` or `PLATFORM = cursor`
|
|
109
|
+
|
|
110
|
+
Use the minimal template to synthesize `CLAUDE.md` (for Claude Code/Cursor) or `AGENTS.md` (for Codex):
|
|
111
|
+
|
|
112
|
+
1. Read `templates/_minimal/CLAUDE.md.tmpl` from the plugin root.
|
|
113
|
+
2. Substitute the following placeholders using repo context:
|
|
114
|
+
|
|
115
|
+
| Placeholder | Source |
|
|
116
|
+
|-------------|--------|
|
|
117
|
+
| `{{PROJECT_TITLE}}` | `$REPO_NAME` (from `basename $(git rev-parse --show-toplevel)`) |
|
|
118
|
+
| `{{PROJECT_DESCRIPTION}}` | One-sentence description derived from the user's first prompt — be concrete, not generic |
|
|
119
|
+
| `{{STACK_LANGUAGE}}` | Detected from `ls` output: `*.py` / `pyproject.toml` → Python, `*.ts` / `*.js` / `package.json` → TypeScript, else "TBD" |
|
|
120
|
+
| `{{STACK_PACKAGE_MANAGER}}` | `pnpm` for Node, `uv` for Python, else "TBD" |
|
|
121
|
+
| `{{STACK_TEST_RUNNER}}` | `vitest` for Node, `pytest` for Python, else "TBD" |
|
|
122
|
+
| `{{STACK_LINTER}}` | `eslint` for Node, `ruff` for Python, else "TBD" |
|
|
123
|
+
| `{{CMD_DEV}}` | Infer from stack: `pnpm dev` / `uv run python src/main.py` / "TBD" |
|
|
124
|
+
| `{{CMD_TEST}}` | `pnpm test` / `uv run pytest` / "TBD" |
|
|
125
|
+
| `{{CMD_BUILD}}` | `pnpm build` / "N/A" / "TBD" |
|
|
126
|
+
| `{{CMD_LINT}}` | `pnpm lint` / `uv run ruff check .` / "TBD" |
|
|
127
|
+
| `{{CONVENTIONS}}` | Pull 3–5 lines from `git log -n 5 --oneline` if available, else "Follow existing project conventions." |
|
|
128
|
+
| `{{HARD_RULES_TABLE}}` | Verbatim content of `templates/_shared/harte-regeln.md` (rules list, minus the provenance comment line) |
|
|
129
|
+
| `{{VCS}}` | See VCS detection below |
|
|
130
|
+
| `{{PROJECT_NAME}}` | `$REPO_NAME` |
|
|
131
|
+
| `{{PLAN_BASELINE_PATH}}` | Omit this entire line (remove the `plan-baseline-path: ...` line from output) |
|
|
132
|
+
| `{{TEST_COMMAND}}` | Same as `{{CMD_TEST}}` |
|
|
133
|
+
| `{{TYPECHECK_COMMAND}}` | `pnpm build` for TS, `false` otherwise |
|
|
134
|
+
| `{{LINT_COMMAND}}` | Same as `{{CMD_LINT}}` |
|
|
135
|
+
|
|
136
|
+
3. Write the substituted output to:
|
|
137
|
+
- `CLAUDE.md` for Claude Code and Cursor
|
|
138
|
+
- `AGENTS.md` for Codex CLI
|
|
139
|
+
|
|
140
|
+
**VCS detection:**
|
|
141
|
+
|
|
142
|
+
```bash
|
|
143
|
+
REMOTE_URL=$(git remote get-url origin 2>/dev/null || echo "")
|
|
144
|
+
if echo "$REMOTE_URL" | grep -q "gitlab"; then VCS="gitlab"
|
|
145
|
+
elif echo "$REMOTE_URL" | grep -q "github"; then VCS="github"
|
|
146
|
+
else VCS="none"; fi
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
Also substitute README and gitignore from `_minimal` templates:
|
|
150
|
+
|
|
151
|
+
- Copy `templates/_minimal/README.md.tmpl` → `README.md`, substituting:
|
|
152
|
+
- `{{PROJECT_TITLE}}` → `$REPO_NAME`
|
|
153
|
+
- `{{PROJECT_DESCRIPTION}}` → one-sentence description from user prompt
|
|
154
|
+
- `{{USAGE_INSTRUCTIONS}}` → "TBD — add usage instructions here."
|
|
155
|
+
- `{{DEVELOPMENT_INSTRUCTIONS}}` → "TBD — add development instructions here."
|
|
156
|
+
- `{{LICENSE}}` → "MIT" (default) — user may change
|
|
157
|
+
- Copy `templates/_minimal/gitignore.tmpl` → `.gitignore` as-is (no placeholders to substitute)
|
|
158
|
+
|
|
159
|
+
---
|
|
160
|
+
|
|
161
|
+
### Public Path — Standard Tier
|
|
162
|
+
|
|
163
|
+
1. **Resolve archetype** from `CONFIRMED_ARCHETYPE` (set by `intensity-heuristic.md` or user selection in Phase 2 of SKILL.md):
|
|
164
|
+
|
|
165
|
+
| Archetype | Template Directory |
|
|
166
|
+
|-----------|-------------------|
|
|
167
|
+
| `static-html` | `templates/static-html/` |
|
|
168
|
+
| `node-minimal` | `templates/node-minimal/` |
|
|
169
|
+
| `nextjs-minimal` | `templates/nextjs-minimal/` |
|
|
170
|
+
| `python-uv` | `templates/python-uv/` |
|
|
171
|
+
|
|
172
|
+
If `CONFIRMED_ARCHETYPE` is `null` or unset, default to `node-minimal`.
|
|
173
|
+
|
|
174
|
+
2. **Copy all files** from the template directory to `$REPO_ROOT`:
|
|
175
|
+
|
|
176
|
+
Use `cp -rP` (no-dereference) so that symlinks inside the template directory are copied **as
|
|
177
|
+
symlinks** rather than followed. This prevents a maliciously crafted or accidentally
|
|
178
|
+
misconfigured template from writing files outside `$REPO_ROOT` via absolute-target symlinks
|
|
179
|
+
(issue #108 — CWE-22 symlink traversal):
|
|
180
|
+
|
|
181
|
+
```bash
|
|
182
|
+
PLUGIN_ROOT="$(dirname "$(dirname "$(dirname "$0")")")" # resolve plugin root
|
|
183
|
+
TMPL_DIR="$PLUGIN_ROOT/templates/$CONFIRMED_ARCHETYPE"
|
|
184
|
+
# -P: copy symlinks as symlinks (no-dereference) — prevents symlink-traversal outside $REPO_ROOT
|
|
185
|
+
cp -rP "$TMPL_DIR/." "$REPO_ROOT/"
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
Preserve directory structure. Do not overwrite files that already exist (from Fast tier steps) unless explicitly noted.
|
|
189
|
+
|
|
190
|
+
3. **Substitute placeholders** in all copied files. For each file under `$REPO_ROOT` that was just copied, apply substitutions for every placeholder used across archetype templates:
|
|
191
|
+
|
|
192
|
+
| Placeholder | Source / Default |
|
|
193
|
+
|-------------|-----------------|
|
|
194
|
+
| `{{PROJECT_NAME}}` | `$REPO_NAME` (slugified: lowercase, hyphens for spaces) |
|
|
195
|
+
| `{{PROJECT_TITLE}}` | `$REPO_NAME` (title-cased: first letter of each word capitalised) |
|
|
196
|
+
| `{{PROJECT_DESCRIPTION}}` | One-sentence description from user prompt |
|
|
197
|
+
| `{{DESCRIPTION}}` | Same as `{{PROJECT_DESCRIPTION}}` (alias used in some templates) |
|
|
198
|
+
| `{{VCS}}` | `gitlab` / `github` / `none` (from VCS detection above) |
|
|
199
|
+
| `{{LICENSE}}` | `MIT` (default — user may change after bootstrap) |
|
|
200
|
+
| `{{USAGE_INSTRUCTIONS}}` | `TBD — add usage instructions here.` |
|
|
201
|
+
| `{{DEVELOPMENT_INSTRUCTIONS}}` | `TBD — add development instructions here.` |
|
|
202
|
+
| `{{STACK_LANGUAGE}}` | `Python` for python-uv, `TypeScript` for node/nextjs, `HTML/CSS/JS` for static-html |
|
|
203
|
+
| `{{STACK_PACKAGE_MANAGER}}` | `uv` for python-uv, `pnpm` for node/nextjs, `none` for static-html |
|
|
204
|
+
| `{{STACK_TEST_RUNNER}}` | `pytest` for python-uv, `vitest` for node/nextjs, `none` for static-html |
|
|
205
|
+
| `{{STACK_LINTER}}` | `ruff` for python-uv, `eslint` for node/nextjs, `none` for static-html |
|
|
206
|
+
| `{{CMD_DEV}}` | `uv run python src/main.py` for python-uv, `pnpm dev` for nextjs, `pnpm build` for node-minimal, `open index.html` for static-html |
|
|
207
|
+
| `{{CMD_TEST}}` | `uv run pytest` for python-uv, `pnpm test` for node/nextjs, `(none)` for static-html |
|
|
208
|
+
| `{{CMD_BUILD}}` | `(N/A)` for python-uv, `pnpm build` for node/nextjs, `(none)` for static-html |
|
|
209
|
+
| `{{CMD_LINT}}` | `uv run ruff check .` for python-uv, `pnpm lint` for node/nextjs, `(none)` for static-html |
|
|
210
|
+
| `{{CONVENTIONS}}` | Pull 3–5 lines from `git log -n 5 --oneline` if available, else `Follow existing project conventions.` |
|
|
211
|
+
| `{{TEST_COMMAND}}` | Same value as `{{CMD_TEST}}` |
|
|
212
|
+
| `{{TYPECHECK_COMMAND}}` | `pnpm build` for TS archetypes (node/nextjs), `false` for python-uv and static-html |
|
|
213
|
+
| `{{LINT_COMMAND}}` | Same value as `{{CMD_LINT}}` |
|
|
214
|
+
| `{{PLAN_BASELINE_PATH}}` | Remove the line entirely (Public path — no baseline) |
|
|
215
|
+
|
|
216
|
+
Derive `PROJECT_TITLE` from `REPO_NAME` by title-casing (replace hyphens/underscores with spaces, capitalise each word):
|
|
217
|
+
|
|
218
|
+
```bash
|
|
219
|
+
PROJECT_SLUG=$(echo "$REPO_NAME" | tr '[:upper:]' '[:lower:]' | tr ' ' '-')
|
|
220
|
+
PROJECT_TITLE=$(echo "$REPO_NAME" | tr '-_' ' ' | awk '{for(i=1;i<=NF;i++) $i=toupper(substr($i,1,1)) tolower(substr($i,2)); print}')
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
Set archetype-specific values before substitution:
|
|
224
|
+
|
|
225
|
+
```bash
|
|
226
|
+
case "$CONFIRMED_ARCHETYPE" in
|
|
227
|
+
python-uv)
|
|
228
|
+
STACK_LANGUAGE="Python"; STACK_PKG="uv"; STACK_TEST="pytest"; STACK_LINT="ruff"
|
|
229
|
+
CMD_DEV="uv run python src/main.py"; CMD_TEST="uv run pytest"
|
|
230
|
+
CMD_BUILD="N/A"; CMD_LINT="uv run ruff check ."
|
|
231
|
+
TYPECHECK_CMD="false"
|
|
232
|
+
;;
|
|
233
|
+
nextjs-minimal)
|
|
234
|
+
STACK_LANGUAGE="TypeScript"; STACK_PKG="pnpm"; STACK_TEST="vitest"; STACK_LINT="eslint"
|
|
235
|
+
CMD_DEV="pnpm dev"; CMD_TEST="pnpm test"
|
|
236
|
+
CMD_BUILD="pnpm build"; CMD_LINT="pnpm lint"
|
|
237
|
+
TYPECHECK_CMD="pnpm build"
|
|
238
|
+
;;
|
|
239
|
+
node-minimal)
|
|
240
|
+
STACK_LANGUAGE="TypeScript"; STACK_PKG="pnpm"; STACK_TEST="vitest"; STACK_LINT="eslint"
|
|
241
|
+
CMD_DEV="pnpm build"; CMD_TEST="pnpm test"
|
|
242
|
+
CMD_BUILD="pnpm build"; CMD_LINT="pnpm lint"
|
|
243
|
+
TYPECHECK_CMD="pnpm build"
|
|
244
|
+
;;
|
|
245
|
+
static-html)
|
|
246
|
+
STACK_LANGUAGE="HTML/CSS/JS"; STACK_PKG="none"; STACK_TEST="none"; STACK_LINT="none"
|
|
247
|
+
CMD_DEV="open index.html"; CMD_TEST=""; CMD_BUILD=""; CMD_LINT=""
|
|
248
|
+
TYPECHECK_CMD="false"
|
|
249
|
+
;;
|
|
250
|
+
esac
|
|
251
|
+
|
|
252
|
+
CONVENTIONS=$(git -C "$REPO_ROOT" log -n 5 --oneline 2>/dev/null | head -5 || echo "Follow existing project conventions.")
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
Apply all substitutions:
|
|
256
|
+
|
|
257
|
+
```bash
|
|
258
|
+
find "$REPO_ROOT" -type f \
|
|
259
|
+
! -path "*/.git/*" \
|
|
260
|
+
! -path "*/.orchestrator/*" \
|
|
261
|
+
! -name "*.lock" | while IFS= read -r file; do
|
|
262
|
+
python3 - "$file" \
|
|
263
|
+
"$PROJECT_SLUG" "$PROJECT_TITLE" "$PROJECT_DESCRIPTION" "$VCS" \
|
|
264
|
+
"$STACK_LANGUAGE" "$STACK_PKG" "$STACK_TEST" "$STACK_LINT" \
|
|
265
|
+
"$CMD_DEV" "$CMD_TEST" "$CMD_BUILD" "$CMD_LINT" \
|
|
266
|
+
"$CONVENTIONS" "$TYPECHECK_CMD" <<'PYEOF'
|
|
267
|
+
import sys
|
|
268
|
+
|
|
269
|
+
(path, project_slug, project_title, description, vcs,
|
|
270
|
+
stack_lang, stack_pkg, stack_test, stack_lint,
|
|
271
|
+
cmd_dev, cmd_test, cmd_build, cmd_lint,
|
|
272
|
+
conventions, typecheck_cmd) = sys.argv[1:16]
|
|
273
|
+
|
|
274
|
+
with open(path, 'r', encoding='utf-8', errors='replace') as fh:
|
|
275
|
+
content = fh.read()
|
|
276
|
+
|
|
277
|
+
content = content.replace('{{PROJECT_NAME}}', project_slug)
|
|
278
|
+
content = content.replace('{{PROJECT_TITLE}}', project_title)
|
|
279
|
+
content = content.replace('{{PROJECT_DESCRIPTION}}', description)
|
|
280
|
+
content = content.replace('{{DESCRIPTION}}', description)
|
|
281
|
+
content = content.replace('{{VCS}}', vcs)
|
|
282
|
+
content = content.replace('{{LICENSE}}', 'MIT')
|
|
283
|
+
content = content.replace('{{USAGE_INSTRUCTIONS}}', 'TBD — add usage instructions here.')
|
|
284
|
+
content = content.replace('{{DEVELOPMENT_INSTRUCTIONS}}', 'TBD — add development instructions here.')
|
|
285
|
+
content = content.replace('{{STACK_LANGUAGE}}', stack_lang)
|
|
286
|
+
content = content.replace('{{STACK_PACKAGE_MANAGER}}', stack_pkg)
|
|
287
|
+
content = content.replace('{{STACK_TEST_RUNNER}}', stack_test)
|
|
288
|
+
content = content.replace('{{STACK_LINTER}}', stack_lint)
|
|
289
|
+
content = content.replace('{{CMD_DEV}}', cmd_dev)
|
|
290
|
+
content = content.replace('{{CMD_TEST}}', cmd_test)
|
|
291
|
+
content = content.replace('{{CMD_BUILD}}', cmd_build)
|
|
292
|
+
content = content.replace('{{CMD_LINT}}', cmd_lint)
|
|
293
|
+
content = content.replace('{{CONVENTIONS}}', conventions)
|
|
294
|
+
content = content.replace('{{TEST_COMMAND}}', cmd_test)
|
|
295
|
+
content = content.replace('{{TYPECHECK_COMMAND}}', typecheck_cmd)
|
|
296
|
+
content = content.replace('{{LINT_COMMAND}}', cmd_lint)
|
|
297
|
+
# Remove lines containing the plan-baseline-path placeholder
|
|
298
|
+
content = '\n'.join(
|
|
299
|
+
line for line in content.splitlines()
|
|
300
|
+
if '{{PLAN_BASELINE_PATH}}' not in line
|
|
301
|
+
)
|
|
302
|
+
# Preserve trailing newline if original had one
|
|
303
|
+
if not content.endswith('\n'):
|
|
304
|
+
content += '\n'
|
|
305
|
+
with open(path, 'w', encoding='utf-8') as fh:
|
|
306
|
+
fh.write(content)
|
|
307
|
+
PYEOF
|
|
308
|
+
done
|
|
309
|
+
```
|
|
310
|
+
|
|
311
|
+
4. **python-uv only: rename source directory**
|
|
312
|
+
|
|
313
|
+
If `CONFIRMED_ARCHETYPE = python-uv`, the template contains `src/__PROJECT_NAME__/`. Rename it to `src/<project_slug>/`:
|
|
314
|
+
|
|
315
|
+
```bash
|
|
316
|
+
if [[ "$CONFIRMED_ARCHETYPE" == "python-uv" ]] && [[ -d "$REPO_ROOT/src/__PROJECT_NAME__" ]]; then
|
|
317
|
+
mv "$REPO_ROOT/src/__PROJECT_NAME__" "$REPO_ROOT/src/$PROJECT_SLUG"
|
|
318
|
+
fi
|
|
319
|
+
```
|
|
320
|
+
|
|
321
|
+
5. **Tier-specific extensions:** After copying and substituting, continue with `standard-template.md` Standard-specific steps (S1–S6 for the matched archetype). Those steps write additional tooling files (`.editorconfig`, expanded README, etc.) and tier-gate correctly — they already know the archetype from `CONFIRMED_ARCHETYPE`.
|
|
322
|
+
|
|
323
|
+
---
|
|
324
|
+
|
|
325
|
+
### Public Path — Deep Tier
|
|
326
|
+
|
|
327
|
+
Follow all Standard tier steps above (including archetype template copy + substitution + python-uv rename), then continue with `deep-template.md` Deep-specific steps (D1–D6 for VCS-conditional CI, CODEOWNERS, CHANGELOG, issue templates, MR/PR template, branch protection).
|
|
328
|
+
|
|
329
|
+
The deep-template steps already reference `VCS` and `CONFIRMED_ARCHETYPE` — they integrate correctly without modification.
|
|
330
|
+
|
|
331
|
+
---
|
|
332
|
+
|
|
333
|
+
## Source Value for bootstrap.lock
|
|
334
|
+
|
|
335
|
+
After the Public path scaffold completes, set `source` for the lock file:
|
|
336
|
+
|
|
337
|
+
| Condition | `source` value |
|
|
338
|
+
|-----------|---------------|
|
|
339
|
+
| `claude init` ran successfully (Claude Code Fast path) | `claude-init` |
|
|
340
|
+
| Plugin template copied (any other case) | `plugin-template` |
|
|
341
|
+
|
|
342
|
+
This value is passed back to SKILL.md Phase 4 for writing `.orchestrator/bootstrap.lock`.
|