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,324 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: reconcile
|
|
3
|
+
user-invocable: true
|
|
4
|
+
tags: [learning, rules, intelligence, meta]
|
|
5
|
+
model: sonnet
|
|
6
|
+
model-preference: sonnet
|
|
7
|
+
model-preference-codex: gpt-5.4-mini
|
|
8
|
+
model-preference-cursor: claude-sonnet-4-6
|
|
9
|
+
args-schema:
|
|
10
|
+
- flag: --dry-run
|
|
11
|
+
description: "Print proposals without writing anything or rendering the approval AUQ"
|
|
12
|
+
description: >
|
|
13
|
+
Use this skill when the user wants to reconcile learnings into rules, run /reconcile, propose
|
|
14
|
+
rules from learnings, turn learnings into .claude/rules/ entries, or review what rules would be
|
|
15
|
+
generated from current session learnings. On-demand version of session-end Phase 3.6.8.
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
> **Platform Note:** State files use the platform's native directory: `.claude/` (Claude Code), `.codex/` (Codex CLI), or `.cursor/` (Cursor IDE). Shared metrics live in `.orchestrator/metrics/`. See `skills/_shared/platform-tools.md`.
|
|
19
|
+
|
|
20
|
+
# Reconcile Skill
|
|
21
|
+
|
|
22
|
+
On-demand version of the session-end Phase 3.6.8 reconciliation flow. Turns eligible learnings
|
|
23
|
+
from `.orchestrator/metrics/learnings.jsonl` into proposed `.claude/rules/<slug>.md` entries,
|
|
24
|
+
presenting each batch of 4 to the coordinator via AUQ multiSelect for operator approval before
|
|
25
|
+
any file is written. Advisory-only — rules are NEVER auto-applied.
|
|
26
|
+
|
|
27
|
+
## Posture Contract (load-bearing — read before executing)
|
|
28
|
+
|
|
29
|
+
- **Advisory-only.** No rule is ever written without explicit operator approval via AUQ.
|
|
30
|
+
The AUQ multiSelect is the mandatory gate; there is no bypass.
|
|
31
|
+
- **Never-always-on invariant.** The reconcile engine's emitter (`emitter.mjs`) throws
|
|
32
|
+
on any eligible learning that would produce an `alwaysApply: true` rule — the engine
|
|
33
|
+
structurally cannot emit always-on rules. This invariant is enforced upstream, not by
|
|
34
|
+
this skill.
|
|
35
|
+
- **Engine never writes `.claude/rules/`.** `runReconcile` computes proposals and records
|
|
36
|
+
them in the idempotency sidecar only. The only module that writes `.claude/rules/` is
|
|
37
|
+
`writer.mjs`, and only AFTER the operator approves proposals via AUQ.
|
|
38
|
+
- **Same pipeline as session-end Phase 3.6.8.** This skill uses the identical engine and
|
|
39
|
+
writer seams as the automatic session-end reconciliation phase — operator experience is
|
|
40
|
+
consistent, and any fixes to the engine benefit both paths.
|
|
41
|
+
- **`reconcile.enabled` gates the AUTOMATIC session-end phase only.** `/reconcile` is an
|
|
42
|
+
on-demand command and runs regardless of `reconcile.enabled`. It still honours
|
|
43
|
+
`rule-expiry-days` and `confidence-floor` from the `reconcile` config block.
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
47
|
+
## Phase 0: Bootstrap Gate
|
|
48
|
+
|
|
49
|
+
Read `skills/_shared/bootstrap-gate.md` and execute the gate check. If the gate is CLOSED,
|
|
50
|
+
invoke `skills/bootstrap/SKILL.md` and wait for completion before proceeding. If the gate
|
|
51
|
+
is OPEN, continue to Phase 1.
|
|
52
|
+
|
|
53
|
+
<HARD-GATE>
|
|
54
|
+
Do NOT proceed past Phase 0 if GATE_CLOSED. There is no bypass. Refer to
|
|
55
|
+
`skills/_shared/bootstrap-gate.md` for the full HARD-GATE constraints.
|
|
56
|
+
</HARD-GATE>
|
|
57
|
+
|
|
58
|
+
---
|
|
59
|
+
|
|
60
|
+
## Phase 1: Config & Argument Loading
|
|
61
|
+
|
|
62
|
+
### 1.1 Read Session Config
|
|
63
|
+
|
|
64
|
+
Read and parse Session Config per `skills/_shared/config-reading.md`. Store result as `$CONFIG`.
|
|
65
|
+
|
|
66
|
+
### 1.2 Extract Reconcile Config
|
|
67
|
+
|
|
68
|
+
Extract the `reconcile` block from `$CONFIG`:
|
|
69
|
+
|
|
70
|
+
```bash
|
|
71
|
+
# rule-expiry-days defaults to EMPTY (not a number) so the engine falls back to
|
|
72
|
+
# its per-type TTL (deriveExpiresAt, default 60d). A numeric override forces flat
|
|
73
|
+
# N-day expiry — matching the `null` default of the reconcile: config resolver.
|
|
74
|
+
RULE_EXPIRY_DAYS=$(echo "$CONFIG" | jq -r '.reconcile["rule-expiry-days"] // empty')
|
|
75
|
+
CONFIDENCE_FLOOR=$(echo "$CONFIG" | jq -r '.reconcile["confidence-floor"] // 0.5')
|
|
76
|
+
RECONCILE_MODE=$(echo "$CONFIG" | jq -r '.reconcile.mode // "warn"')
|
|
77
|
+
MIN_RULE_DAYS=$(echo "$CONFIG" | jq -r '.reconcile["min-rule-days"] // 7')
|
|
78
|
+
MIN_INSIGHT_CHARS=$(echo "$CONFIG" | jq -r '.reconcile["min-insight-chars"] // 24')
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
When `RULE_EXPIRY_DAYS` is empty, pass `ruleExpiryDays: undefined` to `runReconcile` so the engine uses its per-type TTL. Defaults when the `reconcile` block is absent or a field is missing:
|
|
82
|
+
- `rule-expiry-days`: empty → per-type TTL (`deriveExpiresAt`, default 60d). Preserves FA2 behaviour; matches the `null` resolver default.
|
|
83
|
+
- `confidence-floor`: 0.5
|
|
84
|
+
- `mode`: warn (enum `off` | `warn`)
|
|
85
|
+
- `min-rule-days`: 7 — floor window (days) applied to a proposed rule's `expires-at` so a
|
|
86
|
+
near-dead or already-elapsed natural expiry never produces a born-dead rule (issue #741.1).
|
|
87
|
+
- `min-insight-chars`: 24 — opt-in minimum insight length gating the eligibility
|
|
88
|
+
placeholder-insight check (issue #741.2).
|
|
89
|
+
|
|
90
|
+
Note: `reconcile.enabled` is intentionally NOT checked — this on-demand command always runs.
|
|
91
|
+
|
|
92
|
+
### 1.3 Parse Arguments
|
|
93
|
+
|
|
94
|
+
Check `$ARGUMENTS` for `--dry-run`:
|
|
95
|
+
|
|
96
|
+
```bash
|
|
97
|
+
DRY_RUN=false
|
|
98
|
+
if echo "$ARGUMENTS" | grep -q -- '--dry-run'; then
|
|
99
|
+
DRY_RUN=true
|
|
100
|
+
fi
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
---
|
|
104
|
+
|
|
105
|
+
## Phase 2: Run the Reconciliation Engine
|
|
106
|
+
|
|
107
|
+
### 2.1 Resolve Plugin Root
|
|
108
|
+
|
|
109
|
+
Resolve `$PLUGIN_ROOT` per `skills/_shared/config-reading.md` (the standard resolution chain:
|
|
110
|
+
`$CLAUDE_PLUGIN_ROOT` → `$CODEX_PLUGIN_ROOT` → `$CURSOR_RULES_DIR` → common install locations).
|
|
111
|
+
|
|
112
|
+
### 2.2 Invoke `runReconcile`
|
|
113
|
+
|
|
114
|
+
```javascript
|
|
115
|
+
import { runReconcile } from '$PLUGIN_ROOT/scripts/lib/reconcile/engine.mjs';
|
|
116
|
+
|
|
117
|
+
const { proposals, rejected, summary, error } = await runReconcile({
|
|
118
|
+
repoRoot, // absolute path from git rev-parse --show-toplevel
|
|
119
|
+
ruleExpiryDays: RULE_EXPIRY_DAYS, // empty → undefined → engine per-type TTL
|
|
120
|
+
minRuleDays: MIN_RULE_DAYS, // default 7 — floors a near-dead expires-at
|
|
121
|
+
minInsightChars: MIN_INSIGHT_CHARS, // default 24 — opt-in placeholder-insight length gate
|
|
122
|
+
now: new Date(),
|
|
123
|
+
dryRun: DRY_RUN, // true → engine touches no disk (no idempotency sidecar write)
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
// The engine does NOT apply a confidence floor — it proposes every eligible
|
|
127
|
+
// learning and carries each one's `confidence` through. `confidence-floor` is a
|
|
128
|
+
// DELIVERY gate: filter proposals here before the sidecar + AUQ (mirrors
|
|
129
|
+
// session-end Phase 3.6.8). Use `surfaced` everywhere "proposals" appears below.
|
|
130
|
+
const surfaced = proposals.filter((p) => typeof p.confidence === 'number' && p.confidence >= CONFIDENCE_FLOOR);
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
`runReconcile` NEVER throws — a top-level error populates `result.error` instead.
|
|
134
|
+
|
|
135
|
+
If `error` is present, surface it to the user and abort:
|
|
136
|
+
> "Reconcile engine error: `<error>`. Check `.orchestrator/metrics/learnings.jsonl` and retry."
|
|
137
|
+
|
|
138
|
+
### 2.3 Handle Empty / Zero-Proposal Cases
|
|
139
|
+
|
|
140
|
+
If `summary.totalLearnings === 0`:
|
|
141
|
+
> "No learnings found in `.orchestrator/metrics/learnings.jsonl`. Run `/evolve analyze` first to extract session patterns."
|
|
142
|
+
Exit cleanly.
|
|
143
|
+
|
|
144
|
+
If `summary.eligible === 0` (learnings exist but none are eligible — already proposed,
|
|
145
|
+
or wrong learning type — eligibility is type/`file_paths`-based, NOT confidence-based):
|
|
146
|
+
> "No eligible learnings for rule proposals (total: `summary.totalLearnings`, already proposed or ineligible type: all). Run more sessions to accumulate evidence."
|
|
147
|
+
Exit cleanly. Optionally list the rejection reasons from `rejected[]` (field `reason`) as an
|
|
148
|
+
informational table.
|
|
149
|
+
|
|
150
|
+
If `summary.eligible > 0` but `surfaced.length === 0` (proposals exist but ALL fall below
|
|
151
|
+
`confidence-floor`):
|
|
152
|
+
> "No proposals above the confidence floor (`CONFIDENCE_FLOOR`). Lower `reconcile.confidence-floor` or run more sessions so the underlying learnings accrue confidence."
|
|
153
|
+
Exit cleanly.
|
|
154
|
+
|
|
155
|
+
If `summary.proposed === 0` but `summary.eligible > 0` (emit/render failures consumed all
|
|
156
|
+
candidates — unusual):
|
|
157
|
+
> "Engine produced 0 proposals from N eligible learnings. See rejection log."
|
|
158
|
+
List `rejected[].reason` and exit.
|
|
159
|
+
|
|
160
|
+
---
|
|
161
|
+
|
|
162
|
+
## Phase 3: Dry-Run Branch
|
|
163
|
+
|
|
164
|
+
**Only when `DRY_RUN=true`.**
|
|
165
|
+
|
|
166
|
+
Print the proposals in a readable table. Do NOT write the sidecar, do NOT render an AUQ.
|
|
167
|
+
|
|
168
|
+
```
|
|
169
|
+
## Reconcile — Dry Run (N proposals, M rejected)
|
|
170
|
+
|
|
171
|
+
| # | Slug | Confidence | Learning Key | Rule Path |
|
|
172
|
+
|---|------|-----------|-------------|-----------|
|
|
173
|
+
| 1 | <slug> | 0.72 | <learningKey> | .claude/rules/<slug>.md |
|
|
174
|
+
| 2 | ... | ... | ... | ... |
|
|
175
|
+
|
|
176
|
+
Rejected (not eligible for proposal):
|
|
177
|
+
| Learning Key | Reason |
|
|
178
|
+
|-------------|--------|
|
|
179
|
+
| <key> | <reason> |
|
|
180
|
+
|
|
181
|
+
Re-run without --dry-run to enter the approval flow.
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
Exit after printing. Do not proceed to Phase 4.
|
|
185
|
+
|
|
186
|
+
---
|
|
187
|
+
|
|
188
|
+
## Phase 4: Write Pending Sidecar (Normal Mode Only)
|
|
189
|
+
|
|
190
|
+
Write the proposals to `.orchestrator/metrics/reconcile-pending.md` as a human-readable
|
|
191
|
+
record before presenting the AUQ. This sidecar is informational only — it lets the operator
|
|
192
|
+
see the full proposal set in an editor alongside the AUQ prompt.
|
|
193
|
+
|
|
194
|
+
```markdown
|
|
195
|
+
# Reconcile Pending — <ISO date>
|
|
196
|
+
|
|
197
|
+
Generated by `/reconcile` on <timestamp>. N proposals, M rejected.
|
|
198
|
+
|
|
199
|
+
## Proposals
|
|
200
|
+
|
|
201
|
+
| # | Slug | Confidence | Learning Key | Rendered Rule Path |
|
|
202
|
+
|---|------|-----------|-------------|-------------------|
|
|
203
|
+
| 1 | <slug> | 0.72 | <key> | .claude/rules/<slug>.md |
|
|
204
|
+
...
|
|
205
|
+
|
|
206
|
+
## Rejected
|
|
207
|
+
|
|
208
|
+
| Learning Key | Type | Reason |
|
|
209
|
+
|-------------|------|--------|
|
|
210
|
+
| <key> | <type> | <reason> |
|
|
211
|
+
...
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
Write via standard file write (not atomic, not lock-protected — this is a disposable sidecar,
|
|
215
|
+
not a critical artifact).
|
|
216
|
+
|
|
217
|
+
---
|
|
218
|
+
|
|
219
|
+
## Phase 5: AUQ Approval Flow (Normal Mode Only)
|
|
220
|
+
|
|
221
|
+
Present proposals to the operator in batches of 4. Mirror the session-end Phase 3.6.3 / 3.6.8
|
|
222
|
+
multiSelect pattern exactly.
|
|
223
|
+
|
|
224
|
+
For each batch (proposals sliced into groups of 4):
|
|
225
|
+
|
|
226
|
+
```
|
|
227
|
+
AskUserQuestion({
|
|
228
|
+
questions: [{
|
|
229
|
+
question: "Which rule proposals should be written to .claude/rules/? (batch K of N)",
|
|
230
|
+
header: "Reconcile — Approve Rule Proposals",
|
|
231
|
+
options: [
|
|
232
|
+
{
|
|
233
|
+
label: "<slug>.md (confidence: 0.72)",
|
|
234
|
+
description: "Learning: <learningKey> | Path: .claude/rules/<slug>.md | <first 100 chars of rendered content>"
|
|
235
|
+
},
|
|
236
|
+
...up to 4 options per batch...
|
|
237
|
+
{
|
|
238
|
+
label: "Skip all in this batch",
|
|
239
|
+
description: "Decline all proposals in this batch — they are archived to the rejected log."
|
|
240
|
+
}
|
|
241
|
+
],
|
|
242
|
+
multiSelect: true
|
|
243
|
+
}]
|
|
244
|
+
})
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
Collect responses across all batches:
|
|
248
|
+
- Selected options (excluding "Skip all") → `approved[]`
|
|
249
|
+
- Unselected options + "Skip all" batches → `rejected_by_operator[]`
|
|
250
|
+
|
|
251
|
+
> **Codex CLI fallback:** AskUserQuestion is unavailable in subagents and on Codex CLI
|
|
252
|
+
> (AUQ-004). In those contexts, present proposals as a numbered Markdown list and ask
|
|
253
|
+
> the operator to reply with the numbers they wish to approve.
|
|
254
|
+
|
|
255
|
+
---
|
|
256
|
+
|
|
257
|
+
## Phase 6: Write Approved Rules
|
|
258
|
+
|
|
259
|
+
### 6.1 Invoke `writeApprovedRules`
|
|
260
|
+
|
|
261
|
+
```javascript
|
|
262
|
+
import { writeApprovedRules } from '$PLUGIN_ROOT/scripts/lib/reconcile/writer.mjs';
|
|
263
|
+
|
|
264
|
+
const { written, archived, errors } = await writeApprovedRules({
|
|
265
|
+
approved: approved, // proposals the operator approved
|
|
266
|
+
rejected: rejected_by_operator, // proposals the operator declined
|
|
267
|
+
repoRoot,
|
|
268
|
+
sessionId: currentSessionId, // informational; from STATE.md or 'manual'
|
|
269
|
+
});
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
`writeApprovedRules` NEVER throws — per-item failures are collected in `errors[]`.
|
|
273
|
+
|
|
274
|
+
### 6.2 Handle Errors
|
|
275
|
+
|
|
276
|
+
If `errors.length > 0`, surface each error to the operator:
|
|
277
|
+
> "Warning: `N` rule(s) failed to write: `<error list>`. Successfully written: `written`. Archived: `archived`."
|
|
278
|
+
|
|
279
|
+
Log each error but do NOT abort — partial success is acceptable.
|
|
280
|
+
|
|
281
|
+
### 6.3 Report
|
|
282
|
+
|
|
283
|
+
```
|
|
284
|
+
## Reconcile Complete
|
|
285
|
+
|
|
286
|
+
- Written: <written> rule file(s) to .claude/rules/
|
|
287
|
+
- Archived: <archived> declined proposal(s) to .orchestrator/reconcile.rejected.log
|
|
288
|
+
- Errors: <errors.length> (see warnings above, if any)
|
|
289
|
+
|
|
290
|
+
New rules take effect immediately — they are loaded by the wave-executor's rule-loader
|
|
291
|
+
on the next wave dispatch.
|
|
292
|
+
```
|
|
293
|
+
|
|
294
|
+
If `written === 0` and `approved.length === 0`:
|
|
295
|
+
> "No proposals approved. No rules written."
|
|
296
|
+
|
|
297
|
+
---
|
|
298
|
+
|
|
299
|
+
## Critical Rules
|
|
300
|
+
|
|
301
|
+
- **NEVER** call `writeApprovedRules` before the operator has confirmed via AUQ — this is the
|
|
302
|
+
only write-protection gate for `.claude/rules/`.
|
|
303
|
+
- **NEVER** pass `dryRun: false` to `runReconcile` and then skip the AUQ — the idempotency
|
|
304
|
+
sidecar is written during the engine run; writing rules without AUQ confirmation would create
|
|
305
|
+
an inconsistency between the sidecar and the actual rule files.
|
|
306
|
+
- **ALWAYS** surface `errors[]` from `writeApprovedRules` — per-item isolation must not
|
|
307
|
+
silently swallow failures.
|
|
308
|
+
- **ALWAYS** present proposals in batches of ≤4 via AUQ multiSelect — mirrors session-end
|
|
309
|
+
3.6.3 / 3.6.8 and keeps the operator prompt readable.
|
|
310
|
+
- **ALWAYS** honour `confidence-floor`, `rule-expiry-days`, `min-rule-days`, and
|
|
311
|
+
`min-insight-chars` from Session Config `reconcile` block — the engine reads these, but
|
|
312
|
+
the skill must pass them explicitly.
|
|
313
|
+
|
|
314
|
+
## Anti-Patterns
|
|
315
|
+
|
|
316
|
+
- **DO NOT** write any file to `.claude/rules/` without AUQ operator confirmation.
|
|
317
|
+
- **DO NOT** check `reconcile.enabled` — that flag gates the automatic session-end phase, not
|
|
318
|
+
this on-demand command.
|
|
319
|
+
- **DO NOT** emit or approve a rule with `alwaysApply: true` — the engine structurally prevents
|
|
320
|
+
it, but the reviewer should reject any proposal that would produce an always-on rule.
|
|
321
|
+
- **DO NOT** skip the dry-run branch when `--dry-run` is passed — the entire AUQ + write flow
|
|
322
|
+
must be bypassed.
|
|
323
|
+
- **DO NOT** treat `runReconcile` failures as fatal — check the `error` field and surface it,
|
|
324
|
+
then exit cleanly.
|
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: repo-audit
|
|
3
|
+
description: Use this skill when the user wants to audit a repository for baseline compliance, check code quality, security posture, CI/CD setup, testing, documentation, and ecosystem configuration. Runs 9 checklist categories and emits a Markdown report plus JSON sidecar at .orchestrator/metrics/repo-audit-<timestamp>.json. <example>Context: User is in a project repo and wants a baseline compliance check. user: "/repo-audit" assistant: "Running repo-audit across 9 categories — Configuration, Code Quality, Git Hygiene, CI/CD, Testing, Security, Documentation, Clank Integration (optional), and MCP Configuration. Will produce a Markdown checklist report and JSON sidecar." <commentary>The user wants a compliance check; this skill is appropriate because it runs all 9 categories with pass/fail/warn/skipped statuses and writes structured output.</commentary></example>
|
|
4
|
+
model: inherit
|
|
5
|
+
color: cyan
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Repo Audit Skill
|
|
9
|
+
|
|
10
|
+
Perform a comprehensive audit of the host repository against the ecosystem baseline. Emits a structured Markdown checklist report and a JSON sidecar for trend tracking.
|
|
11
|
+
|
|
12
|
+
## Purpose
|
|
13
|
+
|
|
14
|
+
Answer the question: "Does this repo match the ecosystem baseline?" — a compliance-focused, checkable question with a fixed 9-category checklist. Distinct from `/discovery` (broad quality probes) and `/harness-audit` (plugin installation health).
|
|
15
|
+
|
|
16
|
+
## Phase 1: Read Session Config
|
|
17
|
+
|
|
18
|
+
Read the project's `## Session Config` section in `CLAUDE.md` (or `AGENTS.md` for Codex CLI). Store resolved values as `$CONFIG`.
|
|
19
|
+
|
|
20
|
+
**Command resolution follows `skills/quality-gates/SKILL.md` priority order:**
|
|
21
|
+
1. `.orchestrator/policy/quality-gates.json` — canonical policy file (if present).
|
|
22
|
+
2. Session Config `test-command` / `typecheck-command` / `lint-command` — fallback.
|
|
23
|
+
3. Hardcoded defaults: `npm test`, `npm run typecheck`, `npm run lint`.
|
|
24
|
+
|
|
25
|
+
If any command is set to the literal string `skip`, skip that check entirely and mark it `skipped`.
|
|
26
|
+
|
|
27
|
+
## Phase 2: Clank Detection
|
|
28
|
+
|
|
29
|
+
Check for Clank integration markers:
|
|
30
|
+
```bash
|
|
31
|
+
ls .clank/ 2>/dev/null || ls clank.config.* 2>/dev/null || ls clank.config.json 2>/dev/null
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
Set `$CLANK_DETECTED=true` if any marker exists, `false` otherwise.
|
|
35
|
+
|
|
36
|
+
Also check Session Config for `ecosystem: baseline` — if set, treat Clank checks as required rather than optional.
|
|
37
|
+
|
|
38
|
+
## Phase 3: Run 9 Audit Categories
|
|
39
|
+
|
|
40
|
+
Run all checks in parallel where possible. For each check use the status symbols:
|
|
41
|
+
- `✓` — passes
|
|
42
|
+
- `✗` — fails (action required)
|
|
43
|
+
- `⚠` — warning (review recommended)
|
|
44
|
+
- `skipped` — intentionally skipped
|
|
45
|
+
|
|
46
|
+
### Category 1: Configuration
|
|
47
|
+
|
|
48
|
+
| Check | Method |
|
|
49
|
+
|---|---|
|
|
50
|
+
| `CLAUDE.md` exists (50-100 lines, lean) | `wc -l CLAUDE.md` |
|
|
51
|
+
| `.claude/rules/` has path-scoped rules | `ls .claude/rules/*.md 2>/dev/null` |
|
|
52
|
+
| `.claude/settings.json` exists | `ls .claude/settings.json` |
|
|
53
|
+
| `.mcp.json` exists with servers | `ls .mcp.json` |
|
|
54
|
+
| `.gitignore` covers `.env*`, `node_modules`, build artifacts | `grep -E '\.env\*|node_modules' .gitignore` |
|
|
55
|
+
|
|
56
|
+
### Category 2: Code Quality
|
|
57
|
+
|
|
58
|
+
Commands resolved from Session Config per Phase 1.
|
|
59
|
+
|
|
60
|
+
| Check | Method |
|
|
61
|
+
|---|---|
|
|
62
|
+
| ESLint v9 flat config (`eslint.config.mjs`) | `ls eslint.config.mjs 2>/dev/null` |
|
|
63
|
+
| Prettier config (`.prettierrc` or `prettier.config.*`) | `ls .prettierrc* prettier.config.* 2>/dev/null` |
|
|
64
|
+
| TypeScript strict mode (`"strict": true` in tsconfig.json) | `grep '"strict": true' tsconfig.json` |
|
|
65
|
+
| 0 TypeScript errors | Run `{typecheck-command} 2>&1` — pass if exit code 0 |
|
|
66
|
+
| No `console.log` in production code (excluding tests) | `grep -r 'console\.log' --include='*.ts' --include='*.mts' --exclude-dir=tests --exclude-dir=node_modules . 2>/dev/null | grep -v '\.test\.'` |
|
|
67
|
+
| Lint passes | Run `{lint-command} 2>&1` — pass if exit code 0 |
|
|
68
|
+
|
|
69
|
+
### Category 3: Git Hygiene
|
|
70
|
+
|
|
71
|
+
| Check | Method |
|
|
72
|
+
|---|---|
|
|
73
|
+
| Husky + lint-staged configured | `ls .husky/ 2>/dev/null && grep 'lint-staged' package.json` |
|
|
74
|
+
| commitlint (Conventional Commits) | `ls commitlint.config.* 2>/dev/null || grep 'commitlint' package.json` |
|
|
75
|
+
| Gitleaks pre-commit or CI | `ls .gitleaks.toml 2>/dev/null || grep 'gitleaks' .husky/pre-commit 2>/dev/null` |
|
|
76
|
+
| No secrets in git history | `git log --all -p 2>/dev/null | grep -i 'password\|secret\|api_key\|token' | head -1` — warn if any found |
|
|
77
|
+
|
|
78
|
+
### Category 4: CI/CD
|
|
79
|
+
|
|
80
|
+
| Check | Method |
|
|
81
|
+
|---|---|
|
|
82
|
+
| CI config exists (`.gitlab-ci.yml` or `.github/workflows/`) | `ls .gitlab-ci.yml 2>/dev/null \|\| ls .github/workflows/*.yml 2>/dev/null` |
|
|
83
|
+
| Stages include validate → security → test → deploy | Read CI config, check for these stage names |
|
|
84
|
+
| Typecheck in CI | `grep -E 'tsgo|typecheck' .gitlab-ci.yml .github/workflows/*.yml 2>/dev/null` |
|
|
85
|
+
| Tests in CI | `grep -E 'vitest|npm test|pnpm test' .gitlab-ci.yml .github/workflows/*.yml 2>/dev/null` |
|
|
86
|
+
| Dependency audit in CI | `grep -E 'audit|pnpm audit' .gitlab-ci.yml .github/workflows/*.yml 2>/dev/null` |
|
|
87
|
+
|
|
88
|
+
### Category 5: Testing
|
|
89
|
+
|
|
90
|
+
| Check | Method |
|
|
91
|
+
|---|---|
|
|
92
|
+
| Vitest configured (`vitest.config.ts` or `vitest.config.mjs`) | `ls vitest.config.* 2>/dev/null` |
|
|
93
|
+
| Test coverage configured | `grep 'coverage' vitest.config.* 2>/dev/null` |
|
|
94
|
+
| E2E tests (Playwright) for frontend repos | `ls playwright.config.* 2>/dev/null` — only required if `next.config.*` or `nuxt.config.*` exists |
|
|
95
|
+
| Test scripts in `package.json` | `grep '"test"' package.json 2>/dev/null` |
|
|
96
|
+
| Tests pass | Run `{test-command} 2>&1` — pass if exit code 0 |
|
|
97
|
+
|
|
98
|
+
### Category 6: Security
|
|
99
|
+
|
|
100
|
+
| Check | Method |
|
|
101
|
+
|---|---|
|
|
102
|
+
| Auth-at-boundary pattern (`requireAuth`) | `grep -r 'requireAuth' --include='*.ts' src/ 2>/dev/null \|\| echo "N/A (no src/)"` |
|
|
103
|
+
| Zod validation on inputs | `grep -r 'z\.object\|z\.string\|z\.parse\|safeParse' --include='*.ts' src/ 2>/dev/null \|\| echo "N/A"` |
|
|
104
|
+
| No hardcoded secrets (scan for API key patterns) | `grep -r 'sk-\|api_key\s*=\s*"' --include='*.ts' --include='*.mts' --exclude-dir=node_modules . 2>/dev/null` — warn if found |
|
|
105
|
+
| No PAT/token in settings-allowlist entries (`.claude/settings.json`, `.claude/settings.local.json` — on-disk, incl. untracked) | `grep -nEo 'glpat-[A-Za-z0-9_-]{20,}\|ghp_[A-Za-z0-9]{36,}\|github_pat_[A-Za-z0-9_]{22,}\|sk-ant-[A-Za-z0-9_-]{20,}\|AKIA[0-9A-Z]{16}' .claude/settings.json .claude/settings.local.json 2>/dev/null \| grep -vE 'AKIAIOSFODNN7EXAMPLE\|-PLACEHOLDER'` — **fail** if any match (hard — unlike the `sk-` heuristic above, these 5 prefixes are high-signal; see SEC-021 in `.claude/rules/security.md`). This check is required because `check-owner-leakage.mjs` scans `git ls-files` only — `settings.local.json` is gitignored/untracked by convention and structurally invisible to it. |
|
|
106
|
+
| `.env*` files not tracked | `git ls-files | grep '\.env'` — fail if any `.env` (not `.env.example`) tracked |
|
|
107
|
+
| `.env.example` documents all secrets | `ls .env.example 2>/dev/null` |
|
|
108
|
+
|
|
109
|
+
Note: RLS, rate limiting, and CORS checks are `⚠ review` items — they require human judgment and cannot be fully automated. Flag them as `⚠ manual-review-recommended`.
|
|
110
|
+
|
|
111
|
+
### Category 7: Documentation
|
|
112
|
+
|
|
113
|
+
| Check | Method |
|
|
114
|
+
|---|---|
|
|
115
|
+
| `README.md` exists | `ls README.md 2>/dev/null` |
|
|
116
|
+
| `.env.example` exists with documented vars | `ls .env.example 2>/dev/null` |
|
|
117
|
+
| Architecture documented in `CLAUDE.md` | `grep -i 'architecture\|structure\|stack' CLAUDE.md 2>/dev/null` |
|
|
118
|
+
|
|
119
|
+
### Category 8: Clank Integration (Optional)
|
|
120
|
+
|
|
121
|
+
**If `$CLANK_DETECTED=false` AND `ecosystem: baseline` is NOT set in Session Config:**
|
|
122
|
+
|
|
123
|
+
```
|
|
124
|
+
### 8. Clank Integration
|
|
125
|
+
Status: skipped — Clank not detected (.clank/ and clank.config.* absent; ecosystem: baseline not set)
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
Do not mark any Clank check as `✗`. Absence of Clank is not a failure outside the baseline ecosystem.
|
|
129
|
+
|
|
130
|
+
**If `$CLANK_DETECTED=true` OR `ecosystem: baseline` is set:**
|
|
131
|
+
|
|
132
|
+
| Check | Method |
|
|
133
|
+
|---|---|
|
|
134
|
+
| `GET /health` endpoint exists (for services) | `grep -r '/health' --include='*.ts' src/ 2>/dev/null` |
|
|
135
|
+
| CI pipeline sends webhooks to Event Bus | `grep -E 'webhook\|event.bus\|clank' .gitlab-ci.yml .github/workflows/*.yml 2>/dev/null` |
|
|
136
|
+
| Sentry configured (for user-facing apps) | `grep -r 'Sentry' --include='*.ts' --include='*.mts' --exclude-dir=node_modules . 2>/dev/null` |
|
|
137
|
+
| Conventional Commits enforced (commitlint) | `ls commitlint.config.* 2>/dev/null || grep 'commitlint' package.json 2>/dev/null` |
|
|
138
|
+
|
|
139
|
+
### Category 9: MCP Configuration
|
|
140
|
+
|
|
141
|
+
**Scope:** Audits only the repo-local `.mcp.json` file — does NOT cover the user-machine MCPJungle gateway or globally-imported MCP servers.
|
|
142
|
+
|
|
143
|
+
| Check | Method |
|
|
144
|
+
|---|---|
|
|
145
|
+
| `.mcp.json` exists | `ls .mcp.json 2>/dev/null` |
|
|
146
|
+
| MCP servers match project type | Read `.mcp.json`, verify server list is appropriate (e.g., `shadcn` only for frontend repos, no stale servers) |
|
|
147
|
+
| No stale or unused MCP entries | Cross-reference `.mcp.json` servers against project stack markers |
|
|
148
|
+
| MCP server health probe (optional — requires `mcporter`) | For each server declared in repo-local `.mcp.json`: if `command -v mcporter` is present, run `mcporter list --json` and read the per-server `status` field — `ok` → ✓ pass; `auth` → ⚠ warn (remediation: `mcporter auth <server>`); `offline`/`error` → ✗ fail. If `mcporter` is absent → mark this check `skipped` with note "enable with `npm install -g mcporter`". `mcporter` is never a hard dependency; the repo audit proceeds without it. |
|
|
149
|
+
|
|
150
|
+
## Phase 4: Emit Report
|
|
151
|
+
|
|
152
|
+
### 4.1 Markdown Report (stdout)
|
|
153
|
+
|
|
154
|
+
Emit a structured report in this format:
|
|
155
|
+
|
|
156
|
+
```markdown
|
|
157
|
+
# Repo Audit Report — <repo-name>
|
|
158
|
+
Generated: <ISO timestamp>
|
|
159
|
+
Session Config commands: test=`<test-command>` typecheck=`<typecheck-command>` lint=`<lint-command>`
|
|
160
|
+
|
|
161
|
+
## Summary
|
|
162
|
+
| Category | Pass | Fail | Warn | Skipped |
|
|
163
|
+
|---|---|---|---|---|
|
|
164
|
+
| 1. Configuration | N | N | N | N |
|
|
165
|
+
| 2. Code Quality | N | N | N | N |
|
|
166
|
+
| 3. Git Hygiene | N | N | N | N |
|
|
167
|
+
| 4. CI/CD | N | N | N | N |
|
|
168
|
+
| 5. Testing | N | N | N | N |
|
|
169
|
+
| 6. Security | N | N | N | N |
|
|
170
|
+
| 7. Documentation | N | N | N | N |
|
|
171
|
+
| 8. Clank Integration | N | N | N | N |
|
|
172
|
+
| 9. MCP Configuration | N | N | N | N |
|
|
173
|
+
| **Total** | N | N | N | N |
|
|
174
|
+
|
|
175
|
+
**Overall:** ✓ PASS / ✗ FAIL / ⚠ WARN
|
|
176
|
+
|
|
177
|
+
## Detailed Results
|
|
178
|
+
|
|
179
|
+
### 1. Configuration
|
|
180
|
+
- ✓ CLAUDE.md exists (72 lines — within 50-100 range)
|
|
181
|
+
- ✗ `.claude/settings.json` missing — create with permissions and hooks
|
|
182
|
+
- ⚠ `.mcp.json` missing — add MCP servers appropriate for your stack
|
|
183
|
+
...
|
|
184
|
+
|
|
185
|
+
### 2. Code Quality
|
|
186
|
+
...
|
|
187
|
+
|
|
188
|
+
### 8. Clank Integration
|
|
189
|
+
skipped — Clank not detected (.clank/ and clank.config.* absent; ecosystem: baseline not set in Session Config)
|
|
190
|
+
|
|
191
|
+
### 9. MCP Configuration
|
|
192
|
+
- ✓ `.mcp.json` exists
|
|
193
|
+
- ✓ Servers match project type
|
|
194
|
+
- ⚠ MCP server health probe: `github` → ok; `shadcn` → auth (run `mcporter auth shadcn`)
|
|
195
|
+
|
|
196
|
+
## Critical Findings
|
|
197
|
+
<List only ✗ items — actionable, with fix guidance>
|
|
198
|
+
|
|
199
|
+
## Action Items
|
|
200
|
+
<Numbered list of recommended fixes, ordered by priority>
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
### 4.2 JSON Sidecar
|
|
204
|
+
|
|
205
|
+
Write to `.orchestrator/metrics/repo-audit-<unix-timestamp>.json`:
|
|
206
|
+
|
|
207
|
+
```json
|
|
208
|
+
{
|
|
209
|
+
"schema_version": 1,
|
|
210
|
+
"generated_at": "<ISO timestamp>",
|
|
211
|
+
"repo": "<basename of cwd>",
|
|
212
|
+
"commands": {
|
|
213
|
+
"test": "<resolved test-command>",
|
|
214
|
+
"typecheck": "<resolved typecheck-command>",
|
|
215
|
+
"lint": "<resolved lint-command>"
|
|
216
|
+
},
|
|
217
|
+
"clank_detected": false,
|
|
218
|
+
"ecosystem_baseline": false,
|
|
219
|
+
"categories": {
|
|
220
|
+
"configuration": { "pass": 4, "fail": 1, "warn": 0, "skipped": 0, "checks": [] },
|
|
221
|
+
"code_quality": { "pass": 3, "fail": 1, "warn": 1, "skipped": 0, "checks": [] },
|
|
222
|
+
"git_hygiene": { "pass": 2, "fail": 1, "warn": 0, "skipped": 0, "checks": [] },
|
|
223
|
+
"ci_cd": { "pass": 0, "fail": 5, "warn": 0, "skipped": 0, "checks": [] },
|
|
224
|
+
"testing": { "pass": 4, "fail": 0, "warn": 0, "skipped": 1, "checks": [] },
|
|
225
|
+
"security": { "pass": 3, "fail": 1, "warn": 2, "skipped": 0, "checks": [] },
|
|
226
|
+
"documentation": { "pass": 2, "fail": 0, "warn": 1, "skipped": 0, "checks": [] },
|
|
227
|
+
"clank_integration": { "pass": 0, "fail": 0, "warn": 0, "skipped": 4, "checks": [] },
|
|
228
|
+
"mcp_configuration": { "pass": 1, "fail": 0, "warn": 2, "skipped": 0, "checks": [] }
|
|
229
|
+
},
|
|
230
|
+
"summary": {
|
|
231
|
+
"total_pass": 0,
|
|
232
|
+
"total_fail": 0,
|
|
233
|
+
"total_warn": 0,
|
|
234
|
+
"total_skipped": 0,
|
|
235
|
+
"overall": "pass|fail|warn"
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
Each `checks` array entry:
|
|
241
|
+
```json
|
|
242
|
+
{ "id": "config.claude-md-exists", "status": "pass|fail|warn|skipped", "detail": "human-readable result" }
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
MCP server health entries additionally include an optional `remediation` field (representative examples):
|
|
246
|
+
```json
|
|
247
|
+
{ "id": "mcp.server-health-github", "status": "pass", "detail": "mcporter: status=ok", "remediation": null }
|
|
248
|
+
{ "id": "mcp.server-health-shadcn", "status": "warn", "detail": "mcporter: status=auth", "remediation": "mcporter auth shadcn" }
|
|
249
|
+
{ "id": "mcp.server-health-probe", "status": "skipped", "detail": "mcporter not installed — enable with npm install -g mcporter", "remediation": "npm install -g mcporter" }
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
Create `.orchestrator/metrics/` if it does not exist:
|
|
253
|
+
```bash
|
|
254
|
+
mkdir -p .orchestrator/metrics
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
Write using `node -e` or direct file write — do not require any external dependency.
|
|
258
|
+
|
|
259
|
+
## Overall Status Logic
|
|
260
|
+
|
|
261
|
+
- `✗ FAIL` — any check has status `fail`
|
|
262
|
+
- `⚠ WARN` — no fails, but at least one `warn`
|
|
263
|
+
- `✓ PASS` — all checks are `pass` or `skipped`
|
|
264
|
+
|
|
265
|
+
## Success Criteria
|
|
266
|
+
|
|
267
|
+
- All 9 categories checked with pass/fail/warn/skipped status
|
|
268
|
+
- Clank section correctly detected and marked `skipped` when absent
|
|
269
|
+
- Commands resolved from Session Config (not hardcoded `pnpm`)
|
|
270
|
+
- JSON sidecar written to `.orchestrator/metrics/repo-audit-<timestamp>.json`
|
|
271
|
+
- No false positives — verify findings before reporting
|
|
272
|
+
- Critical security findings flagged prominently in "Critical Findings" section
|