@miller-tech/uap 1.222.0 → 2.1.4
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/README.md +19 -9
- package/config/exl3-profiles/qwen38-27b-exl3.env +68 -0
- package/config/llama-profiles/qwen38-27b-dflash2.env +6 -1
- package/dist/.tsbuildinfo +1 -1
- package/dist/benchmarks/paired/adapter.d.ts +15 -0
- package/dist/benchmarks/paired/adapter.d.ts.map +1 -1
- package/dist/benchmarks/paired/adapter.js +22 -1
- package/dist/benchmarks/paired/adapter.js.map +1 -1
- package/dist/bin/cli.js +20 -24
- package/dist/bin/cli.js.map +1 -1
- package/dist/cli/deliver.d.ts +34 -0
- package/dist/cli/deliver.d.ts.map +1 -1
- package/dist/cli/deliver.js +147 -20
- package/dist/cli/deliver.js.map +1 -1
- package/dist/cli/guided-setup.d.ts.map +1 -1
- package/dist/cli/guided-setup.js +15 -0
- package/dist/cli/guided-setup.js.map +1 -1
- package/dist/cli/init.d.ts.map +1 -1
- package/dist/cli/init.js +3 -0
- package/dist/cli/init.js.map +1 -1
- package/dist/cli/plan.d.ts.map +1 -1
- package/dist/cli/plan.js +8 -2
- package/dist/cli/plan.js.map +1 -1
- package/dist/cli/policy.d.ts.map +1 -1
- package/dist/cli/policy.js +104 -2
- package/dist/cli/policy.js.map +1 -1
- package/dist/cli/quality.d.ts +11 -0
- package/dist/cli/quality.d.ts.map +1 -0
- package/dist/cli/quality.js +213 -0
- package/dist/cli/quality.js.map +1 -0
- package/dist/cli/wizard-config.d.ts.map +1 -1
- package/dist/cli/wizard-config.js +19 -9
- package/dist/cli/wizard-config.js.map +1 -1
- package/dist/cli/worktree.d.ts.map +1 -1
- package/dist/cli/worktree.js +8 -1
- package/dist/cli/worktree.js.map +1 -1
- package/dist/dashboard/savings.d.ts +1 -4
- package/dist/dashboard/savings.d.ts.map +1 -1
- package/dist/dashboard/savings.js +2 -52
- package/dist/dashboard/savings.js.map +1 -1
- package/dist/delivery/acceptance-judge.d.ts +10 -0
- package/dist/delivery/acceptance-judge.d.ts.map +1 -1
- package/dist/delivery/acceptance-judge.js +45 -3
- package/dist/delivery/acceptance-judge.js.map +1 -1
- package/dist/delivery/agentic-executor.d.ts +12 -1
- package/dist/delivery/agentic-executor.d.ts.map +1 -1
- package/dist/delivery/agentic-executor.js +25 -5
- package/dist/delivery/agentic-executor.js.map +1 -1
- package/dist/delivery/bash-sweep.d.ts +12 -0
- package/dist/delivery/bash-sweep.d.ts.map +1 -1
- package/dist/delivery/bash-sweep.js +8 -1
- package/dist/delivery/bash-sweep.js.map +1 -1
- package/dist/delivery/convergence-loop.d.ts.map +1 -1
- package/dist/delivery/convergence-loop.js +6 -4
- package/dist/delivery/convergence-loop.js.map +1 -1
- package/dist/delivery/execution-gate.d.ts +1 -1
- package/dist/delivery/execution-gate.d.ts.map +1 -1
- package/dist/delivery/execution-gate.js +248 -5
- package/dist/delivery/execution-gate.js.map +1 -1
- package/dist/delivery/snapshot.d.ts +16 -0
- package/dist/delivery/snapshot.d.ts.map +1 -1
- package/dist/delivery/snapshot.js +113 -2
- package/dist/delivery/snapshot.js.map +1 -1
- package/dist/delivery/user-validation.d.ts.map +1 -1
- package/dist/delivery/user-validation.js +55 -10
- package/dist/delivery/user-validation.js.map +1 -1
- package/dist/delivery/verifier-ladder.d.ts +24 -0
- package/dist/delivery/verifier-ladder.d.ts.map +1 -1
- package/dist/delivery/verifier-ladder.js +119 -2
- package/dist/delivery/verifier-ladder.js.map +1 -1
- package/dist/generators/claude-md.js +17 -4
- package/dist/generators/claude-md.js.map +1 -1
- package/dist/policies/liveness.d.ts +105 -0
- package/dist/policies/liveness.d.ts.map +1 -0
- package/dist/policies/liveness.js +251 -0
- package/dist/policies/liveness.js.map +1 -0
- package/dist/policies/policy-memory.d.ts.map +1 -1
- package/dist/policies/policy-memory.js +3 -4
- package/dist/policies/policy-memory.js.map +1 -1
- package/dist/quality/baseline.d.ts +29 -0
- package/dist/quality/baseline.d.ts.map +1 -0
- package/dist/quality/baseline.js +79 -0
- package/dist/quality/baseline.js.map +1 -0
- package/dist/quality/complexity.d.ts +38 -0
- package/dist/quality/complexity.d.ts.map +1 -0
- package/dist/quality/complexity.js +239 -0
- package/dist/quality/complexity.js.map +1 -0
- package/dist/quality/config.d.ts +40 -0
- package/dist/quality/config.d.ts.map +1 -0
- package/dist/quality/config.js +77 -0
- package/dist/quality/config.js.map +1 -0
- package/dist/quality/crap.d.ts +11 -0
- package/dist/quality/crap.d.ts.map +1 -0
- package/dist/quality/crap.js +54 -0
- package/dist/quality/crap.js.map +1 -0
- package/dist/quality/languages.d.ts +25 -0
- package/dist/quality/languages.d.ts.map +1 -0
- package/dist/quality/languages.js +150 -0
- package/dist/quality/languages.js.map +1 -0
- package/dist/quality/report.d.ts +38 -0
- package/dist/quality/report.d.ts.map +1 -0
- package/dist/quality/report.js +251 -0
- package/dist/quality/report.js.map +1 -0
- package/dist/quality/scanner.d.ts +32 -0
- package/dist/quality/scanner.d.ts.map +1 -0
- package/dist/quality/scanner.js +127 -0
- package/dist/quality/scanner.js.map +1 -0
- package/dist/quality/tools.d.ts +28 -0
- package/dist/quality/tools.d.ts.map +1 -0
- package/dist/quality/tools.js +189 -0
- package/dist/quality/tools.js.map +1 -0
- package/dist/types/config.d.ts +148 -0
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/config.js +35 -0
- package/dist/types/config.js.map +1 -1
- package/docs/ATTRIBUTION.md +0 -1
- package/docs/INDEX.md +38 -4
- package/docs/analysis/MARKET_POSITION.md +179 -0
- package/docs/architecture/OVERVIEW.md +82 -18
- package/docs/architecture/PROTOCOL.md +1 -1
- package/docs/benchmarks/PAIRED_FINDINGS.md +106 -0
- package/docs/benchmarks/PAIRED_HARNESS.md +16 -0
- package/docs/benchmarks/README.md +59 -0
- package/docs/design/UAP_REACTOR.md +0 -1
- package/docs/getting-started/INSTALLATION.md +1 -1
- package/docs/guides/AUTOMATIC.md +0 -14
- package/docs/guides/AUTOMATIC_FEATURES.md +1 -9
- package/docs/guides/COORDINATION.md +1 -1
- package/docs/guides/DELIVERY_PIPELINE.md +5 -0
- package/docs/guides/DEPLOY_BATCHING.md +1 -1
- package/docs/guides/DROIDS_AND_SKILLS.md +1 -1
- package/docs/guides/LOCAL_MODELS.md +6 -1
- package/docs/guides/MCP_ROUTER.md +1 -1
- package/docs/guides/MEMORY.md +1 -1
- package/docs/guides/MULTI_MODEL.md +1 -1
- package/docs/guides/ORCHESTRATOR.md +1 -1
- package/docs/guides/POLICIES.md +19 -3
- package/docs/guides/QWEN38_EXL3.md +114 -0
- package/docs/guides/WORKTREE_WORKFLOW.md +45 -1
- package/docs/integrations/MCP_ROUTER.md +1 -4
- package/docs/plans/deliver-hardening-plan-2026-07-13.md +173 -0
- package/docs/plans/deliver-hardening-review-response-2026-07-13.md +180 -0
- package/docs/plans/k3-uap-uplift-validation.md +216 -0
- package/docs/plans/qwen38-uap-retest-plan.md +196 -0
- package/docs/reference/API.md +1 -1
- package/docs/reference/CLI.md +49 -14
- package/docs/reference/COMPARISON.md +248 -0
- package/docs/reference/CONFIGURATION.md +1 -3
- package/docs/reference/DATABASE_SCHEMA.md +1 -1
- package/docs/reference/FEATURES.md +3 -3
- package/docs/reference/PATTERNS.md +1 -1
- package/docs/reference/PLATFORMS.md +1 -1
- package/package.json +2 -2
- package/scripts/maintenance/update-skills.py +0 -22
- package/scripts/maintenance/verify-compliance.sh +3 -3
- package/src/policies/enforcers/__pycache__/_common.cpython-312.pyc +0 -0
- package/src/policies/enforcers/__pycache__/quality_metrics_gate.cpython-312.pyc +0 -0
- package/src/policies/enforcers/adr_guard.py +0 -0
- package/src/policies/enforcers/bearer_lockdown.py +0 -0
- package/src/policies/enforcers/branch_freshness.py +0 -0
- package/src/policies/enforcers/design_token_gate.py +0 -0
- package/src/policies/enforcers/enforcement_self_protect.py +70 -0
- package/src/policies/enforcers/expert_review_required.py +22 -0
- package/src/policies/enforcers/iac_plan_destruction_check.py +0 -0
- package/src/policies/enforcers/quality_metrics_gate.py +447 -0
- package/src/policies/enforcers/ship_loop_gate.py +0 -0
- package/src/policies/enforcers/validate_plan_on_change.py +0 -0
- package/src/policies/enforcers/visual_verification.py +0 -0
- package/src/policies/enforcers/workdir_scope.py +0 -0
- package/src/policies/schemas/policies/expert-review-required.md +9 -1
- package/src/policies/schemas/policies/quality-metrics-gate.md +74 -0
- package/templates/CLAUDE.template.md +1 -1
- package/templates/hooks/__pycache__/deliver_autoroute.cpython-312.pyc +0 -0
- package/templates/hooks/pre-tool-use-bash.sh +50 -3
- package/templates/hooks/pre-tool-use-edit-write.sh +31 -0
- package/templates/hooks/session-start.sh +15 -0
- package/templates/hooks/uap-policy-gate.sh +187 -5
- package/templates/stryker.config.json +14 -0
- package/tools/agents/scripts/__pycache__/toolcall_path_normalizer.cpython-312.pyc +0 -0
- package/tools/agents/scripts/anthropic_proxy.py +254 -28
- package/tools/agents/tests/run_acceptance.py +0 -0
- package/tools/agents/tests/test_client_disconnect.py +0 -0
- package/tools/agents/tests/test_cycle_break_exploration.py +0 -0
- package/tools/agents/tests/test_deferral_break.py +0 -0
- package/tools/agents/tests/test_delivery_enforcement_all_langs.py +0 -0
- package/tools/agents/tests/test_delivery_enforcement_exemptions.py +0 -0
- package/tools/agents/tests/test_delivery_enforcement_filepath.py +0 -0
- package/tools/agents/tests/test_delivery_enforcement_web_and_bash.py +0 -0
- package/tools/agents/tests/test_delivery_enforcement_worktree.py +0 -0
- package/tools/agents/tests/test_delivery_enforcement_write_complexity.py +0 -0
- package/tools/agents/tests/test_disconnect_watcher.py +0 -0
- package/tools/agents/tests/test_doubling_break.py +0 -0
- package/tools/agents/tests/test_empty_maxtokens_recovery.py +0 -0
- package/tools/agents/tests/test_empty_tool_loop_break.py +0 -0
- package/tools/agents/tests/test_enforcement_self_protect.py +90 -0
- package/tools/agents/tests/test_enforcer_escape_hatches.py +0 -0
- package/tools/agents/tests/test_error_loop_break.py +0 -0
- package/tools/agents/tests/test_expert_review_pr_scope.py +13 -5
- package/tools/agents/tests/test_fastpath_config.py +0 -0
- package/tools/agents/tests/test_finalize_suppression.py +0 -0
- package/tools/agents/tests/test_gate_evidence.py +0 -0
- package/tools/agents/tests/test_gate_failclosed_indirection.py +0 -0
- package/tools/agents/tests/test_gate_integrity.py +0 -0
- package/tools/agents/tests/test_live_deliver_kill.py +0 -0
- package/tools/agents/tests/test_malformed_unclosed_think.py +0 -0
- package/tools/agents/tests/test_mandate_beats_recon.py +0 -0
- package/tools/agents/tests/test_mandate_deliver.py +0 -0
- package/tools/agents/tests/test_non_stream_resp_log.py +0 -0
- package/tools/agents/tests/test_output_token_ceilings.py +0 -0
- package/tools/agents/tests/test_overflow_truncate_count_tokens.py +0 -0
- package/tools/agents/tests/test_path_containment.py +0 -0
- package/tools/agents/tests/test_path_normalizer_hardened.py +0 -0
- package/tools/agents/tests/test_repeat_call_guard.py +0 -0
- package/tools/agents/tests/test_repeat_guard.py +0 -0
- package/tools/agents/tests/test_session_admission.py +0 -0
- package/tools/agents/tests/test_stream_heartbeat.py +0 -0
- package/tools/agents/tests/test_stream_thinking_deltas.py +405 -0
- package/tools/agents/tests/test_stuck_break_hard.py +0 -0
- package/tools/agents/tests/test_stuck_break_reattach.py +0 -0
- package/tools/agents/tests/test_turn_count_breaker_periodic.py +0 -0
- package/tools/agents/tests/test_upstream_chokepoint.py +0 -0
- package/tools/agents/tests/test_upstream_model_aliases.py +0 -0
- package/tools/agents/tests/test_validate_plan_gate.py +0 -0
- package/tools/agents/tests/test_vision_passthrough.py +0 -0
- package/tools/agents/tests/test_workdir_scope_enforcer.py +0 -0
- package/dist/cli/rtk.d.ts +0 -34
- package/dist/cli/rtk.d.ts.map +0 -1
- package/dist/cli/rtk.js +0 -401
- package/dist/cli/rtk.js.map +0 -1
- package/docs/integrations/RTK.md +0 -113
- package/scripts/setup/install-rtk.sh +0 -184
- package/src/policies/enforcers/rtk_wrap.py +0 -205
- package/src/policies/schemas/policies/rtk-wrap.md +0 -50
- package/tools/agents/tests/test_rtk_wrap.py +0 -151
|
@@ -200,10 +200,9 @@ export class PolicyMemoryManager {
|
|
|
200
200
|
//
|
|
201
201
|
// Without this every policy arrived switched on, so offering one and
|
|
202
202
|
// imposing it were the same act. Some policies are a genuine trade rather
|
|
203
|
-
// than a rule
|
|
204
|
-
//
|
|
205
|
-
//
|
|
206
|
-
// directly, 0 through rtk). Worth offering; not worth defaulting on.
|
|
203
|
+
// than a rule — they save something measurable at the price of rewriting
|
|
204
|
+
// or constraining machine-visible behavior. Worth offering; not worth
|
|
205
|
+
// defaulting on.
|
|
207
206
|
//
|
|
208
207
|
// Only consulted when there is no existing row — see storeRawPolicy. A
|
|
209
208
|
// default must not undo a choice an operator made deliberately.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"policy-memory.js","sourceRoot":"","sources":["../../src/policies/policy-memory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AASxD;;;;;GAKG;AACH,MAAM,UAAU,SAAS,CACvB,QAAoG;IAEpG,MAAM,MAAM,GAAG,IAAI,GAAG,EAA2B,CAAC;IAClD,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACtC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACb,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC3B,CAAC;IACD,MAAM,MAAM,GAAiB,EAAE,CAAC;IAChC,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,MAAM,EAAE,CAAC;QAClC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;YAAE,SAAS;QAC9B,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YACrC,IAAI,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,QAAQ;gBAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC1D,IAAI,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,OAAO;gBAAE,OAAO,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC;YAC1D,IAAI,CAAC,CAAC,SAAS,KAAK,CAAC,CAAC,SAAS;gBAAE,OAAO,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3E,OAAO,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9B,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IACtF,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,OAAO,mBAAmB;IAKD;IAJrB,GAAG,GAA2B,IAAI,CAAC;IAE3C;kFAC8E;IAC9E,YAA6B,MAAe;QAAf,WAAM,GAAN,MAAM,CAAS;IAAG,CAAC;IAEhD,IAAY,EAAE;QACZ,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;YACd,IAAI,CAAC,GAAG,GAAG,IAAI,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC9C,CAAC;QACD,OAAO,IAAI,CAAC,GAAG,CAAC;IAClB,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,WAAmB,EAAE,WAA4B,EAAE;QACtE,MAAM,IAAI,GAAG,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC;QACjD,MAAM,iBAAiB,GAAG,IAAI,CAAC,qBAAqB,CAAC,WAAW,CAAC,CAAC;QAElE,wEAAwE;QACxE,0EAA0E;QAC1E,6EAA6E;QAC7E,oEAAoE;QACpE,MAAM,QAAQ,GAAG,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,EAAE,IAAI,EAAE,CAAqF,CAAC;QACrI,MAAM,QAAQ,GAAG,QAAQ,EAAE,EAAE,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;QACrD,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAErC,MAAM,MAAM,GAAW;YACrB,EAAE,EAAE,QAAQ;YACZ,IAAI;YACJ,QAAQ,EAAE,CAAC,QAAQ,CAAC,QAAQ,IAAI,iBAAiB,CAAC,QAAQ,IAAI,QAAQ,CAAuB;YAC7F,KAAK,EAAE,CAAC,QAAQ,CAAC,KAAK,IAAI,iBAAiB,CAAC,KAAK,IAAI,aAAa,CAAoB;YACtF,gBAAgB,EACd,QAAQ,CAAC,gBAAgB,IAAI,iBAAiB,CAAC,gBAAgB,IAAI,UAAU;YAC/E,WAAW;YACX,IAAI,EAAE,QAAQ,CAAC,IAAI,IAAI,iBAAiB,CAAC,IAAI,IAAI,EAAE;YACnD,SAAS,EAAE,QAAQ,EAAE,SAAS,IAAI,GAAG;YACrC,SAAS,EAAE,GAAG;YACd,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3D,uEAAuE;YACvE,sEAAsE;YACtE,sEAAsE;YACtE,+CAA+C;YAC/C,QAAQ,EAAE,QAAQ;gBAChB,CAAC,CAAC,QAAQ,CAAC,QAAQ,KAAK,IAAI,IAAI,QAAQ,CAAC,QAAQ,KAAK,CAAC;gBACvD,CAAC,CAAC,CAAC,iBAAiB,CAAC,aAAa,IAAI,IAAI,CAAC;YAC7C,QAAQ,EAAE,QAAQ,CAAC,QAAQ,IAAI,EAAE;SAClC,CAAC;QAEF,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,MAA4C,CAAC,CAAC;QACnE,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,cAAc;QAClB,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,gBAAgB,EAAkG,CAAC;QACxI,MAAM,MAAM,GAAG,SAAS,CACtB,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACf,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,QAAQ,EAAE,CAAC,CAAC,QAAQ,KAAK,IAAI,IAAI,CAAC,CAAC,QAAQ,KAAK,CAAC;YACjD,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC;YAC/B,SAAS,EAAE,CAAC,CAAC,SAAS,IAAI,EAAE;SAC7B,CAAC,CAAC,CACJ,CAAC;QACF,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;YACvB,KAAK,MAAM,EAAE,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC;gBAC1B,IAAI,CAAC,EAAE,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;gBAC7B,OAAO,EAAE,CAAC;YACZ,CAAC;QACH,CAAC;QACD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;IAClD,CAAC;IAED,+EAA+E;IAC/E,KAAK,CAAC,eAAe,CAAC,EAAU;QAC9B,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QACrC,IAAI,CAAC,GAAG;YAAE,OAAO,IAAI,CAAC;QACtB,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,gBAAgB,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAE,CAAuB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACvG,MAAM,QAAQ,GAAG,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,qBAAqB,EAAE,EAAE,CAAC,CAAC;QAC7D,IAAI,IAAI,GAAG,GAAG,QAAQ,SAAS,CAAC;QAChC,IAAI,CAAC,GAAG,CAAC,CAAC;QACV,OAAO,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,IAAI,GAAG,GAAG,QAAQ,UAAU,CAAC,EAAE,GAAG,CAAC;QAC9D,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;QAClC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACrC,gFAAgF;QAChF,MAAM,WAAW,GAAG,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,UAAU,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;QACrE,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC;YACnB,GAAI,GAA0C;YAC9C,EAAE,EAAE,KAAK;YACT,IAAI;YACJ,WAAW;YACX,SAAS,EAAE,GAAG;YACd,SAAS,EAAE,GAAG;YACd,OAAO,EAAE,CAAC;YACV,QAAQ,EAAE,IAAI;SACf,CAAC,CAAC;QACH,OAAO,KAAK,CAAC;IACf,CAAC;IAED,+DAA+D;IAC/D,KAAK,CAAC,iBAAiB,CAAC,EAAU,EAAE,QAAgB;QAClD,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IAClF,CAAC;IAED,8EAA8E;IAC9E,KAAK,CAAC,eAAe,CAAC,UAAoB,EAAE,IAAI,GAAG,IAAI,EAAE,IAAI,GAAG,EAAE;QAChE,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACrC,UAAU,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE;YAC3B,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC;QAC3F,CAAC,CAAC,CAAC;IACL,CAAC;IAED,qFAAqF;IACrF,cAAc;QAIZ,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,gBAAgB,EAA+C,CAAC;QACrF,OAAO;YACL,OAAO,EAAE,CAAC;YACV,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACzB,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;gBACpB,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,IAAI,QAAQ,CAAC;gBACxC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,UAAU,CAAC;gBACpC,gBAAgB,EAAE,MAAM,CAAC,CAAC,CAAC,gBAAgB,IAAI,UAAU,CAAC;gBAC1D,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE;gBAClC,QAAQ,EAAE,CAAC,CAAC,QAAQ,KAAK,IAAI,IAAI,CAAC,CAAC,QAAQ,KAAK,CAAC;gBACjD,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,WAAW,IAAI,EAAE,CAAC;aACzC,CAAC,CAAC;SACJ,CAAC;IACJ,CAAC;IAED;oFACgF;IAChF,KAAK,CAAC,cAAc,CAAC,MAAqD;QACxE,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;QACpE,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;YACrB,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;YACnE,IAAI,CAAC,GAAG;gBAAE,SAAS;YACnB,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE;gBACxC,QAAQ,EAAE,CAAC,CAAC,QAAiB;gBAC7B,KAAK,EAAE,CAAC,CAAC,KAAc;gBACvB,gBAAgB,EAAE,CAAC,CAAC,gBAAyB;gBAC7C,QAAQ,EAAE,OAAO,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS;aAClE,CAAC,CAAC;YACH,IAAI,OAAO,CAAC,CAAC,QAAQ,KAAK,QAAQ;gBAAE,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;YAC3F,IAAI,CAAC,CAAC,QAAQ,KAAK,KAAK;gBAAE,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;YAC5E,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC;QAC1C,CAAC;QACD,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC;IAC3C,CAAC;IAEO,qBAAqB,CAAC,QAAgB;QAO5C,MAAM,QAAQ,GAMV,EAAE,CAAC;QAEP,wDAAwD;QACxD,MAAM,aAAa,GAAG,QAAQ,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;QAClE,IAAI,aAAa,EAAE,CAAC;YAClB,QAAQ,CAAC,QAAQ,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;QACvC,CAAC;QAED,MAAM,UAAU,GAAG,QAAQ,CAAC,KAAK,CAAC,mDAAmD,CAAC,CAAC;QACvF,IAAI,UAAU,EAAE,CAAC;YACf,QAAQ,CAAC,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,WAAW,EAA6C,CAAC;QAC1F,CAAC;QAED,MAAM,UAAU,GAAG,QAAQ,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC;QACxE,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,KAAK,GAAG,UAAU,CAAC,CAAC,CAAmD,CAAC;YAC9E,IAAI,CAAC,UAAU,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;gBAClE,QAAQ,CAAC,gBAAgB,GAAG,KAAK,CAAC;YACpC,CAAC;QACH,CAAC;QAED,gEAAgE;QAChE,EAAE;QACF,qEAAqE;QACrE,0EAA0E;QAC1E,yEAAyE;QACzE,wEAAwE;QACxE,mEAAmE;QACnE,qEAAqE;QACrE,EAAE;QACF,uEAAuE;QACvE,gEAAgE;QAChE,MAAM,YAAY,GAAG,QAAQ,CAAC,KAAK,CAAC,+CAA+C,CAAC,CAAC;QACrF,IAAI,YAAY,EAAE,CAAC;YACjB,MAAM,IAAI,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;YAC3C,QAAQ,CAAC,aAAa,GAAG,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,SAAS,CAAC;QAC/D,CAAC;QAED,0DAA0D;QAC1D,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;QACzD,IAAI,SAAS,EAAE,CAAC;YACd,QAAQ,CAAC,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC;iBACzB,KAAK,CAAC,GAAG,CAAC;iBACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;iBACpB,MAAM,CAAC,OAAO,CAAC,CAAC;QACrB,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,KAAK,CAAC,qBAAqB,CACzB,QAAgB,EAChB,UAAkB,EAClB,QAAgB;QAEhB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QAC9C,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,UAAU,QAAQ,YAAY,CAAC,CAAC;QAE7D,kDAAkD;QAClD,IAAI,CAAC,EAAE,CAAC,oBAAoB,CAAC;YAC3B,EAAE,EAAE,GAAG,QAAQ,IAAI,QAAQ,EAAE;YAC7B,QAAQ;YACR,QAAQ;YACR,IAAI,EAAE,UAAU;YAChB,QAAQ,EAAE,QAAQ;YAClB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC,CAAC;QAEH,4BAA4B;QAC5B,MAAM,KAAK,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,eAAe,IAAI,EAAE,CAAC,CAAC,CAAC;QAClD,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC9B,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACvB,CAAC;QAED,IAAI,CAAC,EAAE,CAAC,YAAY,CAClB,EAAE,EAAE,EAAE,QAAQ,EAAE,EAChB;YACE,eAAe,EAAE,KAAK;YACtB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,OAAO,EAAE,MAAM,CAAC,OAAO,GAAG,CAAC;SAC5B,CACF,CAAC;IACJ,CAAC;IAED;;4DAEwD;IAChD,kBAAkB,CAAC,CAAU;QACnC,MAAM,GAAG,GAAG,EAAE,GAAI,CAA6B,EAAE,CAAC;QAClD,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;QAClD,IAAI,GAAG,KAAK,WAAW,IAAI,GAAG,KAAK,UAAU;YAAE,GAAG,CAAC,KAAK,GAAG,UAAU,CAAC;aACjE,IAAI,GAAG,KAAK,UAAU;YAAE,GAAG,CAAC,KAAK,GAAG,UAAU,CAAC;aAC/C,IAAI,GAAG,KAAK,aAAa;YAAE,GAAG,CAAC,KAAK,GAAG,aAAa,CAAC;aACrD,IAAI,GAAG,CAAC,KAAK,IAAI,IAAI,IAAI,GAAG,CAAC,KAAK,KAAK,EAAE;YAAE,GAAG,CAAC,KAAK,GAAG,aAAa,CAAC;QAC1E,OAAO,GAAG,CAAC;IACb,CAAC;IAED;;2DAEuD;IAC/C,eAAe,CAAC,IAAe;QACrC,MAAM,GAAG,GAAa,EAAE,CAAC;QACzB,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;YACrB,MAAM,GAAG,GAAG,YAAY,CAAC,SAAS,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC;YAC/D,IAAI,GAAG,CAAC,OAAO;gBAAE,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACtC,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,EAAU;QACxB,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QAC7C,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC;QACzB,MAAM,GAAG,GAAG,YAAY,CAAC,SAAS,CAAC,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC;QACpE,OAAO,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,cAAc;QAClB,MAAM,OAAO,GAAG,IAAI,CAAC,EAAE,CAAC,oBAAoB,EAAE,CAAC;QAC/C,OAAO,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;IACvC,CAAC;IAED,kFAAkF;IAClF,KAAK,CAAC,wBAAwB;QAC5B,OAAO,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC,gBAAgB,EAAE,CAAC,CAAC;IAC1D,CAAC;IAED,KAAK,CAAC,mBAAmB;QACvB,MAAM,OAAO,GAAG,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5E,OAAO,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,qBAAqB,CAAC,QAAgB;QAC1C,MAAM,OAAO,GAAG,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QACnE,OAAO,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,EAAU,EAAE,MAAe;QAC5C,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;IACrD,CAAC;IAED,KAAK,CAAC,mBAAmB,CACvB,EAAU,EACV,KAAqD;QAErD,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,gBAAgB,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IACjG,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,EAAU,EAAE,KAA8C;QACvE,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IAC/E,CAAC;IAED,KAAK,CAAC,kBAAkB,CACtB,KAAqD;QAErD,MAAM,OAAO,GAAG,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,EAAE,gBAAgB,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QAClF,OAAO,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,IAAc;QAC/B,MAAM,OAAO,GAAG,IAAI,CAAC,EAAE,CAAC,oBAAoB,EAAE,CAAC;QAC/C,OAAO,IAAI,CAAC,eAAe,CACzB,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;YACnB,MAAM,UAAU,GAAG,CAAC,CAAC,IAAgB,CAAC;YACtC,OAAO,UAAU,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QAChE,CAAC,CAAC,CACH,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,mBAAmB,CAAC,OAAe,EAAE,OAAe,CAAC;QACzD,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;QAChD,MAAM,YAAY,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;QAE3C,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;YACxC,IAAI,KAAK,GAAG,CAAC,CAAC;YACd,wCAAwC;YACxC,IAAI,MAAM,CAAC,KAAK,KAAK,UAAU;gBAAE,KAAK,IAAI,EAAE,CAAC;YAC7C,cAAc;YACd,KAAK,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;YACtF,aAAa;YACb,IAAI,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;gBAAE,KAAK,IAAI,CAAC,CAAC;YACjE,iBAAiB;YACjB,IAAI,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC;gBAAE,KAAK,IAAI,CAAC,CAAC;YACvD,iBAAiB;YACjB,KAAK,IAAI,MAAM,CAAC,QAAQ,GAAG,GAAG,CAAC;YAC/B,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;QAC3B,CAAC,CAAC,CAAC;QAEH,OAAO,MAAM;aACV,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;aACjC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC;aACd,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAChC,CAAC;IAED,KAAK,CAAC,qBAAqB,CAAC,QAAgB,EAAE,QAAgB;QAC5D,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAC5D,OAAO,IAAI,CAAC,CAAC,CAAE,IAAI,CAAC,IAAe,CAAC,CAAC,CAAC,IAAI,CAAC;IAC7C,CAAC;IAEO,iBAAiB,CAAC,QAAgB;QACxC,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QAC3C,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,iBAAiB,CAAC;IACrD,CAAC;CACF;AAED,2DAA2D;AAC3D,IAAI,SAAS,GAA+B,IAAI,CAAC;AACjD,MAAM,UAAU,sBAAsB;IACpC,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,SAAS,GAAG,IAAI,mBAAmB,EAAE,CAAC;IACxC,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC"}
|
|
1
|
+
{"version":3,"file":"policy-memory.js","sourceRoot":"","sources":["../../src/policies/policy-memory.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { Violation } from './scanner.js';
|
|
2
|
+
export interface BaselineEntry {
|
|
3
|
+
signature: string;
|
|
4
|
+
/** Worst tolerated value; a current value above this blocks. */
|
|
5
|
+
value: number;
|
|
6
|
+
}
|
|
7
|
+
export interface QualityBaseline {
|
|
8
|
+
version: 1;
|
|
9
|
+
generatedAt: string;
|
|
10
|
+
entries: BaselineEntry[];
|
|
11
|
+
}
|
|
12
|
+
export declare function baselinePath(root: string): string;
|
|
13
|
+
export declare function loadBaseline(root: string): QualityBaseline | null;
|
|
14
|
+
export interface RatchetResult {
|
|
15
|
+
/** Violations that must fail the gate. */
|
|
16
|
+
blocking: Violation[];
|
|
17
|
+
/** Pre-existing violations tolerated by the baseline. */
|
|
18
|
+
grandfathered: Violation[];
|
|
19
|
+
/** Grandfathered violations that improved vs the recorded value. */
|
|
20
|
+
improved: Array<{
|
|
21
|
+
violation: Violation;
|
|
22
|
+
baselineValue: number;
|
|
23
|
+
}>;
|
|
24
|
+
}
|
|
25
|
+
/** Split violations into blocking vs grandfathered against the baseline. */
|
|
26
|
+
export declare function ratchet(violations: Violation[], baseline: QualityBaseline | null): RatchetResult;
|
|
27
|
+
/** Rewrite the baseline from a fresh scan (uap quality baseline --update). */
|
|
28
|
+
export declare function writeBaseline(root: string, violations: Violation[]): string;
|
|
29
|
+
//# sourceMappingURL=baseline.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"baseline.d.ts","sourceRoot":"","sources":["../../src/quality/baseline.ts"],"names":[],"mappings":"AAkBA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,gEAAgE;IAChE,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,CAAC,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,aAAa,EAAE,CAAC;CAC1B;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CAkBjE;AAED,MAAM,WAAW,aAAa;IAC5B,0CAA0C;IAC1C,QAAQ,EAAE,SAAS,EAAE,CAAC;IACtB,yDAAyD;IACzD,aAAa,EAAE,SAAS,EAAE,CAAC;IAC3B,oEAAoE;IACpE,QAAQ,EAAE,KAAK,CAAC;QAAE,SAAS,EAAE,SAAS,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAClE;AAED,4EAA4E;AAC5E,wBAAgB,OAAO,CAAC,UAAU,EAAE,SAAS,EAAE,EAAE,QAAQ,EAAE,eAAe,GAAG,IAAI,GAAG,aAAa,CAoBhG;AAED,8EAA8E;AAC9E,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,MAAM,CAY3E"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ratchet baseline for the quality gate (.uap/quality-baseline.json).
|
|
3
|
+
*
|
|
4
|
+
* Semantics — a current violation is BLOCKING unless the baseline proves it
|
|
5
|
+
* pre-existing and not worsened:
|
|
6
|
+
*
|
|
7
|
+
* new violation (no baseline entry) -> BLOCK
|
|
8
|
+
* entry exists, value > baseline value -> BLOCK (worsened)
|
|
9
|
+
* entry exists, value <= baseline value -> grandfathered (allowed)
|
|
10
|
+
* file absent from baseline entirely -> every violation BLOCKS
|
|
11
|
+
*
|
|
12
|
+
* The baseline therefore only ever shrinks: `uap quality baseline --update`
|
|
13
|
+
* rewrites it from a fresh scan, dropping entries whose violations were fixed
|
|
14
|
+
* and lowering values that improved. Lowering is recorded in the file so the
|
|
15
|
+
* shrink is reviewable in git.
|
|
16
|
+
*/
|
|
17
|
+
import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';
|
|
18
|
+
import { join } from 'path';
|
|
19
|
+
export function baselinePath(root) {
|
|
20
|
+
return join(root, '.uap', 'quality-baseline.json');
|
|
21
|
+
}
|
|
22
|
+
export function loadBaseline(root) {
|
|
23
|
+
const p = baselinePath(root);
|
|
24
|
+
if (!existsSync(p))
|
|
25
|
+
return null;
|
|
26
|
+
try {
|
|
27
|
+
const raw = JSON.parse(readFileSync(p, 'utf-8'));
|
|
28
|
+
if (!Array.isArray(raw.entries))
|
|
29
|
+
return null;
|
|
30
|
+
return {
|
|
31
|
+
version: 1,
|
|
32
|
+
generatedAt: typeof raw.generatedAt === 'string' ? raw.generatedAt : '',
|
|
33
|
+
entries: raw.entries.filter((e) => !!e && typeof e.signature === 'string' &&
|
|
34
|
+
typeof e.value === 'number'),
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
/** Split violations into blocking vs grandfathered against the baseline. */
|
|
42
|
+
export function ratchet(violations, baseline) {
|
|
43
|
+
const bySig = new Map();
|
|
44
|
+
for (const e of baseline?.entries ?? [])
|
|
45
|
+
bySig.set(e.signature, e.value);
|
|
46
|
+
const blocking = [];
|
|
47
|
+
const grandfathered = [];
|
|
48
|
+
const improved = [];
|
|
49
|
+
for (const v of violations) {
|
|
50
|
+
const base = bySig.get(v.signature);
|
|
51
|
+
if (base === undefined) {
|
|
52
|
+
blocking.push(v);
|
|
53
|
+
}
|
|
54
|
+
else if (v.value > base) {
|
|
55
|
+
blocking.push(v);
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
grandfathered.push(v);
|
|
59
|
+
if (v.value < base)
|
|
60
|
+
improved.push({ violation: v, baselineValue: base });
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return { blocking, grandfathered, improved };
|
|
64
|
+
}
|
|
65
|
+
/** Rewrite the baseline from a fresh scan (uap quality baseline --update). */
|
|
66
|
+
export function writeBaseline(root, violations) {
|
|
67
|
+
const p = baselinePath(root);
|
|
68
|
+
mkdirSync(join(root, '.uap'), { recursive: true });
|
|
69
|
+
const baseline = {
|
|
70
|
+
version: 1,
|
|
71
|
+
generatedAt: new Date().toISOString(),
|
|
72
|
+
entries: violations
|
|
73
|
+
.map((v) => ({ signature: v.signature, value: v.value }))
|
|
74
|
+
.sort((a, b) => a.signature.localeCompare(b.signature)),
|
|
75
|
+
};
|
|
76
|
+
writeFileSync(p, JSON.stringify(baseline, null, 2) + '\n');
|
|
77
|
+
return p;
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=baseline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"baseline.js","sourceRoot":"","sources":["../../src/quality/baseline.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Built-in complexity fallback scanner.
|
|
3
|
+
*
|
|
4
|
+
* When lizard / rust-code-analysis are installed their numbers are used
|
|
5
|
+
* instead (see tools.ts). This heuristic exists so the gate is not toothless
|
|
6
|
+
* on machines without external tooling. It is deliberately conservative:
|
|
7
|
+
* function-region detection is generic (brace-balance for C-family, indent
|
|
8
|
+
* for Python), and decision counting follows McCabe (cc = 1 + decisions) and
|
|
9
|
+
* the SonarSource cognitive rules (decisions weighted by nesting depth).
|
|
10
|
+
*
|
|
11
|
+
* Accuracy note: it can disagree with lizard on exotic syntax. That is fine
|
|
12
|
+
* for a ratcheted gate — the baseline freezes whatever the scanner reports,
|
|
13
|
+
* and a project needing exact numbers installs lizard.
|
|
14
|
+
*
|
|
15
|
+
* PARITY: quality_metrics_gate.py mirrors this file decision-for-decision.
|
|
16
|
+
* Change one, change both, and extend the parity corpus in
|
|
17
|
+
* test/quality/quality-gate-enforcer.test.ts.
|
|
18
|
+
*/
|
|
19
|
+
import { LanguageFacts } from './languages.js';
|
|
20
|
+
export interface FunctionMetric {
|
|
21
|
+
name: string;
|
|
22
|
+
line: number;
|
|
23
|
+
cyclomatic: number;
|
|
24
|
+
cognitive: number;
|
|
25
|
+
nloc: number;
|
|
26
|
+
}
|
|
27
|
+
export interface FileComplexity {
|
|
28
|
+
functions: FunctionMetric[];
|
|
29
|
+
/** Non-blank, non-comment lines of code in the whole file. */
|
|
30
|
+
loc: number;
|
|
31
|
+
}
|
|
32
|
+
/** Count non-empty lines of comment-stripped content. */
|
|
33
|
+
export declare function countLoc(stripped: string): number;
|
|
34
|
+
/** Name of the function declared on this line, or null. */
|
|
35
|
+
export declare function functionHeader(line: string): string | null;
|
|
36
|
+
/** Split source into function-ish regions and score each. */
|
|
37
|
+
export declare function analyzeComplexity(content: string, facts: LanguageFacts): FileComplexity;
|
|
38
|
+
//# sourceMappingURL=complexity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"complexity.d.ts","sourceRoot":"","sources":["../../src/quality/complexity.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,EAAE,aAAa,EAAc,MAAM,gBAAgB,CAAC;AAE3D,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,cAAc,EAAE,CAAC;IAC5B,8DAA8D;IAC9D,GAAG,EAAE,MAAM,CAAC;CACb;AAED,yDAAyD;AACzD,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAIjD;AAmED,2DAA2D;AAC3D,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAM1D;AA8JD,6DAA6D;AAC7D,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,GAAG,cAAc,CAOvF"}
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Built-in complexity fallback scanner.
|
|
3
|
+
*
|
|
4
|
+
* When lizard / rust-code-analysis are installed their numbers are used
|
|
5
|
+
* instead (see tools.ts). This heuristic exists so the gate is not toothless
|
|
6
|
+
* on machines without external tooling. It is deliberately conservative:
|
|
7
|
+
* function-region detection is generic (brace-balance for C-family, indent
|
|
8
|
+
* for Python), and decision counting follows McCabe (cc = 1 + decisions) and
|
|
9
|
+
* the SonarSource cognitive rules (decisions weighted by nesting depth).
|
|
10
|
+
*
|
|
11
|
+
* Accuracy note: it can disagree with lizard on exotic syntax. That is fine
|
|
12
|
+
* for a ratcheted gate — the baseline freezes whatever the scanner reports,
|
|
13
|
+
* and a project needing exact numbers installs lizard.
|
|
14
|
+
*
|
|
15
|
+
* PARITY: quality_metrics_gate.py mirrors this file decision-for-decision.
|
|
16
|
+
* Change one, change both, and extend the parity corpus in
|
|
17
|
+
* test/quality/quality-gate-enforcer.test.ts.
|
|
18
|
+
*/
|
|
19
|
+
import { stripNoise } from './languages.js';
|
|
20
|
+
/** Count non-empty lines of comment-stripped content. */
|
|
21
|
+
export function countLoc(stripped) {
|
|
22
|
+
let n = 0;
|
|
23
|
+
for (const line of stripped.split('\n'))
|
|
24
|
+
if (line.trim())
|
|
25
|
+
n++;
|
|
26
|
+
return n;
|
|
27
|
+
}
|
|
28
|
+
/** Boolean/ternary ops get a flat +1 cognitive (no nesting bump). */
|
|
29
|
+
const BOOL_OPS = new Set(['&&', '||', '?', 'and', 'or']);
|
|
30
|
+
function countDecisions(segment, facts, initialDepth = 0) {
|
|
31
|
+
let cyclomatic = 1;
|
|
32
|
+
let cognitive = 0;
|
|
33
|
+
// Region segments include the function's own opening brace; callers pass
|
|
34
|
+
// initialDepth = -1 there so nesting depth counts from INSIDE the function
|
|
35
|
+
// (SonarSource convention), not from the header line.
|
|
36
|
+
let depth = initialDepth;
|
|
37
|
+
// Normalize modern TS before tokenizing: `??` counts as ONE decision (a
|
|
38
|
+
// coalescing branch), `?.` counts as none (optional chaining is a guard,
|
|
39
|
+
// not a branch SonarSource-style). Without this `a?.b ?? c` reads as three
|
|
40
|
+
// phantom decisions. Keep in lockstep with quality_metrics_gate.py.
|
|
41
|
+
const normalized = segment.replace(/\?\?/g, ' ? ').replace(/\?\./g, '.');
|
|
42
|
+
// Word + operator scan in source order so cognitive nesting weighting works.
|
|
43
|
+
const tokenRe = /[A-Za-z_][A-Za-z0-9_]*|&&|\|\||[?{}]/g;
|
|
44
|
+
let m;
|
|
45
|
+
while ((m = tokenRe.exec(normalized)) !== null) {
|
|
46
|
+
const tok = m[0];
|
|
47
|
+
if (tok === '{') {
|
|
48
|
+
depth++;
|
|
49
|
+
continue;
|
|
50
|
+
}
|
|
51
|
+
if (tok === '}') {
|
|
52
|
+
depth = Math.max(0, depth - 1);
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
const isDecision = facts.decisionWords.includes(tok) || facts.decisionOps.includes(tok);
|
|
56
|
+
if (isDecision) {
|
|
57
|
+
cyclomatic++;
|
|
58
|
+
// SonarSource cognitive: +1 for the decision, +1 per nesting level.
|
|
59
|
+
// Binary boolean ops add 1 flat (no nesting bump). Keep BOOL_OPS in
|
|
60
|
+
// lockstep with quality_metrics_gate.py (_BOOL_OPS).
|
|
61
|
+
cognitive += BOOL_OPS.has(tok) ? 1 : 1 + Math.max(0, depth);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return { cyclomatic, cognitive };
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Function-header detection, tried in order per line. Deliberately simple:
|
|
68
|
+
* keyword forms first (including generators `function*`), then arrow
|
|
69
|
+
* functions assigned to consts (pervasive in modern TS — missing them dumps
|
|
70
|
+
* their bodies into the <module> score), then a method-style fallback that
|
|
71
|
+
* rejects control-flow keywords. Built from strings (not regex literals) so
|
|
72
|
+
* this module's own <module> score does not count the patterns' `?`s —
|
|
73
|
+
* string contents are stripped before scanning.
|
|
74
|
+
*/
|
|
75
|
+
const RE_FUNC_KW = new RegExp('\\b(?:export\\s+)?(?:default\\s+)?(?:async\\s+)?function\\s*\\*?\\s*([A-Za-z_$][\\w$]*)\\s*\\(');
|
|
76
|
+
const RE_NAMED_KW = new RegExp('\\b(?:def|fn|func|fun)\\s+([A-Za-z_]\\w*)\\s*\\(');
|
|
77
|
+
const RE_ARROW = new RegExp('^\\s*(?:export\\s+)?(?:const|let|var)\\s+([A-Za-z_$][\\w$]*)\\s*(?::\\s*[^=]+?)?=' +
|
|
78
|
+
'\\s*(?:async\\s+)?(?:\\([^)]*\\)|[A-Za-z_$][\\w$]*)\\s*=>\\s*\\{');
|
|
79
|
+
const RE_METHOD = new RegExp('^\\s*(?:(?:public|private|protected|static|final|abstract|override|readonly|async|inline|virtual' +
|
|
80
|
+
'|constexpr|pub|unsafe|extern|internal|sealed|partial|suspend|open|export|default|get|set)\\s+)*' +
|
|
81
|
+
'([A-Za-z_$][\\w$]*)\\s*\\([^;{}]*\\)\\s*(?::\\s*[^{;]+?)?\\s*\\{');
|
|
82
|
+
const CONTROL_WORDS = new Set([
|
|
83
|
+
'if', 'for', 'while', 'switch', 'catch', 'return', 'do', 'else', 'case',
|
|
84
|
+
'with', 'synchronized', 'lock', 'using', 'foreach', 'when', 'unless', 'until',
|
|
85
|
+
]);
|
|
86
|
+
/** Name of the function declared on this line, or null. */
|
|
87
|
+
export function functionHeader(line) {
|
|
88
|
+
let m = RE_FUNC_KW.exec(line) ?? RE_NAMED_KW.exec(line) ?? RE_ARROW.exec(line);
|
|
89
|
+
if (m)
|
|
90
|
+
return m[1];
|
|
91
|
+
m = RE_METHOD.exec(line);
|
|
92
|
+
if (m && !CONTROL_WORDS.has(m[1]))
|
|
93
|
+
return m[1];
|
|
94
|
+
return null;
|
|
95
|
+
}
|
|
96
|
+
function braceDelta(line) {
|
|
97
|
+
let n = 0;
|
|
98
|
+
for (let i = 0; i < line.length; i++) {
|
|
99
|
+
if (line[i] === '{')
|
|
100
|
+
n++;
|
|
101
|
+
else if (line[i] === '}')
|
|
102
|
+
n--;
|
|
103
|
+
}
|
|
104
|
+
return n;
|
|
105
|
+
}
|
|
106
|
+
function scoreRegion(seg, facts, name, line, initialDepth) {
|
|
107
|
+
const d = countDecisions(seg, facts, initialDepth);
|
|
108
|
+
return { name, line, cyclomatic: d.cyclomatic, cognitive: d.cognitive, nloc: countLoc(seg) };
|
|
109
|
+
}
|
|
110
|
+
/** Module-level decisions score as a pseudo-function, so module-level
|
|
111
|
+
* tangles are still gated (and stay in TS/Python signature parity). */
|
|
112
|
+
function moduleMetric(modLines, facts) {
|
|
113
|
+
const seg = modLines.join('\n');
|
|
114
|
+
const d = countDecisions(seg, facts);
|
|
115
|
+
if (d.cyclomatic <= 1)
|
|
116
|
+
return null;
|
|
117
|
+
return { name: '<module>', line: 1, cyclomatic: d.cyclomatic, cognitive: d.cognitive, nloc: countLoc(seg) };
|
|
118
|
+
}
|
|
119
|
+
/** Python-style: a region starts at `def name(` and ends at the first
|
|
120
|
+
* subsequent line whose indent <= the def's indent. */
|
|
121
|
+
function analyzeIndentRegions(lines, loc, facts) {
|
|
122
|
+
const functions = [];
|
|
123
|
+
const modBuf = [];
|
|
124
|
+
let open = null;
|
|
125
|
+
let buf = [];
|
|
126
|
+
const flush = () => {
|
|
127
|
+
if (!open)
|
|
128
|
+
return;
|
|
129
|
+
functions.push(scoreRegion(buf.join('\n'), facts, open.name, open.startLine, 0));
|
|
130
|
+
open = null;
|
|
131
|
+
buf = [];
|
|
132
|
+
};
|
|
133
|
+
for (let i = 0; i < lines.length; i++) {
|
|
134
|
+
const line = lines[i];
|
|
135
|
+
const dm = /^(\s*)(?:async\s+)?def\s+([A-Za-z_][\w]*)\s*\(/.exec(line);
|
|
136
|
+
if (dm) {
|
|
137
|
+
flush();
|
|
138
|
+
open = { name: dm[2], startLine: i + 1, indent: dm[1].length };
|
|
139
|
+
buf.push(line);
|
|
140
|
+
continue;
|
|
141
|
+
}
|
|
142
|
+
if (!open) {
|
|
143
|
+
modBuf.push(line);
|
|
144
|
+
continue;
|
|
145
|
+
}
|
|
146
|
+
const indent = /^(\s*)/.exec(line)?.[1].length ?? 0;
|
|
147
|
+
if (line.trim() && indent <= open.indent) {
|
|
148
|
+
flush();
|
|
149
|
+
modBuf.push(line); // the dedent line itself is module-level
|
|
150
|
+
continue;
|
|
151
|
+
}
|
|
152
|
+
buf.push(line);
|
|
153
|
+
}
|
|
154
|
+
flush();
|
|
155
|
+
const mod = moduleMetric(modBuf, facts);
|
|
156
|
+
if (mod)
|
|
157
|
+
functions.push(mod);
|
|
158
|
+
return { functions, loc };
|
|
159
|
+
}
|
|
160
|
+
/** Classify a detected header line: open a region for it, or score it
|
|
161
|
+
* in place (one-line functions) and stay at module level. */
|
|
162
|
+
function startBraceRegion(name, line, lineNo, depth, delta, facts, functions) {
|
|
163
|
+
if (delta > 0) {
|
|
164
|
+
return { region: { name, startLine: lineNo, startDepth: depth + delta, entered: true }, depth: depth + delta };
|
|
165
|
+
}
|
|
166
|
+
if (!line.includes('{')) {
|
|
167
|
+
// Multi-line signature — the opening brace is on a later line. Open the
|
|
168
|
+
// region now, anticipating the body one level above current depth (TS
|
|
169
|
+
// overload signatures collapse into their implementation; fine for a
|
|
170
|
+
// heuristic).
|
|
171
|
+
return { region: { name, startLine: lineNo, startDepth: depth + 1, entered: false }, depth };
|
|
172
|
+
}
|
|
173
|
+
// One-line function (`function f() { ... }` on one line): the brace
|
|
174
|
+
// balance never dips below startDepth, so without this branch the region
|
|
175
|
+
// stays open and swallows the REST OF THE FILE into this function's
|
|
176
|
+
// metrics. Score the header line alone.
|
|
177
|
+
functions.push(scoreRegion(line, facts, name, lineNo, 0));
|
|
178
|
+
return { region: null, depth: Math.max(0, depth + delta) };
|
|
179
|
+
}
|
|
180
|
+
/** Brace languages: find candidate headers, then brace-balance the region. */
|
|
181
|
+
function analyzeBraceRegions(lines, loc, facts) {
|
|
182
|
+
const functions = [];
|
|
183
|
+
const fileBuf = [];
|
|
184
|
+
let depth = 0;
|
|
185
|
+
let open = null;
|
|
186
|
+
let buf = [];
|
|
187
|
+
const closeRegion = () => {
|
|
188
|
+
if (!open)
|
|
189
|
+
return;
|
|
190
|
+
functions.push(scoreRegion(buf.join('\n'), facts, open.name, open.startLine, -1));
|
|
191
|
+
open = null;
|
|
192
|
+
buf = [];
|
|
193
|
+
};
|
|
194
|
+
for (let i = 0; i < lines.length; i++) {
|
|
195
|
+
const line = lines[i];
|
|
196
|
+
if (open) {
|
|
197
|
+
buf.push(line);
|
|
198
|
+
const d = braceDelta(line);
|
|
199
|
+
depth += d;
|
|
200
|
+
if (!open.entered) {
|
|
201
|
+
if (d > 0)
|
|
202
|
+
open.entered = true;
|
|
203
|
+
continue; // never close-check before the body opens
|
|
204
|
+
}
|
|
205
|
+
if (depth < open.startDepth)
|
|
206
|
+
closeRegion();
|
|
207
|
+
continue;
|
|
208
|
+
}
|
|
209
|
+
const name = functionHeader(line);
|
|
210
|
+
const delta = braceDelta(line);
|
|
211
|
+
if (!name) {
|
|
212
|
+
fileBuf.push(line);
|
|
213
|
+
depth = Math.max(0, depth + delta);
|
|
214
|
+
continue;
|
|
215
|
+
}
|
|
216
|
+
const started = startBraceRegion(name, line, i + 1, depth, delta, facts, functions);
|
|
217
|
+
if (started.region) {
|
|
218
|
+
open = started.region;
|
|
219
|
+
buf = [line];
|
|
220
|
+
}
|
|
221
|
+
depth = started.depth;
|
|
222
|
+
}
|
|
223
|
+
// Unbalanced braces — score what we saw rather than dropping it.
|
|
224
|
+
closeRegion();
|
|
225
|
+
const mod = moduleMetric(fileBuf, facts);
|
|
226
|
+
if (mod)
|
|
227
|
+
functions.push(mod);
|
|
228
|
+
return { functions, loc };
|
|
229
|
+
}
|
|
230
|
+
/** Split source into function-ish regions and score each. */
|
|
231
|
+
export function analyzeComplexity(content, facts) {
|
|
232
|
+
const stripped = stripNoise(content, facts.commentStyle);
|
|
233
|
+
const lines = stripped.split('\n');
|
|
234
|
+
const loc = countLoc(stripped);
|
|
235
|
+
return facts.indentBased
|
|
236
|
+
? analyzeIndentRegions(lines, loc, facts)
|
|
237
|
+
: analyzeBraceRegions(lines, loc, facts);
|
|
238
|
+
}
|
|
239
|
+
//# sourceMappingURL=complexity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"complexity.js","sourceRoot":"","sources":["../../src/quality/complexity.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
export interface QualityThresholds {
|
|
2
|
+
/** Max cyclomatic complexity per function. */
|
|
3
|
+
maxCyclomatic: number;
|
|
4
|
+
/** Max cognitive complexity per function. */
|
|
5
|
+
maxCognitive: number;
|
|
6
|
+
/** Max Halstead difficulty per function (requires rust-code-analysis). */
|
|
7
|
+
maxHalsteadDifficulty: number;
|
|
8
|
+
/** Max non-blank, non-comment lines per file. */
|
|
9
|
+
maxLocPerFile: number;
|
|
10
|
+
/** Min line-coverage percent per file (0-100). */
|
|
11
|
+
minCoveragePct: number;
|
|
12
|
+
/** Max CRAP score per function: cc^2 * (1-cov)^3 + cc. */
|
|
13
|
+
maxCrap: number;
|
|
14
|
+
/** Max surviving mutants (changed-files incremental run). */
|
|
15
|
+
maxSurvivingMutants: number;
|
|
16
|
+
/** Max duplicated-block findings (jscpd clones over the token floor). */
|
|
17
|
+
maxDuplicateBlocks: number;
|
|
18
|
+
/** Max dead-code findings (knip / vulture / compiler dead_code). */
|
|
19
|
+
maxDeadCode: number;
|
|
20
|
+
/** Max explicit any/unknown type usages (TS: any/unknown, Py: typing.Any). */
|
|
21
|
+
maxAnyTypes: number;
|
|
22
|
+
}
|
|
23
|
+
export interface QualityConfig {
|
|
24
|
+
version: 1;
|
|
25
|
+
thresholds: QualityThresholds;
|
|
26
|
+
/** Glob-ish directory prefixes to exclude from scanning. */
|
|
27
|
+
excludeDirs: string[];
|
|
28
|
+
/** File extensions considered source (others are ignored). */
|
|
29
|
+
sourceExts: string[];
|
|
30
|
+
}
|
|
31
|
+
export declare const DEFAULT_THRESHOLDS: QualityThresholds;
|
|
32
|
+
export declare const DEFAULT_SOURCE_EXTS: string[];
|
|
33
|
+
export declare const DEFAULT_EXCLUDE_DIRS: string[];
|
|
34
|
+
export declare function configPath(root: string): string;
|
|
35
|
+
export declare function defaultConfig(): QualityConfig;
|
|
36
|
+
/** Load the config, or null when the gate is inactive (no config file). */
|
|
37
|
+
export declare function loadQualityConfig(root: string): QualityConfig | null;
|
|
38
|
+
/** Write the default config (uap quality init). */
|
|
39
|
+
export declare function writeDefaultConfig(root: string): string;
|
|
40
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/quality/config.ts"],"names":[],"mappings":"AAgBA,MAAM,WAAW,iBAAiB;IAChC,8CAA8C;IAC9C,aAAa,EAAE,MAAM,CAAC;IACtB,6CAA6C;IAC7C,YAAY,EAAE,MAAM,CAAC;IACrB,0EAA0E;IAC1E,qBAAqB,EAAE,MAAM,CAAC;IAC9B,iDAAiD;IACjD,aAAa,EAAE,MAAM,CAAC;IACtB,kDAAkD;IAClD,cAAc,EAAE,MAAM,CAAC;IACvB,0DAA0D;IAC1D,OAAO,EAAE,MAAM,CAAC;IAChB,6DAA6D;IAC7D,mBAAmB,EAAE,MAAM,CAAC;IAC5B,yEAAyE;IACzE,kBAAkB,EAAE,MAAM,CAAC;IAC3B,oEAAoE;IACpE,WAAW,EAAE,MAAM,CAAC;IACpB,8EAA8E;IAC9E,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,CAAC,CAAC;IACX,UAAU,EAAE,iBAAiB,CAAC;IAC9B,4DAA4D;IAC5D,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,8DAA8D;IAC9D,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,eAAO,MAAM,kBAAkB,EAAE,iBAWhC,CAAC;AAEF,eAAO,MAAM,mBAAmB,UAI/B,CAAC;AAEF,eAAO,MAAM,oBAAoB,UAIhC,CAAC;AAEF,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED,wBAAgB,aAAa,IAAI,aAAa,CAO7C;AAED,2EAA2E;AAC3E,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAiBpE;AAED,mDAAmD;AACnD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAKvD"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Quality-metrics gate configuration.
|
|
3
|
+
*
|
|
4
|
+
* Lives at `.uap/quality-metrics.json` (committed, per project). The gate is
|
|
5
|
+
* INACTIVE (fails open) when the file is absent — quality policing is opt-in
|
|
6
|
+
* per project via `uap quality init`, exactly like the design-token gate is
|
|
7
|
+
* inactive without a DESIGN.md.
|
|
8
|
+
*
|
|
9
|
+
* Every threshold mirrors the policing targets:
|
|
10
|
+
* cyclomatic < 22 · cognitive < 22 · halstead difficulty < 80
|
|
11
|
+
* LOC/file < 500 · coverage 100% · CRAP < 25 · surviving mutants 0
|
|
12
|
+
* dead code 0 · redundant (duplicate) code 0 · explicit any/unknown 0
|
|
13
|
+
*/
|
|
14
|
+
import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';
|
|
15
|
+
import { join } from 'path';
|
|
16
|
+
export const DEFAULT_THRESHOLDS = {
|
|
17
|
+
maxCyclomatic: 22,
|
|
18
|
+
maxCognitive: 22,
|
|
19
|
+
maxHalsteadDifficulty: 80,
|
|
20
|
+
maxLocPerFile: 500,
|
|
21
|
+
minCoveragePct: 100,
|
|
22
|
+
maxCrap: 25,
|
|
23
|
+
maxSurvivingMutants: 0,
|
|
24
|
+
maxDuplicateBlocks: 0,
|
|
25
|
+
maxDeadCode: 0,
|
|
26
|
+
maxAnyTypes: 0,
|
|
27
|
+
};
|
|
28
|
+
export const DEFAULT_SOURCE_EXTS = [
|
|
29
|
+
'.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs',
|
|
30
|
+
'.py', '.java', '.cs', '.cpp', '.cc', '.cxx', '.c', '.h', '.hpp',
|
|
31
|
+
'.rs', '.go', '.rb', '.php', '.swift', '.kt', '.scala',
|
|
32
|
+
];
|
|
33
|
+
export const DEFAULT_EXCLUDE_DIRS = [
|
|
34
|
+
'node_modules', 'dist', 'build', 'out', 'target', 'coverage',
|
|
35
|
+
'.git', '.worktrees', 'vendor', '__pycache__', '.venv', 'venv',
|
|
36
|
+
'benchmarks', 'benchmark-results', 'third_party', 'generated',
|
|
37
|
+
];
|
|
38
|
+
export function configPath(root) {
|
|
39
|
+
return join(root, '.uap', 'quality-metrics.json');
|
|
40
|
+
}
|
|
41
|
+
export function defaultConfig() {
|
|
42
|
+
return {
|
|
43
|
+
version: 1,
|
|
44
|
+
thresholds: { ...DEFAULT_THRESHOLDS },
|
|
45
|
+
excludeDirs: [...DEFAULT_EXCLUDE_DIRS],
|
|
46
|
+
sourceExts: [...DEFAULT_SOURCE_EXTS],
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
/** Load the config, or null when the gate is inactive (no config file). */
|
|
50
|
+
export function loadQualityConfig(root) {
|
|
51
|
+
const p = configPath(root);
|
|
52
|
+
if (!existsSync(p))
|
|
53
|
+
return null;
|
|
54
|
+
try {
|
|
55
|
+
const raw = JSON.parse(readFileSync(p, 'utf-8'));
|
|
56
|
+
const d = defaultConfig();
|
|
57
|
+
return {
|
|
58
|
+
version: 1,
|
|
59
|
+
thresholds: { ...d.thresholds, ...(raw.thresholds ?? {}) },
|
|
60
|
+
excludeDirs: raw.excludeDirs ?? d.excludeDirs,
|
|
61
|
+
sourceExts: raw.sourceExts ?? d.sourceExts,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
// A corrupt config must not silently disable policing, but crashing the
|
|
66
|
+
// gate is worse — fail open and let `uap quality check` surface the error.
|
|
67
|
+
return null;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
/** Write the default config (uap quality init). */
|
|
71
|
+
export function writeDefaultConfig(root) {
|
|
72
|
+
const p = configPath(root);
|
|
73
|
+
mkdirSync(join(root, '.uap'), { recursive: true });
|
|
74
|
+
writeFileSync(p, JSON.stringify(defaultConfig(), null, 2) + '\n');
|
|
75
|
+
return p;
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/quality/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export declare function crapScore(cyclomatic: number, coverageFraction: number): number;
|
|
2
|
+
/**
|
|
3
|
+
* Parse per-file line-coverage fractions from a vitest/istanbul
|
|
4
|
+
* coverage-summary.json (`<root>/coverage/coverage-summary.json`).
|
|
5
|
+
* Returns null when absent — coverage metrics are then skipped (fail-open
|
|
6
|
+
* with a logged warning), matching the missing-tool policy.
|
|
7
|
+
*/
|
|
8
|
+
export declare function loadCoverageSummary(root: string): Map<string, number> | null;
|
|
9
|
+
/** Resolve the coverage fraction for a scanned file, tolerating path shape. */
|
|
10
|
+
export declare function coverageFor(coverage: Map<string, number>, root: string, file: string): number | null;
|
|
11
|
+
//# sourceMappingURL=crap.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crap.d.ts","sourceRoot":"","sources":["../../src/quality/crap.ts"],"names":[],"mappings":"AAaA,wBAAgB,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,GAAG,MAAM,CAG9E;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAkB5E;AAED,+EAA+E;AAC/E,wBAAgB,WAAW,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CASpG"}
|