@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
|
@@ -1,239 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it } from "vitest";
|
|
2
|
-
import { SLOP_RULES, type DesignContext } from "./design_slop_rules.js";
|
|
3
|
-
import { scanFile } from "./lint_design_slop.js";
|
|
4
|
-
|
|
5
|
-
// Context with no DESIGN.md → all gates OFF, every rule active.
|
|
6
|
-
const NO_CTX: DesignContext = { raw: "", has: () => false };
|
|
7
|
-
const ctxWith = (raw: string): DesignContext => ({
|
|
8
|
-
raw: raw.toLowerCase(),
|
|
9
|
-
has: (...ks: string[]) => ks.some((k) => raw.toLowerCase().includes(k.toLowerCase())),
|
|
10
|
-
});
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
* Calibration corpus (Phase 4). One positive (must fire) + one negative (must be
|
|
14
|
-
* clean) per rule. `ext` drives the engine class. No untested tell — the guard
|
|
15
|
-
* below asserts every registry rule appears here.
|
|
16
|
-
*/
|
|
17
|
-
const FIXTURES: Record<string, { ext: string; positive: string; negative: string }> = {
|
|
18
|
-
"slop-v1-side-stripe": {
|
|
19
|
-
ext: "css",
|
|
20
|
-
positive: ".card { border-left: 4px solid #6c5ce7; padding: 16px; }",
|
|
21
|
-
negative: ".card { border-left: 1px solid #eee; padding: 16px; }",
|
|
22
|
-
},
|
|
23
|
-
"slop-v3-ghost-card": {
|
|
24
|
-
ext: "css",
|
|
25
|
-
positive: ".card { border: 1px solid #ddd; box-shadow: 0 8px 24px rgba(0,0,0,.1); }",
|
|
26
|
-
negative: ".card { box-shadow: 0 2px 4px rgba(0,0,0,.1); }",
|
|
27
|
-
},
|
|
28
|
-
"slop-v6-diagonal-stripes": {
|
|
29
|
-
ext: "css",
|
|
30
|
-
positive: ".bg { background: repeating-linear-gradient(45deg,#000,#000 10px,#111 10px,#111 20px); }",
|
|
31
|
-
negative: ".bg { background: linear-gradient(#fff,#eee); }",
|
|
32
|
-
},
|
|
33
|
-
"slop-c2-gradient-text": {
|
|
34
|
-
ext: "css",
|
|
35
|
-
positive: ".h { background: linear-gradient(90deg,#f00,#00f); -webkit-background-clip: text; color: transparent; }",
|
|
36
|
-
negative: ".h { color: #111; }",
|
|
37
|
-
},
|
|
38
|
-
"slop-c5-cream-palette": {
|
|
39
|
-
ext: "css",
|
|
40
|
-
positive: "body { background: #f5f1ea; } .a { color: #b08947; }",
|
|
41
|
-
negative: "body { background: #ffffff; } .a { color: #111111; }",
|
|
42
|
-
},
|
|
43
|
-
"slop-t4-eyebrow-overuse": {
|
|
44
|
-
ext: "html",
|
|
45
|
-
positive:
|
|
46
|
-
'<section><span class="uppercase">Features</span></section><section><span class="uppercase">Pricing</span></section><section><h2>Contact</h2></section>',
|
|
47
|
-
negative:
|
|
48
|
-
'<section><span class="uppercase">Features</span></section><section><h2>Pricing</h2></section><section><h2>Contact</h2></section>',
|
|
49
|
-
},
|
|
50
|
-
"slop-t6-crushed-tracking": {
|
|
51
|
-
ext: "css",
|
|
52
|
-
positive: ".display { letter-spacing: -0.05em; }",
|
|
53
|
-
negative: ".display { letter-spacing: -0.02em; }",
|
|
54
|
-
},
|
|
55
|
-
"slop-t7-default-fonts": {
|
|
56
|
-
ext: "css",
|
|
57
|
-
positive: "body { font-family: 'Inter', sans-serif; }",
|
|
58
|
-
negative: "body { font-family: 'Söhne', sans-serif; }",
|
|
59
|
-
},
|
|
60
|
-
"slop-l4-numbered-markers": {
|
|
61
|
-
ext: "html",
|
|
62
|
-
positive: "<div>01</div><div>02</div><div>03</div>",
|
|
63
|
-
negative: "<div>Discover</div><div>Build</div><div>Ship</div>",
|
|
64
|
-
},
|
|
65
|
-
"slop-l8-zindex-magic": {
|
|
66
|
-
ext: "css",
|
|
67
|
-
positive: ".modal { z-index: 9999; }",
|
|
68
|
-
negative: ".modal { z-index: 400; }",
|
|
69
|
-
},
|
|
70
|
-
"slop-m4-transition-all": {
|
|
71
|
-
ext: "css",
|
|
72
|
-
positive: ".x { transition: all 200ms ease-out; }",
|
|
73
|
-
negative: ".x { transition: transform 200ms ease-out; }",
|
|
74
|
-
},
|
|
75
|
-
"slop-m2-animate-layout": {
|
|
76
|
-
ext: "css",
|
|
77
|
-
positive: ".x { transition: width 200ms ease; }",
|
|
78
|
-
negative: ".x { transition: transform 200ms, opacity 200ms; }",
|
|
79
|
-
},
|
|
80
|
-
"slop-cp1-em-dash": {
|
|
81
|
-
ext: "md",
|
|
82
|
-
// ≥80 words is the rule floor; positive carries 4 em-dashes (well over the
|
|
83
|
-
// ~2-per-500 density), negative carries one across the same length.
|
|
84
|
-
positive:
|
|
85
|
-
"We build tools — fast, focused tools — that teams genuinely love using every single day of the working week. " +
|
|
86
|
-
"The product is calm and clear and useful, and people return to it daily because it respects their time — and their attention — and never wastes a single click of effort or a moment of their busy day, and that quiet reliability is the whole point of the thing we set out to make together, and the team keeps shipping the small improvements that matter most to the people who rely on it.",
|
|
87
|
-
negative:
|
|
88
|
-
"We build tools, fast and focused tools, that teams genuinely love using every single day of the working week. " +
|
|
89
|
-
"The product is calm and clear and useful, and people return to it daily because it respects their time and their attention and never wastes a single click of effort or a moment of their busy day — and that quiet reliability is the whole point of the thing we set out to make together, and the team keeps shipping the small improvements that matter most to the people who rely on it.",
|
|
90
|
-
},
|
|
91
|
-
"slop-cp2-buzzword": {
|
|
92
|
-
ext: "md",
|
|
93
|
-
positive: "We streamline and empower your robust, world-class workflow.",
|
|
94
|
-
negative: "We cut page load by 40% and remove three steps from checkout.",
|
|
95
|
-
},
|
|
96
|
-
"slop-cp5-emoji-ui": {
|
|
97
|
-
ext: "html",
|
|
98
|
-
positive: '<h1>🚀 Get Started</h1><button>✅ Track progress</button>',
|
|
99
|
-
// Functional placements stay clean: mid-sentence emoji, status-cell emoji.
|
|
100
|
-
negative:
|
|
101
|
-
'<h1>Get Started</h1><p>Deploys are marked ✅ when healthy.</p><td>✅</td><button>Track progress</button>',
|
|
102
|
-
},
|
|
103
|
-
"slop-v8-lock-shape": {
|
|
104
|
-
ext: "css",
|
|
105
|
-
positive: ".a{border-radius:4px}.b{border-radius:8px}.c{border-radius:12px}.d{border-radius:20px}",
|
|
106
|
-
negative: ".a{border-radius:8px}.b{border-radius:12px}",
|
|
107
|
-
},
|
|
108
|
-
"slop-l9-section-monotony": {
|
|
109
|
-
ext: "html",
|
|
110
|
-
// 8 identical media+text sections → 1 distinct layout family (< 4)
|
|
111
|
-
positive: '<section><div class="grid"><img src="x"><h2>A</h2><p>t</p></div></section>'.repeat(8),
|
|
112
|
-
// 8 sections, 4 distinct signatures → not monotonous
|
|
113
|
-
negative: (
|
|
114
|
-
'<section><div class="grid"><img src="x"><h2>A</h2></div></section>' +
|
|
115
|
-
"<section><h2>B</h2><p>t</p></section>" +
|
|
116
|
-
'<section><div class="flex"><p>c</p></div></section>' +
|
|
117
|
-
'<section><img src="y"></section>'
|
|
118
|
-
).repeat(2),
|
|
119
|
-
},
|
|
120
|
-
"slop-l10-zigzag": {
|
|
121
|
-
ext: "html",
|
|
122
|
-
// 3 consecutive media+text two-column sections → run > 2
|
|
123
|
-
positive: '<section><div class="grid"><img src="x"><h2>A</h2><p>t</p></div></section>'.repeat(3),
|
|
124
|
-
// only 2 consecutive → within cap
|
|
125
|
-
negative: '<section><div class="grid"><img src="x"><h2>A</h2><p>t</p></div></section>'.repeat(2),
|
|
126
|
-
},
|
|
127
|
-
"slop-v4-over-rounded": {
|
|
128
|
-
ext: "css",
|
|
129
|
-
// 24px radius on an 80px chip — mid-range rounding on a small surface
|
|
130
|
-
positive: ".chip{width:80px;border-radius:24px;background:#1f5f9c}",
|
|
131
|
-
// a deliberate pill is a shape decision, not over-rounding
|
|
132
|
-
negative: ".chip{width:80px;border-radius:9999px;background:#1f5f9c}",
|
|
133
|
-
},
|
|
134
|
-
"slop-c3-dark-glow": {
|
|
135
|
-
ext: "css",
|
|
136
|
-
// zero-offset saturated glow inside a declared dark surface
|
|
137
|
-
positive: ".dark .btn{background:#0b0f14;box-shadow:0 0 18px #22d3ee}",
|
|
138
|
-
// same dark surface, ordinary offset depth — not a glow
|
|
139
|
-
negative: ".dark .btn{background:#0b0f14;box-shadow:0 2px 8px #22d3ee}",
|
|
140
|
-
},
|
|
141
|
-
"slop-t9-uppercase-body": {
|
|
142
|
-
ext: "css",
|
|
143
|
-
positive: "article p{text-transform:uppercase;font-size:16px}",
|
|
144
|
-
// a short field label is the legitimate home of uppercase
|
|
145
|
-
negative: ".field-label{text-transform:uppercase;font-size:12px}",
|
|
146
|
-
},
|
|
147
|
-
"slop-t10-wide-tracking-body": {
|
|
148
|
-
ext: "css",
|
|
149
|
-
positive: "article p{letter-spacing:0.12em;font-size:16px}",
|
|
150
|
-
negative: "article p{letter-spacing:0.01em;font-size:16px}",
|
|
151
|
-
},
|
|
152
|
-
"slop-m1-bounce-easing": {
|
|
153
|
-
ext: "css",
|
|
154
|
-
// y1 = 1.56 overshoots the target and returns — the bounce signature
|
|
155
|
-
positive: ".card{transition:transform .3s cubic-bezier(.34,1.56,.64,1)}",
|
|
156
|
-
negative: ".card{transition:transform .3s cubic-bezier(.4,0,.2,1)}",
|
|
157
|
-
},
|
|
158
|
-
"slop-m3-img-hover-transform": {
|
|
159
|
-
ext: "css",
|
|
160
|
-
positive: ".tile:hover img{transform:scale(1.05)}",
|
|
161
|
-
negative: ".tile:hover .tile__title{color:#16202b}",
|
|
162
|
-
},
|
|
163
|
-
};
|
|
164
|
-
|
|
165
|
-
function findingsFor(ruleId: string, content: string, ext: string, ctx = NO_CTX) {
|
|
166
|
-
return scanFile(content, `fixture.${ext}`, ctx).filter((f) => f.rule === ruleId);
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
describe("design-slop rule registry", () => {
|
|
170
|
-
it("every rule has a unique id + a catalog id", () => {
|
|
171
|
-
const ids = SLOP_RULES.map((r) => r.id);
|
|
172
|
-
expect(new Set(ids).size).toBe(ids.length);
|
|
173
|
-
for (const r of SLOP_RULES) {
|
|
174
|
-
expect(r.id).toMatch(/^slop-/);
|
|
175
|
-
expect(r.catalogId).toMatch(/^[A-Z]+\d+$/);
|
|
176
|
-
expect(r.engines.length).toBeGreaterThan(0);
|
|
177
|
-
}
|
|
178
|
-
});
|
|
179
|
-
|
|
180
|
-
it("no untested tell — every registry rule has a +/- fixture", () => {
|
|
181
|
-
for (const r of SLOP_RULES) {
|
|
182
|
-
expect(FIXTURES[r.id], `missing fixture for ${r.id}`).toBeDefined();
|
|
183
|
-
}
|
|
184
|
-
// and no orphan fixtures
|
|
185
|
-
const ids = new Set(SLOP_RULES.map((r) => r.id));
|
|
186
|
-
for (const k of Object.keys(FIXTURES)) {
|
|
187
|
-
expect(ids.has(k), `orphan fixture ${k}`).toBe(true);
|
|
188
|
-
}
|
|
189
|
-
});
|
|
190
|
-
|
|
191
|
-
describe("positive fixtures fire, negative fixtures are clean", () => {
|
|
192
|
-
for (const r of SLOP_RULES) {
|
|
193
|
-
const fx = FIXTURES[r.id];
|
|
194
|
-
if (!fx) continue;
|
|
195
|
-
it(`${r.id} (${r.catalogId})`, () => {
|
|
196
|
-
expect(findingsFor(r.id, fx.positive, fx.ext).length, "positive must fire").toBeGreaterThan(0);
|
|
197
|
-
expect(findingsFor(r.id, fx.negative, fx.ext).length, "negative must be clean").toBe(0);
|
|
198
|
-
});
|
|
199
|
-
}
|
|
200
|
-
});
|
|
201
|
-
});
|
|
202
|
-
|
|
203
|
-
describe("context gates suppress when DESIGN.md declares intent", () => {
|
|
204
|
-
it("t7 default-font is suppressed when DESIGN.md adopts Inter", () => {
|
|
205
|
-
const fx = FIXTURES["slop-t7-default-fonts"]!;
|
|
206
|
-
expect(findingsFor("slop-t7-default-fonts", fx.positive, "css", NO_CTX).length).toBeGreaterThan(0);
|
|
207
|
-
expect(
|
|
208
|
-
findingsFor("slop-t7-default-fonts", fx.positive, "css", ctxWith("Body font: Inter (chosen for variable metrics in a data-dense dashboard)")).length,
|
|
209
|
-
).toBe(0);
|
|
210
|
-
});
|
|
211
|
-
|
|
212
|
-
it("cp5 emoji-ui is suppressed when DESIGN.md declares an emoji strategy", () => {
|
|
213
|
-
const fx = FIXTURES["slop-cp5-emoji-ui"]!;
|
|
214
|
-
expect(findingsFor("slop-cp5-emoji-ui", fx.positive, "html", NO_CTX).length).toBeGreaterThan(0);
|
|
215
|
-
expect(
|
|
216
|
-
findingsFor("slop-cp5-emoji-ui", fx.positive, "html", ctxWith("Voice: playful; emoji are part of the brand voice in headings and CTAs")).length,
|
|
217
|
-
).toBe(0);
|
|
218
|
-
});
|
|
219
|
-
|
|
220
|
-
it("c5 cream-palette is suppressed under a declared warm-neutral language", () => {
|
|
221
|
-
const fx = FIXTURES["slop-c5-cream-palette"]!;
|
|
222
|
-
expect(findingsFor("slop-c5-cream-palette", fx.positive, "css", NO_CTX).length).toBeGreaterThan(0);
|
|
223
|
-
expect(
|
|
224
|
-
findingsFor("slop-c5-cream-palette", fx.positive, "css", ctxWith("Palette: warm-neutral, first-party")).length,
|
|
225
|
-
).toBe(0);
|
|
226
|
-
});
|
|
227
|
-
});
|
|
228
|
-
|
|
229
|
-
describe("inline-ignore", () => {
|
|
230
|
-
it("design-slop-disable-next-line suppresses the next line", () => {
|
|
231
|
-
const css = "/* design-slop-disable-next-line slop-m4-transition-all */\n.x { transition: all 200ms; }";
|
|
232
|
-
expect(findingsFor("slop-m4-transition-all", css, "css").length).toBe(0);
|
|
233
|
-
});
|
|
234
|
-
|
|
235
|
-
it("file-scope design-slop-disable suppresses the whole file", () => {
|
|
236
|
-
const css = "/* design-slop-disable slop-l8-zindex-magic */\n.a{z-index:9999}\n.b{z-index:999}";
|
|
237
|
-
expect(findingsFor("slop-l8-zindex-magic", css, "css").length).toBe(0);
|
|
238
|
-
});
|
|
239
|
-
});
|
|
@@ -1,296 +0,0 @@
|
|
|
1
|
-
import { spawnSync } from 'node:child_process';
|
|
2
|
-
import * as fs from 'node:fs';
|
|
3
|
-
import * as os from 'node:os';
|
|
4
|
-
import * as path from 'node:path';
|
|
5
|
-
|
|
6
|
-
import { afterEach, describe, expect, it } from 'vitest';
|
|
7
|
-
|
|
8
|
-
import {
|
|
9
|
-
LARGE_DIFF_LINES,
|
|
10
|
-
buildPlan,
|
|
11
|
-
classifyBlocking,
|
|
12
|
-
detectReleaseVersion,
|
|
13
|
-
escalationReasons,
|
|
14
|
-
gateVerdict,
|
|
15
|
-
isReviewablePath,
|
|
16
|
-
pickPreviousTag,
|
|
17
|
-
renderReview,
|
|
18
|
-
type Finding,
|
|
19
|
-
} from './self_review_gate.js';
|
|
20
|
-
|
|
21
|
-
const f = (severity: Finding['severity'], kind: Finding['kind']): Finding => ({
|
|
22
|
-
severity,
|
|
23
|
-
kind,
|
|
24
|
-
title: `${severity} ${kind}`,
|
|
25
|
-
detail: 'x',
|
|
26
|
-
});
|
|
27
|
-
|
|
28
|
-
describe('classifyBlocking', () => {
|
|
29
|
-
it('blocks security + high and claim + critical', () => {
|
|
30
|
-
expect(classifyBlocking(f('high', 'security'))).toBe(true);
|
|
31
|
-
expect(classifyBlocking(f('critical', 'claim'))).toBe(true);
|
|
32
|
-
});
|
|
33
|
-
it('does not block low/medium security, or any style/correctness', () => {
|
|
34
|
-
expect(classifyBlocking(f('medium', 'security'))).toBe(false);
|
|
35
|
-
expect(classifyBlocking(f('low', 'claim'))).toBe(false);
|
|
36
|
-
expect(classifyBlocking(f('critical', 'style'))).toBe(false);
|
|
37
|
-
expect(classifyBlocking(f('high', 'correctness'))).toBe(false);
|
|
38
|
-
});
|
|
39
|
-
});
|
|
40
|
-
|
|
41
|
-
describe('gateVerdict', () => {
|
|
42
|
-
const blocking = [f('high', 'security')];
|
|
43
|
-
it('advisory (default shipped mode) never blocks, even with a blocking finding', () => {
|
|
44
|
-
expect(gateVerdict(blocking, { enforce: false })).toBe(0);
|
|
45
|
-
});
|
|
46
|
-
it('enforce blocks only on a merge-blocking finding', () => {
|
|
47
|
-
expect(gateVerdict(blocking, { enforce: true })).toBe(2);
|
|
48
|
-
expect(gateVerdict([f('critical', 'style')], { enforce: true })).toBe(0);
|
|
49
|
-
expect(gateVerdict([], { enforce: true })).toBe(0);
|
|
50
|
-
});
|
|
51
|
-
});
|
|
52
|
-
|
|
53
|
-
describe('isReviewablePath', () => {
|
|
54
|
-
it('skips generated projections + lockfiles, keeps source', () => {
|
|
55
|
-
expect(isReviewablePath('dist/agent-src/skills/x/SKILL.md')).toBe(false);
|
|
56
|
-
expect(isReviewablePath('.augment/rules/x.md')).toBe(false);
|
|
57
|
-
expect(isReviewablePath('.windsurfrules')).toBe(false);
|
|
58
|
-
expect(isReviewablePath('package-lock.json')).toBe(false);
|
|
59
|
-
expect(isReviewablePath('src/rules/x.md')).toBe(true);
|
|
60
|
-
expect(isReviewablePath('src/scripts/y.ts')).toBe(true);
|
|
61
|
-
});
|
|
62
|
-
});
|
|
63
|
-
|
|
64
|
-
describe('renderReview', () => {
|
|
65
|
-
it('carries the HUMAN REVIEW REQUIRED banner + the floor-not-human-review caveat', () => {
|
|
66
|
-
const out = renderReview([], false);
|
|
67
|
-
expect(out).toContain('HUMAN REVIEW REQUIRED');
|
|
68
|
-
expect(out).toContain('not** independent human review');
|
|
69
|
-
});
|
|
70
|
-
it('advisory phrasing says WOULD block, enforce phrasing says blocking', () => {
|
|
71
|
-
const blocking = [f('high', 'security')];
|
|
72
|
-
expect(renderReview(blocking, false)).toContain('WOULD block');
|
|
73
|
-
expect(renderReview(blocking, true)).toContain('merge-blocking');
|
|
74
|
-
});
|
|
75
|
-
it('labels each row (Blocking)/(Advisory) so a critical-but-non-blocking row never reads as inconsistent with the count', () => {
|
|
76
|
-
const findings = [f('critical', 'correctness'), f('critical', 'security')];
|
|
77
|
-
const out = renderReview(findings, false);
|
|
78
|
-
// critical × correctness is NOT blocking → labelled Advisory
|
|
79
|
-
expect(out).toContain('| critical (Advisory) | correctness |');
|
|
80
|
-
// critical × security IS blocking → labelled Blocking
|
|
81
|
-
expect(out).toContain('| critical (Blocking) | security |');
|
|
82
|
-
// verdict count matches the number of (Blocking) rows (exactly 1)
|
|
83
|
-
expect(out).toContain('1 finding(s) WOULD block');
|
|
84
|
-
expect((out.match(/\(Blocking\)/g) ?? []).length).toBe(1);
|
|
85
|
-
});
|
|
86
|
-
});
|
|
87
|
-
|
|
88
|
-
describe('escalationReasons', () => {
|
|
89
|
-
it('flags a large diff at or above the threshold', () => {
|
|
90
|
-
expect(escalationReasons(['src/a.ts'], LARGE_DIFF_LINES)).toEqual([
|
|
91
|
-
`large diff (${LARGE_DIFF_LINES} changed lines ≥ ${LARGE_DIFF_LINES})`,
|
|
92
|
-
]);
|
|
93
|
-
});
|
|
94
|
-
it('does not flag a small non-claim diff', () => {
|
|
95
|
-
expect(escalationReasons(['src/a.ts'], LARGE_DIFF_LINES - 1)).toEqual([]);
|
|
96
|
-
});
|
|
97
|
-
it('flags a claim-ledger surface regardless of size', () => {
|
|
98
|
-
expect(escalationReasons(['docs/CLAIMS.md'], 1)).toEqual([
|
|
99
|
-
'claim-affecting surface touched (docs/CLAIMS.md)',
|
|
100
|
-
]);
|
|
101
|
-
expect(escalationReasons(['docs/proof.md'], 1)[0]).toContain('docs/proof.md');
|
|
102
|
-
expect(escalationReasons(['docs/comparison.yaml'], 1)[0]).toContain('docs/comparison.yaml');
|
|
103
|
-
expect(escalationReasons(['README.md'], 1)[0]).toContain('README.md');
|
|
104
|
-
});
|
|
105
|
-
it('reports both reasons when a large diff also touches a claim surface', () => {
|
|
106
|
-
const r = escalationReasons(['docs/CLAIMS.md', 'src/big.ts'], LARGE_DIFF_LINES + 50);
|
|
107
|
-
expect(r).toHaveLength(2);
|
|
108
|
-
expect(r[0]).toContain('large diff');
|
|
109
|
-
expect(r[1]).toContain('claim-affecting');
|
|
110
|
-
});
|
|
111
|
-
});
|
|
112
|
-
|
|
113
|
-
describe('renderReview — escalation banner', () => {
|
|
114
|
-
const f = (severity: Finding['severity'], kind: Finding['kind']): Finding => ({
|
|
115
|
-
severity, kind, title: 't', detail: 'd',
|
|
116
|
-
});
|
|
117
|
-
it('appends the escalation recommendation when reasons are present', () => {
|
|
118
|
-
const out = renderReview([], false, ['large diff (500 changed lines ≥ 400)']);
|
|
119
|
-
expect(out).toContain('Escalation warranted');
|
|
120
|
-
expect(out).toContain('/council:pr');
|
|
121
|
-
expect(out).toContain('never');
|
|
122
|
-
});
|
|
123
|
-
it('omits the escalation block when there are no reasons (byte-identical to no-arg)', () => {
|
|
124
|
-
const findings = [f('high', 'security')];
|
|
125
|
-
expect(renderReview(findings, false, [])).toBe(renderReview(findings, false));
|
|
126
|
-
});
|
|
127
|
-
it('recommends escalation even on a clean (no-finding) large diff', () => {
|
|
128
|
-
const out = renderReview([], false, ['large diff (500 changed lines ≥ 400)']);
|
|
129
|
-
expect(out).toContain('no findings');
|
|
130
|
-
expect(out).toContain('Escalation warranted');
|
|
131
|
-
});
|
|
132
|
-
});
|
|
133
|
-
|
|
134
|
-
// ── Release-PR review mode (road-to-feedback-9.2.0-followups Phase 3) ──
|
|
135
|
-
// See docs/design/release-pr-review-mode.md — anchored to the PR #957
|
|
136
|
-
// false-advisory case (release features reading as "not in the diff").
|
|
137
|
-
|
|
138
|
-
describe('detectReleaseVersion', () => {
|
|
139
|
-
const changelogAdd = (v: string) =>
|
|
140
|
-
`+## [${v}](https://github.com/event4u-app/agent-config/compare/9.1.0...${v}) (2026-07-14)`;
|
|
141
|
-
const packageAdd = (v: string) => `+ "version": "${v}",`;
|
|
142
|
-
|
|
143
|
-
it('detects a release PR when the changelog heading and the package.json bump agree', () => {
|
|
144
|
-
const patch = [
|
|
145
|
-
'diff --git a/CHANGELOG.md b/CHANGELOG.md',
|
|
146
|
-
'@@ -14,6 +14,8 @@',
|
|
147
|
-
' ## [Unreleased]',
|
|
148
|
-
'+',
|
|
149
|
-
changelogAdd('9.2.0'),
|
|
150
|
-
'diff --git a/package.json b/package.json',
|
|
151
|
-
'@@ -1,6 +1,6 @@',
|
|
152
|
-
'- "version": "9.1.0",',
|
|
153
|
-
packageAdd('9.2.0'),
|
|
154
|
-
].join('\n');
|
|
155
|
-
expect(detectReleaseVersion(patch)).toBe('9.2.0');
|
|
156
|
-
});
|
|
157
|
-
|
|
158
|
-
it('is NOT a release PR when only the changelog heading changed (no version bump)', () => {
|
|
159
|
-
expect(detectReleaseVersion(changelogAdd('9.2.0'))).toBeNull();
|
|
160
|
-
});
|
|
161
|
-
|
|
162
|
-
it('is NOT a release PR when only package.json bumped (no changelog heading)', () => {
|
|
163
|
-
expect(detectReleaseVersion(packageAdd('9.2.0'))).toBeNull();
|
|
164
|
-
});
|
|
165
|
-
|
|
166
|
-
it('is NOT a release PR on a normal feature-PR patch (neither signal present)', () => {
|
|
167
|
-
const patch = ['+export function foo() {}', '-export function bar() {}'].join('\n');
|
|
168
|
-
expect(detectReleaseVersion(patch)).toBeNull();
|
|
169
|
-
});
|
|
170
|
-
|
|
171
|
-
it('refuses to guess when the changelog and package.json versions disagree', () => {
|
|
172
|
-
const patch = [changelogAdd('9.2.0'), packageAdd('9.3.0')].join('\n');
|
|
173
|
-
expect(detectReleaseVersion(patch)).toBeNull();
|
|
174
|
-
});
|
|
175
|
-
|
|
176
|
-
it('ignores removed lines (the old version) and reads only the added one', () => {
|
|
177
|
-
const patch = ['- "version": "9.1.0",', packageAdd('9.2.0'), changelogAdd('9.2.0')].join('\n');
|
|
178
|
-
expect(detectReleaseVersion(patch)).toBe('9.2.0');
|
|
179
|
-
});
|
|
180
|
-
});
|
|
181
|
-
|
|
182
|
-
describe('pickPreviousTag', () => {
|
|
183
|
-
it('picks the highest tag strictly below the release version', () => {
|
|
184
|
-
expect(pickPreviousTag('9.2.0', ['9.0.0', '9.1.0', '9.2.0'])).toBe('9.1.0');
|
|
185
|
-
});
|
|
186
|
-
it('handles a v-prefixed tag naming convention', () => {
|
|
187
|
-
expect(pickPreviousTag('9.2.0', ['v9.0.0', 'v9.1.0'])).toBe('v9.1.0');
|
|
188
|
-
});
|
|
189
|
-
it('returns null when no tag is strictly below the version', () => {
|
|
190
|
-
expect(pickPreviousTag('9.2.0', ['9.2.0', '9.3.0'])).toBeNull();
|
|
191
|
-
expect(pickPreviousTag('9.2.0', [])).toBeNull();
|
|
192
|
-
});
|
|
193
|
-
it('ignores non-semver tags (branch-backup names etc.) instead of crashing', () => {
|
|
194
|
-
expect(
|
|
195
|
-
pickPreviousTag('9.2.0', [
|
|
196
|
-
'backup/pre-rebase-augment-limit-fit',
|
|
197
|
-
'9.1.0',
|
|
198
|
-
'local-squashed-tip-2026-05-18',
|
|
199
|
-
]),
|
|
200
|
-
).toBe('9.1.0');
|
|
201
|
-
});
|
|
202
|
-
});
|
|
203
|
-
|
|
204
|
-
describe('buildPlan — release-PR shape (PR #957 reproduction)', () => {
|
|
205
|
-
function git(root: string, ...args: string[]) {
|
|
206
|
-
return spawnSync('git', args, {
|
|
207
|
-
cwd: root,
|
|
208
|
-
encoding: 'utf8',
|
|
209
|
-
env: {
|
|
210
|
-
...process.env,
|
|
211
|
-
GIT_AUTHOR_NAME: 'T',
|
|
212
|
-
GIT_AUTHOR_EMAIL: 't@e.test',
|
|
213
|
-
GIT_COMMITTER_NAME: 'T',
|
|
214
|
-
GIT_COMMITTER_EMAIL: 't@e.test',
|
|
215
|
-
},
|
|
216
|
-
});
|
|
217
|
-
}
|
|
218
|
-
function write(root: string, rel: string, content: string): void {
|
|
219
|
-
const full = path.join(root, rel);
|
|
220
|
-
fs.mkdirSync(path.dirname(full), { recursive: true });
|
|
221
|
-
fs.writeFileSync(full, content, 'utf-8');
|
|
222
|
-
}
|
|
223
|
-
function mkTmp(): string {
|
|
224
|
-
return fs.realpathSync(fs.mkdtempSync(path.join(os.tmpdir(), 'srg-')));
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
let root: string | undefined;
|
|
228
|
-
afterEach(() => {
|
|
229
|
-
if (root) fs.rmSync(root, { recursive: true, force: true });
|
|
230
|
-
root = undefined;
|
|
231
|
-
});
|
|
232
|
-
|
|
233
|
-
it('release mode sees the pre-cut feature file; the packaging diff alone does not (PR #957 shape)', () => {
|
|
234
|
-
root = mkTmp();
|
|
235
|
-
git(root, 'init', '-q', '-b', 'main');
|
|
236
|
-
write(root, 'package.json', '{\n "name": "x",\n "version": "9.0.0"\n}\n');
|
|
237
|
-
write(root, 'CHANGELOG.md', '# Changelog\n\n## [Unreleased]\n');
|
|
238
|
-
git(root, 'add', '-A');
|
|
239
|
-
git(root, 'commit', '-q', '-m', 'baseline');
|
|
240
|
-
git(root, 'tag', '9.1.0'); // the previous release tag
|
|
241
|
-
|
|
242
|
-
// The feature merges into main BEFORE the release cut — the PR #957 shape.
|
|
243
|
-
write(root, 'feature.txt', 'new cross-source-consistency rule content\n');
|
|
244
|
-
git(root, 'add', '-A');
|
|
245
|
-
git(root, 'commit', '-q', '-m', 'feat: cross-source-consistency');
|
|
246
|
-
|
|
247
|
-
// Release branch cut from main's current tip — no divergence yet, so
|
|
248
|
-
// main...release-branch only shows the release-cut commit below.
|
|
249
|
-
git(root, 'checkout', '-q', '-b', 'release-branch');
|
|
250
|
-
write(
|
|
251
|
-
root,
|
|
252
|
-
'CHANGELOG.md',
|
|
253
|
-
'# Changelog\n\n## [Unreleased]\n\n' +
|
|
254
|
-
'## [9.2.0](https://github.com/event4u-app/agent-config/compare/9.1.0...9.2.0) (2026-07-14)\n',
|
|
255
|
-
);
|
|
256
|
-
write(root, 'package.json', '{\n "name": "x",\n "version": "9.2.0"\n}\n');
|
|
257
|
-
git(root, 'add', '-A');
|
|
258
|
-
git(root, 'commit', '-q', '-m', 'chore(release): 9.2.0');
|
|
259
|
-
|
|
260
|
-
const plan = buildPlan('main', root);
|
|
261
|
-
|
|
262
|
-
expect(plan.release?.version).toBe('9.2.0');
|
|
263
|
-
expect(plan.release?.previousTag).toBe('9.1.0');
|
|
264
|
-
// The packaging diff (main...HEAD) alone does NOT show the pre-cut
|
|
265
|
-
// feature — the exact false-advisory shape PR #957 hit.
|
|
266
|
-
expect(plan.release?.packagingFiles).not.toContain('feature.txt');
|
|
267
|
-
expect(plan.release?.packagingFiles).toEqual(
|
|
268
|
-
expect.arrayContaining(['CHANGELOG.md', 'package.json']),
|
|
269
|
-
);
|
|
270
|
-
// Release mode's actual analysis range (previousTag...HEAD) DOES
|
|
271
|
-
// include it — this is what stops "feature not in diff" recurring.
|
|
272
|
-
expect(plan.files).toContain('feature.txt');
|
|
273
|
-
expect(plan.analysisBase).toBe('9.1.0');
|
|
274
|
-
});
|
|
275
|
-
|
|
276
|
-
it('a normal feature PR (no changelog/version bump) uses the unchanged base', () => {
|
|
277
|
-
root = mkTmp();
|
|
278
|
-
git(root, 'init', '-q', '-b', 'main');
|
|
279
|
-
write(root, 'package.json', '{\n "name": "x",\n "version": "9.1.0"\n}\n');
|
|
280
|
-
write(root, 'CHANGELOG.md', '# Changelog\n\n## [Unreleased]\n');
|
|
281
|
-
git(root, 'add', '-A');
|
|
282
|
-
git(root, 'commit', '-q', '-m', 'baseline');
|
|
283
|
-
git(root, 'tag', '9.1.0');
|
|
284
|
-
|
|
285
|
-
git(root, 'checkout', '-q', '-b', 'feature-branch');
|
|
286
|
-
write(root, 'feature.txt', 'some feature\n');
|
|
287
|
-
git(root, 'add', '-A');
|
|
288
|
-
git(root, 'commit', '-q', '-m', 'feat: add feature');
|
|
289
|
-
|
|
290
|
-
const plan = buildPlan('main', root);
|
|
291
|
-
|
|
292
|
-
expect(plan.release).toBeUndefined();
|
|
293
|
-
expect(plan.analysisBase).toBe('main');
|
|
294
|
-
expect(plan.files).toContain('feature.txt');
|
|
295
|
-
});
|
|
296
|
-
});
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Unit tests for the host-facing capability advertisement.
|
|
3
|
-
*
|
|
4
|
-
* The `configRoot` and `embed` capabilities must appear in the
|
|
5
|
-
* `--version --json` readout (and, via the same module, `GET /api/v1/ping`)
|
|
6
|
-
* so a spawner can feature-detect support before relying on either.
|
|
7
|
-
*/
|
|
8
|
-
import { describe, expect, it } from 'vitest';
|
|
9
|
-
import { CAPABILITIES, buildVersionReadout } from './capabilities.js';
|
|
10
|
-
|
|
11
|
-
describe('capabilities', () => {
|
|
12
|
-
it('advertises configRoot support', () => {
|
|
13
|
-
expect(CAPABILITIES.configRoot).toBe(true);
|
|
14
|
-
});
|
|
15
|
-
|
|
16
|
-
it('advertises the embed contract (reciprocal-ecosystem Phase 3)', () => {
|
|
17
|
-
expect(CAPABILITIES.embed).toEqual({
|
|
18
|
-
supported: true,
|
|
19
|
-
version: 1,
|
|
20
|
-
features: ['theme', 'deepLink'],
|
|
21
|
-
});
|
|
22
|
-
});
|
|
23
|
-
|
|
24
|
-
it('does NOT advertise the accent feature (v2, not v1)', () => {
|
|
25
|
-
expect(CAPABILITIES.embed.features).not.toContain('accent');
|
|
26
|
-
});
|
|
27
|
-
|
|
28
|
-
it('buildVersionReadout carries the version and the full capability block', () => {
|
|
29
|
-
const readout = buildVersionReadout('9.7.0');
|
|
30
|
-
expect(readout).toEqual({
|
|
31
|
-
version: '9.7.0',
|
|
32
|
-
capabilities: {
|
|
33
|
-
configRoot: true,
|
|
34
|
-
embed: { supported: true, version: 1, features: ['theme', 'deepLink'] },
|
|
35
|
-
},
|
|
36
|
-
});
|
|
37
|
-
});
|
|
38
|
-
|
|
39
|
-
it('buildVersionReadout copies capabilities (no shared mutable reference)', () => {
|
|
40
|
-
const readout = buildVersionReadout('1.2.3');
|
|
41
|
-
expect(readout.capabilities).not.toBe(CAPABILITIES);
|
|
42
|
-
});
|
|
43
|
-
});
|