@event4u/agent-config 3.3.0 → 4.1.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/.agent-src/README.md +2 -2
- package/.agent-src/commands/agent-handoff.md +31 -2
- package/.agent-src/commands/agent-status.md +5 -5
- package/.agent-src/commands/agents/audit.md +8 -8
- package/.agent-src/commands/agents/init.md +25 -1
- package/.agent-src/commands/agents/optimize.md +3 -3
- package/.agent-src/commands/agents/user.md +1 -1
- package/.agent-src/commands/agents.md +1 -1
- package/.agent-src/commands/analyze-reference-repo.md +1 -1
- package/.agent-src/commands/check-current-md.md +8 -8
- package/.agent-src/commands/{compress.md → condense.md} +55 -55
- package/.agent-src/commands/context/create.md +7 -4
- package/.agent-src/commands/context/refactor.md +3 -1
- package/.agent-src/commands/feature/dev.md +1 -1
- package/.agent-src/commands/feature/explore.md +1 -1
- package/.agent-src/commands/feature/plan.md +10 -8
- package/.agent-src/commands/feature/refactor.md +3 -1
- package/.agent-src/commands/feature/roadmap.md +7 -4
- package/.agent-src/commands/fix/portability.md +3 -3
- package/.agent-src/commands/fix/refs.md +4 -4
- package/.agent-src/commands/ghostwriter.md +2 -2
- package/.agent-src/commands/memory/learn-low-impact.md +3 -3
- package/.agent-src/commands/module/explore.md +34 -8
- package/.agent-src/commands/optimize/agents-dir.md +9 -7
- package/.agent-src/commands/optimize/augmentignore.md +2 -2
- package/.agent-src/commands/optimize/skills.md +9 -9
- package/.agent-src/commands/post-as.md +1 -1
- package/.agent-src/commands/project-analyze.md +2 -2
- package/.agent-src/commands/project-health.md +3 -2
- package/.agent-src/commands/research/deep.md +1 -1
- package/.agent-src/commands/research/report.md +1 -1
- package/.agent-src/commands/research.md +1 -1
- package/.agent-src/commands/roadmap/ai-council.md +1 -1
- package/.agent-src/commands/roadmap/create.md +9 -4
- package/.agent-src/commands/rule-compliance-audit.md +1 -1
- package/.agent-src/commands/upstream-contribute.md +14 -14
- package/.agent-src/commands/video/from-script.md +1 -1
- package/.agent-src/commands/video/scene.md +1 -1
- package/.agent-src/commands/video/stitch.md +1 -1
- package/.agent-src/commands/video/storyboard.md +1 -1
- package/.agent-src/commands/video.md +1 -1
- package/.agent-src/contexts/augment-infrastructure.md +1 -1
- package/.agent-src/contexts/authority/commit-mechanics.md +15 -0
- package/.agent-src/contexts/authority/kernel-rule-edits.md +3 -3
- package/.agent-src/contexts/authority/scope-mechanics.md +1 -1
- package/.agent-src/contexts/communication/rules-auto/augment-source-of-truth-mechanics.md +28 -28
- package/.agent-src/contexts/communication/rules-auto/skill-quality-mechanics.md +4 -4
- package/.agent-src/contexts/communication/rules-auto/think-before-action-mechanics.md +2 -2
- package/.agent-src/contexts/contracts/artifact-engagement-flow.md +6 -6
- package/.agent-src/contexts/contracts/command-suggestion-flow.md +3 -3
- package/.agent-src/contexts/contracts/emergency-triage-block.md +4 -4
- package/.agent-src/contexts/contracts/frugality-charter.md +3 -3
- package/.agent-src/contexts/documentation-hierarchy.md +14 -7
- package/.agent-src/contexts/execution/autonomy-examples.md +1 -1
- package/.agent-src/contexts/execution/cheap-question-mechanics.md +39 -2
- package/.agent-src/contexts/execution/roadmap-process-loop.md +28 -5
- package/.agent-src/contexts/override-system.md +5 -5
- package/.agent-src/ghostwriter/fictional-fixture-v1.md +1 -1
- package/.agent-src/personas/advisors/first-principles.md +1 -1
- package/.agent-src/personas/hollywood-director.md +1 -1
- package/.agent-src/rules/architecture.md +5 -1
- package/.agent-src/rules/augment-edit-discipline.md +5 -5
- package/.agent-src/rules/augment-source-of-truth.md +15 -15
- package/.agent-src/rules/commit-conventions.md +1 -1
- package/.agent-src/rules/commit-policy.md +10 -0
- package/.agent-src/rules/domain-adoption-policy.md +3 -3
- package/.agent-src/rules/fast-path-marker-visibility.md +3 -3
- package/.agent-src/rules/finance-safety-floor.md +1 -1
- package/.agent-src/rules/framework-neutrality-in-generic-skills.md +8 -8
- package/.agent-src/rules/git-history-discipline.md +1 -1
- package/.agent-src/rules/improve-before-implement.md +2 -2
- package/.agent-src/rules/language-and-tone.md +2 -2
- package/.agent-src/rules/media-governance-routing.md +5 -5
- package/.agent-src/rules/no-attribution-footers.md +1 -0
- package/.agent-src/rules/no-cheap-questions.md +3 -0
- package/.agent-src/rules/no-decorative-emojis-in-git-surfaces.md +111 -0
- package/.agent-src/rules/no-pr-progress-comments.md +118 -0
- package/.agent-src/rules/no-roadmap-references.md +3 -3
- package/.agent-src/rules/non-destructive-by-default.md +1 -1
- package/.agent-src/rules/persona-governance.md +3 -3
- package/.agent-src/rules/preservation-guard.md +15 -15
- package/.agent-src/rules/roadmap-ci-steps-policy.md +7 -3
- package/.agent-src/rules/rule-type-governance.md +1 -1
- package/.agent-src/rules/skill-quality.md +1 -1
- package/.agent-src/rules/{caveman-speak.md → telegraph-speak.md} +15 -15
- package/.agent-src/rules/token-optimizer-maintenance.md +6 -6
- package/.agent-src/skills/agent-docs-writing/SKILL.md +17 -11
- package/.agent-src/skills/agents-md-thin-root/SKILL.md +9 -9
- package/.agent-src/skills/check-refs/SKILL.md +2 -2
- package/.agent-src/skills/code-refactoring/SKILL.md +2 -2
- package/.agent-src/skills/command-writing/SKILL.md +19 -19
- package/.agent-src/skills/comp-banding/SKILL.md +1 -1
- package/.agent-src/skills/condense-memory/SKILL.md +131 -0
- package/.agent-src/skills/context-authoring/SKILL.md +2 -2
- package/.agent-src/skills/context-document/SKILL.md +5 -3
- package/.agent-src/skills/copilot-agents-optimization/SKILL.md +3 -3
- package/.agent-src/skills/description-assist/SKILL.md +2 -2
- package/.agent-src/skills/git-workflow/SKILL.md +1 -1
- package/.agent-src/skills/guideline-writing/SKILL.md +5 -5
- package/.agent-src/skills/learning-to-rule-or-skill/SKILL.md +4 -4
- package/.agent-src/skills/lint-skills/SKILL.md +3 -3
- package/.agent-src/skills/md-language-check/SKILL.md +2 -2
- package/.agent-src/skills/module-detect-on-the-fly/SKILL.md +138 -0
- package/.agent-src/skills/module-management/SKILL.md +166 -94
- package/.agent-src/skills/override-management/SKILL.md +1 -1
- package/.agent-src/skills/persona-writing/SKILL.md +5 -5
- package/.agent-src/skills/positioning-strategy/SKILL.md +1 -1
- package/.agent-src/skills/project-docs/SKILL.md +6 -4
- package/.agent-src/skills/readme-reviewer/SKILL.md +2 -2
- package/.agent-src/skills/roadmap-management/SKILL.md +13 -1
- package/.agent-src/skills/roadmap-writing/SKILL.md +4 -2
- package/.agent-src/skills/rule-refactor/SKILL.md +5 -5
- package/.agent-src/skills/rule-writing/SKILL.md +18 -18
- package/.agent-src/skills/script-writing/SKILL.md +1 -1
- package/.agent-src/skills/skill-improvement-pipeline/SKILL.md +6 -6
- package/.agent-src/skills/skill-management/SKILL.md +21 -21
- package/.agent-src/skills/skill-reviewer/SKILL.md +2 -2
- package/.agent-src/skills/skill-writing/SKILL.md +8 -8
- package/.agent-src/skills/skill-writing/evals/triggers.json +1 -1
- package/.agent-src/skills/token-optimizer/SKILL.md +4 -4
- package/.agent-src/skills/unit-economics-modeling/SKILL.md +1 -1
- package/.agent-src/skills/upstream-contribute/SKILL.md +17 -17
- package/.agent-src/templates/AGENTS.md +1 -0
- package/.agent-src/templates/agent-settings.md +24 -13
- package/.agent-src/templates/agents/agent-project-settings.example.yml +61 -2
- package/.agent-src/templates/command.md +5 -5
- package/.agent-src/templates/contexts.md +1 -1
- package/.agent-src/templates/copilot-instructions.md +8 -8
- package/.agent-src/templates/features.md +1 -1
- package/.agent-src/templates/hooks/pre-commit-frontmatter +2 -2
- package/.agent-src/templates/hooks/pre-commit-roadmap-progress +3 -3
- package/.agent-src/templates/persona.md +2 -2
- package/.agent-src/templates/roadmaps.md +1 -1
- package/.agent-src/templates/rule.md +13 -13
- package/.agent-src/templates/scripts/memory_lookup.py +1 -1
- package/.agent-src/templates/scripts/memory_status.py +2 -2
- package/.agent-src/templates/scripts/work_engine/_lib/agent_settings.py +195 -1
- package/.agent-src/templates/scripts/work_engine/orchestration.py +1 -1
- package/.agent-src/templates/skill-archive-note.md +5 -5
- package/.agent-src/templates/skill.md +1 -1
- package/.claude-plugin/marketplace.json +4 -4
- package/AGENTS.md +16 -17
- package/CHANGELOG.md +181 -3
- package/CONTRIBUTING.md +31 -12
- package/README.md +18 -10
- package/config/agent-settings.template.yml +22 -2
- package/config/discovery/unassigned-artefacts.yml +24 -24
- package/config/profiles/full.ini +1 -1
- package/dist/cli/agent-config.js +52 -3
- package/dist/cli/agent-config.js.map +1 -1
- package/dist/cli/commands/uiServe.js +9 -0
- package/dist/cli/commands/uiServe.js.map +1 -1
- package/dist/cli/registry.js +2 -1
- package/dist/cli/registry.js.map +1 -1
- package/dist/discovery/deprecation-report.md +1 -1
- package/dist/discovery/discovery-manifest.json +649 -606
- package/dist/discovery/discovery-manifest.json.sha256 +1 -1
- package/dist/discovery/discovery-manifest.summary.md +4 -4
- package/dist/discovery/orphan-report.md +1 -1
- package/dist/discovery/packs.json +439 -437
- package/dist/discovery/trust-report.md +5 -5
- package/dist/discovery/workspaces.json +450 -448
- package/dist/install/apply.js +238 -0
- package/dist/install/apply.js.map +1 -0
- package/dist/install/atomic.js +92 -0
- package/dist/install/atomic.js.map +1 -0
- package/dist/install/bridges/augment.js +20 -0
- package/dist/install/bridges/augment.js.map +1 -0
- package/dist/install/bridges/claude.js +44 -0
- package/dist/install/bridges/claude.js.map +1 -0
- package/dist/install/bridges/cline.js +69 -0
- package/dist/install/bridges/cline.js.map +1 -0
- package/dist/install/bridges/copilot.js +28 -0
- package/dist/install/bridges/copilot.js.map +1 -0
- package/dist/install/bridges/cursor.js +34 -0
- package/dist/install/bridges/cursor.js.map +1 -0
- package/dist/install/bridges/gemini.js +39 -0
- package/dist/install/bridges/gemini.js.map +1 -0
- package/dist/install/bridges/index.js +88 -0
- package/dist/install/bridges/index.js.map +1 -0
- package/dist/install/bridges/marker-content.js +153 -0
- package/dist/install/bridges/marker-content.js.map +1 -0
- package/dist/install/bridges/markers.js +42 -0
- package/dist/install/bridges/markers.js.map +1 -0
- package/dist/install/bridges/types.js +31 -0
- package/dist/install/bridges/types.js.map +1 -0
- package/dist/install/bridges/vscode.js +26 -0
- package/dist/install/bridges/vscode.js.map +1 -0
- package/dist/install/bridges/windsurf.js +35 -0
- package/dist/install/bridges/windsurf.js.map +1 -0
- package/dist/install/conflict.js +196 -0
- package/dist/install/conflict.js.map +1 -0
- package/dist/install/detect.js +218 -0
- package/dist/install/detect.js.map +1 -0
- package/dist/install/paths.js +82 -0
- package/dist/install/paths.js.map +1 -0
- package/dist/install/plan.js +157 -0
- package/dist/install/plan.js.map +1 -0
- package/dist/install/txlog.js +140 -0
- package/dist/install/txlog.js.map +1 -0
- package/dist/install/types.js +19 -0
- package/dist/install/types.js.map +1 -0
- package/dist/install/wizard-plan.js +184 -0
- package/dist/install/wizard-plan.js.map +1 -0
- package/dist/mcp/registry-manifest.json +4 -4
- package/dist/router.json +67 -19
- package/dist/server/app.js +6 -0
- package/dist/server/app.js.map +1 -1
- package/dist/server/routes/install.js +547 -0
- package/dist/server/routes/install.js.map +1 -0
- package/dist/server/routes/wizard.js +301 -6
- package/dist/server/routes/wizard.js.map +1 -1
- package/dist/server/routes/workspace.js +396 -0
- package/dist/server/routes/workspace.js.map +1 -0
- package/dist/server/schemas/settings.js +4 -3
- package/dist/server/schemas/settings.js.map +1 -1
- package/dist/ui/assets/index-BXZILUxe.css +1 -0
- package/dist/ui/assets/index-DLEuEW1V.js +35 -0
- package/dist/ui/assets/index-DLEuEW1V.js.map +1 -0
- package/dist/ui/index.html +2 -2
- package/docs/MIGRATION.md +1 -1
- package/docs/adrs/cost/0001-hard-stop-hook.md +1 -1
- package/docs/adrs/router/0001-three-tier-routing.md +4 -4
- package/docs/adrs/schema/0001-json-schema-frontmatter.md +1 -1
- package/docs/adrs/smoke/0001-per-tier-smoke-scripts.md +4 -4
- package/docs/adrs/{caveman → telegraph}/0001-default-off-until-bench.md +9 -9
- package/docs/adrs/telegraph/README.md +9 -0
- package/docs/architecture/augment-projection.md +4 -4
- package/docs/architecture/claude-bundle.md +1 -1
- package/docs/architecture/current-onboard-baseline.md +3 -3
- package/docs/architecture/multi-tool-projection.md +10 -10
- package/docs/architecture/source-projection.md +27 -27
- package/docs/architecture.md +19 -15
- package/docs/archive/CHANGELOG-pre-2.11.0.md +2 -2
- package/docs/archive/CHANGELOG-pre-2.15.0.md +3 -3
- package/docs/archive/CHANGELOG-pre-2.16.0.md +1 -1
- package/docs/archive/CHANGELOG-pre-2.2.0.md +70 -70
- package/docs/archive/CHANGELOG-pre-2.20.0.md +2 -2
- package/docs/archive/CHANGELOG-pre-2.25.0.md +15 -15
- package/docs/archive/CHANGELOG-pre-3.0.0.md +4 -4
- package/docs/archive/CHANGELOG-pre-3.1.0.md +2 -2
- package/docs/archive/CHANGELOG-pre-3.2.0.md +3 -3
- package/docs/benchmark.md +65 -0
- package/docs/benchmarks.md +16 -16
- package/docs/catalog.md +17 -15
- package/docs/contracts/CHANGELOG-conventions.md +1 -1
- package/docs/contracts/STABILITY.md +2 -2
- package/docs/contracts/adoption-signal-floor.md +110 -0
- package/docs/contracts/adr-chat-history-split.md +4 -4
- package/docs/contracts/adr-command-suggestion.md +4 -4
- package/docs/contracts/adr-gtm-context-spine.md +1 -1
- package/docs/contracts/adr-implement-ticket-runtime.md +4 -4
- package/docs/contracts/adr-install-user-type-axis.md +1 -1
- package/docs/contracts/adr-layout.md +2 -2
- package/docs/contracts/adr-product-ui-track.md +10 -10
- package/docs/contracts/adr-user-types-axis.md +3 -3
- package/docs/contracts/adr-wing4-context-spine.md +1 -1
- package/docs/contracts/agent-memory-contract.md +3 -3
- package/docs/contracts/agents-md-tech-stack.md +2 -2
- package/docs/contracts/ai-council-config.md +2 -2
- package/docs/contracts/at-rest-encryption.md +4 -0
- package/docs/contracts/audit-log-v1.md +1 -1
- package/docs/contracts/benchmark-ab-contract.md +101 -0
- package/docs/contracts/benchmark-corpus-spec.md +1 -1
- package/docs/contracts/branch-protection-policy.md +98 -0
- package/docs/contracts/ci-cost-budget.md +106 -0
- package/docs/contracts/ci-green-floor.md +141 -0
- package/docs/contracts/command-clusters.md +6 -6
- package/docs/contracts/command-surface-tiers.md +2 -2
- package/docs/contracts/command-taxonomy.md +2 -2
- package/docs/contracts/{compression-default-kill-criterion.md → condensation-default-kill-criterion.md} +29 -29
- package/docs/contracts/config-presets.md +1 -1
- package/docs/contracts/context-paths.md +3 -3
- package/docs/contracts/context-spine.md +1 -1
- package/docs/contracts/cost-summary-schema.md +12 -12
- package/docs/contracts/cross-wing-handoff.md +4 -4
- package/docs/contracts/daily-workspace.md +4 -0
- package/docs/contracts/decision-trace-v1.md +2 -2
- package/docs/contracts/discovery-manifest.md +4 -4
- package/docs/contracts/explain-modes.md +4 -0
- package/docs/contracts/file-ownership-matrix.json +3493 -3318
- package/docs/contracts/file-ownership-matrix.md +3 -3
- package/docs/contracts/frontmatter-contract.md +4 -4
- package/docs/contracts/ghostwriter-schema.md +3 -3
- package/docs/contracts/gui-wizard.md +1 -1
- package/docs/contracts/harness-expectations.md +123 -0
- package/docs/contracts/host-agent-protocol.md +4 -0
- package/docs/contracts/implement-ticket-flow.md +9 -9
- package/docs/contracts/install-scopes.md +77 -0
- package/docs/contracts/iron-law-overrides.txt +1 -1
- package/docs/contracts/kernel-membership.md +26 -26
- package/docs/contracts/linear-ai-rules-inclusion.md +1 -1
- package/docs/contracts/linter-structural-model.md +2 -2
- package/docs/contracts/load-context-budget-model.md +4 -4
- package/docs/contracts/load-context-schema.md +13 -13
- package/docs/contracts/local-analytics.md +4 -0
- package/docs/contracts/local-knowledge-ingestion.md +1 -1
- package/docs/contracts/mcp-cloud-scope.md +2 -2
- package/docs/contracts/mcp-phase-1-scope.md +3 -3
- package/docs/contracts/measurement-baseline.md +5 -5
- package/docs/contracts/mental-models.md +30 -30
- package/docs/contracts/multi-tool-projection-fidelity.md +4 -4
- package/docs/contracts/namespace.md +4 -4
- package/docs/contracts/orchestration-dsl-v1.md +7 -7
- package/docs/contracts/package-self-orientation.md +12 -12
- package/docs/contracts/persona-schema.md +6 -6
- package/docs/contracts/pilot/language-and-tone.md +1 -1
- package/docs/contracts/plain-language-surface.md +117 -0
- package/docs/contracts/profile-system.md +3 -3
- package/docs/contracts/release-pr-gating.md +103 -0
- package/docs/contracts/role-experience.md +3 -3
- package/docs/contracts/rule-classification.md +13 -13
- package/docs/contracts/rule-interactions.md +4 -4
- package/docs/contracts/rule-interactions.yml +30 -30
- package/docs/contracts/rule-priority-hierarchy.md +13 -13
- package/docs/contracts/rule-router.md +2 -2
- package/docs/contracts/safety-model.md +1 -1
- package/docs/contracts/skill-distribution-channels.md +61 -0
- package/docs/contracts/skill-domains.md +2 -2
- package/docs/contracts/smoke-contracts.md +5 -5
- package/docs/contracts/telegraph-telemetry.md +83 -0
- package/docs/contracts/trust-and-safety.md +5 -5
- package/docs/contracts/ui-stack-extension.md +7 -7
- package/docs/contracts/ui-track-flow.md +9 -9
- package/docs/contracts/user-type-schema.md +4 -4
- package/docs/contracts/workflow-packs.md +4 -4
- package/docs/contracts/workspace-documents.md +4 -0
- package/docs/customization.md +28 -8
- package/docs/decisions/ADR-001-kernel-swap-deferred.md +6 -6
- package/docs/decisions/ADR-002-kernel-bucket-overrides.md +11 -11
- package/docs/decisions/ADR-003-flat-cluster-subs-and-colon-syntax.md +2 -2
- package/docs/decisions/ADR-004-rule-governance-pruning.md +4 -4
- package/docs/decisions/ADR-005-subagent-worktrees.md +7 -7
- package/docs/decisions/ADR-011-domain-pack-readiness.md +6 -6
- package/docs/decisions/ADR-013-discovery-frontmatter-contract.md +3 -3
- package/docs/decisions/ADR-015-discovery-manifest-contract.md +3 -3
- package/docs/decisions/ADR-017-monorepo-physical-layout.md +10 -10
- package/docs/decisions/ADR-018-trust-and-safety-layer.md +6 -6
- package/docs/decisions/ADR-019-router-json-dist-location.md +2 -2
- package/docs/decisions/ADR-020-global-only-consumer-scope.md +2 -2
- package/docs/decisions/ADR-021-deployment-shape.md +1 -1
- package/docs/decisions/ADR-022-daily-workspace-decomposition.md +1 -1
- package/docs/decisions/ADR-027-changelog-machine-vs-manual.md +2 -2
- package/docs/decisions/ADR-028-root-layout.md +7 -7
- package/docs/decisions/ADR-029-multi-workspace-deferred.md +2 -2
- package/docs/decisions/ADR-rule-kernel-and-router.md +5 -5
- package/docs/deploy/team-deployment-posture.md +20 -0
- package/docs/development.md +17 -17
- package/docs/distribution/registries.md +32 -0
- package/docs/distribution/registry-submissions.md +85 -0
- package/docs/distribution/telemetry-schema.md +1 -1
- package/docs/getting-started-by-role.md +45 -3
- package/docs/getting-started.md +2 -2
- package/docs/guidelines/agent-infra/5w2h-analysis.md +3 -3
- package/docs/guidelines/agent-infra/ask-when-uncertain-demos.md +1 -1
- package/docs/guidelines/agent-infra/asking-and-brevity-examples.md +3 -3
- package/docs/guidelines/agent-infra/carve-out-predicates.md +3 -3
- package/docs/guidelines/agent-infra/critical-thinking.md +4 -4
- package/docs/guidelines/agent-infra/direct-answers-demos.md +1 -1
- package/docs/guidelines/agent-infra/first-principles.md +2 -2
- package/docs/guidelines/agent-infra/inversion-thinking.md +5 -5
- package/docs/guidelines/agent-infra/layered-settings.md +56 -2
- package/docs/guidelines/agent-infra/mental-models.md +3 -3
- package/docs/guidelines/agent-infra/roadmap-progress-mechanics.md +2 -2
- package/docs/guidelines/agent-infra/rule-type-governance.md +1 -1
- package/docs/guidelines/agent-infra/scqa-framework.md +5 -5
- package/docs/guidelines/agent-infra/self-improvement-pipeline.md +2 -2
- package/docs/guidelines/agent-infra/six-hats.md +3 -3
- package/docs/guidelines/agent-infra/skill-quality-checklist.md +5 -5
- package/docs/guidelines/agent-infra/systems-thinking.md +1 -1
- package/docs/guidelines/agent-infra/verify-before-complete-demos.md +1 -1
- package/docs/guidelines/augment-portability-patterns.md +4 -4
- package/docs/guidelines/cross-role-handoff.md +2 -2
- package/docs/guidelines/php/php-coding-patterns.md +1 -1
- package/docs/guidelines/prompt-templates.md +6 -6
- package/docs/maintainers/dev-mode.md +1 -1
- package/docs/mcp.md +1 -1
- package/docs/parity/bench.json +3 -3
- package/docs/parity/ruflo.md +2 -2
- package/docs/profiles.md +11 -11
- package/docs/quality.md +11 -11
- package/docs/safety.md +3 -3
- package/docs/setup/mcp-client-config.md +1 -1
- package/docs/setup/mcp-r2-bootstrap.md +1 -1
- package/docs/setup/mcp-server-docker.md +3 -3
- package/docs/setup/per-ide/windsurf.md +1 -1
- package/docs/skills-catalog.md +8 -7
- package/docs/troubleshooting.md +1 -1
- package/docs/walkthroughs/daily-workspace-a11y.md +87 -0
- package/llms.txt +7 -6
- package/package.json +1 -1
- package/scripts/__pycache__/validate_frontmatter.cpython-312.pyc +0 -0
- package/scripts/_archive/README.md +2 -2
- package/scripts/_archive/_backfill_skill_domains.py +3 -3
- package/scripts/_archive/_bootstrap_tier_frontmatter.py +3 -3
- package/scripts/_archive/_p43_bodies.py +10 -10
- package/scripts/_archive/{_p43_compress.py → _p43_condense.py} +5 -5
- package/scripts/_archive/_p4_migrate.py +7 -7
- package/scripts/_archive/_phase2_shim_helper.py +1 -1
- package/scripts/_archive/_pilot_council_question.py +5 -5
- package/scripts/_cli/explain_last/inputs.py +1 -1
- package/scripts/_lib/__pycache__/__init__.cpython-312.pyc +0 -0
- package/scripts/_lib/__pycache__/agent_src.cpython-312.pyc +0 -0
- package/scripts/_lib/agent_settings.py +195 -1
- package/scripts/_lib/agent_src.py +19 -19
- package/scripts/_lib/bench_ab_cache.py +162 -0
- package/scripts/_lib/bench_ab_scoring.py +209 -0
- package/scripts/_lib/{bench_caveman.py → bench_telegraph.py} +21 -21
- package/scripts/_lib/{bench_caveman_report.py → bench_telegraph_report.py} +21 -21
- package/scripts/_lib/claude_desktop_bundler.py +5 -5
- package/scripts/_lib/module_detection.py +223 -0
- package/scripts/_lib/scope_guard.sh +162 -0
- package/scripts/_phase4_bucket.py +3 -3
- package/scripts/_pilot_measure.py +4 -4
- package/scripts/_tmp_scan_framework_leakage.py +1 -1
- package/scripts/adoption_report.py +195 -0
- package/scripts/adoption_snapshot.py +219 -0
- package/scripts/adoption_status.py +166 -0
- package/scripts/ai-video/lib/parse-blueprint.sh +1 -1
- package/scripts/ai_council/advisors.py +5 -5
- package/scripts/ai_council/compile_corpus.py +1 -1
- package/scripts/ai_council/one_off_archive/2026-05/_one_off_budget_v2_audit.py +3 -3
- package/scripts/ai_council/one_off_archive/2026-05/_one_off_context_layer_v1_review.py +2 -2
- package/scripts/ai_council/one_off_archive/2026-05/_one_off_inject_quiet_flag.py +1 -1
- package/scripts/ai_council/one_off_archive/2026-05/_one_off_measure_v2.sh +1 -1
- package/scripts/ai_council/one_off_archive/2026-05/_one_off_measure_verbosity.sh +1 -1
- package/scripts/ai_council/one_off_archive/2026-05/_one_off_nondestructive_inline_audit.py +3 -3
- package/scripts/ai_council/one_off_archive/2026-05/_one_off_per_task.sh +1 -1
- package/scripts/ai_council/one_off_archive/2026-05/_one_off_phase6_trigger_jaccard.py +1 -1
- package/scripts/ai_council/one_off_archive/2026-05/_one_off_phase_2a_budget_rebalance.py +6 -6
- package/scripts/ai_council/one_off_archive/2026-05/_one_off_rebalancing_audit.py +1 -1
- package/scripts/ai_council/one_off_archive/2026-05/_one_off_tier_retrofit.py +6 -6
- package/scripts/annotate_discovery.py +13 -13
- package/scripts/apply_modules_config.py +290 -0
- package/scripts/audit_adr_coverage.py +2 -2
- package/scripts/audit_auto_rules.py +2 -2
- package/scripts/audit_cloud_compatibility.py +3 -3
- package/scripts/audit_command_surface.py +9 -9
- package/scripts/audit_likelihood.py +2 -2
- package/scripts/audit_user_type_axis.py +2 -2
- package/scripts/bench_ab_cache_dispatch.py +68 -0
- package/scripts/bench_ab_clone.py +170 -0
- package/scripts/bench_ab_diff.py +227 -0
- package/scripts/bench_ab_integrity.py +143 -0
- package/scripts/bench_ab_run.py +235 -0
- package/scripts/bench_ab_task_runner.py +369 -0
- package/scripts/bench_ab_tracka_run.py +202 -0
- package/scripts/{bench_compress_memory.py → bench_condense_memory.py} +16 -16
- package/scripts/bench_run.py +33 -33
- package/scripts/bench_runner.py +2 -2
- package/scripts/bootstrap.sh +99 -0
- package/scripts/build_cloud_bundle.py +6 -6
- package/scripts/build_discovery_manifest.py +7 -7
- package/scripts/build_linear_digest.py +3 -3
- package/scripts/build_rule_trigger_matrix.py +8 -8
- package/scripts/chat_history.py +5 -5
- package/scripts/check_always_budget.py +11 -5
- package/scripts/check_augment_description_cap.py +3 -3
- package/scripts/check_cluster_patterns.py +2 -2
- package/scripts/check_command_count_messaging.py +3 -3
- package/scripts/{check_compression.py → check_condensation.py} +34 -34
- package/scripts/{check_compressed_paths.py → check_condensed_paths.py} +8 -8
- package/scripts/check_context_paths.py +7 -7
- package/scripts/check_council_layout.py +2 -2
- package/scripts/check_council_references.py +9 -9
- package/scripts/check_iron_law_prominence.py +2 -2
- package/scripts/check_kernel_rule_bundle.py +2 -2
- package/scripts/check_module_management_neutral.py +149 -0
- package/scripts/check_no_roadmap_refs.py +9 -9
- package/scripts/check_portability.py +3 -3
- package/scripts/check_public_catalog_links.py +4 -4
- package/scripts/check_references.py +7 -6
- package/scripts/check_release_pr_shape.py +112 -0
- package/scripts/check_reply_consistency.py +3 -3
- package/scripts/check_safety_floor_untouched.py +1 -1
- package/scripts/check_template_pin_drift.py +5 -5
- package/scripts/check_token_optimizer_freshness.py +3 -3
- package/scripts/ci_status.py +301 -0
- package/scripts/ci_time_ratio.py +1 -1
- package/scripts/cleanup_other_scope.sh +146 -0
- package/scripts/compile_router.py +10 -10
- package/scripts/{compress.py → condense.py} +64 -64
- package/scripts/condense.sh +18 -0
- package/scripts/{compress_memory.py → condense_memory.py} +33 -33
- package/scripts/config/presets.py +2 -2
- package/scripts/config/profiles.py +1 -1
- package/scripts/cost_by_conversation.py +3 -3
- package/scripts/cost_summary.py +7 -7
- package/scripts/count_token_optimizer_usage.sh +1 -1
- package/scripts/gen_discovery_baseline.py +5 -5
- package/scripts/generate_index.py +6 -6
- package/scripts/generate_ownership_matrix.py +10 -10
- package/scripts/generate_pack_manifests.py +1 -1
- package/scripts/ghostwriter_fixture_allowlist.txt +1 -1
- package/scripts/install +3 -3
- package/scripts/install-hooks.sh +6 -6
- package/scripts/install.py +76 -11
- package/scripts/install.sh +187 -1
- package/scripts/inventory_frontmatter.py +2 -2
- package/scripts/iron_law_sha.py +3 -3
- package/scripts/lint_agents_layout.py +14 -7
- package/scripts/lint_agents_md.py +4 -4
- package/scripts/lint_archived_skills.py +3 -3
- package/scripts/lint_artefact_frontmatter.py +2 -2
- package/scripts/lint_bench_ab.py +172 -0
- package/scripts/lint_bench_corpus.py +1 -1
- package/scripts/lint_command_tiers.py +5 -5
- package/scripts/lint_context_spine_usage.py +1 -1
- package/scripts/lint_framework_leakage.py +7 -7
- package/scripts/lint_framework_leakage_allowlist.json +144 -84
- package/scripts/lint_ghostwriter_source.py +3 -3
- package/scripts/lint_handoffs.py +1 -1
- package/scripts/lint_load_context.py +11 -11
- package/scripts/lint_media_policy_linkage.py +5 -5
- package/scripts/lint_namespace.py +1 -1
- package/scripts/lint_no_new_atomic_commands.py +2 -2
- package/scripts/lint_orchestration_dsl.py +1 -1
- package/scripts/lint_pack_boundaries.py +2 -2
- package/scripts/lint_persona_governance.py +4 -4
- package/scripts/lint_role_experiences.py +237 -0
- package/scripts/lint_rule_interactions.py +2 -2
- package/scripts/lint_rule_tiers.py +1 -1
- package/scripts/lint_trust_coherence.py +2 -2
- package/scripts/mcp_registry_submit.sh +187 -0
- package/scripts/mcp_server/tools.py +1 -1
- package/scripts/measure_frugality_savings.py +10 -10
- package/scripts/measure_patterns.py +1 -1
- package/scripts/measure_projection_bytes.py +5 -5
- package/scripts/measure_rule_budget.py +3 -3
- package/scripts/measure_skill_reduction.py +1 -1
- package/scripts/memory_lookup.py +1 -1
- package/scripts/memory_status.py +2 -2
- package/scripts/migrate_command_suggestions.py +3 -3
- package/scripts/mine_session.py +1 -1
- package/scripts/move_artefact.py +3 -3
- package/scripts/new_skill.py +2 -2
- package/scripts/pack_mcp_content.py +9 -9
- package/scripts/plan_physical_move.py +6 -6
- package/scripts/print_required_checks.py +196 -0
- package/scripts/probe_skill_registration.py +413 -0
- package/scripts/propose_modules_config.py +145 -0
- package/scripts/prototype_lint_contradictions.py +1 -1
- package/scripts/recruit_preflight.sh +152 -0
- package/scripts/refine_ticket_detect.py +3 -3
- package/scripts/release.py +20 -0
- package/scripts/render_benchmark_md.py +308 -0
- package/scripts/roadmap_progress_hook.py +1 -1
- package/scripts/run_skill_evals.py +2 -2
- package/scripts/runtime_registry.py +4 -4
- package/scripts/schemas/command.schema.json +4 -4
- package/scripts/schemas/rule.schema.json +5 -5
- package/scripts/schemas/skill.schema.json +3 -3
- package/scripts/schemas/user-type.schema.json +1 -1
- package/scripts/score_skill_selection.py +1 -1
- package/scripts/skill_collision_clusters.py +2 -2
- package/scripts/skill_linter.py +81 -81
- package/scripts/skill_overlap.py +5 -5
- package/scripts/skill_tools/audit_persona_coverage.py +2 -2
- package/scripts/skill_tools/audit_user_type_coverage.py +2 -2
- package/scripts/skill_tools/run_block_d_eval.py +1 -1
- package/scripts/skill_tools/score_skill_relevance.py +1 -1
- package/scripts/skill_tools/suggest_skill_for_task.py +1 -1
- package/scripts/skill_trigger_eval.py +3 -3
- package/scripts/smoke/kernel.sh +7 -1
- package/scripts/smoke/router.sh +5 -5
- package/scripts/smoke/skills.sh +1 -1
- package/scripts/smoke_quickstart.py +1 -1
- package/scripts/snapshot_agent_outputs.py +3 -3
- package/scripts/spotcheck_thin_root.py +1 -1
- package/scripts/{caveman_stats.py → telegraph_stats.py} +18 -18
- package/scripts/update_counts.py +1 -1
- package/scripts/validate_decision_engine.py +1 -1
- package/scripts/validate_frontmatter.py +1 -1
- package/scripts/validate_safe_paths.py +3 -3
- package/scripts/{validate_caveman_carveouts.py → validate_telegraph_carveouts.py} +7 -7
- package/scripts/verify_roadmap_closure.py +6 -6
- package/templates/consumer-settings/ONBOARDING.md +41 -0
- package/.agent-src/commands/install-via-agent.md +0 -129
- package/.agent-src/skills/compress-memory/SKILL.md +0 -131
- package/dist/ui/assets/index-D-DY1ywI.js +0 -35
- package/dist/ui/assets/index-D-DY1ywI.js.map +0 -1
- package/dist/ui/assets/index-Dqfhmg-d.css +0 -1
- package/docs/adrs/caveman/README.md +0 -9
- package/docs/contracts/caveman-telemetry.md +0 -83
- package/scripts/compress.sh +0 -18
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Propose a ``modules:`` block for ``.agent-project-settings.yml``.
|
|
3
|
+
|
|
4
|
+
Phase B Step 2 of road-to-configurable-modules. Wraps the pure
|
|
5
|
+
:mod:`scripts._lib.module_detection` helper in a CLI surface that the
|
|
6
|
+
installer, the GUI wizard, and the ``/agents init`` command can all call
|
|
7
|
+
without re-implementing the detection table.
|
|
8
|
+
|
|
9
|
+
Usage:
|
|
10
|
+
python3 scripts/propose_modules_config.py # interactive
|
|
11
|
+
python3 scripts/propose_modules_config.py --json # machine-readable
|
|
12
|
+
python3 scripts/propose_modules_config.py --project <path> # custom root
|
|
13
|
+
|
|
14
|
+
Exit codes:
|
|
15
|
+
0 — candidates surfaced (or none found, with ``modules.enabled: false``)
|
|
16
|
+
2 — invalid arguments / unreachable path
|
|
17
|
+
|
|
18
|
+
The CLI never writes files. Callers consume the JSON / TTY output and
|
|
19
|
+
patch ``.agent-project-settings.yml`` themselves (preserves comments +
|
|
20
|
+
ordering per the layered-settings contract).
|
|
21
|
+
"""
|
|
22
|
+
from __future__ import annotations
|
|
23
|
+
|
|
24
|
+
import argparse
|
|
25
|
+
import json
|
|
26
|
+
import sys
|
|
27
|
+
from pathlib import Path
|
|
28
|
+
|
|
29
|
+
# Re-export so consumers can import either path.
|
|
30
|
+
sys.path.insert(0, str(Path(__file__).resolve().parent.parent))
|
|
31
|
+
|
|
32
|
+
from scripts._lib.module_detection import ( # noqa: E402
|
|
33
|
+
ModuleCandidate,
|
|
34
|
+
detect_module_roots,
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def _candidate_to_dict(cand: ModuleCandidate) -> dict[str, str]:
|
|
39
|
+
return {
|
|
40
|
+
"path": cand.path,
|
|
41
|
+
"stack": cand.stack,
|
|
42
|
+
"namespace_template_guess": cand.namespace_template_guess,
|
|
43
|
+
"confidence": cand.confidence,
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def _render_interactive(candidates: list[ModuleCandidate]) -> None:
|
|
48
|
+
"""Print a numbered-options block — the same shape ``/agents init`` shows."""
|
|
49
|
+
if not candidates:
|
|
50
|
+
print("⚠️ No module roots detected.")
|
|
51
|
+
print()
|
|
52
|
+
print(
|
|
53
|
+
"Skipping `modules:` config. Re-run after adding a module "
|
|
54
|
+
"directory (app/Modules/, src/Module/, packages/, internal/, ...)."
|
|
55
|
+
)
|
|
56
|
+
return
|
|
57
|
+
print("📦 Detected module-root candidates:")
|
|
58
|
+
print()
|
|
59
|
+
print(" # Path Stack Confidence Namespace template")
|
|
60
|
+
print(" ─ ──────────────── ─────────────── ────────── ────────────────────")
|
|
61
|
+
for idx, cand in enumerate(candidates, start=1):
|
|
62
|
+
ns = cand.namespace_template_guess or "—"
|
|
63
|
+
print(
|
|
64
|
+
f" {idx:>1} {cand.path:<16} {cand.stack:<15}"
|
|
65
|
+
f" {cand.confidence:<10} {ns}"
|
|
66
|
+
)
|
|
67
|
+
print()
|
|
68
|
+
print("Suggested `modules:` block (paste into .agent-project-settings.yml):")
|
|
69
|
+
print()
|
|
70
|
+
print("modules:")
|
|
71
|
+
print(" enabled: true")
|
|
72
|
+
print(f" root_paths: [{', '.join(c.path for c in candidates)}]")
|
|
73
|
+
primary_ns = next(
|
|
74
|
+
(c.namespace_template_guess for c in candidates
|
|
75
|
+
if c.namespace_template_guess),
|
|
76
|
+
"",
|
|
77
|
+
)
|
|
78
|
+
if primary_ns:
|
|
79
|
+
print(f" namespace_template: '{primary_ns}'")
|
|
80
|
+
else:
|
|
81
|
+
print(" # namespace_template: '' # stack has no PHP-style namespace")
|
|
82
|
+
print(" agent_folder: agents")
|
|
83
|
+
print(" skip_dirs: [.module-template, .example]")
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
def _resolve_project_root(arg: str | None) -> Path:
|
|
87
|
+
if arg:
|
|
88
|
+
root = Path(arg).expanduser().resolve()
|
|
89
|
+
else:
|
|
90
|
+
root = Path.cwd().resolve()
|
|
91
|
+
if not root.is_dir():
|
|
92
|
+
print(
|
|
93
|
+
f"error: project root is not a directory: {root}",
|
|
94
|
+
file=sys.stderr,
|
|
95
|
+
)
|
|
96
|
+
sys.exit(2)
|
|
97
|
+
return root
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
def main(argv: list[str]) -> int:
|
|
101
|
+
parser = argparse.ArgumentParser(
|
|
102
|
+
prog="propose_modules_config.py",
|
|
103
|
+
description=(
|
|
104
|
+
"Detect module-root candidates and propose a `modules:` block "
|
|
105
|
+
"for .agent-project-settings.yml. Pure read-only scan."
|
|
106
|
+
),
|
|
107
|
+
)
|
|
108
|
+
parser.add_argument(
|
|
109
|
+
"--project",
|
|
110
|
+
default=None,
|
|
111
|
+
help="project root (default: cwd)",
|
|
112
|
+
)
|
|
113
|
+
parser.add_argument(
|
|
114
|
+
"--json",
|
|
115
|
+
action="store_true",
|
|
116
|
+
help="emit machine-readable JSON instead of the TTY table",
|
|
117
|
+
)
|
|
118
|
+
args = parser.parse_args(argv)
|
|
119
|
+
root = _resolve_project_root(args.project)
|
|
120
|
+
candidates = detect_module_roots(root)
|
|
121
|
+
if args.json:
|
|
122
|
+
payload = {
|
|
123
|
+
"project_root": str(root),
|
|
124
|
+
"candidates": [_candidate_to_dict(c) for c in candidates],
|
|
125
|
+
"proposed_block": {
|
|
126
|
+
"enabled": bool(candidates),
|
|
127
|
+
"root_paths": [c.path for c in candidates],
|
|
128
|
+
"namespace_template": next(
|
|
129
|
+
(c.namespace_template_guess for c in candidates
|
|
130
|
+
if c.namespace_template_guess),
|
|
131
|
+
"",
|
|
132
|
+
),
|
|
133
|
+
"agent_folder": "agents",
|
|
134
|
+
"skip_dirs": [".module-template", ".example"],
|
|
135
|
+
},
|
|
136
|
+
}
|
|
137
|
+
json.dump(payload, sys.stdout, indent=2)
|
|
138
|
+
sys.stdout.write("\n")
|
|
139
|
+
return 0
|
|
140
|
+
_render_interactive(candidates)
|
|
141
|
+
return 0
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
if __name__ == "__main__":
|
|
145
|
+
raise SystemExit(main(sys.argv[1:]))
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Recruit-session day-of pre-flight checks.
|
|
3
|
+
#
|
|
4
|
+
# Phase B Step 2 of road-to-adoption-proof-and-ci-green.md. Run this
|
|
5
|
+
# 30 minutes before a recruit session — exits non-zero on any failure
|
|
6
|
+
# so a missed prereq pushes the session rather than burning it.
|
|
7
|
+
#
|
|
8
|
+
# Checks (all ≤ 5 s total runtime):
|
|
9
|
+
#
|
|
10
|
+
# 1. Provider keys present — ANTHROPIC_API_KEY or OPENAI_API_KEY in env,
|
|
11
|
+
# OR AGENT_CONFIG_DRYRUN=true (dry-run session task).
|
|
12
|
+
# 2. Workspace state clean — ~/.augment/ has no in-progress experiments.
|
|
13
|
+
# 3. agents/recruit-sessions/ writable.
|
|
14
|
+
# 4. task ci green at HEAD — last 'task ci' run summary is clean.
|
|
15
|
+
# 5. Screen recording tool installed — one of obs / loom-cli /
|
|
16
|
+
# zoom-cli / riverside present (best-effort detection).
|
|
17
|
+
#
|
|
18
|
+
# Output: one line per check, prefixed ✅ / ❌. Exit codes:
|
|
19
|
+
# 0 — every check passed.
|
|
20
|
+
# 1 — at least one check failed.
|
|
21
|
+
#
|
|
22
|
+
# CLI:
|
|
23
|
+
# bash scripts/recruit_preflight.sh [--quiet] [--dry-run-allowed]
|
|
24
|
+
#
|
|
25
|
+
# --quiet Suppress per-check rows; print summary only.
|
|
26
|
+
# --dry-run-allowed Accept AGENT_CONFIG_DRYRUN=true as the provider
|
|
27
|
+
# keys check (default false — explicit keys needed).
|
|
28
|
+
#
|
|
29
|
+
# Tests live at tests/test_recruit_preflight.sh (fixture-driven).
|
|
30
|
+
|
|
31
|
+
set -euo pipefail
|
|
32
|
+
|
|
33
|
+
QUIET=false
|
|
34
|
+
DRY_RUN_ALLOWED=false
|
|
35
|
+
for arg in "$@"; do
|
|
36
|
+
case "$arg" in
|
|
37
|
+
--quiet) QUIET=true ;;
|
|
38
|
+
--dry-run-allowed) DRY_RUN_ALLOWED=true ;;
|
|
39
|
+
-h|--help)
|
|
40
|
+
sed -n '2,28p' "$0" | sed 's/^# //'
|
|
41
|
+
exit 0
|
|
42
|
+
;;
|
|
43
|
+
*) echo "recruit_preflight: unknown arg: $arg" >&2; exit 2 ;;
|
|
44
|
+
esac
|
|
45
|
+
done
|
|
46
|
+
|
|
47
|
+
REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
|
48
|
+
PASS=0
|
|
49
|
+
FAIL=0
|
|
50
|
+
|
|
51
|
+
_emit() {
|
|
52
|
+
if [ "$QUIET" = false ]; then
|
|
53
|
+
echo "$1"
|
|
54
|
+
fi
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
_check() {
|
|
58
|
+
local label="$1"
|
|
59
|
+
local ok="$2"
|
|
60
|
+
local detail="${3:-}"
|
|
61
|
+
if [ "$ok" = "true" ]; then
|
|
62
|
+
_emit "✅ ${label}${detail:+ — ${detail}}"
|
|
63
|
+
PASS=$((PASS + 1))
|
|
64
|
+
else
|
|
65
|
+
_emit "❌ ${label}${detail:+ — ${detail}}"
|
|
66
|
+
FAIL=$((FAIL + 1))
|
|
67
|
+
fi
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
# 1. Provider keys present (or dry-run accepted)
|
|
71
|
+
if [ -n "${ANTHROPIC_API_KEY:-}" ] || [ -n "${OPENAI_API_KEY:-}" ]; then
|
|
72
|
+
_check "provider keys" true "anthropic / openai env var set"
|
|
73
|
+
elif [ "$DRY_RUN_ALLOWED" = true ] && [ "${AGENT_CONFIG_DRYRUN:-}" = "true" ]; then
|
|
74
|
+
_check "provider keys" true "dry-run mode accepted"
|
|
75
|
+
else
|
|
76
|
+
_check "provider keys" false "set ANTHROPIC_API_KEY or OPENAI_API_KEY (or pass --dry-run-allowed)"
|
|
77
|
+
fi
|
|
78
|
+
|
|
79
|
+
# 2. Workspace state clean — ~/.augment/ has no in-progress experiments.
|
|
80
|
+
# "In-progress" is defined as any file under ~/.augment/ modified within
|
|
81
|
+
# the last 60 minutes whose name suggests a session / experiment / draft.
|
|
82
|
+
AUGMENT_DIR="${HOME}/.augment"
|
|
83
|
+
if [ ! -d "$AUGMENT_DIR" ]; then
|
|
84
|
+
_check "workspace clean" true "no ~/.augment/ — fresh user"
|
|
85
|
+
else
|
|
86
|
+
RECENT=$(find "$AUGMENT_DIR" -type f \
|
|
87
|
+
\( -name '*session*' -o -name '*experiment*' -o -name '*draft*' \) \
|
|
88
|
+
-mmin -60 2>/dev/null | head -1 || true)
|
|
89
|
+
if [ -z "$RECENT" ]; then
|
|
90
|
+
_check "workspace clean" true "no recent session/experiment files"
|
|
91
|
+
else
|
|
92
|
+
_check "workspace clean" false "recent file: $(basename "$RECENT")"
|
|
93
|
+
fi
|
|
94
|
+
fi
|
|
95
|
+
|
|
96
|
+
# 3. agents/recruit-sessions/ writable.
|
|
97
|
+
RECRUIT_DIR="$REPO_ROOT/agents/recruit-sessions"
|
|
98
|
+
if [ ! -d "$RECRUIT_DIR" ]; then
|
|
99
|
+
_check "recruit dir writable" false "missing: $RECRUIT_DIR"
|
|
100
|
+
elif [ ! -w "$RECRUIT_DIR" ]; then
|
|
101
|
+
_check "recruit dir writable" false "not writable: $RECRUIT_DIR"
|
|
102
|
+
else
|
|
103
|
+
_check "recruit dir writable" true "$RECRUIT_DIR"
|
|
104
|
+
fi
|
|
105
|
+
|
|
106
|
+
# 4. task ci green at HEAD — look at the last 'task ci' marker if it
|
|
107
|
+
# exists. /tmp/agent-config-ci-start.txt is written by _ci-start
|
|
108
|
+
# at the start of every 'task ci' run; /tmp/agent-config-ci-end.txt
|
|
109
|
+
# by _ci-end on success. Pre-flight passes when both exist AND
|
|
110
|
+
# end > start AND no .agent-src.uncondensed file is newer than end.
|
|
111
|
+
START_MARKER="/tmp/agent-config-ci-start.txt"
|
|
112
|
+
END_MARKER="/tmp/agent-config-ci-end.txt"
|
|
113
|
+
if [ ! -f "$START_MARKER" ] || [ ! -f "$END_MARKER" ]; then
|
|
114
|
+
# Soft pass — no marker yet on a fresh checkout. The session does
|
|
115
|
+
# not need a green CI in the past 30 days; it needs no obvious red.
|
|
116
|
+
_check "task ci green" true "no recent ci marker (acceptable on fresh checkout)"
|
|
117
|
+
else
|
|
118
|
+
START_TS=$(cat "$START_MARKER")
|
|
119
|
+
END_TS=$(cat "$END_MARKER")
|
|
120
|
+
if [ "$END_TS" -gt "$START_TS" ]; then
|
|
121
|
+
_check "task ci green" true "last run completed (end=$END_TS, start=$START_TS)"
|
|
122
|
+
else
|
|
123
|
+
_check "task ci green" false "last run incomplete (start=$START_TS, end=$END_TS)"
|
|
124
|
+
fi
|
|
125
|
+
fi
|
|
126
|
+
|
|
127
|
+
# 5. Screen recording tool — best-effort presence check.
|
|
128
|
+
RECORDING_TOOL=""
|
|
129
|
+
for tool in obs-cli obs loom riverside zoom; do
|
|
130
|
+
if command -v "$tool" >/dev/null 2>&1; then
|
|
131
|
+
RECORDING_TOOL="$tool"
|
|
132
|
+
break
|
|
133
|
+
fi
|
|
134
|
+
done
|
|
135
|
+
if [ -n "$RECORDING_TOOL" ]; then
|
|
136
|
+
_check "recording tool" true "$RECORDING_TOOL on PATH"
|
|
137
|
+
else
|
|
138
|
+
# Browser-based recorders (Loom web, Zoom web, Riverside web) leave
|
|
139
|
+
# nothing on the PATH; the maintainer is presumed to test the clip
|
|
140
|
+
# the day before per _runbook.md § Scheduling. Soft pass with a hint.
|
|
141
|
+
_check "recording tool" true "no CLI recording tool detected — verify the browser/desktop app is open"
|
|
142
|
+
fi
|
|
143
|
+
|
|
144
|
+
if [ "$QUIET" = false ]; then
|
|
145
|
+
echo ""
|
|
146
|
+
fi
|
|
147
|
+
echo "recruit_preflight: ${PASS} pass / ${FAIL} fail"
|
|
148
|
+
|
|
149
|
+
if [ "$FAIL" -gt 0 ]; then
|
|
150
|
+
exit 1
|
|
151
|
+
fi
|
|
152
|
+
exit 0
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"""Deterministic detection helper for the refine-ticket skill.
|
|
3
3
|
|
|
4
4
|
Reads the detection-map.yml from
|
|
5
|
-
.agent-src.
|
|
5
|
+
.agent-src.uncondensed/skills/refine-ticket/ (or the projected copy),
|
|
6
6
|
takes ticket body text, and returns a structured decision — which
|
|
7
7
|
sub-skills should fire, which keywords matched, and an
|
|
8
8
|
orchestration-notes line per sub-skill ready to fold into the skill
|
|
@@ -34,7 +34,7 @@ except ImportError as exc:
|
|
|
34
34
|
REPO_ROOT = Path(__file__).resolve().parent.parent
|
|
35
35
|
|
|
36
36
|
# Post-monorepo Phase 4 the detection map lives under any package's
|
|
37
|
-
# .agent-src.
|
|
37
|
+
# .agent-src.uncondensed/. Discover it via the shared helper; fall
|
|
38
38
|
# back to the legacy flat path so consumers and older sub-trees still
|
|
39
39
|
# work.
|
|
40
40
|
import sys as _sys # noqa: E402
|
|
@@ -54,7 +54,7 @@ def _discover_default_map() -> Path:
|
|
|
54
54
|
return candidate
|
|
55
55
|
return (
|
|
56
56
|
REPO_ROOT
|
|
57
|
-
/ ".agent-src.
|
|
57
|
+
/ ".agent-src.uncondensed"
|
|
58
58
|
/ "skills"
|
|
59
59
|
/ "refine-ticket"
|
|
60
60
|
/ "detection-map.yml"
|
package/scripts/release.py
CHANGED
|
@@ -33,6 +33,16 @@ Each step prints what it's about to do before doing it, so a crash
|
|
|
33
33
|
leaves a recoverable trail.
|
|
34
34
|
|
|
35
35
|
Stdlib-only (Python 3.10+). No third-party runtime dependencies.
|
|
36
|
+
|
|
37
|
+
See also:
|
|
38
|
+
- docs/contracts/release-pr-gating.md — release-PR shape, cut surface,
|
|
39
|
+
kept surface, fail-closed contract.
|
|
40
|
+
- docs/contracts/branch-protection-policy.md — per-PR-shape
|
|
41
|
+
required-check matrix; `task ci:required-checks` previews it.
|
|
42
|
+
- docs/contracts/ci-cost-budget.md — measured baselines + quarterly
|
|
43
|
+
review cadence.
|
|
44
|
+
- .github/workflows/release-validation.yml — the tight release-PR
|
|
45
|
+
validation jobs (release-shape, changelog-entry, version-consistency).
|
|
36
46
|
"""
|
|
37
47
|
|
|
38
48
|
from __future__ import annotations
|
|
@@ -623,6 +633,16 @@ def print_preview(plan: Plan) -> None:
|
|
|
623
633
|
print(plan.changelog_entry.rstrip())
|
|
624
634
|
print("─" * 72)
|
|
625
635
|
print()
|
|
636
|
+
print("Release-PR CI shape (docs/contracts/release-pr-gating.md):")
|
|
637
|
+
print(
|
|
638
|
+
" will run: Consistency · Smoke Contracts · Migration Dry-Run · "
|
|
639
|
+
"Release Validation · Release Guard (post-tag, ~30 s)"
|
|
640
|
+
)
|
|
641
|
+
print(
|
|
642
|
+
" will skip: Tests (install / aux / python / node / windows-lockfile-export) · "
|
|
643
|
+
"Public Install Smoke — heavy install matrices cannot be regressed by a release-shape diff"
|
|
644
|
+
)
|
|
645
|
+
print()
|
|
626
646
|
|
|
627
647
|
|
|
628
648
|
def confirm(prompt: str) -> bool:
|
|
@@ -0,0 +1,308 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Render `docs/benchmark.md` from the latest paired A/B bench reports.
|
|
3
|
+
|
|
4
|
+
Phase 5 Step 1 of `agents/roadmaps/road-to-package-impact-benchmark.md`.
|
|
5
|
+
|
|
6
|
+
Reads:
|
|
7
|
+
- internal/bench/reports/ab/{stamp}-ab-tracka-{with,without}.json (latest pair)
|
|
8
|
+
- internal/bench/reports/ab/{stamp}-ab-trackb-{with,without}.json (latest pair)
|
|
9
|
+
- any matching diff under internal/bench/reports/ab/diff/
|
|
10
|
+
|
|
11
|
+
Emits: `docs/benchmark.md`. The renderer is deterministic — it does not run
|
|
12
|
+
any bench; it only formats existing reports. `task bench:ab` calls this last;
|
|
13
|
+
`task bench:ab:diff` calls it alone.
|
|
14
|
+
|
|
15
|
+
Sections of the rendered file:
|
|
16
|
+
- Headline (delta table)
|
|
17
|
+
- Track A — behavioural
|
|
18
|
+
- Track B — task completion
|
|
19
|
+
- Methodology (target shape, corpus versions, claude CLI version, timestamps)
|
|
20
|
+
- History (last 5 runs)
|
|
21
|
+
|
|
22
|
+
If no reports exist yet, the script writes a placeholder document explaining
|
|
23
|
+
how to produce one — never errors out, so the file is always a real
|
|
24
|
+
description of the current bench state.
|
|
25
|
+
"""
|
|
26
|
+
from __future__ import annotations
|
|
27
|
+
|
|
28
|
+
import argparse
|
|
29
|
+
import json
|
|
30
|
+
import sys
|
|
31
|
+
from datetime import datetime, timezone
|
|
32
|
+
from pathlib import Path
|
|
33
|
+
|
|
34
|
+
REPO_ROOT = Path(__file__).resolve().parent.parent
|
|
35
|
+
REPORTS_DIR = REPO_ROOT / "internal" / "bench" / "reports" / "ab"
|
|
36
|
+
DIFF_DIR = REPORTS_DIR / "diff"
|
|
37
|
+
OUT_PATH = REPO_ROOT / "docs" / "benchmark.md"
|
|
38
|
+
|
|
39
|
+
REQUIRED_SECTIONS = (
|
|
40
|
+
"## Headline",
|
|
41
|
+
"## Track A",
|
|
42
|
+
"## Track B",
|
|
43
|
+
"## Methodology",
|
|
44
|
+
"## History",
|
|
45
|
+
)
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def utc_iso() -> str:
|
|
49
|
+
return datetime.now(timezone.utc).isoformat(timespec="seconds")
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
def latest_pair(corpus: str) -> tuple[Path | None, Path | None]:
|
|
53
|
+
"""Return the (with, without) report pair for a corpus, both with the same stamp.
|
|
54
|
+
|
|
55
|
+
If only one variant has a fresh report, the other position is None.
|
|
56
|
+
"""
|
|
57
|
+
with_reports = sorted(REPORTS_DIR.glob(f"*-{corpus}-with.json"))
|
|
58
|
+
without_reports = sorted(REPORTS_DIR.glob(f"*-{corpus}-without.json"))
|
|
59
|
+
if not with_reports and not without_reports:
|
|
60
|
+
return None, None
|
|
61
|
+
# Latest of each — they don't have to share stamps; the diff handles that.
|
|
62
|
+
return (
|
|
63
|
+
with_reports[-1] if with_reports else None,
|
|
64
|
+
without_reports[-1] if without_reports else None,
|
|
65
|
+
)
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
def latest_diff(corpus: str) -> Path | None:
|
|
69
|
+
diffs = sorted(DIFF_DIR.glob(f"*-{corpus}-diff.json"))
|
|
70
|
+
return diffs[-1] if diffs else None
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
def safe_load(path: Path | None) -> dict:
|
|
74
|
+
if path is None or not path.exists():
|
|
75
|
+
return {}
|
|
76
|
+
try:
|
|
77
|
+
return json.loads(path.read_text())
|
|
78
|
+
except json.JSONDecodeError:
|
|
79
|
+
return {}
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
def fmt_pct(value: float | None) -> str:
|
|
83
|
+
if value is None:
|
|
84
|
+
return "—"
|
|
85
|
+
return f"{value * 100:.1f}%"
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
def fmt_num(value: float | None, places: int = 2) -> str:
|
|
89
|
+
if value is None:
|
|
90
|
+
return "—"
|
|
91
|
+
return f"{value:.{places}f}"
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
def render_headline(track_a: dict, track_b: dict) -> str:
|
|
95
|
+
a_results = (track_a.get("with") or {}).get("results", {})
|
|
96
|
+
a_without = (track_a.get("without") or {}).get("results", {})
|
|
97
|
+
b_results = (track_b.get("with") or {}).get("results", {})
|
|
98
|
+
b_without = (track_b.get("without") or {}).get("results", {})
|
|
99
|
+
a_with_acc = a_results.get("trigger_accuracy")
|
|
100
|
+
a_wo_acc = a_without.get("trigger_accuracy")
|
|
101
|
+
b_with_comp = b_results.get("completion_rate")
|
|
102
|
+
b_wo_comp = b_without.get("completion_rate")
|
|
103
|
+
lines = [
|
|
104
|
+
"## Headline",
|
|
105
|
+
"",
|
|
106
|
+
"| Metric | with | without | delta |",
|
|
107
|
+
"|---|---|---|---|",
|
|
108
|
+
f"| Track A trigger-accuracy | {fmt_pct(a_with_acc)} | {fmt_pct(a_wo_acc)} | "
|
|
109
|
+
f"{fmt_pct((a_with_acc or 0) - (a_wo_acc or 0))} |",
|
|
110
|
+
f"| Track B completion-rate | {fmt_pct(b_with_comp)} | {fmt_pct(b_wo_comp)} | "
|
|
111
|
+
f"{fmt_pct((b_with_comp or 0) - (b_wo_comp or 0))} |",
|
|
112
|
+
f"| Track B mean wall-time | {fmt_num(b_results.get('mean_wall_time'))}s "
|
|
113
|
+
f"| {fmt_num(b_without.get('mean_wall_time'))}s | "
|
|
114
|
+
f"{fmt_num((b_results.get('mean_wall_time') or 0) - (b_without.get('mean_wall_time') or 0))}s |",
|
|
115
|
+
f"| Track B ask-vs-act ratio | {fmt_num(b_results.get('ask_vs_act_ratio'), 3)} "
|
|
116
|
+
f"| {fmt_num(b_without.get('ask_vs_act_ratio'), 3)} | — |",
|
|
117
|
+
"",
|
|
118
|
+
]
|
|
119
|
+
return "\n".join(lines)
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
def render_track_a(track_a: dict) -> str:
|
|
123
|
+
with_data = (track_a.get("with") or {}).get("results", {})
|
|
124
|
+
without_data = (track_a.get("without") or {}).get("results", {})
|
|
125
|
+
lines = ["## Track A — Behavioural eval", ""]
|
|
126
|
+
if not with_data and not without_data:
|
|
127
|
+
lines.append("_No Track A reports yet. Run `task bench:ab:track-a`._")
|
|
128
|
+
lines.append("")
|
|
129
|
+
return "\n".join(lines)
|
|
130
|
+
lines.extend(
|
|
131
|
+
[
|
|
132
|
+
f"- with → **{fmt_pct(with_data.get('trigger_accuracy'))}** "
|
|
133
|
+
f"({with_data.get('matched', 0)}/{with_data.get('total', 0)})",
|
|
134
|
+
f"- without → **{fmt_pct(without_data.get('trigger_accuracy'))}** "
|
|
135
|
+
f"({without_data.get('matched', 0)}/{without_data.get('total', 0)})",
|
|
136
|
+
f"- integrity OK: `{track_a.get('with', {}).get('integrity_ok', '—')}`",
|
|
137
|
+
"",
|
|
138
|
+
"Per-target presence (sample):",
|
|
139
|
+
"",
|
|
140
|
+
]
|
|
141
|
+
)
|
|
142
|
+
per_target = with_data.get("per_target_present", {})
|
|
143
|
+
for i, (target, score) in enumerate(sorted(per_target.items())):
|
|
144
|
+
if i >= 10:
|
|
145
|
+
lines.append(f"- … {len(per_target) - 10} more")
|
|
146
|
+
break
|
|
147
|
+
lines.append(f"- `{target}` → with={score}, without=0")
|
|
148
|
+
lines.append("")
|
|
149
|
+
return "\n".join(lines)
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
def render_track_b(track_b: dict) -> str:
|
|
153
|
+
lines = ["## Track B — Task completion", ""]
|
|
154
|
+
with_data = (track_b.get("with") or {}).get("results", {})
|
|
155
|
+
without_data = (track_b.get("without") or {}).get("results", {})
|
|
156
|
+
mode = with_data.get("mode") or without_data.get("mode") or "—"
|
|
157
|
+
lines.append(f"- Mode: `{mode}`")
|
|
158
|
+
if not with_data and not without_data:
|
|
159
|
+
lines.append("")
|
|
160
|
+
lines.append("_No Track B reports yet. Run `task bench:ab:track-b`._")
|
|
161
|
+
lines.append("")
|
|
162
|
+
return "\n".join(lines)
|
|
163
|
+
lines.extend(
|
|
164
|
+
[
|
|
165
|
+
f"- with → **{fmt_pct(with_data.get('completion_rate'))}** "
|
|
166
|
+
f"({with_data.get('passed', 0)}/{with_data.get('total', 0)})",
|
|
167
|
+
f"- without → **{fmt_pct(without_data.get('completion_rate'))}** "
|
|
168
|
+
f"({without_data.get('passed', 0)}/{without_data.get('total', 0)})",
|
|
169
|
+
"",
|
|
170
|
+
"Per-category:",
|
|
171
|
+
"",
|
|
172
|
+
"| Category | with | without | delta |",
|
|
173
|
+
"|---|---|---|---|",
|
|
174
|
+
]
|
|
175
|
+
)
|
|
176
|
+
with_cats = with_data.get("per_category", {})
|
|
177
|
+
without_cats = without_data.get("per_category", {})
|
|
178
|
+
for cat in sorted(set(with_cats) | set(without_cats)):
|
|
179
|
+
w = with_cats.get(cat, {}).get("completion_rate") or 0
|
|
180
|
+
wo = without_cats.get(cat, {}).get("completion_rate") or 0
|
|
181
|
+
lines.append(
|
|
182
|
+
f"| {cat} | {fmt_pct(w)} | {fmt_pct(wo)} | {fmt_pct(w - wo)} |"
|
|
183
|
+
)
|
|
184
|
+
lines.append("")
|
|
185
|
+
return "\n".join(lines)
|
|
186
|
+
|
|
187
|
+
|
|
188
|
+
def render_methodology(track_a: dict, track_b: dict) -> str:
|
|
189
|
+
with_report = track_a.get("with") or track_b.get("with") or {}
|
|
190
|
+
cache_key = with_report.get("cache_key", {})
|
|
191
|
+
lines = [
|
|
192
|
+
"## Methodology",
|
|
193
|
+
"",
|
|
194
|
+
"- **Target shape:** Shape A (neutral TypeScript fixture under `internal/bench/ab/fixture/`).",
|
|
195
|
+
"- **Variants:** `with` clone inherits `.claude/`, `.augment/`, `AGENTS.md`, "
|
|
196
|
+
"`CLAUDE.md` from the package root; `without` does not.",
|
|
197
|
+
"- **Integrity:** `python3 scripts/bench_ab_integrity.py` exits 0 on every run "
|
|
198
|
+
"(clones differ only at the agent-config surface).",
|
|
199
|
+
"- **Scoring:** structural only (no LLM judge). See `scripts/_lib/bench_ab_scoring.py`.",
|
|
200
|
+
"",
|
|
201
|
+
"Cache key for the latest run:",
|
|
202
|
+
"",
|
|
203
|
+
]
|
|
204
|
+
if cache_key:
|
|
205
|
+
for k in ("corpus_hash", "claude_cli_version", "target_shape_hash"):
|
|
206
|
+
lines.append(f"- `{k}`: `{cache_key.get(k, '—')}`")
|
|
207
|
+
else:
|
|
208
|
+
lines.append("- _no cache key recorded yet_")
|
|
209
|
+
lines.append("")
|
|
210
|
+
lines.append(f"- **Last rendered:** `{utc_iso()}`")
|
|
211
|
+
lines.append("")
|
|
212
|
+
return "\n".join(lines)
|
|
213
|
+
|
|
214
|
+
|
|
215
|
+
def render_history() -> str:
|
|
216
|
+
lines = ["## History", "", "Last 5 runs (per corpus):", ""]
|
|
217
|
+
for corpus in ("ab-tracka", "ab-trackb"):
|
|
218
|
+
lines.append(f"### `{corpus}`")
|
|
219
|
+
lines.append("")
|
|
220
|
+
reports = sorted(
|
|
221
|
+
REPORTS_DIR.glob(f"*-{corpus}-with.json"), reverse=True
|
|
222
|
+
)[:5]
|
|
223
|
+
if not reports:
|
|
224
|
+
lines.append("_no runs yet_")
|
|
225
|
+
lines.append("")
|
|
226
|
+
continue
|
|
227
|
+
for report in reports:
|
|
228
|
+
try:
|
|
229
|
+
data = json.loads(report.read_text())
|
|
230
|
+
except json.JSONDecodeError:
|
|
231
|
+
continue
|
|
232
|
+
results = data.get("results") or {}
|
|
233
|
+
metric = (
|
|
234
|
+
results.get("trigger_accuracy")
|
|
235
|
+
if corpus == "ab-tracka"
|
|
236
|
+
else results.get("completion_rate")
|
|
237
|
+
)
|
|
238
|
+
lines.append(f"- `{data.get('stamp', '—')}` → {fmt_pct(metric)}")
|
|
239
|
+
lines.append("")
|
|
240
|
+
return "\n".join(lines)
|
|
241
|
+
|
|
242
|
+
|
|
243
|
+
def render_placeholder() -> str:
|
|
244
|
+
return (
|
|
245
|
+
"# Package-Impact A/B Benchmark\n"
|
|
246
|
+
"\n"
|
|
247
|
+
"_No A/B bench reports yet._ Produce one with:\n"
|
|
248
|
+
"\n"
|
|
249
|
+
"```sh\n"
|
|
250
|
+
"task bench:ab\n"
|
|
251
|
+
"```\n"
|
|
252
|
+
"\n"
|
|
253
|
+
"Methodology lives in `agents/roadmaps/road-to-package-impact-benchmark.md` "
|
|
254
|
+
"and `internal/bench/ab/README.md`.\n"
|
|
255
|
+
f"\n_Last rendered: {utc_iso()}_\n"
|
|
256
|
+
)
|
|
257
|
+
|
|
258
|
+
|
|
259
|
+
def render(quiet: bool = False) -> int:
|
|
260
|
+
a_with, a_without = latest_pair("ab-tracka")
|
|
261
|
+
b_with, b_without = latest_pair("ab-trackb")
|
|
262
|
+
track_a = {"with": safe_load(a_with), "without": safe_load(a_without)}
|
|
263
|
+
track_b = {"with": safe_load(b_with), "without": safe_load(b_without)}
|
|
264
|
+
have_data = bool(
|
|
265
|
+
track_a["with"] or track_a["without"] or track_b["with"] or track_b["without"]
|
|
266
|
+
)
|
|
267
|
+
if not have_data:
|
|
268
|
+
OUT_PATH.parent.mkdir(parents=True, exist_ok=True)
|
|
269
|
+
OUT_PATH.write_text(render_placeholder())
|
|
270
|
+
if not quiet:
|
|
271
|
+
sys.stdout.write(
|
|
272
|
+
f"render_benchmark_md: no reports — wrote placeholder to {OUT_PATH.relative_to(REPO_ROOT)}\n"
|
|
273
|
+
)
|
|
274
|
+
return 0
|
|
275
|
+
parts = [
|
|
276
|
+
"# Package-Impact A/B Benchmark",
|
|
277
|
+
"",
|
|
278
|
+
"> Generated by `scripts/render_benchmark_md.py`. Source of truth: "
|
|
279
|
+
"`internal/bench/reports/ab/`. Re-render anytime with `task bench:ab:diff`.",
|
|
280
|
+
"",
|
|
281
|
+
render_headline(track_a, track_b),
|
|
282
|
+
render_track_a(track_a),
|
|
283
|
+
render_track_b(track_b),
|
|
284
|
+
render_methodology(track_a, track_b),
|
|
285
|
+
render_history(),
|
|
286
|
+
]
|
|
287
|
+
OUT_PATH.parent.mkdir(parents=True, exist_ok=True)
|
|
288
|
+
OUT_PATH.write_text("\n".join(parts))
|
|
289
|
+
if not quiet:
|
|
290
|
+
sys.stdout.write(
|
|
291
|
+
f"render_benchmark_md: wrote {OUT_PATH.relative_to(REPO_ROOT)}\n"
|
|
292
|
+
)
|
|
293
|
+
return 0
|
|
294
|
+
|
|
295
|
+
|
|
296
|
+
def parse_args(argv: list[str]) -> argparse.Namespace:
|
|
297
|
+
parser = argparse.ArgumentParser(description="Render docs/benchmark.md from A/B reports.")
|
|
298
|
+
parser.add_argument("--quiet", action="store_true", help="Suppress stdout.")
|
|
299
|
+
return parser.parse_args(argv)
|
|
300
|
+
|
|
301
|
+
|
|
302
|
+
def main(argv: list[str] | None = None) -> int:
|
|
303
|
+
args = parse_args(argv if argv is not None else sys.argv[1:])
|
|
304
|
+
return render(quiet=args.quiet)
|
|
305
|
+
|
|
306
|
+
|
|
307
|
+
if __name__ == "__main__":
|
|
308
|
+
raise SystemExit(main())
|
|
@@ -100,7 +100,7 @@ def _resolve_regenerator(consumer_root: Path) -> Path | None:
|
|
|
100
100
|
for candidate in (
|
|
101
101
|
consumer_root / ".augment" / "scripts" / "update_roadmap_progress.py",
|
|
102
102
|
consumer_root / ".agent-src" / "scripts" / "update_roadmap_progress.py",
|
|
103
|
-
consumer_root / ".agent-src.
|
|
103
|
+
consumer_root / ".agent-src.uncondensed" / "scripts" / "update_roadmap_progress.py",
|
|
104
104
|
):
|
|
105
105
|
if candidate.is_file():
|
|
106
106
|
return candidate
|