@event4u/agent-config 7.4.0 → 8.0.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/.claude-plugin/marketplace.json +11 -1
- package/AGENTS.md +9 -9
- package/CHANGELOG.md +373 -0
- package/README.md +35 -5
- package/dist/agent-src/commands/analytics/prune.md +1 -1
- package/dist/agent-src/commands/analytics/show.md +1 -1
- package/dist/agent-src/commands/analyze/decision.md +2 -2
- package/dist/agent-src/commands/analyze/incident.md +2 -2
- package/dist/agent-src/commands/analyze/near-miss.md +2 -2
- package/dist/agent-src/commands/analyze/postmortem.md +2 -2
- package/dist/agent-src/commands/analyze/premortem.md +2 -2
- package/dist/agent-src/commands/cost-report.md +25 -0
- package/dist/agent-src/commands/evals/analyze.json +30 -0
- package/dist/agent-src/commands/evals/mission-upgrade.json +30 -0
- package/dist/agent-src/commands/implement-ticket.md +1 -1
- package/dist/agent-src/commands/knowledge/forget.md +1 -1
- package/dist/agent-src/commands/knowledge/ingest.md +1 -1
- package/dist/agent-src/commands/knowledge/list.md +1 -1
- package/dist/agent-src/commands/memory/load.md +12 -11
- package/dist/agent-src/commands/memory/promote.md +30 -0
- package/dist/agent-src/commands/memory/propose.md +16 -2
- package/dist/agent-src/commands/mission/upgrade.md +1 -1
- package/dist/agent-src/commands/module/explore.md +11 -7
- package/dist/agent-src/commands/optimize-project.md +243 -0
- package/dist/agent-src/commands/optimize.md +5 -0
- package/dist/agent-src/commands/pr/create.md +37 -8
- package/dist/agent-src/commands/prediction-pool.md +2 -2
- package/dist/agent-src/commands/profile/activate.md +3 -3
- package/dist/agent-src/commands/profile/deactivate.md +2 -2
- package/dist/agent-src/commands/profile/show.md +3 -3
- package/dist/agent-src/commands/research/deep.md +5 -0
- package/dist/agent-src/commands/research/report.md +2 -1
- package/dist/agent-src/commands/review-changes.md +14 -7
- package/dist/agent-src/commands/roadmap/create.md +88 -10
- package/dist/agent-src/commands/roadmap/materialize.md +1 -1
- package/dist/agent-src/commands/roadmap/process-full.md +15 -2
- package/dist/agent-src/commands/roadmap/process-phase.md +18 -6
- package/dist/agent-src/commands/roadmap/process-step.md +4 -0
- package/dist/agent-src/commands/roadmap.md +1 -1
- package/dist/agent-src/commands/security-audit-config.md +1 -1
- package/dist/agent-src/commands/sync-agent-settings.md +1 -1
- package/dist/agent-src/commands/sync-gitignore/fix.md +42 -6
- package/dist/agent-src/commands/team-knowledge/bootstrap.md +106 -0
- package/dist/agent-src/commands/team-knowledge/consolidate.md +105 -0
- package/dist/agent-src/commands/team-knowledge.md +64 -0
- package/dist/agent-src/contexts/authority/commit-mechanics.md +8 -0
- package/dist/agent-src/contexts/authority/destructive-mechanics.md +11 -0
- package/dist/agent-src/contexts/authority/scope-mechanics.md +25 -0
- package/dist/agent-src/contexts/communication/rules-auto/reply-close-mechanics.md +43 -0
- package/dist/agent-src/contexts/contracts/agents-md-anatomy.md +1 -1
- package/dist/agent-src/contexts/contracts/artifact-engagement-flow.md +2 -2
- package/dist/agent-src/contexts/contracts/frugality-charter.md +1 -0
- package/dist/agent-src/contexts/execution/auto-dispatch-classification.md +14 -4
- package/dist/agent-src/contexts/execution/autonomy-mechanics.md +11 -0
- package/dist/agent-src/contexts/execution/orchestration-telemetry.md +32 -8
- package/dist/agent-src/contexts/execution/roadmap-execution-contract.md +107 -0
- package/dist/agent-src/contexts/execution/roadmap-process-loop.md +71 -15
- package/dist/agent-src/contexts/execution/subagent-steering.md +41 -1
- package/dist/agent-src/contexts/override-system.md +1 -1
- package/dist/agent-src/personas/brand-strategist.md +0 -1
- package/dist/agent-src/personas/data-integrity.md +66 -0
- package/dist/agent-src/personas/design-director.md +0 -1
- package/dist/agent-src/personas/performance-engineer.md +66 -0
- package/dist/agent-src/personas/production-validator.md +73 -0
- package/dist/agent-src/rules/agent-authority.md +3 -4
- package/dist/agent-src/rules/analysis-skill-routing.md +3 -5
- package/dist/agent-src/rules/architecture.md +2 -4
- package/dist/agent-src/rules/artifact-drafting-protocol.md +35 -6
- package/dist/agent-src/rules/artifact-engagement-recording.md +11 -4
- package/dist/agent-src/rules/ask-when-uncertain.md +10 -14
- package/dist/agent-src/rules/augment-edit-discipline.md +3 -5
- package/dist/agent-src/rules/autonomous-execution.md +3 -5
- package/dist/agent-src/rules/brand-consistency.md +3 -5
- package/dist/agent-src/rules/brand-source-of-truth.md +3 -5
- package/dist/agent-src/rules/cli-output-handling.md +4 -6
- package/dist/agent-src/rules/command-suggestion-policy.md +3 -5
- package/dist/agent-src/rules/commit-conventions.md +3 -5
- package/dist/agent-src/rules/commit-policy.md +8 -10
- package/dist/agent-src/rules/content-quoting-floor.md +88 -0
- package/dist/agent-src/rules/context-hygiene.md +3 -5
- package/dist/agent-src/rules/copilot-routing.md +4 -6
- package/dist/agent-src/rules/decision-revisit-gate.md +120 -0
- package/dist/agent-src/rules/delegation-policy.md +10 -6
- package/dist/agent-src/rules/design-fidelity.md +3 -5
- package/dist/agent-src/rules/devcontainer-routing.md +4 -6
- package/dist/agent-src/rules/direct-answers.md +13 -17
- package/dist/agent-src/rules/docker-commands.md +3 -5
- package/dist/agent-src/rules/domain-adoption-policy.md +3 -5
- package/dist/agent-src/rules/domain-safety-disclaimer.md +3 -5
- package/dist/agent-src/rules/domain-safety-pii.md +7 -8
- package/dist/agent-src/rules/domain-safety-retention.md +3 -5
- package/dist/agent-src/rules/downstream-changes.md +3 -4
- package/dist/agent-src/rules/engineering-safety-floor.md +3 -5
- package/dist/agent-src/rules/external-reference-deep-dive.md +3 -5
- package/dist/agent-src/rules/fast-path-marker-visibility.md +3 -5
- package/dist/agent-src/rules/finance-safety-floor.md +3 -6
- package/dist/agent-src/rules/framework-neutrality-in-generic-skills.md +3 -5
- package/dist/agent-src/rules/git-history-discipline.md +3 -5
- package/dist/agent-src/rules/guidelines.md +2 -4
- package/dist/agent-src/rules/icon-consistency.md +4 -5
- package/dist/agent-src/rules/image-likeness-and-rights.md +3 -5
- package/dist/agent-src/rules/improve-before-implement.md +5 -5
- package/dist/agent-src/rules/invite-challenge.md +3 -5
- package/dist/agent-src/rules/language-and-tone.md +13 -15
- package/dist/agent-src/rules/laravel-routing.md +3 -5
- package/dist/agent-src/rules/laravel-translations.md +3 -5
- package/dist/agent-src/rules/legal-safety-floor.md +5 -7
- package/dist/agent-src/rules/lethal-trifecta-guard.md +3 -5
- package/dist/agent-src/rules/linked-projects-onboarding-gate.md +4 -7
- package/dist/agent-src/rules/low-impact-corpus-privacy-floor.md +3 -5
- package/dist/agent-src/rules/markdown-safe-codeblocks.md +2 -4
- package/dist/agent-src/rules/media-governance-routing.md +3 -5
- package/dist/agent-src/rules/media-sync-ground-truth.md +3 -5
- package/dist/agent-src/rules/minimal-safe-diff.md +5 -5
- package/dist/agent-src/rules/missing-tool-handling.md +3 -5
- package/dist/agent-src/rules/model-recommendation.md +4 -6
- package/dist/agent-src/rules/no-attribution-footers.md +3 -5
- package/dist/agent-src/rules/no-cheap-questions.md +5 -8
- package/dist/agent-src/rules/no-decorative-emojis-in-git-surfaces.md +3 -6
- package/dist/agent-src/rules/no-pr-progress-comments.md +3 -6
- package/dist/agent-src/rules/no-roadmap-references.md +3 -5
- package/dist/agent-src/rules/non-destructive-by-default.md +11 -13
- package/dist/agent-src/rules/notes-first-reasoning.md +3 -5
- package/dist/agent-src/rules/onboarding-gate.md +4 -6
- package/dist/agent-src/rules/output-discipline.md +3 -5
- package/dist/agent-src/rules/package-ci-checks.md +3 -5
- package/dist/agent-src/rules/persona-governance.md +2 -4
- package/dist/agent-src/rules/php-coding.md +3 -5
- package/dist/agent-src/rules/preservation-guard.md +2 -4
- package/dist/agent-src/rules/provider-lifecycle-discipline.md +3 -5
- package/dist/agent-src/rules/reviewer-awareness.md +5 -6
- package/dist/agent-src/rules/roadmap-ci-steps-policy.md +3 -5
- package/dist/agent-src/rules/roadmap-progress-sync.md +5 -5
- package/dist/agent-src/rules/role-mode-adherence.md +2 -4
- package/dist/agent-src/rules/rule-type-governance.md +3 -5
- package/dist/agent-src/rules/runtime-safety.md +2 -4
- package/dist/agent-src/rules/scope-control.md +10 -11
- package/dist/agent-src/rules/security-sensitive-stop.md +4 -5
- package/dist/agent-src/rules/size-enforcement.md +2 -4
- package/dist/agent-src/rules/skill-improvement-trigger.md +3 -5
- package/dist/agent-src/rules/skill-quality.md +3 -5
- package/dist/agent-src/rules/slash-command-routing-policy.md +3 -5
- package/dist/agent-src/rules/source-confidentiality.md +3 -5
- package/dist/agent-src/rules/source-discovery-gate.md +3 -5
- package/dist/agent-src/rules/source-of-truth.md +3 -5
- package/dist/agent-src/rules/strategy-safety-floor.md +3 -5
- package/dist/agent-src/rules/symfony-routing.md +4 -6
- package/dist/agent-src/rules/telegraph-speak.md +4 -5
- package/dist/agent-src/rules/think-before-action.md +7 -4
- package/dist/agent-src/rules/token-budget-discipline.md +29 -5
- package/dist/agent-src/rules/token-efficiency.md +3 -5
- package/dist/agent-src/rules/token-optimizer-maintenance.md +3 -5
- package/dist/agent-src/rules/tool-safety.md +2 -4
- package/dist/agent-src/rules/ui-audit-gate.md +3 -6
- package/dist/agent-src/rules/untrusted-input-defense.md +11 -10
- package/dist/agent-src/rules/upstream-proposal.md +4 -6
- package/dist/agent-src/rules/user-interaction.md +7 -5
- package/dist/agent-src/rules/user-interrupt-priority.md +17 -8
- package/dist/agent-src/rules/verify-before-complete.md +12 -22
- package/dist/agent-src/scripts/archive_completed_roadmaps.ts +3 -3
- package/dist/agent-src/scripts/update_roadmap_progress.ts +197 -7
- package/dist/agent-src/skills/adr-create/SKILL.md +52 -42
- package/dist/agent-src/skills/adversarial-review/SKILL.md +1 -1
- package/dist/agent-src/skills/agent-docs-writing/SKILL.md +18 -0
- package/dist/agent-src/skills/agent-security-review/SKILL.md +1 -1
- package/dist/agent-src/skills/ai-council/SKILL.md +14 -1
- package/dist/agent-src/skills/blade-ui/SKILL.md +4 -0
- package/dist/agent-src/skills/blameless-post-mortem/SKILL.md +0 -3
- package/dist/agent-src/skills/brand/SKILL.md +1 -1
- package/dist/agent-src/skills/brand-identity/SKILL.md +3 -3
- package/dist/agent-src/skills/brand-strategy/SKILL.md +1 -1
- package/dist/agent-src/skills/brand-to-tokens/SKILL.md +5 -4
- package/dist/agent-src/skills/canvas-design/SKILL.md +6 -0
- package/dist/agent-src/skills/check-refs/SKILL.md +7 -4
- package/dist/agent-src/skills/code-review/SKILL.md +5 -0
- package/dist/agent-src/skills/complexity-first-planning/SKILL.md +6 -5
- package/dist/agent-src/skills/condense-memory/SKILL.md +11 -11
- package/dist/agent-src/skills/context-authoring/SKILL.md +1 -1
- package/dist/agent-src/skills/context-document/SKILL.md +17 -0
- package/dist/agent-src/skills/corpus-grounding/SKILL.md +3 -3
- package/dist/agent-src/skills/decision-record/SKILL.md +6 -0
- package/dist/agent-src/skills/decision-review/SKILL.md +5 -3
- package/dist/agent-src/skills/deep-reading-analyst/SKILL.md +6 -1
- package/dist/agent-src/skills/design-intelligence/SKILL.md +45 -2
- package/dist/agent-src/skills/design-intelligence/references/design-languages.md +1 -1
- package/dist/agent-src/skills/design-review/SKILL.md +23 -11
- package/dist/agent-src/skills/design-system-capture/SKILL.md +41 -0
- package/dist/agent-src/skills/design-system-capture/reference/design-system-json.md +62 -0
- package/dist/agent-src/skills/design-tokens/SKILL.md +11 -4
- package/dist/agent-src/skills/design-variations/SKILL.md +127 -0
- package/dist/agent-src/skills/design-variations/evals/triggers.json +17 -0
- package/dist/agent-src/skills/emit-tickets/SKILL.md +4 -4
- package/dist/agent-src/skills/existing-ui-audit/SKILL.md +6 -0
- package/dist/agent-src/skills/fe-design/SKILL.md +20 -0
- package/dist/agent-src/skills/flux/SKILL.md +4 -0
- package/dist/agent-src/skills/html-deck/SKILL.md +123 -0
- package/dist/agent-src/skills/html-deck/evals/triggers.json +17 -0
- package/dist/agent-src/skills/html-deck/templates/deck-shell.html +77 -0
- package/dist/agent-src/skills/iconography/SKILL.md +1 -0
- package/dist/agent-src/skills/image-editing/evals/triggers.json +13 -13
- package/dist/agent-src/skills/judge-artifact-completeness/SKILL.md +136 -0
- package/dist/agent-src/skills/judge-artifact-completeness/calibration/fixtures.json +149 -0
- package/dist/agent-src/skills/judge-artifact-completeness/evals/triggers.json +17 -0
- package/dist/agent-src/skills/judge-artifact-completeness/rubrics/architecture-score.json +73 -0
- package/dist/agent-src/skills/judge-artifact-completeness/rubrics/pr-review-score.json +65 -0
- package/dist/agent-src/skills/judge-artifact-completeness/rubrics/roadmap-score.json +73 -0
- package/dist/agent-src/skills/judge-artifact-completeness/rubrics/ticket-quality-score.json +73 -0
- package/dist/agent-src/skills/judge-code-quality/SKILL.md +1 -0
- package/dist/agent-src/skills/judge-injection-defense/SKILL.md +99 -0
- package/dist/agent-src/skills/judge-injection-defense/calibration/fixtures.json +24 -0
- package/dist/agent-src/skills/judge-injection-defense/evals/triggers.json +17 -0
- package/dist/agent-src/skills/judge-injection-defense/fixtures/behavioral-fixtures.json +63 -0
- package/dist/agent-src/skills/judge-injection-defense/fixtures/coverage-report.md +53 -0
- package/dist/agent-src/skills/judge-injection-defense/fixtures/perturbation-taxonomy.json +110 -0
- package/dist/agent-src/skills/judge-synthesis/SKILL.md +134 -0
- package/dist/agent-src/skills/judge-synthesis/evals/triggers.json +17 -0
- package/dist/agent-src/skills/laravel/SKILL.md +0 -1
- package/dist/agent-src/skills/learning-to-rule-or-skill/SKILL.md +46 -0
- package/dist/agent-src/skills/lint-skills/SKILL.md +6 -6
- package/dist/agent-src/skills/logo-generation/SKILL.md +1 -1
- package/dist/agent-src/skills/markitdown/SKILL.md +1 -1
- package/dist/agent-src/skills/md-language-check/SKILL.md +3 -3
- package/dist/agent-src/skills/memory-consolidation/SKILL.md +66 -1
- package/dist/agent-src/skills/migration-architect/SKILL.md +1 -0
- package/dist/agent-src/skills/module-detect-on-the-fly/SKILL.md +2 -2
- package/dist/agent-src/skills/performance-analysis/SKILL.md +2 -0
- package/dist/agent-src/skills/prediction-pool-optimizer/SKILL.md +4 -4
- package/dist/agent-src/skills/premortem/SKILL.md +0 -3
- package/dist/agent-src/skills/project-analysis-core/SKILL.md +16 -0
- package/dist/agent-src/skills/react-shadcn-ui/SKILL.md +18 -0
- package/dist/agent-src/skills/react-shadcn-ui/reference/registry.md +59 -0
- package/dist/agent-src/skills/reasoning-orchestrator/SKILL.md +3 -1
- package/dist/agent-src/skills/refine-ticket/SKILL.md +5 -1
- package/dist/agent-src/skills/release-comms/SKILL.md +47 -46
- package/dist/agent-src/skills/roadmap-management/SKILL.md +25 -0
- package/dist/agent-src/skills/roadmap-writing/SKILL.md +33 -3
- package/dist/agent-src/skills/root-cause-frameworks/SKILL.md +0 -3
- package/dist/agent-src/skills/script-writing/SKILL.md +1 -1
- package/dist/agent-src/skills/security-audit/SKILL.md +1 -0
- package/dist/agent-src/skills/skill-improvement-pipeline/SKILL.md +4 -0
- package/dist/agent-src/skills/source-discovery/SKILL.md +22 -3
- package/dist/agent-src/skills/sql-writing/SKILL.md +1 -1
- package/dist/agent-src/skills/subagent-orchestration/SKILL.md +33 -14
- package/dist/agent-src/skills/subagent-orchestration/prompts/README.md +11 -0
- package/dist/agent-src/skills/subagent-orchestration/prompts/do-in-steps.md +8 -0
- package/dist/agent-src/skills/systematic-debugging/SKILL.md +30 -1
- package/dist/agent-src/skills/tailwind-engineer/SKILL.md +4 -0
- package/dist/agent-src/skills/testing-anti-patterns/SKILL.md +1 -1
- package/dist/agent-src/skills/threat-modeling/SKILL.md +2 -2
- package/dist/agent-src/skills/token-optimizer/SKILL.md +1 -1
- package/dist/agent-src/skills/typography-system/SKILL.md +4 -3
- package/dist/agent-src/skills/verify-completion-evidence/SKILL.md +2 -0
- package/dist/agent-src/skills/wireframe/SKILL.md +118 -0
- package/dist/agent-src/skills/wireframe/evals/triggers.json +17 -0
- package/dist/agent-src/templates/agent-settings.md +22 -1
- package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
- package/dist/agent-src/templates/command.md +2 -2
- package/dist/agent-src/templates/contexts/knowledge-pages.md +116 -0
- package/dist/agent-src/templates/hooks/pre-commit-frontmatter +1 -1
- package/dist/agent-src/templates/roadmaps.md +70 -2
- package/dist/agent-src/templates/rule.md +1 -1
- package/dist/agent-src/templates/scripts/README.md +3 -3
- package/dist/agent-src/templates/scripts/work_engine/_lib/agent_settings.ts +109 -0
- package/dist/agent-src/templates/tickets.md +8 -8
- package/dist/cli/commands/recordTriggerEval.test.js +1 -1
- package/dist/cli/commands/recordTriggerEval.test.js.map +1 -1
- package/dist/cli/initRouting.js +4 -2
- package/dist/cli/initRouting.js.map +1 -1
- package/dist/cli/registry.js +1 -0
- package/dist/cli/registry.js.map +1 -1
- package/dist/discovery/deprecation-report.md +1 -1
- package/dist/discovery/discovery-manifest.json +802 -258
- package/dist/discovery/discovery-manifest.json.sha256 +1 -1
- package/dist/discovery/discovery-manifest.summary.md +8 -8
- package/dist/discovery/orphan-report.md +1 -1
- package/dist/discovery/packs.json +46 -28
- package/dist/discovery/trust-report.md +12 -11
- package/dist/discovery/workspaces.json +32 -18
- package/dist/install/preflight.js +173 -0
- package/dist/install/preflight.js.map +1 -0
- package/dist/mcp/registry-manifest.json +4 -4
- package/dist/router.json +1 -1
- package/dist/server/routes/settings.js +4 -0
- package/dist/server/routes/settings.js.map +1 -1
- package/dist/server/schemas/settings.js +6 -1
- package/dist/server/schemas/settings.js.map +1 -1
- package/docs/CLAIMS.md +108 -0
- package/docs/MIGRATION.md +3 -3
- package/docs/architecture.md +6 -6
- package/docs/benchmark.md +133 -2
- package/docs/benchmark.pinned.yml +31 -0
- package/docs/capability-matrix.md +1 -0
- package/docs/catalog.md +92 -74
- package/docs/command-flows.md +16 -4
- package/docs/comparison.yaml +35 -0
- package/docs/contracts/agents-layout.md +148 -0
- package/docs/contracts/brand-token-consumption.md +5 -0
- package/docs/contracts/capability-boundary.md +5 -0
- package/docs/contracts/command-category-governance.md +5 -0
- package/docs/contracts/command-clusters.md +1 -0
- package/docs/contracts/command-surface-tiers.md +1 -1
- package/docs/contracts/conformance.md +84 -0
- package/docs/contracts/creative-pack-boundary.md +5 -0
- package/docs/contracts/discovery-manifest.schema.json +5 -4
- package/docs/contracts/file-ownership-matrix.json +4605 -985
- package/docs/contracts/governance-enforcement-projection.md +5 -0
- package/docs/contracts/gui-wizard.md +1 -1
- package/docs/contracts/hook-architecture-v1.md +2 -2
- package/docs/contracts/implement-ticket-flow.md +1 -1
- package/docs/contracts/kernel-membership.md +13 -0
- package/docs/contracts/mcp-tool-inventory.md +23 -23
- package/docs/contracts/no-runtime-boundary.md +6 -1
- package/docs/contracts/review-lens-schema.md +5 -0
- package/docs/contracts/rule-router.md +102 -8
- package/docs/contracts/skill-bundled-assets.md +1 -1
- package/docs/contracts/skill-dry-run.md +1 -1
- package/docs/contracts/subagent-boundary.md +5 -0
- package/docs/contracts/ticket-bundle-format.md +9 -4
- package/docs/contracts/tier-3-contrib-plugin.md +2 -2
- package/docs/contracts/write-engine.md +3 -0
- package/docs/customization.md +87 -15
- package/docs/decisions/ADR-107-legal-domain-pack-adoption.md +1 -1
- package/docs/decisions/ADR-109-subagent-v1-contract.md +246 -0
- package/docs/decisions/ADR-110-discipline-profile-resolution-locus.md +105 -0
- package/docs/decisions/INDEX.md +2 -0
- package/docs/distribution/awesome-list-submission.md +46 -0
- package/docs/distribution/launch-story-draft.md +58 -0
- package/docs/end-to-end-walkthroughs.md +2 -2
- package/docs/getting-started.md +2 -2
- package/docs/guidelines/agent-infra/asking-and-brevity-examples.md +24 -0
- package/docs/guidelines/agent-infra/corpus-grounding-authoring.md +1 -1
- package/docs/guidelines/agent-infra/linked-projects-onboarding-gate.md +2 -2
- package/docs/guidelines/agent-infra/missing-tool-handling.md +3 -3
- package/docs/guidelines/agent-infra/verify-before-complete-demos.md +2 -2
- package/docs/guidelines/augment-portability-patterns.md +1 -1
- package/docs/guidelines/code-clarity.md +19 -0
- package/docs/guidelines/design-antipatterns-triggers.json +2 -1
- package/docs/guidelines/design-antipatterns.md +35 -0
- package/docs/guidelines/design-canon.md +62 -0
- package/docs/guidelines/design-modes.md +6 -0
- package/docs/guidelines/php/general.md +9 -1
- package/docs/guidelines/php/php-coding-patterns.md +7 -0
- package/docs/guides/cross-repo-retrieval.md +1 -1
- package/docs/guides/frontend-design-corpus-refresh.md +2 -2
- package/docs/guides/local-analytics.md +4 -4
- package/docs/guides/skill-discovery.md +1 -1
- package/docs/guides/skill-preview.md +1 -1
- package/docs/hook-payload-capture.md +6 -6
- package/docs/install-friction-report.md +66 -0
- package/docs/installation.md +1 -1
- package/docs/maintainers/optional-media-deps.md +50 -0
- package/docs/mcp-server.md +11 -12
- package/docs/media/proof-demo.cast +14 -0
- package/docs/media/proof-demo.gif +0 -0
- package/docs/migration/consumer-template-consumption-model.md +1 -1
- package/docs/migration/divergences/bench-stats-float-precision.md +1 -1
- package/docs/migration/node-floor.md +1 -1
- package/docs/migration/yaml-roundtrip-spike.md +1 -1
- package/docs/personas.md +16 -5
- package/docs/positioning-evidence.md +86 -0
- package/docs/proof.md +86 -0
- package/docs/skills-catalog.md +1 -1
- package/docs/troubleshooting.md +8 -8
- package/docs/wedge/production-validator/README.md +57 -0
- package/docs/wedge/production-validator/production-validator.md +56 -0
- package/docs/wizard.md +2 -2
- package/package.json +1 -1
- package/src/config/agent-settings.template.yml +71 -4
- package/src/config/agents-paths.yml +254 -0
- package/src/config/budgets.yml +16 -0
- package/src/config/discovery/packs.yml +1 -0
- package/src/config/discovery/unassigned-artefacts.yml +2 -0
- package/src/config/gitignore-block.txt +25 -0
- package/src/config/host-capabilities.yml +31 -0
- package/src/config/profiles/balanced.ini +4 -0
- package/src/config/profiles/full.ini +4 -0
- package/src/config/profiles/minimal.ini +4 -0
- package/src/scripts/_cli/cmd_conformance.ts +716 -0
- package/src/scripts/_cli/cmd_doctor.ts +23 -2
- package/src/scripts/_cli/cmd_fleet.ts +401 -0
- package/src/scripts/_cli/cmd_preflight.ts +159 -0
- package/src/scripts/_dispatch.bash +10 -0
- package/src/scripts/_lib/knowledge_events.ts +193 -0
- package/src/scripts/_lib/subagent_steering.ts +115 -3
- package/src/scripts/_lib/text_similarity.ts +75 -0
- package/src/scripts/ai-video/test-pipeline.sh +1 -1
- package/src/scripts/ai_council/clients.ts +19 -3
- package/src/scripts/append_contested.ts +112 -0
- package/src/scripts/audit_auto_rules.ts +11 -1
- package/src/scripts/audit_mcp_tools.ts +25 -11
- package/src/scripts/bench_ab_v2_run.ts +527 -40
- package/src/scripts/bench_ab_v2_stats.ts +6 -0
- package/src/scripts/bench_matrix.ts +266 -0
- package/src/scripts/bootstrap_knowledge.ts +267 -0
- package/src/scripts/build_discovery_manifest.ts +42 -2
- package/src/scripts/build_proof.ts +214 -0
- package/src/scripts/check_always_budget.ts +3 -0
- package/src/scripts/check_augment_description_cap.ts +2 -2
- package/src/scripts/check_claims.ts +270 -0
- package/src/scripts/check_comparison.ts +79 -0
- package/src/scripts/check_generated_artefact_headers.ts +109 -0
- package/src/scripts/check_generator_output_coverage.ts +142 -0
- package/src/scripts/check_gitignore_freshness.ts +127 -0
- package/src/scripts/check_knowledge_pages.ts +210 -0
- package/src/scripts/check_knowledge_sharing.ts +162 -0
- package/src/scripts/check_media_deps.ts +91 -0
- package/src/scripts/check_memory_contradiction.ts +280 -0
- package/src/scripts/check_memory_similarity.ts +134 -0
- package/src/scripts/check_quality_regression.ts +56 -10
- package/src/scripts/check_references.ts +3 -1
- package/src/scripts/check_release_pr_shape.ts +4 -0
- package/src/scripts/check_site_links.ts +135 -0
- package/src/scripts/check_skill_gaps.ts +99 -0
- package/src/scripts/check_token_quality_golden.ts +197 -11
- package/src/scripts/check_tracked_but_ignored.ts +67 -0
- package/src/scripts/cluster_near_miss_patterns.ts +0 -0
- package/src/scripts/compile_router.ts +30 -3
- package/src/scripts/condense.ts +350 -14
- package/src/scripts/consolidate_knowledge_events.ts +192 -0
- package/src/scripts/degrade_to_pointer.ts +136 -0
- package/src/scripts/design_slop_rules.test.ts +208 -0
- package/src/scripts/design_slop_rules.ts +530 -0
- package/src/scripts/emit_knowledge_event.ts +158 -0
- package/src/scripts/export_replay_corpus.ts +187 -0
- package/src/scripts/external_sources_denylist.json +14 -3
- package/src/scripts/fold_intake.ts +281 -0
- package/src/scripts/generate_capability_matrix.ts +9 -1
- package/src/scripts/generate_knowledge_index.ts +222 -0
- package/src/scripts/hook_manifest.yaml +40 -17
- package/src/scripts/hooks/design_slop_hook.ts +181 -0
- package/src/scripts/hooks/dispatch_hook.ts +18 -0
- package/src/scripts/hot_context_hook.ts +372 -0
- package/src/scripts/install +47 -0
- package/src/scripts/install-hooks.sh +17 -0
- package/src/scripts/inventory_meta_layers.ts +11 -0
- package/src/scripts/janitor.ts +258 -0
- package/src/scripts/lint_agent_security.ts +1 -0
- package/src/scripts/lint_agents_layout.ts +74 -15
- package/src/scripts/lint_bench_ab.ts +4 -1
- package/src/scripts/lint_confusables.ts +197 -0
- package/src/scripts/lint_design_slop.ts +245 -0
- package/src/scripts/lint_featured_skills.ts +0 -0
- package/src/scripts/lint_framework_leakage_allowlist.json +26 -3
- package/src/scripts/lint_knowledge_scale.ts +250 -0
- package/src/scripts/lint_legal_pack.ts +67 -0
- package/src/scripts/lint_persona_governance.ts +8 -3
- package/src/scripts/lint_regression.ts +15 -0
- package/src/scripts/lint_roadmap_blockers.ts +202 -0
- package/src/scripts/lint_roadmap_complexity.ts +81 -2
- package/src/scripts/lint_subagent_determinism.ts +125 -0
- package/src/scripts/measure_augment_budget.ts +46 -6
- package/src/scripts/measure_patterns.ts +4 -3
- package/src/scripts/measure_skill_reduction.ts +6 -6
- package/src/scripts/migration_status.ts +6 -2
- package/src/scripts/mine_missing_guardrails.ts +189 -0
- package/src/scripts/parity/phase_gate.ts +1 -1
- package/src/scripts/parity/replay.ts +21 -0
- package/src/scripts/project_thin_rules.ts +120 -16
- package/src/scripts/release.ts +39 -1
- package/src/scripts/render_benchmark_composite.ts +378 -0
- package/src/scripts/roadmap_progress_hook.ts +101 -43
- package/src/scripts/schemas/skill.schema.json +27 -0
- package/src/scripts/schemas/subagent.schema.json +106 -0
- package/src/scripts/skill_linter.ts +1 -0
- package/src/scripts/smoke/kernel.sh +5 -4
- package/src/scripts/surface-tiers.yml +1 -0
- package/src/scripts/sync_gitignore.ts +4 -0
- package/src/scripts/update_skill_candidates.ts +172 -0
- package/src/scripts/validate_frontmatter.ts +1 -0
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
/**
|
|
3
|
+
* Pointer degradation — road-to-knowledge-system Phase 4 (self-learning
|
|
4
|
+
* wiring). After `learning-to-rule-or-skill` promotes a knowledge-page
|
|
5
|
+
* entry into a real skill/rule/guideline, the SOURCE entry is rewritten to
|
|
6
|
+
* a pointer stub instead of staying as full duplicated prose. This is the
|
|
7
|
+
* staging → promotion → pointer lifecycle: it prevents double-maintenance
|
|
8
|
+
* between the knowledge page and the new artifact, and keeps
|
|
9
|
+
* `agents/knowledge/INDEX.md` honest about what still needs attention.
|
|
10
|
+
*
|
|
11
|
+
* Two source shapes:
|
|
12
|
+
* - Whole page: `--source agents/knowledge/concepts/x.md` — the page
|
|
13
|
+
* BODY (below frontmatter) is replaced with a pointer line;
|
|
14
|
+
* frontmatter (and its provenance) is preserved untouched.
|
|
15
|
+
* - Named section: `--source agents/knowledge/procedures/skill-candidates.md#<topic>`
|
|
16
|
+
* — only the matching `## <topic>` section's body is replaced; the
|
|
17
|
+
* heading and every other section stay untouched.
|
|
18
|
+
*
|
|
19
|
+
* Usage:
|
|
20
|
+
* degrade_to_pointer.ts --source <path[#anchor]> --artifact <path> --date <YYYY-MM-DD>
|
|
21
|
+
*
|
|
22
|
+
* Exit codes: 0 = degraded, 1 = usage error / source not found, 3 = internal error.
|
|
23
|
+
*/
|
|
24
|
+
import * as fs from 'node:fs';
|
|
25
|
+
import * as path from 'node:path';
|
|
26
|
+
import process from 'node:process';
|
|
27
|
+
import { fileURLToPath } from 'node:url';
|
|
28
|
+
|
|
29
|
+
import { main as generateIndexMain } from './generate_knowledge_index.js';
|
|
30
|
+
|
|
31
|
+
const PROG = 'degrade_to_pointer.ts';
|
|
32
|
+
const FRONTMATTER_RE = /^(---[ \t]*\r?\n[\s\S]*?\r?\n---[ \t]*\r?\n)/;
|
|
33
|
+
|
|
34
|
+
export function pointerLine(artifact: string, date: string): string {
|
|
35
|
+
return `> Promoted to \`${artifact}\` on ${date}; see that artifact for current guidance.`;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/** Replace a whole page's body (below frontmatter, if any) with a pointer line. Preserves frontmatter and the first H1 heading, if present, so the page stays a resolvable link target. */
|
|
39
|
+
export function degradeWholeFile(content: string, artifact: string, date: string): string {
|
|
40
|
+
const fmMatch = FRONTMATTER_RE.exec(content);
|
|
41
|
+
const frontmatter = fmMatch?.[1] ?? '';
|
|
42
|
+
const rest = fmMatch ? content.slice(frontmatter.length) : content;
|
|
43
|
+
|
|
44
|
+
const headingMatch = /^(#\s+.+)$/m.exec(rest);
|
|
45
|
+
const heading = headingMatch?.[1] !== undefined ? `${headingMatch[1]}\n\n` : '';
|
|
46
|
+
|
|
47
|
+
return `${frontmatter}${heading}${pointerLine(artifact, date)}\n`;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/** Replace one `## <anchor>` section's body (up to the next `## ` heading or EOF) with a pointer line, byte-for-byte outside that span. Throws if the anchor is not found. */
|
|
51
|
+
export function degradeSection(content: string, anchor: string, artifact: string, date: string): string {
|
|
52
|
+
const headingLine = `## ${anchor}`;
|
|
53
|
+
const lines = content.split('\n');
|
|
54
|
+
const startIdx = lines.findIndex((l) => l.trim() === headingLine);
|
|
55
|
+
if (startIdx === -1) {
|
|
56
|
+
throw new Error(`section "${anchor}" not found`);
|
|
57
|
+
}
|
|
58
|
+
let endIdx = lines.length;
|
|
59
|
+
for (let i = startIdx + 1; i < lines.length; i++) {
|
|
60
|
+
if (/^##\s/.test(lines[i] ?? '')) {
|
|
61
|
+
endIdx = i;
|
|
62
|
+
break;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
const before = lines.slice(0, startIdx + 1);
|
|
66
|
+
const after = lines.slice(endIdx);
|
|
67
|
+
const body = ['', pointerLine(artifact, date), ''];
|
|
68
|
+
return [...before, ...body, ...after].join('\n');
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
function printUsage(): void {
|
|
72
|
+
process.stdout.write(`usage: ${PROG} --source PATH[#ANCHOR] --artifact PATH --date YYYY-MM-DD\n`);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
export function main(argv: string[]): number {
|
|
76
|
+
let source: string | null = null;
|
|
77
|
+
let artifact: string | null = null;
|
|
78
|
+
let date: string | null = null;
|
|
79
|
+
|
|
80
|
+
for (let i = 0; i < argv.length; i++) {
|
|
81
|
+
const arg = argv[i];
|
|
82
|
+
if (arg === '-h' || arg === '--help') {
|
|
83
|
+
printUsage();
|
|
84
|
+
return 0;
|
|
85
|
+
} else if (arg === '--source') {
|
|
86
|
+
source = argv[++i] ?? null;
|
|
87
|
+
} else if (arg === '--artifact') {
|
|
88
|
+
artifact = argv[++i] ?? null;
|
|
89
|
+
} else if (arg === '--date') {
|
|
90
|
+
date = argv[++i] ?? null;
|
|
91
|
+
} else {
|
|
92
|
+
process.stderr.write(`${PROG}: error: unrecognized argument: ${arg}\n`);
|
|
93
|
+
printUsage();
|
|
94
|
+
return 1;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
if (!source || !artifact || !date) {
|
|
99
|
+
process.stderr.write(`${PROG}: error: --source, --artifact, and --date are required\n`);
|
|
100
|
+
printUsage();
|
|
101
|
+
return 1;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
const [filePath = '', anchor] = source.split('#');
|
|
105
|
+
|
|
106
|
+
let content: string;
|
|
107
|
+
try {
|
|
108
|
+
content = fs.readFileSync(filePath, 'utf8');
|
|
109
|
+
} catch {
|
|
110
|
+
process.stderr.write(`${PROG}: error: source file not found: ${filePath}\n`);
|
|
111
|
+
return 1;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
let updated: string;
|
|
115
|
+
try {
|
|
116
|
+
updated = anchor ? degradeSection(content, anchor, artifact, date) : degradeWholeFile(content, artifact, date);
|
|
117
|
+
} catch (err) {
|
|
118
|
+
process.stderr.write(`${PROG}: error: ${(err as Error).message}\n`);
|
|
119
|
+
return 1;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
fs.writeFileSync(filePath, updated, 'utf8');
|
|
123
|
+
process.stdout.write(`${PROG}: degraded ${source} → pointer to ${artifact}.\n`);
|
|
124
|
+
|
|
125
|
+
// Regenerate the index so the pointer's new one-line summary is
|
|
126
|
+
// reflected immediately, not left stale until the next unrelated write.
|
|
127
|
+
// Assumes the standard invocation cwd (repo root), matching every other
|
|
128
|
+
// script in this package (generate_knowledge_index.ts defaults the same way).
|
|
129
|
+
generateIndexMain(['--dir', process.cwd(), '--quiet']);
|
|
130
|
+
|
|
131
|
+
return 0;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
if (fileURLToPath(import.meta.url) === path.resolve(process.argv[1] ?? '')) {
|
|
135
|
+
process.exit(main(process.argv.slice(2)));
|
|
136
|
+
}
|
|
@@ -0,0 +1,208 @@
|
|
|
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-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-lock-colour": {
|
|
109
|
+
ext: "css",
|
|
110
|
+
positive: ".a{color:#e11d48}.b{background:#2563eb}.c{border-color:#16a34a}",
|
|
111
|
+
negative: ".a{color:#111827}.b{background:#6b7280}.c{border-color:#2563eb}",
|
|
112
|
+
},
|
|
113
|
+
"slop-l9-section-monotony": {
|
|
114
|
+
ext: "html",
|
|
115
|
+
// 8 identical media+text sections → 1 distinct layout family (< 4)
|
|
116
|
+
positive: '<section><div class="grid"><img src="x"><h2>A</h2><p>t</p></div></section>'.repeat(8),
|
|
117
|
+
// 8 sections, 4 distinct signatures → not monotonous
|
|
118
|
+
negative: (
|
|
119
|
+
'<section><div class="grid"><img src="x"><h2>A</h2></div></section>' +
|
|
120
|
+
"<section><h2>B</h2><p>t</p></section>" +
|
|
121
|
+
'<section><div class="flex"><p>c</p></div></section>' +
|
|
122
|
+
'<section><img src="y"></section>'
|
|
123
|
+
).repeat(2),
|
|
124
|
+
},
|
|
125
|
+
"slop-l10-zigzag": {
|
|
126
|
+
ext: "html",
|
|
127
|
+
// 3 consecutive media+text two-column sections → run > 2
|
|
128
|
+
positive: '<section><div class="grid"><img src="x"><h2>A</h2><p>t</p></div></section>'.repeat(3),
|
|
129
|
+
// only 2 consecutive → within cap
|
|
130
|
+
negative: '<section><div class="grid"><img src="x"><h2>A</h2><p>t</p></div></section>'.repeat(2),
|
|
131
|
+
},
|
|
132
|
+
};
|
|
133
|
+
|
|
134
|
+
function findingsFor(ruleId: string, content: string, ext: string, ctx = NO_CTX) {
|
|
135
|
+
return scanFile(content, `fixture.${ext}`, ctx).filter((f) => f.rule === ruleId);
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
describe("design-slop rule registry", () => {
|
|
139
|
+
it("every rule has a unique id + a catalog id", () => {
|
|
140
|
+
const ids = SLOP_RULES.map((r) => r.id);
|
|
141
|
+
expect(new Set(ids).size).toBe(ids.length);
|
|
142
|
+
for (const r of SLOP_RULES) {
|
|
143
|
+
expect(r.id).toMatch(/^slop-/);
|
|
144
|
+
expect(r.catalogId).toMatch(/^[A-Z]+\d+$/);
|
|
145
|
+
expect(r.engines.length).toBeGreaterThan(0);
|
|
146
|
+
}
|
|
147
|
+
});
|
|
148
|
+
|
|
149
|
+
it("no untested tell — every registry rule has a +/- fixture", () => {
|
|
150
|
+
for (const r of SLOP_RULES) {
|
|
151
|
+
expect(FIXTURES[r.id], `missing fixture for ${r.id}`).toBeDefined();
|
|
152
|
+
}
|
|
153
|
+
// and no orphan fixtures
|
|
154
|
+
const ids = new Set(SLOP_RULES.map((r) => r.id));
|
|
155
|
+
for (const k of Object.keys(FIXTURES)) {
|
|
156
|
+
expect(ids.has(k), `orphan fixture ${k}`).toBe(true);
|
|
157
|
+
}
|
|
158
|
+
});
|
|
159
|
+
|
|
160
|
+
describe("positive fixtures fire, negative fixtures are clean", () => {
|
|
161
|
+
for (const r of SLOP_RULES) {
|
|
162
|
+
const fx = FIXTURES[r.id];
|
|
163
|
+
if (!fx) continue;
|
|
164
|
+
it(`${r.id} (${r.catalogId})`, () => {
|
|
165
|
+
expect(findingsFor(r.id, fx.positive, fx.ext).length, "positive must fire").toBeGreaterThan(0);
|
|
166
|
+
expect(findingsFor(r.id, fx.negative, fx.ext).length, "negative must be clean").toBe(0);
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
});
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
describe("context gates suppress when DESIGN.md declares intent", () => {
|
|
173
|
+
it("t7 default-font is suppressed when DESIGN.md adopts Inter", () => {
|
|
174
|
+
const fx = FIXTURES["slop-t7-default-fonts"]!;
|
|
175
|
+
expect(findingsFor("slop-t7-default-fonts", fx.positive, "css", NO_CTX).length).toBeGreaterThan(0);
|
|
176
|
+
expect(
|
|
177
|
+
findingsFor("slop-t7-default-fonts", fx.positive, "css", ctxWith("Body font: Inter (chosen for variable metrics in a data-dense dashboard)")).length,
|
|
178
|
+
).toBe(0);
|
|
179
|
+
});
|
|
180
|
+
|
|
181
|
+
it("cp5 emoji-ui is suppressed when DESIGN.md declares an emoji strategy", () => {
|
|
182
|
+
const fx = FIXTURES["slop-cp5-emoji-ui"]!;
|
|
183
|
+
expect(findingsFor("slop-cp5-emoji-ui", fx.positive, "html", NO_CTX).length).toBeGreaterThan(0);
|
|
184
|
+
expect(
|
|
185
|
+
findingsFor("slop-cp5-emoji-ui", fx.positive, "html", ctxWith("Voice: playful; emoji are part of the brand voice in headings and CTAs")).length,
|
|
186
|
+
).toBe(0);
|
|
187
|
+
});
|
|
188
|
+
|
|
189
|
+
it("c5 cream-palette is suppressed under a declared warm-neutral language", () => {
|
|
190
|
+
const fx = FIXTURES["slop-c5-cream-palette"]!;
|
|
191
|
+
expect(findingsFor("slop-c5-cream-palette", fx.positive, "css", NO_CTX).length).toBeGreaterThan(0);
|
|
192
|
+
expect(
|
|
193
|
+
findingsFor("slop-c5-cream-palette", fx.positive, "css", ctxWith("Palette: warm-neutral, first-party")).length,
|
|
194
|
+
).toBe(0);
|
|
195
|
+
});
|
|
196
|
+
});
|
|
197
|
+
|
|
198
|
+
describe("inline-ignore", () => {
|
|
199
|
+
it("design-slop-disable-next-line suppresses the next line", () => {
|
|
200
|
+
const css = "/* design-slop-disable-next-line slop-m4-transition-all */\n.x { transition: all 200ms; }";
|
|
201
|
+
expect(findingsFor("slop-m4-transition-all", css, "css").length).toBe(0);
|
|
202
|
+
});
|
|
203
|
+
|
|
204
|
+
it("file-scope design-slop-disable suppresses the whole file", () => {
|
|
205
|
+
const css = "/* design-slop-disable slop-l8-zindex-magic */\n.a{z-index:9999}\n.b{z-index:999}";
|
|
206
|
+
expect(findingsFor("slop-l8-zindex-magic", css, "css").length).toBe(0);
|
|
207
|
+
});
|
|
208
|
+
});
|