@event4u/agent-config 14.10.0 → 14.12.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/.augment-plugin/marketplace.json +3 -3
- package/.augment-plugin/plugin.json +1 -1
- package/.claude-plugin/marketplace.json +1 -1
- package/CHANGELOG.md +161 -208
- package/README.md +1 -1
- package/dist/agent-src/commands/design.md +88 -0
- package/dist/agent-src/commands/project/analyze.md +47 -0
- package/dist/agent-src/commands/review/changes.md +67 -6
- package/dist/agent-src/commands/roadmap/create.md +49 -0
- package/dist/agent-src/commands/roadmap/next.md +27 -11
- package/dist/agent-src/commands/roadmap/process-full.md +14 -0
- package/dist/agent-src/commands/video/from-script.md +60 -3
- package/dist/agent-src/commands/video/stitch.md +14 -0
- package/dist/agent-src/contexts/communication/rules-auto/guidelines-mechanics.md +1 -0
- package/dist/agent-src/contexts/execution/evidence-discipline.md +26 -0
- package/dist/agent-src/contexts/execution/roadmap-process-loop.md +154 -2
- package/dist/agent-src/rules/active-remediation.md +3 -3
- package/dist/agent-src/rules/code-provenance.md +2 -2
- package/dist/agent-src/rules/context-hygiene.md +13 -33
- package/dist/agent-src/rules/council-availability.md +2 -2
- package/dist/agent-src/rules/decision-revisit-gate.md +3 -1
- package/dist/agent-src/rules/design-fidelity.md +18 -0
- package/dist/agent-src/rules/design-review-after-ui-write.md +2 -2
- package/dist/agent-src/rules/evaluator-independence.md +56 -44
- package/dist/agent-src/rules/fix-what-you-see.md +9 -1
- package/dist/agent-src/rules/framework-neutrality-in-generic-skills.md +1 -1
- package/dist/agent-src/rules/minimal-safe-diff.md +14 -20
- package/dist/agent-src/rules/missing-skill-recovery.md +13 -1
- package/dist/agent-src/rules/playbook-precedence.md +105 -0
- package/dist/agent-src/rules/recurring-criticism.md +3 -1
- package/dist/agent-src/rules/roadmap-progress-sync.md +14 -13
- package/dist/agent-src/rules/scale-discipline.md +24 -0
- package/dist/agent-src/rules/security-sensitive-stop.md +2 -2
- package/dist/agent-src/rules/settings-ask-protocol.md +2 -2
- package/dist/agent-src/rules/ui-audit-gate.md +27 -15
- package/dist/agent-src/rules/untrusted-input-defense.md +2 -2
- package/dist/agent-src/skills/accessibility-auditor/SKILL.md +19 -0
- package/dist/agent-src/skills/adr-create/SKILL.md +7 -0
- package/dist/agent-src/skills/agents-md-thin-root/SKILL.md +33 -0
- package/dist/agent-src/skills/ai-council/references/advanced-modes.md +17 -3
- package/dist/agent-src/skills/ai-council/references/output-and-synthesis.md +31 -0
- package/dist/agent-src/skills/ai-council/references/procedure.md +19 -0
- package/dist/agent-src/skills/alerting-doctrine/SKILL.md +225 -0
- package/dist/agent-src/skills/authz-review/SKILL.md +0 -1
- package/dist/agent-src/skills/blast-radius-analyzer/SKILL.md +32 -0
- package/dist/agent-src/skills/brand/SKILL.md +3 -0
- package/dist/agent-src/skills/brand-asset-generation/SKILL.md +3 -0
- package/dist/agent-src/skills/brand-audit/SKILL.md +3 -0
- package/dist/agent-src/skills/brand-identity/SKILL.md +3 -0
- package/dist/agent-src/skills/brand-strategy/SKILL.md +3 -0
- package/dist/agent-src/skills/brand-to-tokens/SKILL.md +3 -0
- package/dist/agent-src/skills/check-refs/SKILL.md +3 -0
- package/dist/agent-src/skills/code-refactoring/SKILL.md +45 -1
- package/dist/agent-src/skills/code-review/SKILL.md +75 -5
- package/dist/agent-src/skills/command-routing/SKILL.md +6 -0
- package/dist/agent-src/skills/command-writing/SKILL.md +35 -0
- package/dist/agent-src/skills/condense-memory/SKILL.md +3 -0
- package/dist/agent-src/skills/context-authoring/SKILL.md +1 -1
- package/dist/agent-src/skills/conventional-commits-writing/SKILL.md +3 -0
- package/dist/agent-src/skills/copilot-agents-optimization/SKILL.md +10 -0
- package/dist/agent-src/skills/corpus-grounding/SKILL.md +3 -0
- package/dist/agent-src/skills/design-intelligence/SKILL.md +3 -0
- package/dist/agent-src/skills/design-intelligence/data/landing.csv +36 -35
- package/dist/agent-src/skills/design-intelligence/data/stacks/threejs.csv +1 -0
- package/dist/agent-src/skills/design-review/SKILL.md +79 -1
- package/dist/agent-src/skills/design-review/references/verification-automation.md +41 -0
- package/dist/agent-src/skills/design-system-capture/SKILL.md +35 -40
- package/dist/agent-src/skills/design-system-capture/references/import-procedure.md +50 -0
- package/dist/agent-src/skills/design-tokens/SKILL.md +3 -0
- package/dist/agent-src/skills/design-variations/SKILL.md +3 -0
- package/dist/agent-src/skills/developer-like-execution/SKILL.md +3 -0
- package/dist/agent-src/skills/estimate-ticket/SKILL.md +3 -0
- package/dist/agent-src/skills/existing-ui-audit/SKILL.md +28 -4
- package/dist/agent-src/skills/fe-design/SKILL.md +74 -41
- package/dist/agent-src/skills/fe-design/references/craft-floor.md +52 -0
- package/dist/agent-src/skills/fe-design/references/source-led-port.md +36 -0
- package/dist/agent-src/skills/file-editor/SKILL.md +5 -0
- package/dist/agent-src/skills/finishing-a-development-branch/SKILL.md +2 -2
- package/dist/agent-src/skills/git-workflow/SKILL.md +3 -0
- package/dist/agent-src/skills/html-deck/SKILL.md +3 -0
- package/dist/agent-src/skills/iconography/SKILL.md +3 -0
- package/dist/agent-src/skills/image-editing/SKILL.md +3 -0
- package/dist/agent-src/skills/image-generation/SKILL.md +3 -0
- package/dist/agent-src/skills/image-provider-routing/SKILL.md +3 -0
- package/dist/agent-src/skills/incident-commander/SKILL.md +10 -0
- package/dist/agent-src/skills/js-library-packaging/SKILL.md +173 -0
- package/dist/agent-src/skills/js-library-packaging/scripts/check_package_surface.ts +270 -0
- package/dist/agent-src/skills/laravel-migration/SKILL.md +3 -0
- package/dist/agent-src/skills/learning-to-rule-or-skill/SKILL.md +3 -0
- package/dist/agent-src/skills/lint-skills/SKILL.md +3 -0
- package/dist/agent-src/skills/llm-provider-knowledge/SKILL.md +3 -0
- package/dist/agent-src/skills/logging-monitoring/SKILL.md +234 -51
- package/dist/agent-src/skills/logo-generation/SKILL.md +3 -0
- package/dist/agent-src/skills/md-language-check/SKILL.md +3 -0
- package/dist/agent-src/skills/monorepo-workspace/SKILL.md +149 -0
- package/dist/agent-src/skills/motion-choreographer/SKILL.md +6 -0
- package/dist/agent-src/skills/multi-tenancy/SKILL.md +4 -0
- package/dist/agent-src/skills/operational-readiness/SKILL.md +184 -0
- package/dist/agent-src/skills/override-management/SKILL.md +3 -0
- package/dist/agent-src/skills/persona-improvement/SKILL.md +3 -0
- package/dist/agent-src/skills/pest-testing/SKILL.md +3 -0
- package/dist/agent-src/skills/playbook-authoring/SKILL.md +162 -0
- package/dist/agent-src/skills/playwright-testing/SKILL.md +3 -0
- package/dist/agent-src/skills/privacy-review/SKILL.md +3 -0
- package/dist/agent-src/skills/project-analysis-core/SKILL.md +23 -0
- package/dist/agent-src/skills/prompt-engineering-image/SKILL.md +3 -0
- package/dist/agent-src/skills/quality-tools/SKILL.md +5 -0
- package/dist/agent-src/skills/react-shadcn-ui/SKILL.md +81 -33
- package/dist/agent-src/skills/readme-reviewer/SKILL.md +3 -0
- package/dist/agent-src/skills/readme-writing/SKILL.md +3 -0
- package/dist/agent-src/skills/readme-writing-package/SKILL.md +3 -0
- package/dist/agent-src/skills/receiving-code-review/SKILL.md +2 -2
- package/dist/agent-src/skills/refine-prompt/SKILL.md +3 -0
- package/dist/agent-src/skills/refine-ticket/SKILL.md +3 -0
- package/dist/agent-src/skills/requesting-code-review/SKILL.md +2 -2
- package/dist/agent-src/skills/review-routing/SKILL.md +2 -2
- package/dist/agent-src/skills/roadmap-writing/SKILL.md +23 -41
- package/dist/agent-src/skills/roadmap-writing/references/follow-up-roadmap-shape.md +47 -0
- package/dist/agent-src/skills/rtk-output-filtering/SKILL.md +22 -6
- package/dist/agent-src/skills/runway-cognition/SKILL.md +3 -0
- package/dist/agent-src/skills/scene-expander/scene-blueprint.schema.yaml +26 -0
- package/dist/agent-src/skills/secrets-management/SKILL.md +4 -0
- package/dist/agent-src/skills/server-hardening/SKILL.md +159 -0
- package/dist/agent-src/skills/skill-improvement-pipeline/SKILL.md +3 -0
- package/dist/agent-src/skills/skill-management/SKILL.md +3 -0
- package/dist/agent-src/skills/skill-reviewer/SKILL.md +3 -0
- package/dist/agent-src/skills/skill-writing/SKILL.md +6 -0
- package/dist/agent-src/skills/skill-writing/references/procedure.md +24 -2
- package/dist/agent-src/skills/spreadsheet-authoring/SKILL.md +3 -0
- package/dist/agent-src/skills/storybook-workshop/SKILL.md +203 -0
- package/dist/agent-src/skills/storybook-workshop/scripts/story_contrast_floor.ts +134 -0
- package/dist/agent-src/skills/subagent-orchestration/SKILL.md +1 -1
- package/dist/agent-src/skills/subagent-orchestration/prompts/README.md +25 -0
- package/dist/agent-src/skills/supply-chain-intake/SKILL.md +12 -0
- package/dist/agent-src/skills/systematic-debugging/SKILL.md +1 -1
- package/dist/agent-src/skills/terraform/SKILL.md +3 -0
- package/dist/agent-src/skills/test-driven-development/SKILL.md +1 -1
- package/dist/agent-src/skills/threat-modeling/SKILL.md +0 -3
- package/dist/agent-src/skills/token-optimizer/SKILL.md +3 -0
- package/dist/agent-src/skills/typography-system/SKILL.md +3 -0
- package/dist/agent-src/skills/ui-component-architect/SKILL.md +17 -1
- package/dist/agent-src/skills/upstream-contribute/SKILL.md +3 -0
- package/dist/agent-src/skills/validate-feature-fit/SKILL.md +3 -0
- package/dist/agent-src/skills/verify-completion-evidence/SKILL.md +2 -2
- package/dist/agent-src/skills/wireframe/SKILL.md +3 -0
- package/dist/agent-src/skills/wireframe/references/story-beat-ledger.schema.json +115 -0
- package/dist/agent-src/skills/workspace-link/SKILL.md +131 -0
- package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
- package/dist/agent-src/templates/playbook.md +75 -0
- package/dist/agent-src/templates/roadmaps.md +37 -0
- package/dist/agent-src/templates/scripts/check_playbook_invokes.ts +231 -0
- package/dist/agent-src/templates/scripts/work_engine/directives/ui/apply.ts +24 -0
- package/dist/agent-src/templates/scripts/work_engine/directives/ui/polish.ts +2 -0
- package/dist/agent-src/templates/scripts/work_engine/directives/ui/review.ts +216 -0
- package/dist/agent-src/templates/scripts/work_engine/directives/ui/scaffold.ts +159 -0
- package/dist/agent-src/templates/scripts/work_engine/directives/ui/stack_bundles.ts +73 -4
- package/dist/agent-src/templates/scripts/work_engine/stack/detect.ts +325 -40
- package/dist/cli/commands/uiAudit.js +221 -0
- package/dist/cli/commands/uiRender.js +206 -0
- package/dist/cli/main.js +22 -1
- package/dist/cli/mcp/content.js +64 -1
- package/dist/cli/mcp/dispatch.js +175 -10
- package/dist/cli/registry.js +3 -0
- package/dist/cli-delegate/{chunk-G23AT6GD.js → chunk-DMSZHXZS.js} +57 -1
- package/dist/cli-delegate/{chunk-77GR3VD4.js → chunk-FF7WAFMR.js} +58 -3
- package/dist/cli-delegate/{chunk-YM4GZDJG.js → chunk-JCW7ZLHK.js} +10 -0
- package/dist/cli-delegate/{chunk-H4VIVD4C.js → chunk-JJA2QEWA.js} +413 -391
- package/dist/cli-delegate/{chunk-PLSG6UL5.js → chunk-K4FFODTS.js} +341 -204
- package/dist/cli-delegate/{chunk-B2ERU2VA.js → chunk-WOKWX5PL.js} +1 -1
- package/dist/cli-delegate/cmd_brand_status.js +8 -6
- package/dist/cli-delegate/cmd_conformance.js +3 -3
- package/dist/cli-delegate/cmd_doctor.js +3 -3
- package/dist/cli-delegate/cmd_export.js +4 -4
- package/dist/cli-delegate/cmd_handoff.js +1 -1
- package/dist/cli-delegate/cmd_preflight.js +2 -2
- package/dist/cli-delegate/cmd_prune.js +4 -4
- package/dist/cli-delegate/cmd_session_recycle.js +70 -9
- package/dist/cli-delegate/cmd_settings_migrate.js +4 -4
- package/dist/cli-delegate/cmd_settings_set.js +1 -1
- package/dist/cli-delegate/cmd_sync.js +4 -4
- package/dist/cli-delegate/cmd_uninstall.js +4 -4
- package/dist/cli-delegate/cmd_validate.js +4 -4
- package/dist/discovery/deprecation-report.md +1 -1
- package/dist/discovery/discovery-manifest.json +362 -127
- package/dist/discovery/discovery-manifest.json.sha256 +1 -1
- package/dist/discovery/discovery-manifest.summary.md +4 -4
- package/dist/discovery/dormancy-report.md +1 -1
- package/dist/discovery/orphan-report.md +1 -1
- package/dist/discovery/packs.json +18 -8
- package/dist/discovery/trust-report.md +3 -3
- package/dist/discovery/workspaces.json +16 -6
- package/dist/hooks/dispatch.js +2575 -1472
- package/dist/install/install.mjs +800 -708
- package/dist/mcp/registry-manifest.json +3 -3
- package/dist/mcp/server.json +2 -2
- package/dist/mcp/server.mjs +1685 -1250
- package/dist/router.json +1 -1
- package/dist/scripts/_lib/lean_projection_mode.js +40 -0
- package/dist/scripts/_lib/scoped_projection.js +84 -0
- package/dist/scripts/_lib/ui_surface.js +89 -0
- package/dist/scripts/condense.js +6 -10
- package/dist/scripts/project_thin_rules.js +40 -2
- package/dist/server/schemas/settings.js +6 -0
- package/dist/shared/skillRanking.js +159 -0
- package/docs/contracts/provider-lifecycle.md +47 -18
- package/docs/contracts/settings-classes.md +35 -5
- package/docs/guidelines/agent-infra/context-hygiene-mechanics.md +49 -0
- package/docs/guidelines/agent-infra/downstream-changes-mechanics.md +91 -0
- package/docs/guidelines/agent-infra/evaluator-independence-mechanics.md +92 -0
- package/docs/guidelines/agent-infra/minimal-safe-diff-mechanics.md +45 -1
- package/docs/guidelines/agent-infra/roadmap-deferred-resolution-provenance.md +54 -0
- package/docs/guidelines/code-clarity.md +21 -0
- package/docs/guidelines/design-antipatterns.md +4 -2
- package/docs/guidelines/design-asset-discipline.md +38 -0
- package/docs/guidelines/design-fidelity-mechanics.md +45 -29
- package/docs/guidelines/design-handover-extraction.md +35 -5
- package/docs/guidelines/design-modes.md +41 -1
- package/docs/guidelines/monorepo-antipatterns.md +141 -0
- package/docs/guidelines/redundancy-taxonomy.md +180 -0
- package/llms.txt +50 -39
- package/package.json +6 -2
- package/src/agent-src/templates/scripts/check_playbook_invokes.ts +231 -0
- package/src/agent-src/templates/scripts/work_engine/directives/ui/apply.ts +24 -0
- package/src/agent-src/templates/scripts/work_engine/directives/ui/polish.ts +2 -0
- package/src/agent-src/templates/scripts/work_engine/directives/ui/review.ts +216 -0
- package/src/agent-src/templates/scripts/work_engine/directives/ui/scaffold.ts +159 -0
- package/src/agent-src/templates/scripts/work_engine/directives/ui/stack_bundles.ts +73 -4
- package/src/agent-src/templates/scripts/work_engine/stack/detect.ts +325 -40
- package/src/config/agent-settings.template.yml +44 -0
- package/src/config/assurance-capability-registry.json +223 -0
- package/src/config/assurance-threshold-budget.json +65 -0
- package/src/config/budgets.yml +19 -0
- package/src/config/ci-local-parity.yml +29 -0
- package/src/config/discovery/prompt-patterns.yml +56 -0
- package/src/config/discovery/unassigned-artefacts.yml +2 -0
- package/src/config/dispatch-economy-metrics.json +4 -2
- package/src/config/estate-count-budget.json +8 -3
- package/src/config/evaluator-budgets.json +14 -14
- package/src/config/gate-coverage.yml +392 -8
- package/src/config/gate-violation-baselines.json +76 -72
- package/src/config/hook-latency-budget.json +1 -0
- package/src/config/hook-token-budget.json +137 -125
- package/src/config/pack-size-budget.json +39 -10
- package/src/config/preamble-payload-budget.json +97 -71
- package/src/config/quorum-attendance-budget.json +12 -4
- package/src/config/routing-coverage-seed.json +29 -0
- package/src/config/rule-activation-census.json +7 -3
- package/src/config/rule-enforcement-baseline.json +0 -1
- package/src/config/rule-stub-ceilings.json +112 -91
- package/src/config/suggestion-capture.json +28 -0
- package/src/config/surface-matrix.yml +21 -2
- package/src/config/web-launch-readiness.json +188 -0
- package/src/scripts/_cli/cmd_doctor.ts +15 -16
- package/src/scripts/_cli/doctor_install_mode.ts +49 -0
- package/src/scripts/_cli/doctor_overrides.ts +154 -0
- package/src/scripts/_dispatch.bash +17 -0
- package/src/scripts/_lib/as_of.ts +412 -0
- package/src/scripts/_lib/exec_evidence.ts +7 -0
- package/src/scripts/_lib/gate_baseline.ts +150 -1
- package/src/scripts/_lib/hook_settings.ts +33 -0
- package/src/scripts/_lib/host_listing_model.ts +192 -0
- package/src/scripts/_lib/lean_projection_mode.ts +44 -0
- package/src/scripts/_lib/mcp_bridge.ts +199 -0
- package/src/scripts/_lib/review_independence.ts +62 -10
- package/src/scripts/_lib/rule_injection.ts +239 -0
- package/src/scripts/_lib/run_checkpoint.ts +54 -1
- package/src/scripts/_lib/scoped_projection.ts +96 -0
- package/src/scripts/_lib/session_register.ts +44 -2
- package/src/scripts/_lib/skill_catalogue.ts +38 -2
- package/src/scripts/_lib/skill_estate.ts +115 -0
- package/src/scripts/_lib/transcript_reads.ts +207 -0
- package/src/scripts/_lib/ui_authority.ts +343 -0
- package/src/scripts/ai-video/adapters/fal.sh +8 -3
- package/src/scripts/ai-video/adapters/gemini-veo.sh +10 -0
- package/src/scripts/ai-video/adapters/higgsfield.sh +10 -2
- package/src/scripts/ai-video/adapters/kling.sh +10 -0
- package/src/scripts/ai-video/adapters/sora.sh +10 -0
- package/src/scripts/ai-video/lib/calibrate-cost.sh +145 -0
- package/src/scripts/ai-video/lib/model-capabilities/README.md +53 -7
- package/src/scripts/ai-video/lib/model-capabilities/comfyui.json +15 -3
- package/src/scripts/ai-video/lib/model-capabilities/fal.json +36 -6
- package/src/scripts/ai-video/lib/model-capabilities/gemini-veo.json +23 -0
- package/src/scripts/ai-video/lib/model-capabilities/higgsfield.json +23 -0
- package/src/scripts/ai-video/lib/model-capabilities/kling.json +23 -0
- package/src/scripts/ai-video/lib/model-capabilities/musetalk.json +8 -2
- package/src/scripts/ai-video/lib/model-capabilities/replicate.json +36 -6
- package/src/scripts/ai-video/lib/model-capabilities/sora.json +45 -0
- package/src/scripts/ai-video/lib/model-capabilities/syncso.json +8 -2
- package/src/scripts/ai-video/lib/parse-blueprint.sh +52 -5
- package/src/scripts/ai-video/lib/resume-scan.sh +92 -3
- package/src/scripts/ai-video/lib/seam-plan.sh +212 -0
- package/src/scripts/ai-video/smoke-trace.sh +450 -2
- package/src/scripts/ai-video/stitch.sh +191 -10
- package/src/scripts/ai-video/test-pipeline.sh +84 -6
- package/src/scripts/ai_council/argument_exhaustion.ts +130 -0
- package/src/scripts/ai_council/cli_agency_bounds.ts +139 -0
- package/src/scripts/ai_council/cli_least_agency_canary.ts +347 -0
- package/src/scripts/ai_council/clients.ts +3 -2
- package/src/scripts/ai_council/consensus.ts +63 -6
- package/src/scripts/ai_council/events_log.ts +46 -1
- package/src/scripts/ai_council/orchestrator.ts +103 -108
- package/src/scripts/ai_council/orchestrator_results.ts +166 -0
- package/src/scripts/ai_council/prompts.ts +12 -5
- package/src/scripts/ai_council/quorum.ts +82 -1
- package/src/scripts/ai_council/quorum_wiring.ts +82 -5
- package/src/scripts/ai_council/stance_tally.ts +22 -0
- package/src/scripts/bench_hook_latency.ts +62 -0
- package/src/scripts/build_proof.ts +12 -1
- package/src/scripts/capture_skill_catalogue.ts +21 -0
- package/src/scripts/check_always_budget.ts +2 -1
- package/src/scripts/check_augmentignore.ts +2 -1
- package/src/scripts/check_beta_review_markers.ts +2 -1
- package/src/scripts/check_bundle_path_leakage.ts +162 -7
- package/src/scripts/check_command_examples.ts +557 -0
- package/src/scripts/check_composite_arming.ts +364 -0
- package/src/scripts/check_corpus_staleness.ts +2 -1
- package/src/scripts/check_council_pin_staleness.ts +3 -1
- package/src/scripts/check_enforcement_coverage.ts +116 -3
- package/src/scripts/check_enforcement_denominator.ts +365 -0
- package/src/scripts/check_estate_count.ts +122 -3
- package/src/scripts/check_gate_coverage.ts +2 -1
- package/src/scripts/check_hook_bundle_freshness.ts +13 -1
- package/src/scripts/check_knowledge_cards.ts +2 -1
- package/src/scripts/check_knowledge_pages.ts +3 -2
- package/src/scripts/check_memory.ts +2 -1
- package/src/scripts/check_no_automerge_key.ts +287 -0
- package/src/scripts/check_pack_conformance_fixture.ts +565 -0
- package/src/scripts/check_preamble_payload_budget.ts +30 -3
- package/src/scripts/check_proposal.ts +2 -1
- package/src/scripts/check_reach_staleness.ts +2 -1
- package/src/scripts/check_release_adjacent_health.ts +2 -1
- package/src/scripts/check_release_pr_shape.ts +5 -0
- package/src/scripts/check_review_schema.ts +34 -1
- package/src/scripts/check_roadmap_trackable.ts +48 -3
- package/src/scripts/check_routing_coverage.ts +352 -0
- package/src/scripts/check_score_contract.ts +505 -0
- package/src/scripts/check_skill_admissions.ts +514 -0
- package/src/scripts/check_source_size_budget.ts +2 -1
- package/src/scripts/check_standing_payload_delta.ts +505 -0
- package/src/scripts/check_trigger_evals.ts +2 -1
- package/src/scripts/check_web_launch_readiness.ts +705 -0
- package/src/scripts/classify_change_risk.ts +281 -0
- package/src/scripts/compute_skill_tiers.ts +186 -0
- package/src/scripts/condense.ts +8 -13
- package/src/scripts/council_attendance_metrics.ts +183 -0
- package/src/scripts/council_cli.ts +10 -8
- package/src/scripts/council_parse_rate.ts +116 -0
- package/src/scripts/derive_playbooks.ts +406 -0
- package/src/scripts/description_route_check.ts +494 -0
- package/src/scripts/design_slop_rules.ts +56 -2
- package/src/scripts/dispatch_r2_reviewer.ts +16 -0
- package/src/scripts/frontend_corpus_hash.ts +116 -0
- package/src/scripts/grade_target_readiness.ts +478 -0
- package/src/scripts/hook_manifest.json +1 -1
- package/src/scripts/hook_manifest.yaml +124 -16
- package/src/scripts/hooks/concern_registry.ts +6 -0
- package/src/scripts/hooks/design_pass_hook.ts +356 -0
- package/src/scripts/hooks/rtk_wrap_hook.ts +30 -7
- package/src/scripts/hooks/rule_inject_hook.ts +318 -0
- package/src/scripts/hooks/suggestion_capture_hook.ts +368 -0
- package/src/scripts/hot_context_hook.ts +74 -7
- package/src/scripts/install.ts +40 -89
- package/src/scripts/lint_adapter_tier.ts +663 -0
- package/src/scripts/lint_archived_skills.ts +93 -0
- package/src/scripts/lint_budget_ownership.ts +56 -5
- package/src/scripts/lint_deterministic_time.ts +470 -0
- package/src/scripts/lint_framework_leakage.ts +5 -0
- package/src/scripts/lint_handoffs.ts +525 -1
- package/src/scripts/lint_judge_prompt_expectation.ts +155 -0
- package/src/scripts/lint_marketplace.ts +88 -0
- package/src/scripts/lint_media_policy_linkage.ts +140 -1
- package/src/scripts/lint_one_off_age.ts +6 -1
- package/src/scripts/lint_override_kernel_guard.ts +87 -5
- package/src/scripts/lint_roadmap_complexity.ts +56 -0
- package/src/scripts/lint_rule_enforcement_declaration.ts +24 -7
- package/src/scripts/lint_rule_norm_pin.ts +321 -0
- package/src/scripts/lint_skill_trigger_corpus.ts +349 -0
- package/src/scripts/lint_spawn_payload.ts +42 -5
- package/src/scripts/lint_symptom_intake.ts +2 -1
- package/src/scripts/mcp_parity_smoke.ts +30 -4
- package/src/scripts/mcp_render.ts +66 -1
- package/src/scripts/mcp_tool_fingerprint.ts +241 -0
- package/src/scripts/measure_risk_class_drift.ts +140 -0
- package/src/scripts/measure_skill_ranker_baseline.ts +212 -0
- package/src/scripts/media/lib/adapter-common.sh +211 -1
- package/src/scripts/media/lib/adapter-contract.md +74 -6
- package/src/scripts/model_rule_injection.ts +907 -0
- package/src/scripts/pack_install_smoke.ts +363 -0
- package/src/scripts/pr_conflict_census.ts +187 -0
- package/src/scripts/project_thin_rules.ts +45 -2
- package/src/scripts/release.ts +66 -860
- package/src/scripts/release_drill.ts +59 -3
- package/src/scripts/release_env.ts +298 -0
- package/src/scripts/release_publication.ts +720 -0
- package/src/scripts/report_pack_delta.ts +204 -0
- package/src/scripts/roadmap_context.ts +778 -0
- package/src/scripts/schemas/fidelity-measurement-sheet.schema.json +169 -0
- package/src/scripts/schemas/rule.schema.json +24 -2
- package/src/scripts/schemas/skill.schema.json +39 -0
- package/src/scripts/schemas/ui-authority.schema.json +114 -0
- package/src/scripts/select_analysis_mode.ts +112 -0
- package/src/scripts/session_register_hook.ts +29 -3
- package/src/scripts/sessions_cli.ts +67 -3
- package/src/scripts/skill_tools/score_skill_relevance.ts +36 -53
- package/src/scripts/sync_pr_branch.ts +40 -1
- package/src/scripts/token_sink_report.ts +239 -0
- package/src/scripts/trigger_coverage.ts +122 -3
- package/src/scripts/update_counts.ts +7 -3
- package/src/scripts/validate_frontmatter.ts +66 -0
- package/src/server/schemas/settings.ts +10 -0
- package/src/shared/skillRanking.ts +183 -0
- package/dist/agent-src/skills/accessibility-auditor/evals/evals.json +0 -15
- package/dist/agent-src/skills/agent-security-review/evals/triggers.json +0 -52
- package/dist/agent-src/skills/ai-code-blindspots/evals/triggers.json +0 -52
- package/dist/agent-src/skills/analysis-skill-router/evals/evals.json +0 -13
- package/dist/agent-src/skills/brand/evals/triggers.json +0 -17
- package/dist/agent-src/skills/brand-asset-generation/evals/triggers.json +0 -17
- package/dist/agent-src/skills/brand-audit/evals/triggers.json +0 -17
- package/dist/agent-src/skills/brand-identity/evals/triggers.json +0 -17
- package/dist/agent-src/skills/brand-strategy/evals/triggers.json +0 -17
- package/dist/agent-src/skills/brand-to-tokens/evals/triggers.json +0 -17
- package/dist/agent-src/skills/bug-analyzer/evals/evals.json +0 -13
- package/dist/agent-src/skills/canvas-design/evals/triggers.json +0 -17
- package/dist/agent-src/skills/character-consistency/evals/evals.json +0 -16
- package/dist/agent-src/skills/code-intelligence/evals/triggers.json +0 -52
- package/dist/agent-src/skills/code-review/evals/evals.json +0 -100
- package/dist/agent-src/skills/command-routing/evals/evals.json +0 -14
- package/dist/agent-src/skills/complexity-first-planning/evals/triggers.json +0 -17
- package/dist/agent-src/skills/contract-review/evals/triggers.json +0 -17
- package/dist/agent-src/skills/conventional-commits-writing/evals/evals.json +0 -15
- package/dist/agent-src/skills/corpus-grounding/evals/triggers.json +0 -17
- package/dist/agent-src/skills/dashboard-design/evals/evals.json +0 -16
- package/dist/agent-src/skills/dcf-modeling/evals/domain-truth.json +0 -29
- package/dist/agent-src/skills/dcf-modeling/evals/evals.json +0 -20
- package/dist/agent-src/skills/decision-record/evals/evals.json +0 -20
- package/dist/agent-src/skills/decision-record/evals/triggers.json +0 -87
- package/dist/agent-src/skills/design-intelligence/evals/evals.json +0 -14
- package/dist/agent-src/skills/design-intelligence/evals/triggers.json +0 -17
- package/dist/agent-src/skills/design-system-capture/evals/evals.json +0 -15
- package/dist/agent-src/skills/design-tokens/evals/triggers.json +0 -17
- package/dist/agent-src/skills/design-variations/evals/triggers.json +0 -17
- package/dist/agent-src/skills/developer-like-execution/evals/evals.json +0 -16
- package/dist/agent-src/skills/doc-coauthoring/evals/evals.json +0 -16
- package/dist/agent-src/skills/doc-coauthoring/evals/triggers.json +0 -17
- package/dist/agent-src/skills/docx-authoring/evals/triggers.json +0 -52
- package/dist/agent-src/skills/dpa-review/evals/triggers.json +0 -17
- package/dist/agent-src/skills/editorial-calendar/evals/domain-truth.json +0 -16
- package/dist/agent-src/skills/editorial-calendar/evals/evals.json +0 -16
- package/dist/agent-src/skills/eloquent/evals/triggers.json +0 -17
- package/dist/agent-src/skills/estimate-ticket/evals/evals.json +0 -16
- package/dist/agent-src/skills/estimate-ticket/evals/output-schema.yml +0 -20
- package/dist/agent-src/skills/estimate-ticket/evals/triggers.json +0 -19
- package/dist/agent-src/skills/evaluate-llm-feature/evals/triggers.json +0 -52
- package/dist/agent-src/skills/existing-ui-audit/evals/triggers.json +0 -47
- package/dist/agent-src/skills/experiment-loop/evals/output-schema.yml +0 -27
- package/dist/agent-src/skills/experiment-loop/evals/triggers.json +0 -17
- package/dist/agent-src/skills/fe-design/evals/triggers.json +0 -55
- package/dist/agent-src/skills/forecasting/evals/domain-truth.json +0 -29
- package/dist/agent-src/skills/forecasting/evals/evals.json +0 -20
- package/dist/agent-src/skills/forensics-report/evals/triggers.json +0 -17
- package/dist/agent-src/skills/frontend-render-security/evals/triggers.json +0 -52
- package/dist/agent-src/skills/fundraising-narrative/evals/domain-truth.json +0 -16
- package/dist/agent-src/skills/fundraising-narrative/evals/evals.json +0 -16
- package/dist/agent-src/skills/gated-reach/evals/triggers.json +0 -72
- package/dist/agent-src/skills/github-ci/evals/evals.json +0 -25
- package/dist/agent-src/skills/history-design/evals/triggers.json +0 -17
- package/dist/agent-src/skills/html-deck/evals/triggers.json +0 -17
- package/dist/agent-src/skills/humanizer/evals/strip_fixtures.json +0 -57
- package/dist/agent-src/skills/humanizer/evals/triggers.json +0 -17
- package/dist/agent-src/skills/iconography/evals/triggers.json +0 -17
- package/dist/agent-src/skills/image-analyser/evals/triggers.json +0 -17
- package/dist/agent-src/skills/image-creator/evals/triggers.json +0 -17
- package/dist/agent-src/skills/image-editing/evals/triggers.json +0 -17
- package/dist/agent-src/skills/image-generation/evals/triggers.json +0 -17
- package/dist/agent-src/skills/image-provider-routing/evals/triggers.json +0 -17
- package/dist/agent-src/skills/incident-commander/evals/domain-truth.json +0 -16
- package/dist/agent-src/skills/incident-commander/evals/evals.json +0 -20
- package/dist/agent-src/skills/judge-artifact-completeness/evals/triggers.json +0 -17
- package/dist/agent-src/skills/judge-injection-defense/evals/triggers.json +0 -17
- package/dist/agent-src/skills/judge-synthesis/evals/triggers.json +0 -17
- package/dist/agent-src/skills/launch-readiness/evals/evals.json +0 -21
- package/dist/agent-src/skills/learning-tutor/evals/triggers.json +0 -52
- package/dist/agent-src/skills/legal-intake-triage/evals/triggers.json +0 -17
- package/dist/agent-src/skills/legal-practice-profile/evals/triggers.json +0 -17
- package/dist/agent-src/skills/license-compliance-audit/evals/triggers.json +0 -52
- package/dist/agent-src/skills/license-compliance-borrow-check/evals/triggers.json +0 -52
- package/dist/agent-src/skills/license-compliance-credits/evals/triggers.json +0 -52
- package/dist/agent-src/skills/llm-provider-knowledge/evals/triggers.json +0 -20
- package/dist/agent-src/skills/logging-monitoring/evals/evals.json +0 -16
- package/dist/agent-src/skills/logo-generation/evals/triggers.json +0 -17
- package/dist/agent-src/skills/messaging-architecture/evals/domain-truth.json +0 -16
- package/dist/agent-src/skills/messaging-architecture/evals/evals.json +0 -16
- package/dist/agent-src/skills/nda-triage/evals/triggers.json +0 -17
- package/dist/agent-src/skills/pdf-tools/evals/triggers.json +0 -52
- package/dist/agent-src/skills/perf-feedback-craft/evals/evals.json +0 -16
- package/dist/agent-src/skills/persona-improvement/evals/triggers.json +0 -52
- package/dist/agent-src/skills/php-coder/evals/triggers.json +0 -17
- package/dist/agent-src/skills/prediction-pool-optimizer/evals/triggers.json +0 -21
- package/dist/agent-src/skills/prompt-engineering-image/evals/triggers.json +0 -17
- package/dist/agent-src/skills/prompt-engineering-patterns/evals/evals.json +0 -16
- package/dist/agent-src/skills/prompt-validator/evals/triggers.json +0 -17
- package/dist/agent-src/skills/quality-tools/evals/evals.json +0 -15
- package/dist/agent-src/skills/reasoning-orchestrator/evals/triggers.json +0 -17
- package/dist/agent-src/skills/refine-prompt/evals/evals.json +0 -16
- package/dist/agent-src/skills/refine-ticket/evals/evals.json +0 -16
- package/dist/agent-src/skills/refine-ticket/evals/output-schema.yml +0 -16
- package/dist/agent-src/skills/refine-ticket/evals/triggers.json +0 -17
- package/dist/agent-src/skills/release-comms/evals/evals.json +0 -16
- package/dist/agent-src/skills/rice-prioritization/evals/evals.json +0 -20
- package/dist/agent-src/skills/runway-cognition/evals/domain-truth.json +0 -29
- package/dist/agent-src/skills/runway-cognition/evals/evals.json +0 -20
- package/dist/agent-src/skills/scenario-modeling/evals/domain-truth.json +0 -29
- package/dist/agent-src/skills/scenario-modeling/evals/evals.json +0 -20
- package/dist/agent-src/skills/schema-review/evals/triggers.json +0 -17
- package/dist/agent-src/skills/screenshot-hygiene/evals/triggers.json +0 -52
- package/dist/agent-src/skills/security-maturity-assessment/evals/triggers.json +0 -52
- package/dist/agent-src/skills/skill-writing/evals/triggers.json +0 -17
- package/dist/agent-src/skills/spreadsheet-authoring/evals/triggers.json +0 -47
- package/dist/agent-src/skills/subagent-orchestration/evals/evals.json +0 -60
- package/dist/agent-src/skills/supply-chain-intake/evals/triggers.json +0 -52
- package/dist/agent-src/skills/systematic-debugging/evals/evals.json +0 -20
- package/dist/agent-src/skills/test-case-discovery/evals/triggers.json +0 -52
- package/dist/agent-src/skills/test-driven-development/evals/evals.json +0 -16
- package/dist/agent-src/skills/threat-modeling/evals/evals.json +0 -21
- package/dist/agent-src/skills/typography-system/evals/evals.json +0 -14
- package/dist/agent-src/skills/typography-system/evals/triggers.json +0 -17
- package/dist/agent-src/skills/unit-economics-modeling/evals/domain-truth.json +0 -40
- package/dist/agent-src/skills/unit-economics-modeling/evals/evals.json +0 -24
- package/dist/agent-src/skills/verify-completion-evidence/evals/evals.json +0 -16
- package/dist/agent-src/skills/verify-repair-loop/evals/output-schema.yml +0 -20
- package/dist/agent-src/skills/verify-repair-loop/evals/triggers.json +0 -17
- package/dist/agent-src/skills/vision-articulation/evals/evals.json +0 -16
- package/dist/agent-src/skills/voice-and-tone-design/evals/evals.json +0 -16
- package/dist/agent-src/skills/wireframe/evals/triggers.json +0 -17
- package/dist/agent-src/skills/worktree-lifecycle/evals/evals.json +0 -38
- package/dist/agent-src/skills/worktree-lifecycle/evals/triggers.json +0 -52
- package/dist/cli/agent-config.js.map +0 -1
- package/dist/cli/bash/runBash.js.map +0 -1
- package/dist/cli/commands/commands.js.map +0 -1
- package/dist/cli/commands/config.js.map +0 -1
- package/dist/cli/commands/doctorShell.js.map +0 -1
- package/dist/cli/commands/mcpServer.js.map +0 -1
- package/dist/cli/commands/packs.js.map +0 -1
- package/dist/cli/commands/profiles.js.map +0 -1
- package/dist/cli/commands/recordTriggerEval.js.map +0 -1
- package/dist/cli/commands/rtkDetect.js.map +0 -1
- package/dist/cli/commands/settings.js.map +0 -1
- package/dist/cli/commands/uiServe.js.map +0 -1
- package/dist/cli/commands/versions.js.map +0 -1
- package/dist/cli/commands/workspaces.js.map +0 -1
- package/dist/cli/configRoot.js.map +0 -1
- package/dist/cli/discovery/loadManifest.js.map +0 -1
- package/dist/cli/firstRunNotice.js.map +0 -1
- package/dist/cli/help.js.map +0 -1
- package/dist/cli/initRouting.js.map +0 -1
- package/dist/cli/log/logger.js.map +0 -1
- package/dist/cli/main.js.map +0 -1
- package/dist/cli/mcp/content.js.map +0 -1
- package/dist/cli/mcp/dispatch.js.map +0 -1
- package/dist/cli/mcp/stdio.js.map +0 -1
- package/dist/cli/paths.js.map +0 -1
- package/dist/cli/python/knowledge_ingest.js.map +0 -1
- package/dist/cli/python/workspace_analytics.js.map +0 -1
- package/dist/cli/python/workspace_crypto.js.map +0 -1
- package/dist/cli/python/workspace_documents.js.map +0 -1
- package/dist/cli/python/workspace_drive.js.map +0 -1
- package/dist/cli/python/workspace_drive_health.js.map +0 -1
- package/dist/cli/python/workspace_explain.js.map +0 -1
- package/dist/cli/python/workspace_hosts.js.map +0 -1
- package/dist/cli/python/workspace_inbox.js.map +0 -1
- package/dist/cli/python/workspace_render.js.map +0 -1
- package/dist/cli/python/workspace_roles.js.map +0 -1
- package/dist/cli/python/workspace_secrets.js.map +0 -1
- package/dist/cli/python/workspace_sessions.js.map +0 -1
- package/dist/cli/python/workspace_skills.js.map +0 -1
- package/dist/cli/registry.js.map +0 -1
- package/dist/install/agentSwitchDetection.js.map +0 -1
- package/dist/install/agentSwitchProfile.js.map +0 -1
- package/dist/install/atomic.js.map +0 -1
- package/dist/install/claudePathsPlan.js.map +0 -1
- package/dist/install/conflict.js.map +0 -1
- package/dist/install/detect.js.map +0 -1
- package/dist/install/emit_host_rules_cli.js.map +0 -1
- package/dist/install/globalRuleLayers.js.map +0 -1
- package/dist/install/hostLayerFingerprint.js.map +0 -1
- package/dist/install/partitionEligibility.js.map +0 -1
- package/dist/install/paths.js.map +0 -1
- package/dist/install/plan.js.map +0 -1
- package/dist/install/preflight.js.map +0 -1
- package/dist/install/rtkDetection.js.map +0 -1
- package/dist/install/ruleInScope.js.map +0 -1
- package/dist/install/ruleLayerPartition.js.map +0 -1
- package/dist/install/rule_scope.js.map +0 -1
- package/dist/install/rule_scope_cli.js.map +0 -1
- package/dist/install/selectedTools.js.map +0 -1
- package/dist/install/toolDetection.js.map +0 -1
- package/dist/install/txlog.js.map +0 -1
- package/dist/install/types.js.map +0 -1
- package/dist/install/wizard-plan.js.map +0 -1
- package/dist/install/wizardDismissals.js.map +0 -1
- package/dist/scripts/_lib/agent_settings.js.map +0 -1
- package/dist/scripts/_lib/agent_src.js.map +0 -1
- package/dist/scripts/_lib/claude_builtin_names.js.map +0 -1
- package/dist/scripts/_lib/claude_plugin.js.map +0 -1
- package/dist/scripts/_lib/claude_settings_hooks.js.map +0 -1
- package/dist/scripts/_lib/compile_time_toggles.js.map +0 -1
- package/dist/scripts/_lib/environment_detector.js.map +0 -1
- package/dist/scripts/_lib/host_launch.js.map +0 -1
- package/dist/scripts/_lib/install_layout.js.map +0 -1
- package/dist/scripts/_lib/installed_lock.js.map +0 -1
- package/dist/scripts/_lib/model_tier.js.map +0 -1
- package/dist/scripts/_lib/prune_empty_dirs.js.map +0 -1
- package/dist/scripts/_lib/scoped_projection.js.map +0 -1
- package/dist/scripts/_lib/script_output.js.map +0 -1
- package/dist/scripts/_lib/spawn_env.js.map +0 -1
- package/dist/scripts/_lib/surface_tiers.js.map +0 -1
- package/dist/scripts/_lib/token_count.js.map +0 -1
- package/dist/scripts/_lib/trigger_eval_floors.js.map +0 -1
- package/dist/scripts/_lib/user_global_paths.js.map +0 -1
- package/dist/scripts/ai_council/modes.js.map +0 -1
- package/dist/scripts/ai_council/transport_resolver.js.map +0 -1
- package/dist/scripts/condense.js.map +0 -1
- package/dist/scripts/project_thin_rules.js.map +0 -1
- package/dist/server/app.js.map +0 -1
- package/dist/server/io/atomicMultiWrite.js.map +0 -1
- package/dist/server/io/atomicWrite.js.map +0 -1
- package/dist/server/io/sharedWriteCheck.js.map +0 -1
- package/dist/server/io/substituteTemplate.js.map +0 -1
- package/dist/server/io/yamlIO.js.map +0 -1
- package/dist/server/nicknameResolver.js.map +0 -1
- package/dist/server/port.js.map +0 -1
- package/dist/server/routes/discovery.js.map +0 -1
- package/dist/server/routes/install.js.map +0 -1
- package/dist/server/routes/ping.js.map +0 -1
- package/dist/server/routes/schema.js.map +0 -1
- package/dist/server/routes/settings.js.map +0 -1
- package/dist/server/routes/settingsChanges.js.map +0 -1
- package/dist/server/routes/userMd.js.map +0 -1
- package/dist/server/routes/wizard.js.map +0 -1
- package/dist/server/routes/workspace.js.map +0 -1
- package/dist/server/schemas/settings.js.map +0 -1
- package/dist/server/serverInfo.js.map +0 -1
- package/dist/server/token.js.map +0 -1
- package/dist/server/writeRoot.js.map +0 -1
- package/dist/shared/capabilities.js.map +0 -1
- package/dist/shared/interactiveContext.js.map +0 -1
- package/dist/shared/nicknamePrefill.js.map +0 -1
- package/dist/shared/settingsAsks.js.map +0 -1
- package/dist/shared/settingsCarveOut.js.map +0 -1
- package/dist/shared/settingsClasses.js.map +0 -1
- package/dist/shared/settingsConsent.js.map +0 -1
- package/dist/shared/settingsSurface.js.map +0 -1
- package/dist/shared/userMd/formAdapter.js.map +0 -1
- package/dist/shared/userMd/schema.js.map +0 -1
- package/dist/shared/userMd/utils.js.map +0 -1
- package/dist/ui/assets/index-Cxgy63kz.js.map +0 -1
- package/src/scripts/_lib/adr_frontmatter.test.ts +0 -365
- package/src/scripts/_lib/adversarial_council_gate.test.ts +0 -112
- package/src/scripts/_lib/adversarial_reconcile.test.ts +0 -197
- package/src/scripts/_lib/auto_dispatch.corpus.test.ts +0 -150
- package/src/scripts/_lib/secret_detector.test.ts +0 -108
- package/src/scripts/_lib/secret_detector_adversarial.test.ts +0 -116
- package/src/scripts/_lib/untrusted_content.test.ts +0 -175
- package/src/scripts/check_secret_leak.test.ts +0 -90
- package/src/scripts/design_slop_rules.test.ts +0 -239
- package/src/scripts/self_review_gate.test.ts +0 -296
- package/src/shared/capabilities.test.ts +0 -43
|
@@ -45,12 +45,14 @@ import { fileURLToPath } from 'node:url';
|
|
|
45
45
|
|
|
46
46
|
import { write_atomic } from './_lib/fs_atomic.js';
|
|
47
47
|
import {
|
|
48
|
+
classify_collisions,
|
|
48
49
|
iso_now,
|
|
49
50
|
read_live_records,
|
|
50
51
|
register_dir,
|
|
51
52
|
safe_stem,
|
|
52
53
|
ttl_is_measured,
|
|
53
54
|
ttl_seconds_for,
|
|
55
|
+
type SessionRecord,
|
|
54
56
|
} from './_lib/session_register.js';
|
|
55
57
|
import { claim_file, claim_is_stale, claim_read_paths } from './session_register_hook.js';
|
|
56
58
|
|
|
@@ -62,7 +64,7 @@ function usage(): number {
|
|
|
62
64
|
' live sessions, plus unmerged branches',
|
|
63
65
|
' held by other worktrees (--branches adds',
|
|
64
66
|
' that axis to the JSON form)',
|
|
65
|
-
' agent-config sessions:claim <slug> claim a roadmap for this session',
|
|
67
|
+
' agent-config sessions:claim <slug> [--paths <a,b,…>] claim a roadmap for this session',
|
|
66
68
|
' agent-config sessions:claim <slug> --force claim it even though a peer holds it',
|
|
67
69
|
' agent-config sessions:claim --release drop this session\'s roadmap claim',
|
|
68
70
|
'',
|
|
@@ -168,6 +170,30 @@ export function other_worktree_branches_detailed(
|
|
|
168
170
|
return { rows, filtered: unmerged !== null };
|
|
169
171
|
}
|
|
170
172
|
|
|
173
|
+
/**
|
|
174
|
+
* `PATH OVERLAP` lines for this session against every live peer.
|
|
175
|
+
*
|
|
176
|
+
* Kept a separate, separately-labelled line rather than folded into the slug or
|
|
177
|
+
* branch report, because the three collisions call for three different moves: a
|
|
178
|
+
* slug collision means stop, a branch collision means coordinate, a path
|
|
179
|
+
* collision means reorder — take the disjoint steps first if ordering allows,
|
|
180
|
+
* otherwise name it and continue. The register is advisory and never a lock.
|
|
181
|
+
*
|
|
182
|
+
* Pure over the record arrays so the fixture test needs no register on disk.
|
|
183
|
+
*/
|
|
184
|
+
export function path_overlap_lines(
|
|
185
|
+
others: readonly SessionRecord[],
|
|
186
|
+
here: { branch: string | null; roadmap_slug: string | null; owned_paths?: readonly string[] },
|
|
187
|
+
): string[] {
|
|
188
|
+
return classify_collisions(others, here)
|
|
189
|
+
.filter((c) => c.kind === 'path')
|
|
190
|
+
.map(
|
|
191
|
+
(c) =>
|
|
192
|
+
` PATH OVERLAP ${c.record.session_id} · ${(c.paths ?? []).length} shared path(s): ` +
|
|
193
|
+
`${(c.paths ?? []).join(', ')}`,
|
|
194
|
+
);
|
|
195
|
+
}
|
|
196
|
+
|
|
171
197
|
function cmd_list(argv: string[], root: string): number {
|
|
172
198
|
const as_json = argv.includes('--json');
|
|
173
199
|
const dir = register_dir(root);
|
|
@@ -229,6 +255,21 @@ function cmd_list(argv: string[], root: string): number {
|
|
|
229
255
|
);
|
|
230
256
|
}
|
|
231
257
|
write_held_branches(held, filtered);
|
|
258
|
+
// The path axis. Silent when this session has declared no owned paths, which
|
|
259
|
+
// is every session that has not run `sessions:claim --paths`.
|
|
260
|
+
const sid = env_session_id();
|
|
261
|
+
const mine = sid === null ? undefined : records.find((r) => r.session_id === sid);
|
|
262
|
+
const overlaps = path_overlap_lines(
|
|
263
|
+
records.filter((r) => r.session_id !== mine?.session_id),
|
|
264
|
+
{
|
|
265
|
+
branch: mine?.branch ?? null,
|
|
266
|
+
roadmap_slug: mine?.roadmap_slug ?? null,
|
|
267
|
+
...(mine?.owned_paths !== undefined ? { owned_paths: mine.owned_paths } : {}),
|
|
268
|
+
},
|
|
269
|
+
);
|
|
270
|
+
if (overlaps.length > 0) {
|
|
271
|
+
process.stdout.write(`\n${overlaps.join('\n')}\n`);
|
|
272
|
+
}
|
|
232
273
|
process.stdout.write(
|
|
233
274
|
'Advisory only — this register is not a lock, and an idle session\n' +
|
|
234
275
|
'disappears from it after its TTL although its user may return.\n',
|
|
@@ -432,7 +473,15 @@ function cmd_claim(argv: string[], root: string): number {
|
|
|
432
473
|
);
|
|
433
474
|
return 0;
|
|
434
475
|
}
|
|
435
|
-
const
|
|
476
|
+
const paths_idx = argv.indexOf('--paths');
|
|
477
|
+
const paths_arg = paths_idx >= 0 ? (argv[paths_idx + 1] ?? '') : '';
|
|
478
|
+
const owned_paths = paths_arg
|
|
479
|
+
.split(',')
|
|
480
|
+
.map((x) => x.trim())
|
|
481
|
+
.filter((x) => x !== '');
|
|
482
|
+
// The slug is the first bare token that is not the VALUE of --paths; without
|
|
483
|
+
// this the comma list would be read as the slug on `claim --paths a,b road-to-x`.
|
|
484
|
+
const slug = argv.find((a, i) => !a.startsWith('-') && i !== paths_idx + 1);
|
|
436
485
|
if (slug === undefined || slug.trim() === '') {
|
|
437
486
|
return usage();
|
|
438
487
|
}
|
|
@@ -476,7 +525,19 @@ function cmd_claim(argv: string[], root: string): number {
|
|
|
476
525
|
try {
|
|
477
526
|
write_atomic(
|
|
478
527
|
target,
|
|
479
|
-
`${JSON.stringify(
|
|
528
|
+
`${JSON.stringify(
|
|
529
|
+
{
|
|
530
|
+
slug: slug.trim(),
|
|
531
|
+
written_at: iso_now(),
|
|
532
|
+
session_id: sid,
|
|
533
|
+
// Absent, not empty, when nothing was declared: the whole
|
|
534
|
+
// additive guarantee of `owned_paths` rests on the field not
|
|
535
|
+
// being written at all in the ordinary case.
|
|
536
|
+
...(owned_paths.length > 0 ? { paths: owned_paths } : {}),
|
|
537
|
+
},
|
|
538
|
+
null,
|
|
539
|
+
2,
|
|
540
|
+
)}\n`,
|
|
480
541
|
);
|
|
481
542
|
} catch (exc) {
|
|
482
543
|
process.stderr.write(`sessions:claim: could not write the claim — ${String(exc)}\n`);
|
|
@@ -484,6 +545,9 @@ function cmd_claim(argv: string[], root: string): number {
|
|
|
484
545
|
}
|
|
485
546
|
process.stdout.write(
|
|
486
547
|
`Claimed "${slug.trim()}" for this session. It becomes visible to other\n` +
|
|
548
|
+
(owned_paths.length > 0
|
|
549
|
+
? `Declared ${owned_paths.length} owned path(s); peers sharing one are labelled PATH OVERLAP.\n`
|
|
550
|
+
: '') +
|
|
487
551
|
'sessions on the next turn, when the heartbeat lifts it into the register.\n' +
|
|
488
552
|
(sid === null
|
|
489
553
|
? 'NOTE: this host exports no session id, so the claim is scoped to this\n' +
|
|
@@ -34,7 +34,17 @@ import * as fs from 'node:fs';
|
|
|
34
34
|
import * as path from 'node:path';
|
|
35
35
|
import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
36
36
|
|
|
37
|
-
|
|
37
|
+
// The formula, the stopword list and the tokenizer live in one Node-free
|
|
38
|
+
// module so the pure stdio-lite dispatcher can share them instead of growing
|
|
39
|
+
// a second copy (road-to-skill-delivery-over-mcp risk 6). Everything below is
|
|
40
|
+
// the disk half — globbing, frontmatter, the CLI — which stays here.
|
|
41
|
+
import {
|
|
42
|
+
scoreSkill,
|
|
43
|
+
skillTerms as _sharedSkillTerms,
|
|
44
|
+
tokenize as _sharedTokenize,
|
|
45
|
+
triggerTextFromFlatLines,
|
|
46
|
+
type RankOptions,
|
|
47
|
+
} from '../../shared/skillRanking.js';
|
|
38
48
|
|
|
39
49
|
const _HERE = fileURLToPath(import.meta.url);
|
|
40
50
|
// src/scripts/skill_tools/score_skill_relevance.ts → parents[3] of the .py
|
|
@@ -42,19 +52,6 @@ const _HERE = fileURLToPath(import.meta.url);
|
|
|
42
52
|
export const ROOT = path.resolve(path.dirname(_HERE), '..', '..', '..');
|
|
43
53
|
export const DEFAULT_SKILLS_DIR = path.join(ROOT, '.agent-src.uncondensed', 'skills');
|
|
44
54
|
|
|
45
|
-
// re.compile(r"[a-z][a-z0-9]+") — applied to the lowercased text.
|
|
46
|
-
const TOKEN_RE = /[a-z][a-z0-9]+/g;
|
|
47
|
-
|
|
48
|
-
const STOPWORDS: ReadonlySet<string> = new Set([
|
|
49
|
-
'the', 'a', 'an', 'and', 'or', 'but', 'of', 'for', 'with', 'to', 'in',
|
|
50
|
-
'on', 'at', 'by', 'from', 'as', 'is', 'are', 'was', 'were', 'be', 'been',
|
|
51
|
-
'this', 'that', 'these', 'those', 'it', 'its', 'use', 'when', 'even',
|
|
52
|
-
'via', 'via:', 'into', 'onto', 'use:', 'skill', 'skills', 'task', 'tasks',
|
|
53
|
-
'code', 'file', 'files', 'doing', 'make', 'do', 'go', 'get', 'set',
|
|
54
|
-
'not', 'no', 'yes', 'any', 'some', 'all', 'one', 'two', 'new', 'old',
|
|
55
|
-
'user', 'users', 'our', 'your', 'their', 'they', 'we', 'you', 'i', 'me',
|
|
56
|
-
]);
|
|
57
|
-
|
|
58
55
|
/** Mirror Python len(str) — count Unicode code points, not UTF-16 units. */
|
|
59
56
|
function pyLen(s: string): number {
|
|
60
57
|
let n = 0;
|
|
@@ -65,16 +62,9 @@ function pyLen(s: string): number {
|
|
|
65
62
|
}
|
|
66
63
|
|
|
67
64
|
export function _tokenize(text: string): Set<string> {
|
|
68
|
-
|
|
69
|
-
//
|
|
70
|
-
|
|
71
|
-
const matches = text.toLowerCase().match(TOKEN_RE) ?? [];
|
|
72
|
-
for (const t of matches) {
|
|
73
|
-
if (!STOPWORDS.has(t) && pyLen(t) > 2) {
|
|
74
|
-
out.add(t);
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
return out;
|
|
65
|
+
// Single-sourced in `src/shared/skillRanking.ts`. Kept as an export because
|
|
66
|
+
// the CLI-parity suite and the hook path both import this name.
|
|
67
|
+
return _sharedTokenize(text);
|
|
78
68
|
}
|
|
79
69
|
|
|
80
70
|
export interface Frontmatter {
|
|
@@ -152,6 +142,8 @@ export interface Skill {
|
|
|
152
142
|
description: string;
|
|
153
143
|
personas: string[];
|
|
154
144
|
terms: Set<string>;
|
|
145
|
+
/** `triggers[].keyword` / `.phrase` prose. Indexed only under keyword-v2. */
|
|
146
|
+
triggerText: string[];
|
|
155
147
|
}
|
|
156
148
|
|
|
157
149
|
function _load_skills(skillsDir: string): Skill[] {
|
|
@@ -167,11 +159,16 @@ function _load_skills(skillsDir: string): Skill[] {
|
|
|
167
159
|
personas = [personas];
|
|
168
160
|
}
|
|
169
161
|
const personaList = [...personas];
|
|
162
|
+
const rawTriggers = fm['triggers'];
|
|
163
|
+
const triggerText = Array.isArray(rawTriggers)
|
|
164
|
+
? triggerTextFromFlatLines(rawTriggers as string[])
|
|
165
|
+
: [];
|
|
170
166
|
skills.push({
|
|
171
167
|
name,
|
|
172
168
|
description: desc,
|
|
173
169
|
personas: personaList,
|
|
174
170
|
terms: _tokenize(name + ' ' + desc),
|
|
171
|
+
triggerText,
|
|
175
172
|
});
|
|
176
173
|
}
|
|
177
174
|
return skills;
|
|
@@ -214,43 +211,29 @@ function _globSkillMd(root: string): string[] {
|
|
|
214
211
|
return dirs.map((name) => path.join(root, name, 'SKILL.md'));
|
|
215
212
|
}
|
|
216
213
|
|
|
217
|
-
function _score(taskTerms: Set<string>, skill: Skill): number {
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
}
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
let personaHit = 0.0;
|
|
231
|
-
// task_lower = " ".join(task_terms) — Set iteration order = insertion order
|
|
232
|
-
// (matches Python set-iteration only incidentally; the membership tests
|
|
233
|
-
// below are order-independent so the result is deterministic).
|
|
234
|
-
const taskLower = [...taskTerms].join(' ');
|
|
235
|
-
for (const persona of skill.personas) {
|
|
236
|
-
const slug = String(persona).toLowerCase();
|
|
237
|
-
const parts = slug.split('-');
|
|
238
|
-
if (taskLower.includes(slug) || parts.some((part) => taskTerms.has(part))) {
|
|
239
|
-
personaHit = 1.0;
|
|
240
|
-
break;
|
|
241
|
-
}
|
|
242
|
-
}
|
|
243
|
-
return pyRound(overlap * 70 + personaHit * 30, 0);
|
|
214
|
+
function _score(taskTerms: Set<string>, skill: Skill, opts: RankOptions = {}): number {
|
|
215
|
+
// Single-sourced in `src/shared/skillRanking.ts`. Under keyword-v1 (the
|
|
216
|
+
// default) `skill.terms` is already `tokenize(name + ' ' + description)`, so
|
|
217
|
+
// the precomputed set is reused unchanged; keyword-v2 re-derives the term
|
|
218
|
+
// set with the skill's trigger prose folded in.
|
|
219
|
+
const rankable = {
|
|
220
|
+
name: skill.name,
|
|
221
|
+
description: skill.description,
|
|
222
|
+
personas: skill.personas,
|
|
223
|
+
triggerText: skill.triggerText,
|
|
224
|
+
};
|
|
225
|
+
const terms = opts.includeTriggers ? _sharedSkillTerms(rankable, opts) : skill.terms;
|
|
226
|
+
return scoreSkill(taskTerms, rankable, terms);
|
|
244
227
|
}
|
|
245
228
|
|
|
246
229
|
export type RankRow = [string, number, string[]];
|
|
247
230
|
|
|
248
|
-
export function rank(task: string, skillsDir: string): RankRow[] {
|
|
231
|
+
export function rank(task: string, skillsDir: string, opts: RankOptions = {}): RankRow[] {
|
|
249
232
|
const taskTerms = _tokenize(task);
|
|
250
233
|
const skills = _load_skills(skillsDir);
|
|
251
234
|
const rows: RankRow[] = [];
|
|
252
235
|
for (const s of skills) {
|
|
253
|
-
const score = _score(taskTerms, s);
|
|
236
|
+
const score = _score(taskTerms, s, opts);
|
|
254
237
|
if (score > 0) {
|
|
255
238
|
rows.push([s.name, score, [...s.personas]]);
|
|
256
239
|
}
|
|
@@ -83,6 +83,44 @@ const GENERATED = [
|
|
|
83
83
|
// measured for road-to-merge-hotspot-drawdown. Regenerate; never merge.
|
|
84
84
|
'agents/roadmaps/archive/INDEX.md',
|
|
85
85
|
'agents/roadmaps/archive/index.json',
|
|
86
|
+
// ── Added 2026-08-25 (road-to-merge-surface-zero 1.1). Each carries its
|
|
87
|
+
// write site, because this list tells a human to DISCARD one side, and an
|
|
88
|
+
// entry added on a conflict count alone would tell them to discard hand
|
|
89
|
+
// work. Counts are from `pr_conflict_census --limit 2000` over 60 days.
|
|
90
|
+
//
|
|
91
|
+
// Written by `build_proof.ts:500` from `docs/CLAIMS.md`. 26 resolutions, and
|
|
92
|
+
// it fails in pairs: a CLAIMS.md edit leaves it stale, which reds both the
|
|
93
|
+
// drift-guard test and `demo-commands-still-pass`.
|
|
94
|
+
'docs/proof.md',
|
|
95
|
+
// Both written by `generate_catalog.ts` (`:166` for llms.txt) from SKILL.md
|
|
96
|
+
// frontmatter. Neither has ever been hand-authored.
|
|
97
|
+
'docs/skills-catalog.md',
|
|
98
|
+
'llms.txt',
|
|
99
|
+
// Written by `lint_originality.ts:340`. Named by step 1.1 and included
|
|
100
|
+
// although the census found ZERO conflicts on it in either window — it is
|
|
101
|
+
// genuinely generated and classifying it costs nothing. Recorded rather than
|
|
102
|
+
// quietly dropped: the step named it on conflict frequency, and that premise
|
|
103
|
+
// does not hold.
|
|
104
|
+
'agents/reports/originality.json',
|
|
105
|
+
'agents/reports/originality.md',
|
|
106
|
+
];
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Generated paths a literal cannot express.
|
|
110
|
+
*
|
|
111
|
+
* `isGenerated` matches on equality or a trailing-slash prefix, so a per-pack
|
|
112
|
+
* manifest needs a pattern. Kept as a separate named list rather than by
|
|
113
|
+
* loosening the literal matcher: a glob inside the array above would make every
|
|
114
|
+
* future entry ambiguous about which kind of match it asks for.
|
|
115
|
+
*/
|
|
116
|
+
const GENERATED_PATTERNS: readonly { readonly re: RegExp; readonly why: string }[] = [
|
|
117
|
+
{
|
|
118
|
+
// `generate_pack_manifests.ts:427`, and the file's own first line reads
|
|
119
|
+
// "Generated by scripts/generate_pack_manifests.ts — DO NOT EDIT BY
|
|
120
|
+
// HAND". 12 resolutions over 60 days across two packs.
|
|
121
|
+
re: /^src\/domains\/[^/]+\/pack\.yaml$/,
|
|
122
|
+
why: 'per-pack manifest written by generate_pack_manifests.ts',
|
|
123
|
+
},
|
|
86
124
|
];
|
|
87
125
|
|
|
88
126
|
/**
|
|
@@ -159,7 +197,8 @@ export function isUntrackedByDesign(rel: string): boolean {
|
|
|
159
197
|
|
|
160
198
|
export function isGenerated(rel: string): boolean {
|
|
161
199
|
const norm = rel.replace(/\\/g, '/');
|
|
162
|
-
|
|
200
|
+
if (GENERATED.some((g) => (g.endsWith('/') ? norm.startsWith(g) : norm === g))) return true;
|
|
201
|
+
return GENERATED_PATTERNS.some((p) => p.re.test(norm));
|
|
163
202
|
}
|
|
164
203
|
|
|
165
204
|
/**
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Token-sink ranking + re-read measurement over the local transcript store.
|
|
4
|
+
*
|
|
5
|
+
* `road-to-role-scoped-spawn-profiles` Phase 3 Steps 1-3. Phase 3 is declared
|
|
6
|
+
* independent of that roadmap's Phases 0-2 in both directions: it needs no
|
|
7
|
+
* payload capture and it arms nothing.
|
|
8
|
+
*
|
|
9
|
+
* **The denominator is published, deliberately.** Step 2's whole content is
|
|
10
|
+
* that *"a sink's share is only meaningful against the total it was measured
|
|
11
|
+
* from, and the store is one machine's history — the report says so rather
|
|
12
|
+
* than reading as a property of the package."* Every rendered figure is
|
|
13
|
+
* therefore accompanied by the record count, the date range, and the
|
|
14
|
+
* single-store caveat, and {@link Report.provenance} carries that sentence as
|
|
15
|
+
* data so a JSON consumer cannot strip it by taking the numbers only.
|
|
16
|
+
*
|
|
17
|
+
* **Two things this report is NOT.** It is not a cost figure — the weighting
|
|
18
|
+
* is the cost-SHAPED `weightedInputUnits` from `_lib/cc_transcript.ts`, not a
|
|
19
|
+
* price. And the wasted-token column is a `chars / 4` proxy over duplicate
|
|
20
|
+
* `tool_result` bodies (see `_lib/transcript_reads.ts`), because the
|
|
21
|
+
* transcript records no per-tool-result token count; it is named
|
|
22
|
+
* `wasted_tokens_proxy` everywhere so the label travels with the number.
|
|
23
|
+
*
|
|
24
|
+
* Class A: in-process, per-invocation, read-only, no network, no daemon, no
|
|
25
|
+
* writes outside stdout.
|
|
26
|
+
*
|
|
27
|
+
* Usage:
|
|
28
|
+
* ./scripts-run src/scripts/token_sink_report [--format text|json]
|
|
29
|
+
* [--root <path>] [--max-age-days <n>] [--top <n>]
|
|
30
|
+
*/
|
|
31
|
+
import * as path from 'node:path';
|
|
32
|
+
import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
33
|
+
|
|
34
|
+
import {
|
|
35
|
+
DEFAULT_PROJECTS_ROOT,
|
|
36
|
+
billableInputTokens,
|
|
37
|
+
listTranscriptFiles,
|
|
38
|
+
scanTranscripts,
|
|
39
|
+
weightedInputUnits,
|
|
40
|
+
type TranscriptRecord,
|
|
41
|
+
} from './_lib/cc_transcript.js';
|
|
42
|
+
import { computeRereads, type RereadResult } from './_lib/transcript_reads.js';
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* One token sink: a `bucket/model` pair. The bucket half is what makes the
|
|
46
|
+
* ranking answer the question the roadmap asks — `main` versus `subagent` is
|
|
47
|
+
* the axis a scoping decision acts on — and the model half keeps a cheap
|
|
48
|
+
* worker's traffic from being summed with an expensive orchestrator's.
|
|
49
|
+
*/
|
|
50
|
+
export interface Sink {
|
|
51
|
+
sink: string;
|
|
52
|
+
bucket: string;
|
|
53
|
+
model: string;
|
|
54
|
+
calls: number;
|
|
55
|
+
billable_input: number;
|
|
56
|
+
weighted_input_units: number;
|
|
57
|
+
/** This sink's share of total weighted input units, 0..1. */
|
|
58
|
+
weighted_share: number;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export function rankSinks(records: readonly TranscriptRecord[]): Sink[] {
|
|
62
|
+
const acc = new Map<string, Sink>();
|
|
63
|
+
for (const r of records) {
|
|
64
|
+
const key = `${r.bucket}/${r.model}`;
|
|
65
|
+
const row = acc.get(key) ?? {
|
|
66
|
+
sink: key,
|
|
67
|
+
bucket: r.bucket,
|
|
68
|
+
model: r.model,
|
|
69
|
+
calls: 0,
|
|
70
|
+
billable_input: 0,
|
|
71
|
+
weighted_input_units: 0,
|
|
72
|
+
weighted_share: 0,
|
|
73
|
+
};
|
|
74
|
+
row.calls += 1;
|
|
75
|
+
row.billable_input += billableInputTokens(r.usage);
|
|
76
|
+
row.weighted_input_units += weightedInputUnits(r.usage);
|
|
77
|
+
acc.set(key, row);
|
|
78
|
+
}
|
|
79
|
+
const rows = [...acc.values()];
|
|
80
|
+
const total = rows.reduce((s, r) => s + r.weighted_input_units, 0);
|
|
81
|
+
for (const r of rows) {
|
|
82
|
+
r.weighted_share = total > 0 ? r.weighted_input_units / total : 0;
|
|
83
|
+
}
|
|
84
|
+
rows.sort((a, b) => b.weighted_input_units - a.weighted_input_units || a.sink.localeCompare(b.sink));
|
|
85
|
+
return rows;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
export interface Options {
|
|
89
|
+
format: 'text' | 'json';
|
|
90
|
+
root: string;
|
|
91
|
+
maxAgeDays: number;
|
|
92
|
+
top: number;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
const DEFAULT_TOP = 15;
|
|
96
|
+
|
|
97
|
+
export function parseArgs(argv: string[]): Options {
|
|
98
|
+
const opts: Options = {
|
|
99
|
+
format: 'text',
|
|
100
|
+
root: DEFAULT_PROJECTS_ROOT,
|
|
101
|
+
maxAgeDays: 90,
|
|
102
|
+
top: DEFAULT_TOP,
|
|
103
|
+
};
|
|
104
|
+
for (let i = 0; i < argv.length; i++) {
|
|
105
|
+
const a = argv[i];
|
|
106
|
+
if (a === undefined) continue;
|
|
107
|
+
if (a === '--format') opts.format = (argv[++i] as Options['format']) ?? opts.format;
|
|
108
|
+
else if (a.startsWith('--format=')) opts.format = a.slice('--format='.length) as Options['format'];
|
|
109
|
+
else if (a === '--root') opts.root = argv[++i] ?? opts.root;
|
|
110
|
+
else if (a.startsWith('--root=')) opts.root = a.slice('--root='.length);
|
|
111
|
+
else if (a === '--max-age-days') opts.maxAgeDays = Number(argv[++i]) || opts.maxAgeDays;
|
|
112
|
+
else if (a.startsWith('--max-age-days=')) opts.maxAgeDays = Number(a.slice('--max-age-days='.length)) || opts.maxAgeDays;
|
|
113
|
+
else if (a === '--top') opts.top = Number(argv[++i]) || opts.top;
|
|
114
|
+
else if (a.startsWith('--top=')) opts.top = Number(a.slice('--top='.length)) || opts.top;
|
|
115
|
+
}
|
|
116
|
+
if (opts.format !== 'text' && opts.format !== 'json') opts.format = 'text';
|
|
117
|
+
return opts;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* The single-store caveat, carried as DATA rather than as rendering. A JSON
|
|
122
|
+
* consumer that keeps `sinks` and drops the prose still keeps this field.
|
|
123
|
+
*/
|
|
124
|
+
export const PROVENANCE =
|
|
125
|
+
'Local-store-derived: computed from one machine\'s ~/.claude/projects transcripts. ' +
|
|
126
|
+
'Every share below is a fact about this store, not a property of the package.';
|
|
127
|
+
|
|
128
|
+
export interface Report {
|
|
129
|
+
schema: 'token-sink-report/v1';
|
|
130
|
+
root: string;
|
|
131
|
+
window_days: number;
|
|
132
|
+
provenance: string;
|
|
133
|
+
total_seen: number;
|
|
134
|
+
deduped_count: number;
|
|
135
|
+
dedup_ratio: number;
|
|
136
|
+
legs_scanned: number;
|
|
137
|
+
date_range: { first: string | null; last: string | null };
|
|
138
|
+
sinks: Sink[];
|
|
139
|
+
rereads: RereadResult;
|
|
140
|
+
wasted_tokens_proxy_note: string;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
const PROXY_NOTE =
|
|
144
|
+
'wasted_tokens_proxy is a chars / 4 estimate over duplicate tool_result bodies. ' +
|
|
145
|
+
'The transcript records no per-tool-result token count, so this is a proxy, never a measurement.';
|
|
146
|
+
|
|
147
|
+
export function buildReport(opts: Options): Report {
|
|
148
|
+
const scan = scanTranscripts({ root: opts.root, maxAgeDays: opts.maxAgeDays });
|
|
149
|
+
const files = listTranscriptFiles({ root: opts.root, maxAgeDays: opts.maxAgeDays });
|
|
150
|
+
const rereads = computeRereads(files);
|
|
151
|
+
|
|
152
|
+
const stamps = scan.records
|
|
153
|
+
.map((r) => r.timestamp)
|
|
154
|
+
.filter((t): t is string => typeof t === 'string' && t.length > 0)
|
|
155
|
+
.sort();
|
|
156
|
+
|
|
157
|
+
return {
|
|
158
|
+
schema: 'token-sink-report/v1',
|
|
159
|
+
root: opts.root,
|
|
160
|
+
window_days: opts.maxAgeDays,
|
|
161
|
+
provenance: PROVENANCE,
|
|
162
|
+
total_seen: scan.totalSeen,
|
|
163
|
+
deduped_count: scan.dedupedCount,
|
|
164
|
+
dedup_ratio: scan.dedup_ratio,
|
|
165
|
+
legs_scanned: rereads.legs_scanned,
|
|
166
|
+
date_range: { first: stamps[0] ?? null, last: stamps[stamps.length - 1] ?? null },
|
|
167
|
+
sinks: rankSinks(scan.records),
|
|
168
|
+
rereads,
|
|
169
|
+
wasted_tokens_proxy_note: PROXY_NOTE,
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
function pct(v: number): string {
|
|
174
|
+
return `${(v * 100).toFixed(1)}%`;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
export function renderText(r: Report, top: number = DEFAULT_TOP): string {
|
|
178
|
+
const out: string[] = [];
|
|
179
|
+
out.push('token-sink report · schema token-sink-report/v1');
|
|
180
|
+
out.push('');
|
|
181
|
+
out.push('Denominator (read this before any share below):');
|
|
182
|
+
out.push(` records (deduped) : ${r.deduped_count} of ${r.total_seen} seen (dedup ${pct(r.dedup_ratio)})`);
|
|
183
|
+
out.push(` transcript legs : ${r.legs_scanned}`);
|
|
184
|
+
out.push(` date range : ${r.date_range.first ?? 'n/a'} .. ${r.date_range.last ?? 'n/a'}`);
|
|
185
|
+
out.push(` window : ${r.window_days} days · root ${r.root}`);
|
|
186
|
+
out.push(` provenance : ${r.provenance}`);
|
|
187
|
+
out.push('');
|
|
188
|
+
|
|
189
|
+
if (r.deduped_count === 0) {
|
|
190
|
+
out.push('No records in this store for the given window — nothing to rank.');
|
|
191
|
+
out.push('');
|
|
192
|
+
} else {
|
|
193
|
+
out.push(`Token sinks, ranked by weighted input units (top ${top}):`);
|
|
194
|
+
for (const s of r.sinks.slice(0, top)) {
|
|
195
|
+
out.push(
|
|
196
|
+
` ${s.sink.padEnd(38)} calls=${String(s.calls).padStart(6)} ` +
|
|
197
|
+
`weighted=${s.weighted_input_units.toFixed(0).padStart(12)} share=${pct(s.weighted_share)}`,
|
|
198
|
+
);
|
|
199
|
+
}
|
|
200
|
+
out.push('');
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
out.push('Re-reads within a single transcript leg:');
|
|
204
|
+
out.push(` reads observed : ${r.rereads.total_reads}`);
|
|
205
|
+
out.push(` duplicate reads : ${r.rereads.duplicate_reads}`);
|
|
206
|
+
out.push(` wasted (proxy) : ${r.rereads.wasted_tokens_proxy} tokens`);
|
|
207
|
+
out.push(` note : ${r.wasted_tokens_proxy_note}`);
|
|
208
|
+
if (r.rereads.files.length === 0) {
|
|
209
|
+
out.push(' no file was read twice inside one leg in this window.');
|
|
210
|
+
} else {
|
|
211
|
+
out.push(` top ${top} by wasted (proxy):`);
|
|
212
|
+
for (const f of r.rereads.files.slice(0, top)) {
|
|
213
|
+
out.push(
|
|
214
|
+
` ${f.file_path}\n reads=${f.total_reads} dup=${f.duplicate_reads} ` +
|
|
215
|
+
`legs_with_reread=${f.legs_with_reread} wasted_proxy=${f.wasted_tokens_proxy}`,
|
|
216
|
+
);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
return out.join('\n');
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
export function main(argv: string[] = process.argv.slice(2)): number {
|
|
223
|
+
const opts = parseArgs(argv);
|
|
224
|
+
const report = buildReport(opts);
|
|
225
|
+
if (opts.format === 'json') {
|
|
226
|
+
process.stdout.write(JSON.stringify(report, null, 2) + '\n');
|
|
227
|
+
} else {
|
|
228
|
+
process.stdout.write(renderText(report, opts.top) + '\n');
|
|
229
|
+
}
|
|
230
|
+
return 0;
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
const _HERE = fileURLToPath(import.meta.url);
|
|
234
|
+
declare const __AGENT_CONFIG_BUNDLE__: boolean | undefined;
|
|
235
|
+
const _bundled = typeof __AGENT_CONFIG_BUNDLE__ !== 'undefined' && __AGENT_CONFIG_BUNDLE__;
|
|
236
|
+
if (!_bundled && process.argv[1] !== undefined) {
|
|
237
|
+
const invokedUrl = pathToFileURL(path.resolve(process.argv[1])).href;
|
|
238
|
+
if (pathToFileURL(_HERE).href === invokedUrl) process.exit(main());
|
|
239
|
+
}
|