@event4u/agent-config 3.3.0 → 4.2.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 +216 -3
- package/CONTRIBUTING.md +31 -12
- package/README.md +21 -12
- 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/atomic.js +92 -0
- package/dist/install/atomic.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 +358 -0
- package/dist/server/routes/install.js.map +1 -0
- package/dist/server/routes/wizard.js +468 -32
- 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 +5 -3
- package/dist/server/schemas/settings.js.map +1 -1
- package/dist/ui/assets/index-BDAhhpDV.js +40 -0
- package/dist/ui/assets/index-BDAhhpDV.js.map +1 -0
- package/dist/ui/assets/index-BXZILUxe.css +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 +110 -97
- 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 +3 -3
- 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/connector-setup.md +2 -2
- package/docs/deploy/policy-cookbook.md +2 -2
- 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 +273 -45
- 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 +152 -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
|
@@ -1,22 +1,22 @@
|
|
|
1
1
|
#!/usr/bin/env python3
|
|
2
2
|
"""
|
|
3
|
-
Agent-config sync —
|
|
3
|
+
Agent-config sync — condense .agent-src.uncondensed/ → .agent-src/
|
|
4
4
|
and project .agent-src/ → .augment/ (copies for rules by default,
|
|
5
5
|
symlinks for the rest; opt into rule symlinks via
|
|
6
6
|
augment.rules_use_symlinks in .agent-settings.yml).
|
|
7
7
|
|
|
8
|
-
Copies non-.md files as-is. Lists .md files that need
|
|
8
|
+
Copies non-.md files as-is. Lists .md files that need condensation (done by the
|
|
9
9
|
Augment agent interactively). Tracks SHA-256 hashes of source files to detect
|
|
10
|
-
changes since last
|
|
10
|
+
changes since last condensation.
|
|
11
11
|
|
|
12
12
|
Usage:
|
|
13
|
-
python scripts/
|
|
14
|
-
python scripts/
|
|
15
|
-
python scripts/
|
|
16
|
-
python scripts/
|
|
17
|
-
python scripts/
|
|
18
|
-
python scripts/
|
|
19
|
-
python scripts/
|
|
13
|
+
python scripts/condense.py # sync all non-.md files + cleanup + project
|
|
14
|
+
python scripts/condense.py --list # list .md files needing condensation
|
|
15
|
+
python scripts/condense.py --changed # list only .md files changed since last condensation
|
|
16
|
+
python scripts/condense.py --check # check if directories are in sync
|
|
17
|
+
python scripts/condense.py --mark-done <relative-path> # mark file as condensed (update hash)
|
|
18
|
+
python scripts/condense.py --mark-all-done # mark ALL .md files as condensed
|
|
19
|
+
python scripts/condense.py --project-augment # rebuild .augment/ projection
|
|
20
20
|
"""
|
|
21
21
|
|
|
22
22
|
from __future__ import annotations
|
|
@@ -42,19 +42,19 @@ PROJECT_ROOT = Path(__file__).resolve().parent.parent
|
|
|
42
42
|
# Legacy single-root anchor — kept for backward compatibility with callers
|
|
43
43
|
# that pass it explicitly. Multi-root iteration (post-ADR-017 physical
|
|
44
44
|
# move) goes through `_lib.agent_src` helpers.
|
|
45
|
-
SOURCE_DIR = PROJECT_ROOT / ".agent-src.
|
|
45
|
+
SOURCE_DIR = PROJECT_ROOT / ".agent-src.uncondensed"
|
|
46
46
|
TARGET_DIR = PROJECT_ROOT / ".agent-src"
|
|
47
47
|
AUGMENT_DIR = PROJECT_ROOT / ".augment"
|
|
48
|
-
HASH_FILE = PROJECT_ROOT / ".
|
|
48
|
+
HASH_FILE = PROJECT_ROOT / "internal" / ".condensation-hashes.json"
|
|
49
49
|
SETTINGS_FILE = PROJECT_ROOT / ".agent-settings.yml"
|
|
50
50
|
|
|
51
51
|
|
|
52
52
|
def _iter_sources():
|
|
53
53
|
"""Yield (physical_path, logical_relpath) for every source artefact.
|
|
54
54
|
|
|
55
|
-
Wraps `_lib.agent_src.iter_all_sources` so the
|
|
56
|
-
active source root (legacy `.agent-src.
|
|
57
|
-
`packages/*/.agent-src.
|
|
55
|
+
Wraps `_lib.agent_src.iter_all_sources` so the condenseor walks every
|
|
56
|
+
active source root (legacy `.agent-src.uncondensed/` plus any
|
|
57
|
+
`packages/*/.agent-src.uncondensed/`) and keys outputs by the
|
|
58
58
|
logical relative path that survives the physical move (ADR-017).
|
|
59
59
|
"""
|
|
60
60
|
yield from iter_all_sources()
|
|
@@ -69,7 +69,7 @@ def _any_source_root_exists() -> bool:
|
|
|
69
69
|
"""True if at least one artefact source root contains files."""
|
|
70
70
|
return bool(artefact_roots())
|
|
71
71
|
|
|
72
|
-
# Self-projection tool toggle — see
|
|
72
|
+
# Self-projection tool toggle — see agents/.agent-tools.yml. When the file is
|
|
73
73
|
# absent (e.g. tests run in tmp dirs, consumer projects), `_active_tools`
|
|
74
74
|
# returns ``None`` which is treated as "emit every tool".
|
|
75
75
|
_ALL_TOOLS = frozenset({
|
|
@@ -81,11 +81,11 @@ _ALL_TOOLS = frozenset({
|
|
|
81
81
|
def _active_tools() -> frozenset[str] | None:
|
|
82
82
|
"""Return the set of active self-projection tools, or None for "all".
|
|
83
83
|
|
|
84
|
-
Reads
|
|
85
|
-
test fixtures that monkey-patch `
|
|
86
|
-
(empty) project root and get the default "all tools" behaviour.
|
|
84
|
+
Reads `agents/.agent-tools.yml` relative to the current `PROJECT_ROOT`
|
|
85
|
+
so test fixtures that monkey-patch `condense.PROJECT_ROOT` see their
|
|
86
|
+
own (empty) project root and get the default "all tools" behaviour.
|
|
87
87
|
"""
|
|
88
|
-
tools_file = PROJECT_ROOT / ".agent-tools.yml"
|
|
88
|
+
tools_file = PROJECT_ROOT / "agents" / ".agent-tools.yml"
|
|
89
89
|
if not tools_file.exists():
|
|
90
90
|
return None
|
|
91
91
|
try:
|
|
@@ -103,12 +103,12 @@ def _tool_active(tool_id: str) -> bool:
|
|
|
103
103
|
active = _active_tools()
|
|
104
104
|
return True if active is None else tool_id in active
|
|
105
105
|
|
|
106
|
-
# Files to copy as-is even if .md (not
|
|
106
|
+
# Files to copy as-is even if .md (not condensed by agent)
|
|
107
107
|
COPY_AS_IS = {"README.md"}
|
|
108
108
|
|
|
109
109
|
# Directories (relative to SOURCE_DIR) whose .md content is data, not prose,
|
|
110
110
|
# and must be copied verbatim. Ghostwriter fixtures carry voice_samples that
|
|
111
|
-
# would be destroyed by
|
|
111
|
+
# would be destroyed by telegraph condensation.
|
|
112
112
|
COPY_AS_IS_DIRS = frozenset({"ghostwriter"})
|
|
113
113
|
|
|
114
114
|
|
|
@@ -154,7 +154,7 @@ def file_hash(filepath: Path) -> str:
|
|
|
154
154
|
|
|
155
155
|
|
|
156
156
|
def load_hashes() -> dict:
|
|
157
|
-
"""Load stored
|
|
157
|
+
"""Load stored condensation hashes from JSON file."""
|
|
158
158
|
if HASH_FILE.exists():
|
|
159
159
|
try:
|
|
160
160
|
return json.loads(HASH_FILE.read_text())
|
|
@@ -164,13 +164,13 @@ def load_hashes() -> dict:
|
|
|
164
164
|
|
|
165
165
|
|
|
166
166
|
def save_hashes(hashes: dict) -> None:
|
|
167
|
-
"""Save
|
|
167
|
+
"""Save condensation hashes to JSON file."""
|
|
168
168
|
HASH_FILE.parent.mkdir(parents=True, exist_ok=True)
|
|
169
169
|
HASH_FILE.write_text(json.dumps(hashes, indent=2, sort_keys=True) + "\n")
|
|
170
170
|
|
|
171
171
|
|
|
172
172
|
def mark_done(relative_path: str) -> None:
|
|
173
|
-
"""Mark a single file as
|
|
173
|
+
"""Mark a single file as condensed by storing its current source hash.
|
|
174
174
|
|
|
175
175
|
Also runs the path rewriter on the just-written `.agent-src/<path>` so
|
|
176
176
|
logical names from the source frontmatter resolve to deployment-correct
|
|
@@ -185,14 +185,14 @@ def mark_done(relative_path: str) -> None:
|
|
|
185
185
|
hashes = load_hashes()
|
|
186
186
|
hashes[relative_path] = file_hash(source_file)
|
|
187
187
|
save_hashes(hashes)
|
|
188
|
-
print(f"✅ Marked as
|
|
188
|
+
print(f"✅ Marked as condensed: {relative_path}")
|
|
189
189
|
|
|
190
190
|
|
|
191
191
|
def apply_path_rewriter(relative_path: str) -> bool:
|
|
192
192
|
"""Apply `_rewrite_paths` to `.agent-src/<relative_path>` in-place.
|
|
193
193
|
|
|
194
194
|
Returns True if the file was modified, False otherwise. Silently
|
|
195
|
-
returns False if the target doesn't exist (
|
|
195
|
+
returns False if the target doesn't exist (condensation hasn't run
|
|
196
196
|
yet) — `--mark-done` is also valid before content exists.
|
|
197
197
|
"""
|
|
198
198
|
target = TARGET_DIR / relative_path
|
|
@@ -207,20 +207,20 @@ def apply_path_rewriter(relative_path: str) -> bool:
|
|
|
207
207
|
|
|
208
208
|
|
|
209
209
|
def mark_all_done() -> None:
|
|
210
|
-
"""Mark ALL .md files as
|
|
210
|
+
"""Mark ALL .md files as condensed (e.g. after initial full condensation)."""
|
|
211
211
|
hashes = load_hashes()
|
|
212
212
|
count = 0
|
|
213
213
|
for source_file, relative in _iter_sources():
|
|
214
|
-
if not
|
|
214
|
+
if not should_condense(source_file):
|
|
215
215
|
continue
|
|
216
216
|
hashes[relative] = file_hash(source_file)
|
|
217
217
|
count += 1
|
|
218
218
|
save_hashes(hashes)
|
|
219
|
-
print(f"✅ Marked {count} files as
|
|
219
|
+
print(f"✅ Marked {count} files as condensed")
|
|
220
220
|
|
|
221
221
|
|
|
222
222
|
def list_changed_md(source_dir: Path) -> list:
|
|
223
|
-
"""List .md files whose source hash differs from stored hash (= need
|
|
223
|
+
"""List .md files whose source hash differs from stored hash (= need recondensation).
|
|
224
224
|
|
|
225
225
|
The ``source_dir`` parameter is retained for backward compatibility but
|
|
226
226
|
ignored — iteration walks every active source root (ADR-017).
|
|
@@ -229,7 +229,7 @@ def list_changed_md(source_dir: Path) -> list:
|
|
|
229
229
|
hashes = load_hashes()
|
|
230
230
|
changed = []
|
|
231
231
|
for source_file, relative in _iter_sources():
|
|
232
|
-
if not
|
|
232
|
+
if not should_condense(source_file):
|
|
233
233
|
continue
|
|
234
234
|
current_hash = file_hash(source_file)
|
|
235
235
|
stored_hash = hashes.get(relative)
|
|
@@ -262,15 +262,15 @@ def clean_stale_hashes(source_dir: Path) -> int:
|
|
|
262
262
|
|
|
263
263
|
|
|
264
264
|
|
|
265
|
-
def
|
|
266
|
-
"""Check if file should be
|
|
265
|
+
def should_condense(filepath: Path) -> bool:
|
|
266
|
+
"""Check if file should be condensed (is .md and not in copy-as-is list)."""
|
|
267
267
|
if filepath.suffix != ".md":
|
|
268
268
|
return False
|
|
269
269
|
if filepath.name in COPY_AS_IS:
|
|
270
270
|
return False
|
|
271
271
|
# Determine the logical relative path so the COPY_AS_IS_DIRS check
|
|
272
|
-
# works for both legacy (`.agent-src.
|
|
273
|
-
# (`packages/*/.agent-src.
|
|
272
|
+
# works for both legacy (`.agent-src.uncondensed/`) and post-move
|
|
273
|
+
# (`packages/*/.agent-src.uncondensed/`) source roots.
|
|
274
274
|
rel_parts: tuple[str, ...] = filepath.parts
|
|
275
275
|
for root in artefact_roots():
|
|
276
276
|
try:
|
|
@@ -321,8 +321,8 @@ def sync_non_md(source_dir: Path, target_dir: Path) -> int:
|
|
|
321
321
|
copied = 0
|
|
322
322
|
seen: set[str] = set()
|
|
323
323
|
for source_file, relative in _iter_sources():
|
|
324
|
-
if
|
|
325
|
-
continue # .md files are
|
|
324
|
+
if should_condense(source_file):
|
|
325
|
+
continue # .md files are condensed by the agent, not copied here
|
|
326
326
|
if relative in seen:
|
|
327
327
|
continue
|
|
328
328
|
seen.add(relative)
|
|
@@ -334,12 +334,12 @@ def sync_non_md(source_dir: Path, target_dir: Path) -> int:
|
|
|
334
334
|
|
|
335
335
|
|
|
336
336
|
def list_md_files(source_dir: Path) -> list:
|
|
337
|
-
"""List all .md files that need
|
|
337
|
+
"""List all .md files that need condensation by the agent."""
|
|
338
338
|
del source_dir # multi-root: ignored, kept for signature stability
|
|
339
339
|
files: list[str] = []
|
|
340
340
|
seen: set[str] = set()
|
|
341
341
|
for source_file, relative in _iter_sources():
|
|
342
|
-
if not
|
|
342
|
+
if not should_condense(source_file):
|
|
343
343
|
continue
|
|
344
344
|
if relative in seen:
|
|
345
345
|
continue
|
|
@@ -402,7 +402,7 @@ USER_TYPE_TOOL_DIRS = {
|
|
|
402
402
|
}
|
|
403
403
|
|
|
404
404
|
# Map tool-projection directories to the canonical tool ID used by
|
|
405
|
-
#
|
|
405
|
+
# `agents/.agent-tools.yml`. Directories not in this map are always emitted.
|
|
406
406
|
_DIR_TOOL_ID = {
|
|
407
407
|
".claude/rules": "claude-code",
|
|
408
408
|
".cursor/rules": "cursor",
|
|
@@ -415,7 +415,7 @@ _DIR_TOOL_ID = {
|
|
|
415
415
|
|
|
416
416
|
|
|
417
417
|
def _filter_tool_dirs(mapping: dict[str, str]) -> dict[str, str]:
|
|
418
|
-
"""Drop entries whose tool ID is not active in
|
|
418
|
+
"""Drop entries whose tool ID is not active in `agents/.agent-tools.yml`."""
|
|
419
419
|
return {
|
|
420
420
|
d: p for d, p in mapping.items()
|
|
421
421
|
if _tool_active(_DIR_TOOL_ID.get(d, "claude-code"))
|
|
@@ -432,7 +432,7 @@ def strip_frontmatter(content: str) -> str:
|
|
|
432
432
|
|
|
433
433
|
|
|
434
434
|
# ── Path rewriter (P1 of road-to-path-fixes.md) ───────────────────────────
|
|
435
|
-
# Source files use logical names that the rewriter resolves at
|
|
435
|
+
# Source files use logical names that the rewriter resolves at condense
|
|
436
436
|
# time, so the shipped `.agent-src/` (and `.augment/` projection) carry
|
|
437
437
|
# deployment-correct relative paths without the agent author having to
|
|
438
438
|
# know how deep their file lives.
|
|
@@ -440,12 +440,12 @@ def strip_frontmatter(content: str) -> str:
|
|
|
440
440
|
# Frontmatter rewrites:
|
|
441
441
|
# load_context: / load_context_eager:
|
|
442
442
|
# contexts/<area>/<file>.md (logical, preferred)
|
|
443
|
-
# .agent-src.
|
|
443
|
+
# .agent-src.uncondensed/contexts/<area>/<file>.md (legacy)
|
|
444
444
|
# → ../contexts/<area>/<file>.md (relative from .agent-src/rules/)
|
|
445
445
|
# triggers[].path_prefix:
|
|
446
446
|
# LEFT ALONE — `path_prefix:` is a literal match pattern, not a
|
|
447
447
|
# file reference. Source-of-truth rules that fire on edits under
|
|
448
|
-
# `.agent-src.
|
|
448
|
+
# `.agent-src.uncondensed/` keep that prefix verbatim (see
|
|
449
449
|
# road-to-path-fixes.md P2.2 / Modified Option 1).
|
|
450
450
|
#
|
|
451
451
|
# Body-link rewrites:
|
|
@@ -455,7 +455,7 @@ def strip_frontmatter(content: str) -> str:
|
|
|
455
455
|
# Idempotent: applying twice is a no-op (rewritten patterns no longer
|
|
456
456
|
# match the source patterns).
|
|
457
457
|
|
|
458
|
-
_LEGACY_SRC_PREFIX = ".agent-src.
|
|
458
|
+
_LEGACY_SRC_PREFIX = ".agent-src.uncondensed/"
|
|
459
459
|
_PROJECTED_SRC_PREFIX = ".agent-src/"
|
|
460
460
|
|
|
461
461
|
# A YAML list item under load_context*: ` - some/path.md` (optionally quoted)
|
|
@@ -513,7 +513,7 @@ def _rewrite_path_prefix_value(value: str) -> str:
|
|
|
513
513
|
`path_prefix:` is a literal match pattern the host evaluates against
|
|
514
514
|
the file the agent is editing — not a file reference. Rewriting it
|
|
515
515
|
breaks the workflow it was authored for: source-of-truth rules that
|
|
516
|
-
fire when the agent edits files under `.agent-src.
|
|
516
|
+
fire when the agent edits files under `.agent-src.uncondensed/`
|
|
517
517
|
keep that prefix verbatim. The prefix ban therefore applies only to
|
|
518
518
|
`load_context:` entries and body links (see road-to-path-fixes.md
|
|
519
519
|
P2.2 + the AI-Council convergence on 2026-05-06).
|
|
@@ -556,10 +556,10 @@ def _rewrite_body_links(body: str, prefix: str) -> str:
|
|
|
556
556
|
|
|
557
557
|
# ── Human-review banner injection (Phase 5.3 / ADR-018) ───────────────────
|
|
558
558
|
# Source artefacts may set `trust.human_review_required: true` in their
|
|
559
|
-
# frontmatter. The
|
|
559
|
+
# frontmatter. The condenseor injects a short, parser-stable banner block
|
|
560
560
|
# at the top of the projected body so every downstream surface (agent
|
|
561
561
|
# memory, .augment, .claude, etc.) surfaces the gate. Idempotent — the
|
|
562
|
-
# marker comment prevents double-injection on re-
|
|
562
|
+
# marker comment prevents double-injection on re-condense.
|
|
563
563
|
|
|
564
564
|
_HRR_BANNER_MARKER = "<!-- agent-config:human-review-banner -->"
|
|
565
565
|
|
|
@@ -1063,7 +1063,7 @@ def generate_user_type_symlinks() -> int:
|
|
|
1063
1063
|
def generate_tools() -> None:
|
|
1064
1064
|
"""Generate all tool-specific directories and files.
|
|
1065
1065
|
|
|
1066
|
-
|
|
1066
|
+
`agents/.agent-tools.yml` gates per-tool emission. When the file
|
|
1067
1067
|
is missing, every tool is emitted (preserves test fixtures and
|
|
1068
1068
|
pre-gating behaviour). See `_active_tools()` and `_tool_active()`.
|
|
1069
1069
|
"""
|
|
@@ -1095,7 +1095,7 @@ def generate_tools() -> None:
|
|
|
1095
1095
|
|
|
1096
1096
|
|
|
1097
1097
|
# ── .augment/ projection ──────────────────────────────────────────────
|
|
1098
|
-
# The package uses .agent-src/ as the tool-agnostic
|
|
1098
|
+
# The package uses .agent-src/ as the tool-agnostic condensed source of truth.
|
|
1099
1099
|
# .augment/ is a generated projection so that Augment Code (which reads from
|
|
1100
1100
|
# .augment/) works on the package repo itself. Rules default to copies
|
|
1101
1101
|
# because Augment Code historically does not load symlinked rule files;
|
|
@@ -1174,7 +1174,7 @@ def project_to_augment() -> None:
|
|
|
1174
1174
|
# Cleanup: remove any stray top-level entries in .augment/ that are no longer projected.
|
|
1175
1175
|
# `state` holds runtime state files written by hooks (onboarding-gate,
|
|
1176
1176
|
# context-hygiene, …) and must survive sync — it is regenerated by
|
|
1177
|
-
# the next hook fire, not by
|
|
1177
|
+
# the next hook fire, not by condense.
|
|
1178
1178
|
known = set(AUGMENT_SYMLINK_DIRS) | set(AUGMENT_SYMLINK_FILES) | {"rules", "state"}
|
|
1179
1179
|
for item in AUGMENT_DIR.iterdir():
|
|
1180
1180
|
if item.name in known:
|
|
@@ -1211,10 +1211,10 @@ def clean_tools() -> None:
|
|
|
1211
1211
|
|
|
1212
1212
|
def main() -> None:
|
|
1213
1213
|
# Multi-root awareness (ADR-017): tolerate a missing legacy
|
|
1214
|
-
# `.agent-src.
|
|
1214
|
+
# `.agent-src.uncondensed/` as long as at least one package-scoped
|
|
1215
1215
|
# source root carries artefacts.
|
|
1216
1216
|
if not SOURCE_DIR.exists() and not _any_source_root_exists():
|
|
1217
|
-
print(f"❌ No source directory found (looked at {SOURCE_DIR} and packages/*/.agent-src.
|
|
1217
|
+
print(f"❌ No source directory found (looked at {SOURCE_DIR} and packages/*/.agent-src.uncondensed)")
|
|
1218
1218
|
sys.exit(1)
|
|
1219
1219
|
|
|
1220
1220
|
arg = sys.argv[1] if len(sys.argv) > 1 else "--sync"
|
|
@@ -1228,15 +1228,15 @@ def main() -> None:
|
|
|
1228
1228
|
elif arg == "--changed":
|
|
1229
1229
|
changed = list_changed_md(SOURCE_DIR)
|
|
1230
1230
|
if not changed:
|
|
1231
|
-
print("✅ No .md files changed since last
|
|
1231
|
+
print("✅ No .md files changed since last condensation")
|
|
1232
1232
|
sys.exit(0)
|
|
1233
|
-
print(f"📝 {len(changed)} .md files changed since last
|
|
1233
|
+
print(f"📝 {len(changed)} .md files changed since last condensation:\n")
|
|
1234
1234
|
for f in changed:
|
|
1235
1235
|
print(f" {f}")
|
|
1236
1236
|
|
|
1237
1237
|
elif arg == "--mark-done":
|
|
1238
1238
|
if len(sys.argv) < 3:
|
|
1239
|
-
print("Usage: python scripts/
|
|
1239
|
+
print("Usage: python scripts/condense.py --mark-done <relative-path>")
|
|
1240
1240
|
sys.exit(1)
|
|
1241
1241
|
mark_done(sys.argv[2])
|
|
1242
1242
|
|
|
@@ -1246,7 +1246,7 @@ def main() -> None:
|
|
|
1246
1246
|
elif arg == "--check":
|
|
1247
1247
|
missing, stale = check_sync(SOURCE_DIR, TARGET_DIR)
|
|
1248
1248
|
if not missing and not stale:
|
|
1249
|
-
print("✅ .agent-src/ is in sync with .agent-src.
|
|
1249
|
+
print("✅ .agent-src/ is in sync with .agent-src.uncondensed/")
|
|
1250
1250
|
sys.exit(0)
|
|
1251
1251
|
if missing:
|
|
1252
1252
|
print(f"❌ Missing in .agent-src/ ({len(missing)}):")
|
|
@@ -1256,7 +1256,7 @@ def main() -> None:
|
|
|
1256
1256
|
print(f"❌ Stale in .agent-src/ ({len(stale)}):")
|
|
1257
1257
|
for f in stale:
|
|
1258
1258
|
print(f" {f}")
|
|
1259
|
-
print(f"\nRun 'task sync' to fix non-.md files, then ask the agent to
|
|
1259
|
+
print(f"\nRun 'task sync' to fix non-.md files, then ask the agent to condense .md files.")
|
|
1260
1260
|
sys.exit(1)
|
|
1261
1261
|
|
|
1262
1262
|
elif arg == "--sync":
|
|
@@ -1278,7 +1278,7 @@ def main() -> None:
|
|
|
1278
1278
|
changed = list_changed_md(SOURCE_DIR)
|
|
1279
1279
|
print(f"\n✅ Done: {copied} copied, {deleted} stale deleted")
|
|
1280
1280
|
if changed:
|
|
1281
|
-
print(f"📝 {len(changed)} .md files need
|
|
1281
|
+
print(f"📝 {len(changed)} .md files need condensation (run --changed to see them)")
|
|
1282
1282
|
else:
|
|
1283
1283
|
print(f"✅ All .md files are up to date")
|
|
1284
1284
|
print(f"\n--- Projecting .agent-src/ → .augment/ ---")
|
|
@@ -1298,15 +1298,15 @@ def main() -> None:
|
|
|
1298
1298
|
|
|
1299
1299
|
if changed:
|
|
1300
1300
|
has_issues = True
|
|
1301
|
-
print(f"❌ {len(changed)} .md file(s) need
|
|
1301
|
+
print(f"❌ {len(changed)} .md file(s) need recondensation:\n")
|
|
1302
1302
|
for f in changed:
|
|
1303
1303
|
stored = load_hashes().get(f)
|
|
1304
1304
|
reason = "no hash stored" if stored is None else "hash mismatch"
|
|
1305
1305
|
print(f" {f} ({reason})")
|
|
1306
|
-
print(f"\nRun '/
|
|
1306
|
+
print(f"\nRun '/condense' command to recondense these files.")
|
|
1307
1307
|
|
|
1308
1308
|
if not has_issues:
|
|
1309
|
-
print("✅ All
|
|
1309
|
+
print("✅ All condensation hashes are clean (no stale, no mismatches)")
|
|
1310
1310
|
sys.exit(0)
|
|
1311
1311
|
sys.exit(1)
|
|
1312
1312
|
|
|
@@ -1327,7 +1327,7 @@ def main() -> None:
|
|
|
1327
1327
|
project_to_augment()
|
|
1328
1328
|
|
|
1329
1329
|
else:
|
|
1330
|
-
print("Usage: python scripts/
|
|
1330
|
+
print("Usage: python scripts/condense.py [--sync|--list|--changed|--check|--check-hashes|--clean-hashes|--mark-done <path>|--mark-all-done|--generate-tools|--clean-tools|--project-augment]")
|
|
1331
1331
|
sys.exit(1)
|
|
1332
1332
|
|
|
1333
1333
|
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Augment Sync — sync non-.md files and cleanup stale files
|
|
3
|
+
#
|
|
4
|
+
# Usage:
|
|
5
|
+
# ./scripts/condense.sh # sync non-.md files + cleanup
|
|
6
|
+
# ./scripts/condense.sh --list # list ALL .md files
|
|
7
|
+
# ./scripts/condense.sh --changed # list .md files changed since last condensation
|
|
8
|
+
# ./scripts/condense.sh --check # check if dirs are in sync
|
|
9
|
+
# ./scripts/condense.sh --mark-done <path> # mark file as condensed
|
|
10
|
+
# ./scripts/condense.sh --mark-all-done # mark all files as condensed
|
|
11
|
+
#
|
|
12
|
+
# .md condensation is done by the Augment agent interactively.
|
|
13
|
+
|
|
14
|
+
set -euo pipefail
|
|
15
|
+
|
|
16
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
17
|
+
|
|
18
|
+
python3 "$SCRIPT_DIR/condense.py" "${@:---sync}"
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
#!/usr/bin/env python3
|
|
2
|
-
"""Input-side memory
|
|
2
|
+
"""Input-side memory condensation — Phase 2 of step-16-telegraph-substance.
|
|
3
3
|
|
|
4
|
-
Rewrites memory files (AGENTS.md, CLAUDE.md, .cursorrules, ...) to
|
|
4
|
+
Rewrites memory files (AGENTS.md, CLAUDE.md, .cursorrules, ...) to telegraph
|
|
5
5
|
grammar (drop articles / auxiliaries) while preserving carve-outs byte-for-byte
|
|
6
6
|
(code blocks, numbered-options, status markers, Iron-Law ALL-CAPS, backtick
|
|
7
7
|
spans). Writes `.original.md` backup before mutating. Gated by Phase 0
|
|
8
8
|
`validate_safe_paths.assert_safe`. Idempotency guard: `original_sha256:` +
|
|
9
|
-
`
|
|
9
|
+
`condensed_at:` frontmatter refuse re-condensation on body-hash drift.
|
|
10
10
|
|
|
11
|
-
CLI: `
|
|
11
|
+
CLI: `condense_memory.py <path> [--check|--decondense]`. Stdlib-only.
|
|
12
12
|
"""
|
|
13
13
|
from __future__ import annotations
|
|
14
14
|
|
|
@@ -24,14 +24,14 @@ sys.path.insert(0, str(REPO_ROOT / "scripts"))
|
|
|
24
24
|
|
|
25
25
|
from validate_safe_paths import SensitivePathError, assert_safe # noqa: E402
|
|
26
26
|
|
|
27
|
-
__all__ = ["
|
|
27
|
+
__all__ = ["condense_text", "condense_file", "decondense_file", "CondensationRefused"]
|
|
28
28
|
|
|
29
29
|
|
|
30
|
-
class
|
|
31
|
-
"""Raised when the target is already
|
|
30
|
+
class CondensationRefused(RuntimeError):
|
|
31
|
+
"""Raised when the target is already condensed and body hash diverged."""
|
|
32
32
|
|
|
33
33
|
|
|
34
|
-
# Carve-out region patterns — mirrors
|
|
34
|
+
# Carve-out region patterns — mirrors telegraph-speak.md § Carve-outs (1–7).
|
|
35
35
|
RE_FENCE = re.compile(r"^```")
|
|
36
36
|
RE_NUMBERED = re.compile(r"^>?\s*\d+\.\s")
|
|
37
37
|
RE_STATUS = re.compile(r"^\s*(?:❌|⚠️|✅)")
|
|
@@ -43,26 +43,26 @@ DROP_TOKENS = {"the", "a", "an", "is", "are", "was", "were", "be", "been",
|
|
|
43
43
|
"being", "that", "which"}
|
|
44
44
|
|
|
45
45
|
|
|
46
|
-
def
|
|
46
|
+
def _condense_words(text: str) -> str:
|
|
47
47
|
out = WORD_RE.sub(lambda m: "" if m.group(0).lower() in DROP_TOKENS else m.group(0), text)
|
|
48
48
|
out = re.sub(r"[ \t]{2,}", " ", out)
|
|
49
49
|
return re.sub(r" +([,.;:!?])", r"\1", out)
|
|
50
50
|
|
|
51
51
|
|
|
52
|
-
def
|
|
53
|
-
"""
|
|
52
|
+
def _condense_prose_line(line: str) -> str:
|
|
53
|
+
"""Condense a prose line; preserve backtick-spans byte-for-byte."""
|
|
54
54
|
parts: list[str] = []
|
|
55
55
|
last = 0
|
|
56
56
|
for span in RE_BACKTICK_SPAN.finditer(line):
|
|
57
|
-
parts.append(
|
|
57
|
+
parts.append(_condense_words(line[last:span.start()]))
|
|
58
58
|
parts.append(span.group(0))
|
|
59
59
|
last = span.end()
|
|
60
|
-
parts.append(
|
|
60
|
+
parts.append(_condense_words(line[last:]))
|
|
61
61
|
return "".join(parts)
|
|
62
62
|
|
|
63
63
|
|
|
64
|
-
def
|
|
65
|
-
"""
|
|
64
|
+
def condense_text(body: str) -> str:
|
|
65
|
+
"""Condense a memory-file body. Idempotent on already-telegraph text."""
|
|
66
66
|
out: list[str] = []
|
|
67
67
|
in_fence = False
|
|
68
68
|
for raw in body.splitlines(keepends=True):
|
|
@@ -75,7 +75,7 @@ def compress_text(body: str) -> str:
|
|
|
75
75
|
or RE_IRONLAW.match(stripped.strip()):
|
|
76
76
|
out.append(raw)
|
|
77
77
|
continue
|
|
78
|
-
out.append(
|
|
78
|
+
out.append(_condense_prose_line(raw))
|
|
79
79
|
return "".join(out)
|
|
80
80
|
|
|
81
81
|
|
|
@@ -98,38 +98,38 @@ def _has_sha_marker(fm: str) -> bool:
|
|
|
98
98
|
|
|
99
99
|
|
|
100
100
|
def _inject_frontmatter(fm: str, sha: str, ts: str) -> str:
|
|
101
|
-
drop = re.compile(r"^(original_sha256|
|
|
101
|
+
drop = re.compile(r"^(original_sha256|condensed_at):.*$", re.MULTILINE)
|
|
102
102
|
inner = drop.sub("", fm.strip().strip("-").strip()).strip() if fm else ""
|
|
103
103
|
body = inner + ("\n" if inner else "")
|
|
104
|
-
return f"---\n{body}original_sha256: {sha}\
|
|
104
|
+
return f"---\n{body}original_sha256: {sha}\ncondensed_at: {ts}\n---\n"
|
|
105
105
|
|
|
106
106
|
|
|
107
107
|
def _backup_path(target: Path) -> Path:
|
|
108
108
|
return target.parent / (target.name + ".original.md")
|
|
109
109
|
|
|
110
110
|
|
|
111
|
-
def
|
|
111
|
+
def condense_file(target: Path) -> Path:
|
|
112
112
|
assert_safe(target)
|
|
113
113
|
text = target.read_text(encoding="utf-8")
|
|
114
114
|
fm, body = _split_frontmatter(text)
|
|
115
115
|
if _has_sha_marker(fm):
|
|
116
|
-
if _sha256(
|
|
117
|
-
raise
|
|
118
|
-
f"{target}: body hash diverged;
|
|
119
|
-
f"(`scripts/
|
|
116
|
+
if _sha256(condense_text(body)) != _sha256(body):
|
|
117
|
+
raise CondensationRefused(
|
|
118
|
+
f"{target}: body hash diverged; decondense first "
|
|
119
|
+
f"(`scripts/condense_memory.py {target} --decondense`)."
|
|
120
120
|
)
|
|
121
121
|
return target
|
|
122
122
|
backup = _backup_path(target)
|
|
123
123
|
backup.write_text(text, encoding="utf-8")
|
|
124
124
|
ts = datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ")
|
|
125
125
|
target.write_text(
|
|
126
|
-
_inject_frontmatter(fm, _sha256(body), ts) +
|
|
126
|
+
_inject_frontmatter(fm, _sha256(body), ts) + condense_text(body),
|
|
127
127
|
encoding="utf-8",
|
|
128
128
|
)
|
|
129
129
|
return backup
|
|
130
130
|
|
|
131
131
|
|
|
132
|
-
def
|
|
132
|
+
def decondense_file(target: Path) -> Path:
|
|
133
133
|
assert_safe(target)
|
|
134
134
|
backup = _backup_path(target)
|
|
135
135
|
if not backup.is_file():
|
|
@@ -140,27 +140,27 @@ def decompress_file(target: Path) -> Path:
|
|
|
140
140
|
|
|
141
141
|
|
|
142
142
|
def _main(argv: list[str]) -> int:
|
|
143
|
-
ap = argparse.ArgumentParser(description="
|
|
143
|
+
ap = argparse.ArgumentParser(description="Condense memory files to telegraph grammar.")
|
|
144
144
|
ap.add_argument("path", type=Path)
|
|
145
145
|
grp = ap.add_mutually_exclusive_group()
|
|
146
146
|
grp.add_argument("--check", action="store_true", help="exit 0 if safe; no writes")
|
|
147
|
-
grp.add_argument("--
|
|
147
|
+
grp.add_argument("--decondense", action="store_true", help="restore .original.md")
|
|
148
148
|
args = ap.parse_args(argv)
|
|
149
149
|
try:
|
|
150
150
|
if args.check:
|
|
151
151
|
assert_safe(args.path)
|
|
152
152
|
return 0
|
|
153
|
-
if args.
|
|
154
|
-
|
|
155
|
-
print(f"
|
|
153
|
+
if args.decondense:
|
|
154
|
+
decondense_file(args.path)
|
|
155
|
+
print(f"decondenseed: {args.path}")
|
|
156
156
|
return 0
|
|
157
|
-
backup =
|
|
158
|
-
print(f"
|
|
157
|
+
backup = condense_file(args.path)
|
|
158
|
+
print(f"condensed: {args.path} (backup: {backup})")
|
|
159
159
|
return 0
|
|
160
160
|
except SensitivePathError as exc:
|
|
161
161
|
print(f"error: refused: {exc}", file=sys.stderr)
|
|
162
162
|
return 2
|
|
163
|
-
except
|
|
163
|
+
except CondensationRefused as exc:
|
|
164
164
|
print(f"error: {exc}", file=sys.stderr)
|
|
165
165
|
return 3
|
|
166
166
|
except FileNotFoundError as exc:
|
|
@@ -34,7 +34,7 @@ logger = logging.getLogger(__name__)
|
|
|
34
34
|
PRESET_ID_ENV = "AGENT_CONFIG_PRESET_ID"
|
|
35
35
|
SEED_PRESET_IDS: tuple[str, ...] = ("fast", "balanced", "strict")
|
|
36
36
|
DEFAULT_PRESET_ID = "balanced"
|
|
37
|
-
PRESETS_DIRNAME = ".agent-src.
|
|
37
|
+
PRESETS_DIRNAME = ".agent-src.uncondensed/presets"
|
|
38
38
|
|
|
39
39
|
SOURCE_PACK = "pack"
|
|
40
40
|
SOURCE_PROFILE = "profile"
|
|
@@ -94,7 +94,7 @@ def _load_yaml(path: Path) -> dict[str, Any]:
|
|
|
94
94
|
|
|
95
95
|
def _preset_file(project_root: Path, preset_id: str) -> Path:
|
|
96
96
|
# Legacy single-root layout — honor when present so tests that mock a
|
|
97
|
-
# ``.agent-src.
|
|
97
|
+
# ``.agent-src.uncondensed/`` sub-tree under ``project_root`` keep working.
|
|
98
98
|
legacy = project_root / PRESETS_DIRNAME / f"{preset_id}.yml"
|
|
99
99
|
if legacy.exists():
|
|
100
100
|
return legacy
|
|
@@ -40,7 +40,7 @@ SEED_PROFILE_IDS: tuple[str, ...] = (
|
|
|
40
40
|
"ops",
|
|
41
41
|
)
|
|
42
42
|
DEFAULT_PROFILE_ID = "developer"
|
|
43
|
-
PROFILES_DIRNAME = ".agent-src.
|
|
43
|
+
PROFILES_DIRNAME = ".agent-src.uncondensed/profiles"
|
|
44
44
|
|
|
45
45
|
SOURCE_PACK = "pack"
|
|
46
46
|
SOURCE_USER = "user-settings"
|
|
@@ -27,7 +27,7 @@ def _load(path: Path) -> list[dict]:
|
|
|
27
27
|
def group(rows: list[dict]) -> dict:
|
|
28
28
|
by_conv: dict = defaultdict(lambda: {
|
|
29
29
|
"sessions": 0, "total_cost_usd": 0.0, "input_tokens": 0,
|
|
30
|
-
"output_tokens": 0, "
|
|
30
|
+
"output_tokens": 0, "telegraph_delta_tokens": 0,
|
|
31
31
|
"by_model": defaultdict(lambda: {"sessions": 0, "cost_usd": 0.0}),
|
|
32
32
|
})
|
|
33
33
|
for row in rows:
|
|
@@ -38,7 +38,7 @@ def group(rows: list[dict]) -> dict:
|
|
|
38
38
|
b["total_cost_usd"] += cost
|
|
39
39
|
b["input_tokens"] += int(row.get("input_tokens") or 0)
|
|
40
40
|
b["output_tokens"] += int(row.get("output_tokens") or 0)
|
|
41
|
-
b["
|
|
41
|
+
b["telegraph_delta_tokens"] += int(row.get("telegraph_delta_tokens") or 0)
|
|
42
42
|
m = b["by_model"][str(row.get("model") or "unknown")]
|
|
43
43
|
m["sessions"] += 1
|
|
44
44
|
m["cost_usd"] += cost
|
|
@@ -53,7 +53,7 @@ def render_text(report: dict) -> str:
|
|
|
53
53
|
lines.append(
|
|
54
54
|
f" {cid}: {b['sessions']} sessions · ${b['total_cost_usd']:.4f} · "
|
|
55
55
|
f"in {b['input_tokens']:,} · out {b['output_tokens']:,} · "
|
|
56
|
-
f"
|
|
56
|
+
f"telegraph_delta {b['telegraph_delta_tokens']:+,}"
|
|
57
57
|
)
|
|
58
58
|
for model, m in sorted(b["by_model"].items()):
|
|
59
59
|
lines.append(f" {model}: {m['sessions']} sessions · ${m['cost_usd']:.4f}")
|