@event4u/agent-config 14.11.0 → 14.13.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 +368 -516
- package/CONTRIBUTING.md +38 -0
- package/CREDITS.md +135 -0
- package/NOTICE +13 -0
- package/README.md +8 -6
- package/dist/agent-src/commands/analyze/inbox.md +109 -2
- package/dist/agent-src/commands/feature/dev.md +7 -2
- package/dist/agent-src/commands/ghostwriter/write.md +5 -1
- package/dist/agent-src/commands/implement-ticket.md +1 -1
- package/dist/agent-src/commands/mission/upgrade.md +1 -1
- package/dist/agent-src/commands/orchestrate.md +2 -2
- package/dist/agent-src/commands/post-as/me.md +5 -1
- package/dist/agent-src/commands/pr/merge.md +19 -6
- package/dist/agent-src/commands/roadmap/process-full.md +19 -5
- package/dist/agent-src/commands/tdd/red.md +12 -2
- package/dist/agent-src/commands/work.md +1 -1
- package/dist/agent-src/contexts/communication/rules-auto/token-efficiency-mechanics.md +40 -0
- package/dist/agent-src/contexts/execution/auto-dispatch-classification.md +5 -2
- package/dist/agent-src/contexts/execution/autonomy-mechanics.md +21 -0
- package/dist/agent-src/contexts/execution/evidence-discipline.md +26 -0
- package/dist/agent-src/contexts/execution/orchestration-telemetry.md +1 -0
- package/dist/agent-src/contexts/execution/subagent-response-contract.md +40 -0
- package/dist/agent-src/contexts/execution/subagent-steering.md +13 -1
- package/dist/agent-src/contexts/execution/terminal-states.md +96 -0
- package/dist/agent-src/rules/artifact-drafting-protocol.md +1 -1
- package/dist/agent-src/rules/broken-access-control.md +4 -0
- package/dist/agent-src/rules/code-provenance.md +4 -0
- package/dist/agent-src/rules/design-fidelity.md +1 -1
- package/dist/agent-src/rules/domain-safety-pii.md +4 -0
- package/dist/agent-src/rules/domain-safety-retention.md +4 -0
- package/dist/agent-src/rules/engineering-safety-floor.md +2 -0
- package/dist/agent-src/rules/external-code-graph-interop.md +14 -12
- package/dist/agent-src/rules/improve-before-implement.md +6 -8
- package/dist/agent-src/rules/laravel-routing.md +1 -1
- package/dist/agent-src/rules/lethal-trifecta-guard.md +4 -0
- package/dist/agent-src/rules/secret-vcs-guard.md +2 -0
- package/dist/agent-src/rules/security-sensitive-stop.md +2 -0
- package/dist/agent-src/rules/source-confidentiality.md +12 -34
- package/dist/agent-src/rules/symfony-routing.md +1 -1
- package/dist/agent-src/rules/token-efficiency.md +14 -0
- package/dist/agent-src/rules/tool-safety.md +4 -0
- package/dist/agent-src/rules/untrusted-input-defense.md +4 -0
- package/dist/agent-src/scripts/archive_completed_roadmaps.ts +247 -3
- package/dist/agent-src/scripts/guarded_baseline.ts +328 -0
- package/dist/agent-src/scripts/roadmap_set_step.ts +253 -0
- package/dist/agent-src/scripts/stub_queue.ts +82 -0
- package/dist/agent-src/scripts/stubs_due.ts +400 -0
- package/dist/agent-src/scripts/ticket_bundles.ts +84 -0
- package/dist/agent-src/scripts/update_roadmap_progress.ts +8 -4
- package/dist/agent-src/skills/brand-asset-generation/SKILL.md +17 -4
- package/dist/agent-src/skills/brand-audit/SKILL.md +33 -0
- package/dist/agent-src/skills/code-intelligence/SKILL.md +57 -0
- package/dist/agent-src/skills/code-refactoring/SKILL.md +45 -1
- package/dist/agent-src/skills/code-review/SKILL.md +65 -6
- package/dist/agent-src/skills/command-writing/SKILL.md +35 -0
- package/dist/agent-src/skills/database/SKILL.md +8 -0
- package/dist/agent-src/skills/dependency-upgrade/SKILL.md +27 -0
- package/dist/agent-src/skills/design-review/SKILL.md +1 -1
- package/dist/agent-src/skills/doc-coauthoring/SKILL.md +1 -1
- package/dist/agent-src/skills/existing-ui-audit/SKILL.md +25 -2
- package/dist/agent-src/skills/feature-planning/SKILL.md +9 -2
- package/dist/agent-src/skills/frontend-render-security/SKILL.md +44 -0
- package/dist/agent-src/skills/git-workflow/SKILL.md +1 -1
- package/dist/agent-src/skills/js-library-packaging/scripts/check_package_surface.ts +38 -4
- package/dist/agent-src/skills/judge-artifact-completeness/rubrics/ticket-quality-score.json +2 -2
- package/dist/agent-src/skills/laravel/SKILL.md +35 -0
- package/dist/agent-src/skills/laravel-migration/SKILL.md +57 -3
- package/dist/agent-src/skills/monorepo-workspace/SKILL.md +26 -0
- package/dist/agent-src/skills/playbook-authoring/SKILL.md +28 -1
- package/dist/agent-src/skills/project-analysis-core/SKILL.md +23 -0
- package/dist/agent-src/skills/react-shadcn-ui/SKILL.md +30 -13
- package/dist/agent-src/skills/skill-writing/references/procedure.md +29 -7
- package/dist/agent-src/skills/sql-writing/SKILL.md +7 -1
- package/dist/agent-src/skills/standards-from-config/SKILL.md +27 -4
- package/dist/agent-src/skills/storybook-workshop/SKILL.md +9 -0
- package/dist/agent-src/skills/supply-chain-intake/SKILL.md +11 -4
- package/dist/agent-src/skills/symfony-workflow/SKILL.md +35 -0
- package/dist/agent-src/skills/test-case-discovery/SKILL.md +85 -0
- package/dist/agent-src/skills/test-driven-development/SKILL.md +33 -9
- package/dist/agent-src/skills/testing-anti-patterns/SKILL.md +1 -1
- package/dist/agent-src/skills/testing-anti-patterns/process-anti-patterns.md +37 -0
- package/dist/agent-src/skills/ui-component-architect/SKILL.md +53 -2
- package/dist/agent-src/skills/upstream-contribute/SKILL.md +38 -1
- package/dist/agent-src/skills/verify-repair-loop/SKILL.md +9 -4
- package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
- package/dist/agent-src/templates/roadmaps.md +97 -3
- package/dist/agent-src/templates/scripts/check_memory.ts +258 -17
- package/dist/agent-src/templates/scripts/check_memory_proposal.ts +9 -3
- package/dist/agent-src/templates/scripts/memory_lookup.ts +86 -0
- package/dist/agent-src/templates/scripts/memory_signal.ts +44 -0
- package/dist/agent-src/templates/scripts/work_engine/directives/backend/implement.ts +90 -0
- package/dist/agent-src/templates/scripts/work_engine/directives/backend/index.ts +11 -0
- package/dist/agent-src/templates/scripts/work_engine/directives/backend/test.ts +23 -1
- package/dist/agent-src/templates/scripts/work_engine/directives/backend/verify.ts +10 -1
- package/dist/agent-src/templates/scripts/work_engine/directives/mixed/stitch.ts +5 -1
- package/dist/agent-src/templates/scripts/work_engine/stack/runner.ts +102 -14
- package/dist/cli/commands/uiAudit.js +124 -5
- package/dist/cli/registry.js +2 -0
- package/dist/cli-delegate/{chunk-HYWSRNUX.js → chunk-2DK2VJWG.js} +3 -3
- package/dist/cli-delegate/{chunk-L43NCYPB.js → chunk-4FS4WRXP.js} +10 -0
- package/dist/cli-delegate/{chunk-OMIVVCG2.js → chunk-A4QJ6ENT.js} +24 -0
- package/dist/cli-delegate/{chunk-236PNQZK.js → chunk-AKJGUQNO.js} +466 -285
- package/dist/cli-delegate/{chunk-E46KPN6K.js → chunk-BTWUYDGN.js} +424 -363
- package/dist/cli-delegate/{chunk-K4FFODTS.js → chunk-ILMUPLGW.js} +1227 -316
- package/dist/cli-delegate/{chunk-FF7WAFMR.js → chunk-KPBWFOPZ.js} +5 -1
- package/dist/cli-delegate/cmd_adr_effective.js +102 -0
- package/dist/cli-delegate/cmd_conformance.js +42 -10
- package/dist/cli-delegate/cmd_doctor.js +3 -3
- package/dist/cli-delegate/cmd_export.js +3 -2
- package/dist/cli-delegate/cmd_fleet.js +2 -2
- 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 +3 -2
- package/dist/cli-delegate/cmd_settings_get.js +1 -1
- package/dist/cli-delegate/cmd_settings_migrate.js +3 -2
- package/dist/cli-delegate/cmd_settings_set.js +2 -2
- package/dist/cli-delegate/cmd_sync.js +3 -2
- package/dist/cli-delegate/cmd_uninstall.js +3 -2
- package/dist/cli-delegate/cmd_validate.js +3 -2
- package/dist/discovery/deprecation-report.md +1 -1
- package/dist/discovery/discovery-manifest.json +62 -62
- package/dist/discovery/discovery-manifest.json.sha256 +1 -1
- package/dist/discovery/discovery-manifest.summary.md +1 -1
- package/dist/discovery/dormancy-report.md +1 -1
- package/dist/discovery/orphan-report.md +1 -1
- package/dist/discovery/packs.json +2 -2
- package/dist/discovery/trust-report.md +1 -1
- package/dist/discovery/workspaces.json +2 -2
- package/dist/hooks/dispatch.js +2413 -1087
- package/dist/install/claudeRuleRewrite.js +254 -0
- package/dist/install/detect.js +29 -16
- package/dist/install/detect_php_shape.js +159 -0
- package/dist/install/install.mjs +639 -428
- package/dist/mcp/awesome-mcp-servers.row.md +1 -1
- package/dist/mcp/mcp-cloudflare-catalogue.json +1 -1
- package/dist/mcp/registry-manifest.json +3 -3
- package/dist/mcp/server.json +3 -3
- package/dist/mcp/server.mjs +4818 -2645
- package/dist/server/schemas/settings.js +6 -0
- package/dist/ui/assets/index-D0jaCRPM.js +29 -0
- package/dist/ui/index.html +1 -1
- package/docs/MIGRATION.md +1 -1
- package/docs/THIRD-PARTY-NOTICES.md +25 -0
- package/docs/contracts/provider-lifecycle.md +1 -1
- package/docs/contracts/settings-classes.md +30 -4
- package/docs/guidelines/agent-infra/5w2h-analysis.md +3 -3
- package/docs/guidelines/agent-infra/agent-interaction-and-decision-quality.md +1 -0
- package/docs/guidelines/agent-infra/artifact-drafting-protocol-mechanics.md +58 -3
- package/docs/guidelines/agent-infra/ask-when-uncertain-demos.md +2 -2
- package/docs/guidelines/agent-infra/asking-and-brevity-examples.md +3 -3
- package/docs/guidelines/agent-infra/break-glass-usage.md +7 -7
- package/docs/guidelines/agent-infra/carve-out-predicates.md +3 -3
- package/docs/guidelines/agent-infra/comparison-matrix.md +1 -1
- package/docs/guidelines/agent-infra/critical-thinking.md +4 -4
- package/docs/guidelines/agent-infra/direct-answers-demos.md +2 -2
- package/docs/guidelines/agent-infra/domain-eval-anti-pattern.md +1 -1
- package/docs/guidelines/agent-infra/downstream-changes-mechanics.md +91 -0
- package/docs/guidelines/agent-infra/engineering-memory-data-format.md +3 -3
- package/docs/guidelines/agent-infra/existence-question-verdicts.md +80 -0
- package/docs/guidelines/agent-infra/first-principles.md +2 -2
- package/docs/guidelines/agent-infra/framework-neutrality-patterns.md +2 -2
- package/docs/guidelines/agent-infra/guarded-baseline.md +39 -0
- package/docs/guidelines/agent-infra/inversion-thinking.md +5 -5
- package/docs/guidelines/agent-infra/language-and-tone-examples.md +1 -1
- package/docs/guidelines/agent-infra/layered-settings.md +10 -10
- package/docs/guidelines/agent-infra/memory-access.md +1 -1
- package/docs/guidelines/agent-infra/mental-models.md +3 -3
- package/docs/guidelines/agent-infra/reuse-verdict-mechanics.md +71 -0
- package/docs/guidelines/agent-infra/review-routing-data-format.md +7 -7
- package/docs/guidelines/agent-infra/roadmap-progress-mechanics.md +13 -7
- package/docs/guidelines/agent-infra/role-contracts.md +2 -2
- package/docs/guidelines/agent-infra/role-mode-router.md +3 -3
- package/docs/guidelines/agent-infra/rule-type-governance.md +2 -2
- package/docs/guidelines/agent-infra/scqa-framework.md +5 -5
- package/docs/guidelines/agent-infra/self-improvement-pipeline.md +6 -6
- package/docs/guidelines/agent-infra/simplicity-and-goal-demos.md +2 -2
- package/docs/guidelines/agent-infra/six-hats.md +3 -3
- package/docs/guidelines/agent-infra/skill-quality-checklist.md +6 -6
- package/docs/guidelines/agent-infra/source-confidentiality-mechanics.md +109 -0
- package/docs/guidelines/agent-infra/systems-thinking.md +1 -1
- package/docs/guidelines/agent-infra/verify-before-complete-demos.md +2 -2
- package/docs/guidelines/augment-portability-patterns.md +6 -4
- package/docs/guidelines/code-clarity.md +21 -0
- package/docs/guidelines/component-oriented-and-oop-development.md +3 -2
- package/docs/guidelines/cross-role-handoff.md +2 -2
- package/docs/guidelines/design-fidelity-mechanics.md +1 -1
- package/docs/guidelines/docs/readme-size-and-splitting.md +3 -3
- package/docs/guidelines/php/database.md +90 -7
- package/docs/guidelines/prompt-templates.md +7 -7
- package/docs/guidelines/redundancy-taxonomy.md +180 -0
- package/llms.txt +2 -2
- package/package.json +10 -3
- package/src/agent-src/scripts/archive_completed_roadmaps.ts +247 -3
- package/src/agent-src/scripts/guarded_baseline.ts +328 -0
- package/src/agent-src/scripts/roadmap_set_step.ts +253 -0
- package/src/agent-src/scripts/stub_queue.ts +82 -0
- package/src/agent-src/scripts/stubs_due.ts +400 -0
- package/src/agent-src/scripts/ticket_bundles.ts +84 -0
- package/src/agent-src/scripts/update_roadmap_progress.ts +8 -4
- package/src/agent-src/templates/scripts/check_memory.ts +258 -17
- package/src/agent-src/templates/scripts/check_memory_proposal.ts +9 -3
- package/src/agent-src/templates/scripts/memory_lookup.ts +86 -0
- package/src/agent-src/templates/scripts/memory_signal.ts +44 -0
- package/src/agent-src/templates/scripts/work_engine/directives/backend/implement.ts +90 -0
- package/src/agent-src/templates/scripts/work_engine/directives/backend/index.ts +11 -0
- package/src/agent-src/templates/scripts/work_engine/directives/backend/test.ts +23 -1
- package/src/agent-src/templates/scripts/work_engine/directives/backend/verify.ts +10 -1
- package/src/agent-src/templates/scripts/work_engine/directives/mixed/stitch.ts +5 -1
- package/src/agent-src/templates/scripts/work_engine/stack/runner.ts +102 -14
- package/src/config/agent-settings.template.yml +48 -3
- package/src/config/assurance-capability-registry.json +21 -9
- package/src/config/budgets.yml +19 -0
- package/src/config/canonical-terms.yml +119 -0
- package/src/config/capability-native-outcome-bars.json +81 -0
- package/src/config/ci-local-parity.yml +95 -0
- package/src/config/discovery/prompt-patterns.yml +56 -0
- package/src/config/drafting-channels.yml +43 -0
- package/src/config/estate-count-budget.json +38 -31
- package/src/config/evaluator-budgets.json +14 -14
- package/src/config/gate-coverage.yml +731 -30
- package/src/config/gate-reachability-exemptions.json +21 -0
- package/src/config/gate-violation-baselines.json +38 -20
- package/src/config/harness-evolution-budget.json +25 -0
- package/src/config/lapsed-beta-baseline.json +96 -0
- package/src/config/memory-twin-verdicts.yml +129 -0
- package/src/config/metric-registry.yml +124 -0
- package/src/config/pack-size-budget.json +35 -7
- package/src/config/preamble-payload-budget.json +97 -71
- package/src/config/profiles/balanced.ini +27 -0
- package/src/config/profiles/full.ini +27 -0
- package/src/config/profiles/minimal.ini +27 -0
- package/src/config/publish-surface.json +9 -2
- package/src/config/routing-coverage-seed.json +43 -0
- package/src/config/rule-stub-ceilings.json +126 -112
- package/src/config/suggestion-capture.json +28 -0
- package/src/config/surface-matrix.yml +21 -2
- package/src/config/turnaround-budget.json +66 -0
- package/src/config/web-launch-readiness.json +188 -0
- package/src/install/claudeRuleRewrite.ts +288 -0
- package/src/install/detect.ts +60 -17
- package/src/install/detect_php_shape.ts +191 -0
- package/src/scripts/_cli/cmd_doctor.ts +27 -112
- package/src/scripts/_dispatch.bash +27 -0
- package/src/scripts/_lib/activation_ladder.ts +211 -0
- package/src/scripts/_lib/activation_states.ts +88 -0
- package/src/scripts/_lib/adherence_detectors.ts +143 -0
- package/src/scripts/_lib/arith_claims.ts +181 -0
- package/src/scripts/_lib/arm_ranking.ts +62 -0
- package/src/scripts/_lib/asset_delivery_ledger.ts +303 -0
- package/src/scripts/_lib/audit_field_provenance.ts +54 -0
- package/src/scripts/_lib/auto_dispatch.ts +32 -3
- package/src/scripts/_lib/bench_ab_size_claim.ts +98 -4
- package/src/scripts/_lib/benchmark_cache_fields.ts +158 -0
- package/src/scripts/_lib/candidate_proposer.ts +402 -0
- package/src/scripts/_lib/candidate_record.ts +601 -0
- package/src/scripts/_lib/capture_rate.ts +319 -0
- package/src/scripts/_lib/collector_denominator.ts +771 -0
- package/src/scripts/_lib/collector_record.ts +340 -0
- package/src/scripts/_lib/collector_store.ts +664 -0
- package/src/scripts/_lib/collector_supervision.ts +827 -0
- package/src/scripts/_lib/concern_estate.ts +77 -0
- package/src/scripts/_lib/config_chain.ts +477 -0
- package/src/scripts/_lib/config_cost.ts +209 -0
- package/src/scripts/_lib/council_settings_block.ts +6 -0
- package/src/scripts/_lib/curator_ops.ts +172 -0
- package/src/scripts/_lib/delivery_arm_experiment.ts +266 -0
- package/src/scripts/_lib/delivery_criticality.ts +126 -0
- package/src/scripts/_lib/doctor_runtime_checks.ts +70 -0
- package/src/scripts/_lib/empty_cycles.ts +88 -0
- package/src/scripts/_lib/eval_publication.ts +354 -0
- package/src/scripts/_lib/evaluation_vector.ts +283 -0
- package/src/scripts/_lib/evaluator_promotion.ts +225 -0
- package/src/scripts/_lib/evidence_basis.ts +118 -0
- package/src/scripts/_lib/exec_evidence.ts +8 -0
- package/src/scripts/_lib/experience_card.ts +272 -0
- package/src/scripts/_lib/experience_report.ts +151 -0
- package/src/scripts/_lib/experiment_freeze.ts +112 -0
- package/src/scripts/_lib/gate_baseline.ts +150 -1
- package/src/scripts/_lib/generated_by.ts +66 -0
- package/src/scripts/_lib/harness_evolution_guards.ts +229 -0
- package/src/scripts/_lib/hook_effect_probe.ts +141 -0
- package/src/scripts/_lib/host_denominator.ts +687 -0
- package/src/scripts/_lib/host_projection_reach.ts +157 -0
- package/src/scripts/_lib/ignored_blocker.ts +148 -0
- package/src/scripts/_lib/install_reach_checks.ts +495 -0
- package/src/scripts/_lib/json_duplicate_keys.ts +150 -0
- package/src/scripts/_lib/judge_hygiene.ts +228 -0
- package/src/scripts/_lib/legacy_boundary_map.ts +228 -0
- package/src/scripts/_lib/loop_guards.ts +299 -0
- package/src/scripts/_lib/loss_class.ts +129 -0
- package/src/scripts/_lib/machine_wake.ts +51 -0
- package/src/scripts/_lib/md_prose_lines.ts +177 -0
- package/src/scripts/_lib/minimality_tiebreak.ts +168 -0
- package/src/scripts/_lib/one_resolver_invariant.ts +449 -0
- package/src/scripts/_lib/orchestration_record.ts +253 -5
- package/src/scripts/_lib/outcome_envelope.ts +227 -0
- package/src/scripts/_lib/outcome_vocabularies.ts +125 -0
- package/src/scripts/_lib/paired_stats.ts +245 -0
- package/src/scripts/_lib/paired_verdict.ts +226 -0
- package/src/scripts/_lib/prefix_stable_surfaces.ts +123 -0
- package/src/scripts/_lib/privacy_class.ts +47 -0
- package/src/scripts/_lib/regression_neighbourhood.ts +259 -0
- package/src/scripts/_lib/repeated_failure.ts +105 -0
- package/src/scripts/_lib/repo_root.ts +111 -0
- package/src/scripts/_lib/review_skipped_record.ts +37 -0
- package/src/scripts/_lib/role_split.ts +338 -0
- package/src/scripts/_lib/runtime_journal.ts +1499 -0
- package/src/scripts/_lib/runtime_wiring_checks.ts +430 -0
- package/src/scripts/_lib/skill_catalogue.ts +11 -1
- package/src/scripts/_lib/skill_estate.ts +115 -0
- package/src/scripts/_lib/source_digest.ts +200 -0
- package/src/scripts/_lib/source_redact.ts +260 -0
- package/src/scripts/_lib/source_shape.ts +502 -0
- package/src/scripts/_lib/source_snapshot_dedup.ts +199 -0
- package/src/scripts/_lib/strip_comments.d.mts +8 -0
- package/src/scripts/_lib/strip_comments.mjs +65 -0
- package/src/scripts/_lib/test_red_state.ts +154 -0
- package/src/scripts/_lib/trigger_shift.ts +144 -0
- package/src/scripts/_lib/untrusted_content.ts +82 -7
- package/src/scripts/adoption_report.ts +1 -1
- package/src/scripts/adr/evidence_census.ts +1 -1
- package/src/scripts/adr/regenerate_index.ts +26 -2
- package/src/scripts/adr_cite_check.ts +164 -1
- package/src/scripts/ai_council/argument_exhaustion.ts +130 -0
- package/src/scripts/ai_council/blind_review.ts +11 -1
- package/src/scripts/ai_council/clients.ts +4 -0
- package/src/scripts/ai_council/config.ts +3 -0
- package/src/scripts/ai_council/consensus.ts +28 -8
- package/src/scripts/ai_council/consensus_round.ts +226 -0
- package/src/scripts/ai_council/disagreement_signal.ts +338 -0
- package/src/scripts/ai_council/inline_findings.ts +340 -0
- package/src/scripts/ai_council/judge_position_bias.ts +197 -0
- package/src/scripts/ai_council/orchestrator.ts +16 -203
- package/src/scripts/ai_council/orchestrator_results.ts +23 -3
- package/src/scripts/ai_council/pricing.ts +106 -0
- package/src/scripts/ai_council/prompts.ts +74 -7
- package/src/scripts/ai_council/provider_leakage_bench.ts +327 -0
- package/src/scripts/ai_council/py_format.ts +14 -3
- package/src/scripts/ai_council/recouncil_guard.ts +293 -0
- package/src/scripts/ai_council/response_record.ts +50 -0
- package/src/scripts/ai_council/topology_bench_manifest.ts +860 -0
- package/src/scripts/ai_council/topology_vocabulary.ts +175 -0
- package/src/scripts/asset_delivery_ledger.ts +157 -0
- package/src/scripts/attest_artifact.ts +193 -0
- package/src/scripts/audit_auto_rules.ts +2 -1
- package/src/scripts/audit_command_surface.ts +1 -1
- package/src/scripts/audit_mcp_tools.ts +2 -2
- package/src/scripts/audit_skill_overlap_allowlist.json +6 -1
- package/src/scripts/audit_user_type_axis.ts +2 -1
- package/src/scripts/bench_ab_clone.ts +215 -10
- package/src/scripts/bench_ab_integrity.ts +119 -5
- package/src/scripts/bench_ab_v2_stats.ts +40 -213
- package/src/scripts/build_archive_index.ts +1 -1
- package/src/scripts/build_linear_digest.ts +1 -1
- package/src/scripts/build_proof.ts +11 -4
- package/src/scripts/build_rule_trigger_matrix.ts +1 -1
- package/src/scripts/build_source_digests.ts +157 -0
- package/src/scripts/cache_realization_report.ts +103 -0
- package/src/scripts/check_adr_frontmatter.ts +126 -0
- package/src/scripts/check_benchmark_report_fields.ts +207 -0
- package/src/scripts/check_beta_review_markers.ts +235 -6
- package/src/scripts/check_bundle_path_leakage.ts +195 -7
- package/src/scripts/check_claims.ts +576 -6
- package/src/scripts/check_command_examples.ts +557 -0
- package/src/scripts/check_composite_arming.ts +35 -0
- package/src/scripts/check_concern_admissions.ts +365 -0
- package/src/scripts/check_enforcement_coverage.ts +28 -0
- package/src/scripts/check_estate_count.ts +263 -3
- package/src/scripts/check_gate_reachability.ts +383 -0
- package/src/scripts/check_host_loadability.ts +104 -0
- package/src/scripts/check_loss_class_declared.ts +308 -0
- package/src/scripts/check_md_language.ts +15 -98
- package/src/scripts/check_memory_proposal.ts +18 -11
- package/src/scripts/check_no_currency_in_cost_surfaces.ts +225 -0
- package/src/scripts/check_no_external_sources.ts +281 -6
- package/src/scripts/check_pack_conformance_fixture.ts +11 -1
- package/src/scripts/check_pack_size.ts +59 -2
- package/src/scripts/check_preamble_payload_budget.ts +144 -6
- package/src/scripts/check_prefix_stable_mutation.ts +372 -0
- package/src/scripts/check_publish_surface.ts +10 -1
- package/src/scripts/check_references.ts +24 -1
- package/src/scripts/check_routing_coverage.ts +352 -0
- package/src/scripts/check_rule_evidence_declaration.ts +316 -0
- package/src/scripts/check_rule_projection_integrity.ts +14 -4
- package/src/scripts/check_score_contract.ts +528 -0
- package/src/scripts/check_skill_admissions.ts +514 -0
- package/src/scripts/check_static_parity.ts +285 -0
- package/src/scripts/check_supervision_claim_atomicity.ts +498 -0
- package/src/scripts/check_suppression_hygiene.ts +15 -0
- package/src/scripts/check_web_launch_readiness.ts +705 -0
- package/src/scripts/ci_settle.ts +39 -2
- package/src/scripts/code_graph/build.ts +60 -3
- package/src/scripts/code_graph/extract.ts +44 -0
- package/src/scripts/code_graph/types.ts +24 -0
- package/src/scripts/collector_daemon.ts +714 -0
- package/src/scripts/config_cost_report.ts +302 -0
- package/src/scripts/consumer_matrix.ts +74 -1
- package/src/scripts/cost/budget.mjs +10 -3
- package/src/scripts/cost/track.mjs +10 -3
- package/src/scripts/council_cli.ts +37 -54
- package/src/scripts/description_route_check.ts +494 -0
- package/src/scripts/dispatch_r2_reviewer.ts +46 -5
- package/src/scripts/evolution_lab.ts +980 -0
- package/src/scripts/external_sources_denylist.json +5 -18
- package/src/scripts/extract_audit_patterns.ts +21 -0
- package/src/scripts/fold_intake.ts +12 -1
- package/src/scripts/gen_discovery_baseline.ts +1 -1
- package/src/scripts/generate_capabilities_index.ts +12 -5
- package/src/scripts/generate_capability_matrix.ts +3 -3
- package/src/scripts/generate_command_flows.ts +2 -2
- package/src/scripts/generate_cookbook.ts +2 -2
- package/src/scripts/generate_index.ts +8 -1
- package/src/scripts/generate_knowledge_index.ts +2 -1
- package/src/scripts/generate_ownership_matrix.ts +2 -1
- package/src/scripts/generate_pack_manifests.ts +10 -2
- package/src/scripts/generate_role_experiences_catalog.ts +2 -2
- package/src/scripts/generate_settings_reference.ts +1 -1
- package/src/scripts/git_authorization_hook.ts +22 -1
- package/src/scripts/grade_target_readiness.ts +48 -5
- package/src/scripts/hook_effect_doctor.ts +261 -0
- package/src/scripts/hook_manifest.json +1 -1
- package/src/scripts/hook_manifest.yaml +125 -11
- package/src/scripts/hooks/block_speaking_inbox_dir.ts +271 -0
- package/src/scripts/hooks/block_unauthorized_git.ts +18 -0
- package/src/scripts/hooks/concern_registry.ts +6 -0
- package/src/scripts/hooks/dispatch_hook.ts +32 -0
- package/src/scripts/hooks/journal_record_hook.ts +345 -0
- package/src/scripts/hooks/prepush_metadata_sources.sh +110 -0
- package/src/scripts/hooks/run_continuation_hook.ts +44 -9
- package/src/scripts/hooks/shims/install.sh +61 -0
- package/src/scripts/hooks/shims/php +101 -0
- package/src/scripts/hooks/suggestion_capture_hook.ts +378 -0
- package/src/scripts/hot_context_hook.ts +16 -0
- package/src/scripts/install-hooks.sh +20 -5
- package/src/scripts/install.ts +17 -35
- package/src/scripts/inventory_frontmatter.ts +2 -1
- package/src/scripts/lint_adr_sweep_routing.ts +12 -0
- package/src/scripts/lint_budget_ownership.ts +54 -4
- package/src/scripts/lint_canonical_terms.ts +604 -0
- package/src/scripts/lint_composition_review.ts +619 -0
- package/src/scripts/lint_consolidation_lineage.ts +666 -0
- package/src/scripts/lint_eval_specs.ts +593 -0
- package/src/scripts/lint_hook_manifest.ts +19 -0
- package/src/scripts/lint_host_portability.ts +373 -0
- package/src/scripts/lint_judge_prompt_expectation.ts +27 -1
- package/src/scripts/lint_memory_twin_parity.ts +335 -0
- package/src/scripts/lint_metric_consumers.ts +355 -0
- package/src/scripts/lint_skill_descriptions.ts +18 -1
- package/src/scripts/lint_skill_frontmatter_safety.ts +58 -0
- package/src/scripts/lint_skill_link_reach.ts +252 -0
- package/src/scripts/lint_skill_trigger_corpus.ts +752 -0
- package/src/scripts/lint_ticket_buildable.ts +17 -1
- package/src/scripts/mcp_server/consumer_tool_catalog.json +1 -1
- package/src/scripts/mcp_server/tool_catalog_source.ts +1 -1
- package/src/scripts/measure_docs_dead_links.ts +348 -0
- package/src/scripts/measure_host_capture.ts +461 -0
- package/src/scripts/migration_status.ts +3 -3
- package/src/scripts/model_rule_injection.ts +60 -0
- package/src/scripts/orchestration_record.ts +14 -0
- package/src/scripts/pack_install_smoke.ts +363 -0
- package/src/scripts/pr_conflict_census.ts +187 -0
- package/src/scripts/preamble_byte_census.ts +139 -10
- package/src/scripts/prepack-check.mjs +4 -1
- package/src/scripts/probe_turnaround.ts +384 -0
- package/src/scripts/probe_unblocked_ask.ts +279 -0
- package/src/scripts/render_benchmark_md.ts +1 -1
- package/src/scripts/report_pack_delta.ts +204 -0
- package/src/scripts/rule_activation_census.ts +70 -9
- package/src/scripts/rule_backlinks.ts +1 -1
- package/src/scripts/run_lifecycle_suite.ts +208 -0
- package/src/scripts/run_skill_evals.ts +40 -0
- package/src/scripts/schemas/delivery-manifest.schema.json +43 -0
- package/src/scripts/schemas/drafting-channels.schema.json +43 -0
- package/src/scripts/schemas/evals.schema.json +24 -1
- package/src/scripts/schemas/rule.schema.json +52 -1
- package/src/scripts/schemas/skill.schema.json +17 -2
- package/src/scripts/select_analysis_mode.ts +112 -0
- package/src/scripts/skill_overlap.ts +7 -1
- package/src/scripts/skill_tools/run_block_d_eval.ts +8 -1
- package/src/scripts/skill_tools/score_skill_relevance.ts +84 -3
- package/src/scripts/skill_tools/suggest_skill_for_task.ts +8 -1
- package/src/scripts/skill_usage_report.ts +2 -1
- package/src/scripts/stubs_due.ts +211 -0
- package/src/scripts/sweep_source_surfaces.ts +678 -0
- package/src/scripts/sync_pr_branch.ts +40 -1
- package/src/scripts/trigger_eval_grandfather.json +202 -222
- package/src/scripts/utilization_report.ts +22 -2
- package/src/server/schemas/settings.ts +10 -0
- package/src/templates/marketing-copy.yml +1 -1
- 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/alerting-doctrine/evals/triggers.json +0 -17
- 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 -67
- 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/js-library-packaging/evals/triggers.json +0 -17
- 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/monorepo-workspace/evals/triggers.json +0 -17
- package/dist/agent-src/skills/nda-triage/evals/triggers.json +0 -17
- package/dist/agent-src/skills/operational-readiness/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/server-hardening/evals/triggers.json +0 -17
- 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/storybook-workshop/evals/triggers.json +0 -17
- 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/workspace-link/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/uiAudit.js.map +0 -1
- package/dist/cli/commands/uiRender.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/lean_projection_mode.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/ui_surface.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/skillRanking.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 +0 -26
- 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/ui_authority.test.ts +0 -251
- 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 -246
- package/src/scripts/self_review_gate.test.ts +0 -296
- package/src/shared/capabilities.test.ts +0 -43
|
@@ -0,0 +1,363 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
/**
|
|
3
|
+
* Global-install smoke harness — does the PUBLISHED payload still work?
|
|
4
|
+
*
|
|
5
|
+
* `prepack-check.mjs` (in the `prepack` script) answers a narrower question:
|
|
6
|
+
* does every import in the packed set RESOLVE. That is not the same question,
|
|
7
|
+
* and the gap is recorded in the tree rather than hypothetical —
|
|
8
|
+
* `src/cli/python/workspace_hosts.ts:180-191` records a real
|
|
9
|
+
* `ERR_MODULE_NOT_FOUND` in a global install, and
|
|
10
|
+
* `src/server/routes/wizard.ts:136-137` invokes a shell script from
|
|
11
|
+
* `src/scripts/` **by path** at runtime, which no import graph can see. A trim
|
|
12
|
+
* can pass every static gate and still break an install.
|
|
13
|
+
*
|
|
14
|
+
* So this harness is behavioural: pack a real tarball, install it into a
|
|
15
|
+
* throwaway prefix, and RUN the consumer surface.
|
|
16
|
+
*
|
|
17
|
+
* WHY IT EXISTS AT ALL — `road-to-npm-payload-reduction` Phase 1.1. The
|
|
18
|
+
* `packed_size_mb` cap has been raised four times in twenty days (6.4 → 6.9 →
|
|
19
|
+
* 7.8 → 8.4 → 9.2), and every note names the same structural cause: nobody
|
|
20
|
+
* knows which of the 16.7 MB under `src/scripts/` a consumer actually needs.
|
|
21
|
+
* That question is not decidable by reading import specifiers — an earlier
|
|
22
|
+
* budget note asserted an answer that way and had to retract it. It is
|
|
23
|
+
* decidable by removing a subtree and watching an install break, or not.
|
|
24
|
+
*
|
|
25
|
+
* ```bash
|
|
26
|
+
* pack_install_smoke # the tarball as it ships
|
|
27
|
+
* pack_install_smoke --exclude src/scripts/ai_council/
|
|
28
|
+
* pack_install_smoke --sabotage src/scripts/_lib/ # must FAIL — sensitivity
|
|
29
|
+
* pack_install_smoke --json
|
|
30
|
+
* ```
|
|
31
|
+
*
|
|
32
|
+
* `--exclude` appends a negation to `files[]` in a COPY of package.json inside
|
|
33
|
+
* a temporary clone; the tracked tree is never modified.
|
|
34
|
+
*
|
|
35
|
+
* Exit codes: 0 = every probe passed · 1 = a probe failed · 2 = harness error
|
|
36
|
+
* (could not pack, could not install) — kept distinct because "the install
|
|
37
|
+
* broke" and "the harness broke" must not read the same.
|
|
38
|
+
*/
|
|
39
|
+
import * as fs from 'node:fs';
|
|
40
|
+
import * as os from 'node:os';
|
|
41
|
+
import * as path from 'node:path';
|
|
42
|
+
import { spawnSync, type SpawnSyncReturns } from 'node:child_process';
|
|
43
|
+
import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
44
|
+
|
|
45
|
+
const _FILE = fileURLToPath(import.meta.url);
|
|
46
|
+
const REPO = path.resolve(path.dirname(_FILE), '..', '..');
|
|
47
|
+
|
|
48
|
+
export interface ProbeResult {
|
|
49
|
+
readonly name: string;
|
|
50
|
+
readonly ok: boolean;
|
|
51
|
+
readonly exit: number | null;
|
|
52
|
+
readonly detail: string;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export interface SmokeResult {
|
|
56
|
+
readonly excluded: readonly string[];
|
|
57
|
+
readonly packedBytes: number | null;
|
|
58
|
+
readonly probes: readonly ProbeResult[];
|
|
59
|
+
readonly ok: boolean;
|
|
60
|
+
readonly harnessError: string | null;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
const run = (
|
|
64
|
+
cmd: string,
|
|
65
|
+
args: readonly string[],
|
|
66
|
+
opts: { cwd?: string; env?: NodeJS.ProcessEnv; timeout?: number } = {},
|
|
67
|
+
): SpawnSyncReturns<string> =>
|
|
68
|
+
spawnSync(cmd, [...args], {
|
|
69
|
+
cwd: opts.cwd ?? REPO,
|
|
70
|
+
encoding: 'utf8',
|
|
71
|
+
timeout: opts.timeout ?? 600_000,
|
|
72
|
+
maxBuffer: 64 * 1024 * 1024,
|
|
73
|
+
env: opts.env ?? process.env,
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
/** A throwaway checkout of HEAD — never the working tree, so `--exclude` is safe. */
|
|
77
|
+
function stageClone(excluded: readonly string[]): string {
|
|
78
|
+
const dir = fs.mkdtempSync(path.join(os.tmpdir(), 'ac-pack-smoke-'));
|
|
79
|
+
const src = path.join(dir, 'src');
|
|
80
|
+
const r = run('git', ['worktree', 'add', '--quiet', '--detach', src, 'HEAD']);
|
|
81
|
+
if (r.status !== 0) throw new Error(`git worktree add failed: ${r.stderr}`);
|
|
82
|
+
if (excluded.length > 0) {
|
|
83
|
+
const pj = path.join(src, 'package.json');
|
|
84
|
+
const manifest = JSON.parse(fs.readFileSync(pj, 'utf8')) as { files?: string[] };
|
|
85
|
+
// A trailing negation wins in npm's files[] evaluation, which is what
|
|
86
|
+
// makes a one-line append a faithful simulation of removing a subtree.
|
|
87
|
+
// A directory argument gets `**` appended; a glob (one containing `*`)
|
|
88
|
+
// is passed through as written. Without that distinction only whole
|
|
89
|
+
// subtrees could be tested, and the reductions that actually exist in
|
|
90
|
+
// this payload are FILE PATTERNS, not subtrees.
|
|
91
|
+
manifest.files = [
|
|
92
|
+
...(manifest.files ?? []),
|
|
93
|
+
...excluded.map((e) => (e.includes('*') ? `!${e}` : `!${e}**`)),
|
|
94
|
+
];
|
|
95
|
+
fs.writeFileSync(pj, JSON.stringify(manifest, null, 4), 'utf8');
|
|
96
|
+
}
|
|
97
|
+
return dir;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/** The consumer surface. Each probe is one thing a real install must be able to do. */
|
|
101
|
+
function probes(bin: string, home: string, project: string): ProbeResult[] {
|
|
102
|
+
const env: NodeJS.ProcessEnv = {
|
|
103
|
+
...process.env,
|
|
104
|
+
HOME: home,
|
|
105
|
+
EVENT4U_CONFIG_HOME: path.join(home, '.event4u', 'agent-config'),
|
|
106
|
+
AGENT_CONFIG_NO_UI: '1',
|
|
107
|
+
CI: '1',
|
|
108
|
+
};
|
|
109
|
+
const probe = (name: string, args: readonly string[], cwd = project): ProbeResult => {
|
|
110
|
+
const r = run(bin, args, { cwd, env, timeout: 300_000 });
|
|
111
|
+
const detail = `${r.stdout ?? ''}${r.stderr ?? ''}`.trim().slice(-1200);
|
|
112
|
+
return { name, ok: r.status === 0, exit: r.status, detail };
|
|
113
|
+
};
|
|
114
|
+
|
|
115
|
+
const out: ProbeResult[] = [
|
|
116
|
+
probe('--version', ['--version']),
|
|
117
|
+
// The projection writers are the surface where a missing template or
|
|
118
|
+
// script shows up as a real failure, so they must be exercised. The CLI
|
|
119
|
+
// `install` verb boots the wizard UI and takes no --global/--tools —
|
|
120
|
+
// that is the BASH orchestrator's signature, and getting this wrong once
|
|
121
|
+
// produced a red probe that said nothing about the payload. `--dry-run`
|
|
122
|
+
// is the CLI's own writes-suppressed boot.
|
|
123
|
+
|
|
124
|
+
probe('council:status', ['council:status']),
|
|
125
|
+
probe('hooks:status', ['hooks:status']),
|
|
126
|
+
probe('mcp:available', ['mcp:available']),
|
|
127
|
+
// `mcp:available` only lists the registry. `mcp:setup` verifies the
|
|
128
|
+
// server MODULE resolves, which is the probe that can actually see
|
|
129
|
+
// src/scripts/mcp_server/ disappear — without it, excluding that subtree
|
|
130
|
+
// reads green for the wrong reason.
|
|
131
|
+
probe('mcp:setup (server module resolves)', ['mcp:setup']),
|
|
132
|
+
probe('settings:get', ['settings:get', 'roles.active_role']),
|
|
133
|
+
];
|
|
134
|
+
|
|
135
|
+
// The wizard boot is a separate shape: it must START and then be killable,
|
|
136
|
+
// so a zero exit is the wrong assertion — a server that exits 0 immediately
|
|
137
|
+
// has not booted. `--check` is the non-serving form when the CLI has one.
|
|
138
|
+
const boot = run(bin, ['setup', '--check'], { cwd: project, env, timeout: 120_000 });
|
|
139
|
+
out.push({
|
|
140
|
+
name: 'setup --check (wizard boot path)',
|
|
141
|
+
// A CLI that does not know the flag is a harness limitation, not an
|
|
142
|
+
// install defect — recorded as such rather than silently counted green.
|
|
143
|
+
ok: boot.status === 0 || /unknown option|unknown command/i.test(`${boot.stderr}`),
|
|
144
|
+
exit: boot.status,
|
|
145
|
+
detail: `${boot.stdout ?? ''}${boot.stderr ?? ''}`.trim().slice(-600),
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
// The wizard boot is a SERVER: it prints WIZARD_READY and then stays up, so
|
|
149
|
+
// exit 0 is the wrong assertion — a zero exit here would mean it died. The
|
|
150
|
+
// marker is the success signal, and the timeout is the harness's way of
|
|
151
|
+
// saying "it was still serving".
|
|
152
|
+
const wiz = run(bin, ['install', '--dry-run', '--no-open', '--allow-headless'], {
|
|
153
|
+
cwd: project,
|
|
154
|
+
env,
|
|
155
|
+
timeout: 60_000,
|
|
156
|
+
});
|
|
157
|
+
const wizOut = `${wiz.stdout ?? ''}${wiz.stderr ?? ''}`;
|
|
158
|
+
out.push({
|
|
159
|
+
name: 'install --dry-run boots the wizard (WIZARD_READY)',
|
|
160
|
+
ok: wizOut.includes('WIZARD_READY'),
|
|
161
|
+
exit: wiz.status,
|
|
162
|
+
detail: wizOut.trim().slice(-900),
|
|
163
|
+
});
|
|
164
|
+
|
|
165
|
+
// The bash orchestrator, run FROM THE INSTALLED TREE. This is the probe that
|
|
166
|
+
// actually reads `src/scripts/` by path rather than by import, which is the
|
|
167
|
+
// only way the path-reachability the roadmap's Context documents gets tested.
|
|
168
|
+
// bin resolves to <pkg>/dist/cli/agent-config.js, so the package root is
|
|
169
|
+
// THREE levels up. Two was wrong and reported a payload finding that was a
|
|
170
|
+
// harness defect — recorded because that is the exact confusion this whole
|
|
171
|
+
// harness exists to prevent.
|
|
172
|
+
const pkgRoot = path.resolve(path.dirname(fs.realpathSync(bin)), '..', '..');
|
|
173
|
+
const orch = path.join(pkgRoot, 'src', 'scripts', 'install');
|
|
174
|
+
if (fs.existsSync(orch)) {
|
|
175
|
+
const r = run('bash', [orch, '--global', '--tools=claude-code', '--yes', '--quiet'], {
|
|
176
|
+
cwd: project,
|
|
177
|
+
env,
|
|
178
|
+
timeout: 300_000,
|
|
179
|
+
});
|
|
180
|
+
out.push({
|
|
181
|
+
name: 'bash src/scripts/install --global (installed tree)',
|
|
182
|
+
ok: r.status === 0,
|
|
183
|
+
exit: r.status,
|
|
184
|
+
detail: `${r.stdout ?? ''}${r.stderr ?? ''}`.trim().slice(-1500),
|
|
185
|
+
});
|
|
186
|
+
} else {
|
|
187
|
+
out.push({
|
|
188
|
+
name: 'bash src/scripts/install --global (installed tree)',
|
|
189
|
+
ok: false,
|
|
190
|
+
exit: null,
|
|
191
|
+
detail: `orchestrator absent from the installed tree at ${orch} — this IS a payload finding, not a harness gap`,
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
// The media pipeline, dry-run. src/scripts/ai-video/ is shell, so no import
|
|
196
|
+
// graph reaches it and only a by-path invocation can see it go missing.
|
|
197
|
+
const trace = path.join(pkgRoot, 'src', 'scripts', 'ai-video', 'smoke-trace.sh');
|
|
198
|
+
out.push({
|
|
199
|
+
name: 'ai-video smoke-trace.sh present and executable (dry-run path)',
|
|
200
|
+
ok: fs.existsSync(trace),
|
|
201
|
+
exit: null,
|
|
202
|
+
detail: fs.existsSync(trace)
|
|
203
|
+
? trace
|
|
204
|
+
: `absent from the installed tree at ${trace} — the /video:* surface has no shell to call`,
|
|
205
|
+
});
|
|
206
|
+
|
|
207
|
+
// One hook dispatch, the surface a consumer's editor drives on every turn.
|
|
208
|
+
const disp = run(
|
|
209
|
+
bin,
|
|
210
|
+
['dispatch:hook', '--platform', 'claude', '--event', 'pre_tool_use', '--project-dir', project],
|
|
211
|
+
{ cwd: project, env: { ...env, CLAUDE_PROJECT_DIR: project }, timeout: 120_000 },
|
|
212
|
+
);
|
|
213
|
+
out.push({
|
|
214
|
+
name: 'dispatch:hook pre_tool_use',
|
|
215
|
+
// A dispatcher legitimately returns non-zero to BLOCK. What must never
|
|
216
|
+
// happen is a module-resolution crash, so that is what is asserted.
|
|
217
|
+
ok: !/ERR_MODULE_NOT_FOUND|Cannot find module|ERR_REQUIRE_ESM/.test(
|
|
218
|
+
`${disp.stdout ?? ''}${disp.stderr ?? ''}`,
|
|
219
|
+
),
|
|
220
|
+
exit: disp.status,
|
|
221
|
+
detail: `${disp.stdout ?? ''}${disp.stderr ?? ''}`.trim().slice(-1200),
|
|
222
|
+
});
|
|
223
|
+
return out;
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
export function smoke(excluded: readonly string[]): SmokeResult {
|
|
227
|
+
let stage: string | null = null;
|
|
228
|
+
const fail = (msg: string): SmokeResult => ({
|
|
229
|
+
excluded,
|
|
230
|
+
packedBytes: null,
|
|
231
|
+
probes: [],
|
|
232
|
+
ok: false,
|
|
233
|
+
harnessError: msg,
|
|
234
|
+
});
|
|
235
|
+
try {
|
|
236
|
+
stage = stageClone(excluded);
|
|
237
|
+
const src = path.join(stage, 'src');
|
|
238
|
+
const prefix = path.join(stage, 'prefix');
|
|
239
|
+
const home = path.join(stage, 'home');
|
|
240
|
+
const project = path.join(stage, 'project');
|
|
241
|
+
for (const d of [prefix, home, project]) fs.mkdirSync(d, { recursive: true });
|
|
242
|
+
fs.writeFileSync(path.join(project, 'package.json'), '{"name":"smoke-project"}\n', 'utf8');
|
|
243
|
+
|
|
244
|
+
// node_modules is symlinked rather than installed: `prepack` runs the
|
|
245
|
+
// real build, and a fresh `npm ci` per bisect step would make the loop
|
|
246
|
+
// unusable. The symlink is read-only in practice — the build writes into
|
|
247
|
+
// the clone's own dist/.
|
|
248
|
+
const nm = path.join(src, 'node_modules');
|
|
249
|
+
if (!fs.existsSync(nm)) fs.symlinkSync(path.join(REPO, 'node_modules'), nm, 'dir');
|
|
250
|
+
|
|
251
|
+
// NOT --ignore-scripts. The budget file measures the TRACKED payload
|
|
252
|
+
// that way, but a published tarball is BUILT — `prepack` runs
|
|
253
|
+
// `npm run build`, and dist/cli/agent-config.js is the `bin` target. A
|
|
254
|
+
// harness packing an unbuilt tree installs a package with no binary and
|
|
255
|
+
// proves nothing about the payload a consumer downloads.
|
|
256
|
+
const packed = run('npm', ['pack', '--json', '--pack-destination', stage], {
|
|
257
|
+
cwd: src,
|
|
258
|
+
timeout: 900_000,
|
|
259
|
+
});
|
|
260
|
+
if (packed.status !== 0) return fail(`npm pack failed: ${packed.stderr.slice(-800)}`);
|
|
261
|
+
// `prepack` runs the build, whose progress goes to stdout too — and the
|
|
262
|
+
// build itself prints bracketed lines, so "slice from the last `[`" is
|
|
263
|
+
// not enough either. Take the last balanced top-level array and parse
|
|
264
|
+
// that; if it does not parse, fall back to finding the tarball on disk,
|
|
265
|
+
// because the pack SUCCEEDED and only its report was unreadable.
|
|
266
|
+
const entry = ((): { filename: string; size: number } | null => {
|
|
267
|
+
for (let i = packed.stdout.lastIndexOf('['); i !== -1; i = packed.stdout.lastIndexOf('[', i - 1)) {
|
|
268
|
+
try {
|
|
269
|
+
const parsed = JSON.parse(packed.stdout.slice(i)) as Array<{ filename: string; size: number }>;
|
|
270
|
+
if (Array.isArray(parsed) && parsed[0]?.filename !== undefined) return parsed[0];
|
|
271
|
+
} catch {
|
|
272
|
+
/* keep walking left */
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
const tgz = fs.readdirSync(stage).filter((f) => f.endsWith('.tgz'));
|
|
276
|
+
const only = tgz[0];
|
|
277
|
+
if (only === undefined) return null;
|
|
278
|
+
return { filename: only, size: fs.statSync(path.join(stage, only)).size };
|
|
279
|
+
})();
|
|
280
|
+
if (entry === null) return fail(`npm pack produced no tarball: ${packed.stdout.slice(-800)}`);
|
|
281
|
+
const tarball = path.join(stage, entry.filename);
|
|
282
|
+
|
|
283
|
+
const inst = run(
|
|
284
|
+
'npm',
|
|
285
|
+
['install', '--global', '--prefix', prefix, '--ignore-scripts', '--no-audit', '--no-fund', tarball],
|
|
286
|
+
{ cwd: stage, env: { ...process.env, npm_config_prefix: prefix } },
|
|
287
|
+
);
|
|
288
|
+
if (inst.status !== 0) return fail(`global install failed: ${inst.stderr.slice(-1500)}`);
|
|
289
|
+
|
|
290
|
+
const bin = path.join(prefix, 'bin', 'agent-config');
|
|
291
|
+
if (!fs.existsSync(bin)) return fail(`installed bin missing at ${bin}`);
|
|
292
|
+
|
|
293
|
+
const results = probes(bin, home, project);
|
|
294
|
+
return {
|
|
295
|
+
excluded,
|
|
296
|
+
packedBytes: entry.size,
|
|
297
|
+
probes: results,
|
|
298
|
+
ok: results.every((p) => p.ok),
|
|
299
|
+
harnessError: null,
|
|
300
|
+
};
|
|
301
|
+
} catch (exc) {
|
|
302
|
+
return fail(String(exc));
|
|
303
|
+
} finally {
|
|
304
|
+
if (stage !== null) {
|
|
305
|
+
// Detach the worktree before removing it, or git keeps a dangling
|
|
306
|
+
// administrative entry that breaks the NEXT run in the same repo.
|
|
307
|
+
run('git', ['worktree', 'remove', '--force', path.join(stage, 'src')]);
|
|
308
|
+
fs.rmSync(stage, { recursive: true, force: true });
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
export function main(argv: readonly string[] = process.argv.slice(2)): number {
|
|
314
|
+
const excluded: string[] = [];
|
|
315
|
+
let sabotage: string | null = null;
|
|
316
|
+
const json = argv.includes('--json');
|
|
317
|
+
for (let i = 0; i < argv.length; i += 1) {
|
|
318
|
+
if (argv[i] === '--exclude' && argv[i + 1] !== undefined) excluded.push(argv[i + 1] as string);
|
|
319
|
+
if (argv[i] === '--sabotage' && argv[i + 1] !== undefined) sabotage = argv[i + 1] as string;
|
|
320
|
+
}
|
|
321
|
+
if (sabotage !== null) excluded.push(sabotage);
|
|
322
|
+
|
|
323
|
+
const res = smoke(excluded);
|
|
324
|
+
if (json) {
|
|
325
|
+
process.stdout.write(`${JSON.stringify(res, null, 2)}\n`);
|
|
326
|
+
} else {
|
|
327
|
+
const mb = res.packedBytes === null ? 'n/a' : (res.packedBytes / 1e6).toFixed(4);
|
|
328
|
+
process.stdout.write(
|
|
329
|
+
`pack_install_smoke · excluded=${excluded.length === 0 ? '(none)' : excluded.join(' ')} · packed=${mb} MB\n`,
|
|
330
|
+
);
|
|
331
|
+
for (const p of res.probes) {
|
|
332
|
+
process.stdout.write(` ${p.ok ? '✅' : '❌'} ${p.name} (exit ${String(p.exit)})\n`);
|
|
333
|
+
if (!p.ok) process.stdout.write(` ${p.detail.split('\n').slice(-6).join('\n ')}\n`);
|
|
334
|
+
}
|
|
335
|
+
if (res.harnessError !== null) process.stderr.write(`\n⚠️ harness error: ${res.harnessError}\n`);
|
|
336
|
+
}
|
|
337
|
+
if (res.harnessError !== null) return 2;
|
|
338
|
+
if (sabotage !== null) {
|
|
339
|
+
// Sensitivity mode: the run is CORRECT when the install breaks.
|
|
340
|
+
const broke = !res.ok;
|
|
341
|
+
process.stdout.write(
|
|
342
|
+
broke
|
|
343
|
+
? `\n✅ sabotage of ${sabotage} broke the install — the harness is sensitive.\n`
|
|
344
|
+
: `\n❌ sabotage of ${sabotage} did NOT break the install. Either the subtree is genuinely unused, or this harness cannot see the surface that needs it — say which before trusting a green.\n`,
|
|
345
|
+
);
|
|
346
|
+
return broke ? 0 : 1;
|
|
347
|
+
}
|
|
348
|
+
return res.ok ? 0 : 1;
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
function _isCliEntry(): boolean {
|
|
352
|
+
const a = process.argv[1];
|
|
353
|
+
if (!a) return false;
|
|
354
|
+
if (a === _FILE || pathToFileURL(path.resolve(a)).href === import.meta.url) return true;
|
|
355
|
+
try {
|
|
356
|
+
return fs.realpathSync(a) === fs.realpathSync(_FILE);
|
|
357
|
+
} catch {
|
|
358
|
+
return false;
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
if (_isCliEntry()) process.exit(main());
|
|
362
|
+
|
|
363
|
+
export { REPO };
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
/**
|
|
3
|
+
* `pr_conflict_census` — which paths actually cost merge conflicts.
|
|
4
|
+
*
|
|
5
|
+
* Answers "why is everything red" as one command, so the measurement never has
|
|
6
|
+
* to be reconstructed by hand (road-to-merge-surface-zero AC-4).
|
|
7
|
+
*
|
|
8
|
+
* THE MEASUREMENT, and why it is a count of conflicts rather than of churn.
|
|
9
|
+
* `git show --name-only` on a MERGE commit prints the *combined* diff: only the
|
|
10
|
+
* paths that differ from BOTH parents. A conflict-free merge therefore prints
|
|
11
|
+
* nothing, and a merge that resolved conflicts prints exactly the resolved
|
|
12
|
+
* paths. Validated in both directions before this script existed:
|
|
13
|
+
*
|
|
14
|
+
* - a merge with five known conflicts printed those five paths;
|
|
15
|
+
* - a clean PR merge printed nothing.
|
|
16
|
+
*
|
|
17
|
+
* So the census counts RESOLUTIONS, not touches. That distinction is the whole
|
|
18
|
+
* value: a file edited in every branch but never conflicting is not a merge
|
|
19
|
+
* surface, and a file edited rarely but always conflicting is.
|
|
20
|
+
*
|
|
21
|
+
* WHAT IT CANNOT SEE, stated because a census that overstates its reach is
|
|
22
|
+
* worse than none. A conflict resolved by rebase leaves no merge commit, so it
|
|
23
|
+
* is invisible here. A squash-merge of a branch that itself merged main carries
|
|
24
|
+
* the resolution inside one commit with one parent — also invisible. The number
|
|
25
|
+
* is therefore a FLOOR on conflict cost, never a total.
|
|
26
|
+
*
|
|
27
|
+
* Exit codes: 0 always. This is an instrument, not a gate.
|
|
28
|
+
*/
|
|
29
|
+
import { spawnSync } from 'node:child_process';
|
|
30
|
+
import * as path from 'node:path';
|
|
31
|
+
import process from 'node:process';
|
|
32
|
+
import { fileURLToPath } from 'node:url';
|
|
33
|
+
|
|
34
|
+
const HERE = fileURLToPath(import.meta.url);
|
|
35
|
+
const REPO_ROOT = path.resolve(path.dirname(HERE), '..', '..');
|
|
36
|
+
|
|
37
|
+
export interface CensusRow {
|
|
38
|
+
path: string;
|
|
39
|
+
/** Merge commits in which this path had to be resolved against both parents. */
|
|
40
|
+
resolutions: number;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export interface Census {
|
|
44
|
+
rows: CensusRow[];
|
|
45
|
+
/** Merge commits examined. */
|
|
46
|
+
merges: number;
|
|
47
|
+
/** Merges that resolved at least one path. */
|
|
48
|
+
conflicted: number;
|
|
49
|
+
/** The `--since` ASKED for. Not necessarily the window measured — see below. */
|
|
50
|
+
since: string;
|
|
51
|
+
ref: string;
|
|
52
|
+
/**
|
|
53
|
+
* Merge commits the `--since` window contains, before `--limit` truncation.
|
|
54
|
+
*
|
|
55
|
+
* The gap between this and `merges` is the whole reason it is reported: on
|
|
56
|
+
* this repository a 60-day window holds ~1,800 merge commits, so a default
|
|
57
|
+
* limit of 200 measures the newest THREE DAYS while a naive header would
|
|
58
|
+
* print "60 days ago → HEAD". A census that mislabels its own window is
|
|
59
|
+
* worse than no census, because the number looks like a trend.
|
|
60
|
+
*/
|
|
61
|
+
available: number;
|
|
62
|
+
/** Oldest and newest merge date ACTUALLY scanned, `YYYY-MM-DD`. */
|
|
63
|
+
scannedFrom: string;
|
|
64
|
+
scannedTo: string;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
function git(root: string, args: readonly string[]): string {
|
|
68
|
+
const r = spawnSync('git', args, { cwd: root, encoding: 'utf-8', maxBuffer: 64 * 1024 * 1024 });
|
|
69
|
+
return r.status === 0 ? (r.stdout ?? '') : '';
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
export function census(
|
|
73
|
+
root = REPO_ROOT,
|
|
74
|
+
opts: { since?: string | undefined; ref?: string | undefined; limit?: number | undefined } = {},
|
|
75
|
+
): Census {
|
|
76
|
+
const since = opts.since ?? '60 days ago';
|
|
77
|
+
const ref = opts.ref ?? 'HEAD';
|
|
78
|
+
const limit = opts.limit ?? 200;
|
|
79
|
+
const lines = git(root, [
|
|
80
|
+
'log',
|
|
81
|
+
'--merges',
|
|
82
|
+
`--since=${since}`,
|
|
83
|
+
'--format=%H %ad',
|
|
84
|
+
'--date=short',
|
|
85
|
+
ref,
|
|
86
|
+
])
|
|
87
|
+
.split('\n')
|
|
88
|
+
.filter((l) => l.trim() !== '');
|
|
89
|
+
const available = lines.length;
|
|
90
|
+
const scanned = lines.slice(0, limit);
|
|
91
|
+
const merges = scanned.map((l) => l.split(' ')[0] ?? '').filter((h) => h !== '');
|
|
92
|
+
const dates = scanned.map((l) => (l.split(' ')[1] ?? '').trim()).filter((d) => d !== '');
|
|
93
|
+
const scannedTo = dates[0] ?? '';
|
|
94
|
+
const scannedFrom = dates[dates.length - 1] ?? '';
|
|
95
|
+
const counts = new Map<string, number>();
|
|
96
|
+
let conflicted = 0;
|
|
97
|
+
for (const h of merges) {
|
|
98
|
+
const files = git(root, ['show', '--format=', '--name-only', h])
|
|
99
|
+
.split('\n')
|
|
100
|
+
.map((l) => l.trim())
|
|
101
|
+
.filter((l) => l !== '');
|
|
102
|
+
if (files.length > 0) conflicted += 1;
|
|
103
|
+
for (const f of files) counts.set(f, (counts.get(f) ?? 0) + 1);
|
|
104
|
+
}
|
|
105
|
+
const rows = [...counts.entries()]
|
|
106
|
+
.map(([p, n]) => ({ path: p, resolutions: n }))
|
|
107
|
+
.sort((a, b) => b.resolutions - a.resolutions || a.path.localeCompare(b.path));
|
|
108
|
+
return { rows, merges: merges.length, conflicted, since, ref, available, scannedFrom, scannedTo };
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/** Is this path a generated artefact, i.e. one that should never be hand-merged? */
|
|
112
|
+
export function isGenerated(p: string): boolean {
|
|
113
|
+
return (
|
|
114
|
+
/^docs\/(proof|catalog|skills-catalog)\.md$/.test(p) ||
|
|
115
|
+
/^agents\/(index\.md|reports\/)/.test(p) ||
|
|
116
|
+
/^internal\/reports\//.test(p) ||
|
|
117
|
+
/^dist\//.test(p) ||
|
|
118
|
+
p === 'llms.txt' ||
|
|
119
|
+
/^src\/domains\/[^/]+\/pack\.yaml$/.test(p) ||
|
|
120
|
+
// Added after the first full-window run, because the first version
|
|
121
|
+
// MISSED the top four hotspots and reported 10 % generated where the
|
|
122
|
+
// real share is far higher. All four are written by
|
|
123
|
+
// `update_roadmap_progress` / the archive index builder / the
|
|
124
|
+
// condensation pass, never by hand:
|
|
125
|
+
p === 'agents/roadmaps-progress.md' ||
|
|
126
|
+
/^agents\/roadmaps\/(archive\/(index\.json|INDEX\.md)|stubs\/README\.md)$/.test(p) ||
|
|
127
|
+
p === 'internal/.condensation-hashes.json'
|
|
128
|
+
);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
export function main(argv: string[] = process.argv.slice(2), root = REPO_ROOT): number {
|
|
132
|
+
const arg = (flag: string): string | undefined => {
|
|
133
|
+
const i = argv.indexOf(flag);
|
|
134
|
+
return i >= 0 ? argv[i + 1] : undefined;
|
|
135
|
+
};
|
|
136
|
+
const top = Number(arg('--top') ?? '15');
|
|
137
|
+
const limitArg = arg('--limit');
|
|
138
|
+
const c = census(root, {
|
|
139
|
+
since: arg('--since'),
|
|
140
|
+
ref: arg('--ref'),
|
|
141
|
+
// Parsed here and not only accepted in `census()`: the default of 200
|
|
142
|
+
// measures the newest three days on this repository, so a caller asking
|
|
143
|
+
// for a real window needs a way to say so from the CLI.
|
|
144
|
+
limit: limitArg === undefined ? undefined : Number(limitArg),
|
|
145
|
+
});
|
|
146
|
+
if (argv.includes('--json')) {
|
|
147
|
+
process.stdout.write(`${JSON.stringify(c, null, 2)}\n`);
|
|
148
|
+
return 0;
|
|
149
|
+
}
|
|
150
|
+
// The window ACTUALLY scanned, never the one asked for. Printing `--since`
|
|
151
|
+
// as though it were the window is how a three-day reading becomes a
|
|
152
|
+
// sixty-day claim.
|
|
153
|
+
process.stdout.write(
|
|
154
|
+
`merge conflicts resolved, ${c.scannedFrom} → ${c.scannedTo} (${c.ref}): ` +
|
|
155
|
+
`${String(c.conflicted)} of ${String(c.merges)} merge commit(s) resolved at least one path\n`,
|
|
156
|
+
);
|
|
157
|
+
if (c.available > c.merges) {
|
|
158
|
+
process.stdout.write(
|
|
159
|
+
` ⚠️ TRUNCATED: \`--since ${c.since}\` holds ${String(c.available)} merge commit(s); ` +
|
|
160
|
+
`${String(c.merges)} were scanned (--limit). Raise --limit for the full window.\n`,
|
|
161
|
+
);
|
|
162
|
+
}
|
|
163
|
+
process.stdout.write('\n');
|
|
164
|
+
if (c.rows.length === 0) {
|
|
165
|
+
process.stdout.write(' (no resolutions in the window — every merge in it was clean)\n');
|
|
166
|
+
return 0;
|
|
167
|
+
}
|
|
168
|
+
const width = Math.max(...c.rows.slice(0, top).map((r) => r.path.length));
|
|
169
|
+
for (const r of c.rows.slice(0, top)) {
|
|
170
|
+
const tag = isGenerated(r.path) ? ' [generated]' : '';
|
|
171
|
+
process.stdout.write(
|
|
172
|
+
` ${String(r.resolutions).padStart(3)} ${r.path.padEnd(width)}${tag}\n`,
|
|
173
|
+
);
|
|
174
|
+
}
|
|
175
|
+
const gen = c.rows.filter((r) => isGenerated(r.path)).reduce((n, r) => n + r.resolutions, 0);
|
|
176
|
+
const all = c.rows.reduce((n, r) => n + r.resolutions, 0);
|
|
177
|
+
process.stdout.write(
|
|
178
|
+
`\n ${String(gen)} of ${String(all)} resolutions (${String(Math.round((gen / all) * 100))} %) are on GENERATED paths — ` +
|
|
179
|
+
'a PR carrying a regenerated output it did not need to carry.\n' +
|
|
180
|
+
' Floor, not a total: a conflict resolved by rebase leaves no merge commit and is invisible here.\n',
|
|
181
|
+
);
|
|
182
|
+
return 0;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
if (path.resolve(process.argv[1] ?? '') === path.resolve(HERE)) {
|
|
186
|
+
process.exit(main());
|
|
187
|
+
}
|