@neurcode-ai/cli 0.9.64 → 0.9.66
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/LICENSE +201 -0
- package/dist/commands/bootstrap-policy.d.ts +29 -0
- package/dist/commands/bootstrap-policy.d.ts.map +1 -0
- package/dist/commands/bootstrap-policy.js +334 -0
- package/dist/commands/bootstrap-policy.js.map +1 -0
- package/dist/commands/brain.d.ts.map +1 -1
- package/dist/commands/brain.js +273 -0
- package/dist/commands/brain.js.map +1 -1
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +82 -0
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/pilot-report.d.ts +9 -0
- package/dist/commands/pilot-report.d.ts.map +1 -0
- package/dist/commands/pilot-report.js +176 -0
- package/dist/commands/pilot-report.js.map +1 -0
- package/dist/commands/quickstart.d.ts +21 -0
- package/dist/commands/quickstart.d.ts.map +1 -0
- package/dist/commands/quickstart.js +178 -0
- package/dist/commands/quickstart.js.map +1 -0
- package/dist/commands/remediate-export.d.ts +31 -0
- package/dist/commands/remediate-export.d.ts.map +1 -0
- package/dist/commands/remediate-export.js +283 -0
- package/dist/commands/remediate-export.js.map +1 -0
- package/dist/commands/remediate-governance.d.ts +54 -0
- package/dist/commands/remediate-governance.d.ts.map +1 -0
- package/dist/commands/remediate-governance.js +375 -0
- package/dist/commands/remediate-governance.js.map +1 -0
- package/dist/commands/remediate.d.ts.map +1 -1
- package/dist/commands/remediate.js.map +1 -1
- package/dist/commands/replay.d.ts.map +1 -1
- package/dist/commands/replay.js +30 -0
- package/dist/commands/replay.js.map +1 -1
- package/dist/commands/verify.d.ts.map +1 -1
- package/dist/commands/verify.js +409 -30
- package/dist/commands/verify.js.map +1 -1
- package/dist/daemon/server.d.ts.map +1 -1
- package/dist/daemon/server.js +1078 -0
- package/dist/daemon/server.js.map +1 -1
- package/dist/explainability/DeterminismClassifier.d.ts +34 -0
- package/dist/explainability/DeterminismClassifier.d.ts.map +1 -0
- package/dist/explainability/DeterminismClassifier.js +104 -0
- package/dist/explainability/DeterminismClassifier.js.map +1 -0
- package/dist/explainability/ViolationFormatter.d.ts +32 -0
- package/dist/explainability/ViolationFormatter.d.ts.map +1 -0
- package/dist/explainability/ViolationFormatter.js +252 -0
- package/dist/explainability/ViolationFormatter.js.map +1 -0
- package/dist/explainability/index.d.ts +15 -0
- package/dist/explainability/index.d.ts.map +1 -0
- package/dist/explainability/index.js +94 -0
- package/dist/explainability/index.js.map +1 -0
- package/dist/explainability/types.d.ts +37 -0
- package/dist/explainability/types.d.ts.map +1 -0
- package/dist/explainability/types.js +3 -0
- package/dist/explainability/types.js.map +1 -0
- package/dist/governance/canonical-invariants.d.ts +88 -0
- package/dist/governance/canonical-invariants.d.ts.map +1 -0
- package/dist/governance/canonical-invariants.js +197 -0
- package/dist/governance/canonical-invariants.js.map +1 -0
- package/dist/governance/canonical-ordering.d.ts +76 -0
- package/dist/governance/canonical-ordering.d.ts.map +1 -0
- package/dist/governance/canonical-ordering.js +189 -0
- package/dist/governance/canonical-ordering.js.map +1 -0
- package/dist/governance/canonical-pipeline.d.ts +45 -0
- package/dist/governance/canonical-pipeline.d.ts.map +1 -0
- package/dist/governance/canonical-pipeline.js +616 -0
- package/dist/governance/canonical-pipeline.js.map +1 -0
- package/dist/governance/diff-line-provenance.d.ts +59 -0
- package/dist/governance/diff-line-provenance.d.ts.map +1 -0
- package/dist/governance/diff-line-provenance.js +118 -0
- package/dist/governance/diff-line-provenance.js.map +1 -0
- package/dist/governance/pilot-readiness.d.ts +34 -0
- package/dist/governance/pilot-readiness.d.ts.map +1 -0
- package/dist/governance/pilot-readiness.js +226 -0
- package/dist/governance/pilot-readiness.js.map +1 -0
- package/dist/governance/policy-parity-validator.d.ts +62 -0
- package/dist/governance/policy-parity-validator.d.ts.map +1 -0
- package/dist/governance/policy-parity-validator.js +137 -0
- package/dist/governance/policy-parity-validator.js.map +1 -0
- package/dist/governance/remediation-boundary.d.ts +55 -0
- package/dist/governance/remediation-boundary.d.ts.map +1 -0
- package/dist/governance/remediation-boundary.js +120 -0
- package/dist/governance/remediation-boundary.js.map +1 -0
- package/dist/governance/structural-cache.d.ts +103 -0
- package/dist/governance/structural-cache.d.ts.map +1 -0
- package/dist/governance/structural-cache.js +240 -0
- package/dist/governance/structural-cache.js.map +1 -0
- package/dist/governance/structural-on-diff.d.ts +33 -0
- package/dist/governance/structural-on-diff.d.ts.map +1 -0
- package/dist/governance/structural-on-diff.js +67 -0
- package/dist/governance/structural-on-diff.js.map +1 -0
- package/dist/governance/structural-policy-merge.d.ts +22 -0
- package/dist/governance/structural-policy-merge.d.ts.map +1 -0
- package/dist/governance/structural-policy-merge.js +32 -0
- package/dist/governance/structural-policy-merge.js.map +1 -0
- package/dist/governance/verify-runtime-guard.d.ts +99 -0
- package/dist/governance/verify-runtime-guard.d.ts.map +1 -0
- package/dist/governance/verify-runtime-guard.js +129 -0
- package/dist/governance/verify-runtime-guard.js.map +1 -0
- package/dist/index.js +107 -0
- package/dist/index.js.map +1 -1
- package/dist/integrations/review-compression/index.d.ts +50 -0
- package/dist/integrations/review-compression/index.d.ts.map +1 -0
- package/dist/integrations/review-compression/index.js +158 -0
- package/dist/integrations/review-compression/index.js.map +1 -0
- package/dist/intent-engine/domain-taxonomy.d.ts +42 -0
- package/dist/intent-engine/domain-taxonomy.d.ts.map +1 -0
- package/dist/intent-engine/domain-taxonomy.js +534 -0
- package/dist/intent-engine/domain-taxonomy.js.map +1 -0
- package/dist/intent-engine/index.d.ts +1 -0
- package/dist/intent-engine/index.d.ts.map +1 -1
- package/dist/intent-engine/index.js +6 -1
- package/dist/intent-engine/index.js.map +1 -1
- package/dist/intent-engine/parser.d.ts.map +1 -1
- package/dist/intent-engine/parser.js +47 -0
- package/dist/intent-engine/parser.js.map +1 -1
- package/dist/intent-engine/repo-classifier.d.ts +64 -0
- package/dist/intent-engine/repo-classifier.d.ts.map +1 -0
- package/dist/intent-engine/repo-classifier.js +178 -0
- package/dist/intent-engine/repo-classifier.js.map +1 -0
- package/dist/intent-engine/semantic-expander.d.ts +104 -0
- package/dist/intent-engine/semantic-expander.d.ts.map +1 -0
- package/dist/intent-engine/semantic-expander.js +480 -0
- package/dist/intent-engine/semantic-expander.js.map +1 -0
- package/dist/patch-engine/patterns.d.ts.map +1 -1
- package/dist/patch-engine/patterns.js +8 -4
- package/dist/patch-engine/patterns.js.map +1 -1
- package/dist/semantic/index.d.ts +14 -0
- package/dist/semantic/index.d.ts.map +1 -0
- package/dist/semantic/index.js +30 -0
- package/dist/semantic/index.js.map +1 -0
- package/dist/semantic/tfidf-engine.d.ts +81 -0
- package/dist/semantic/tfidf-engine.d.ts.map +1 -0
- package/dist/semantic/tfidf-engine.js +278 -0
- package/dist/semantic/tfidf-engine.js.map +1 -0
- package/dist/semantic/vector-store.d.ts +108 -0
- package/dist/semantic/vector-store.d.ts.map +1 -0
- package/dist/semantic/vector-store.js +321 -0
- package/dist/semantic/vector-store.js.map +1 -0
- package/dist/structural-rules/context-severity.d.ts +46 -0
- package/dist/structural-rules/context-severity.d.ts.map +1 -0
- package/dist/structural-rules/context-severity.js +115 -0
- package/dist/structural-rules/context-severity.js.map +1 -0
- package/dist/structural-rules/distributed/DS001-saga-rollback-absence.d.ts +11 -0
- package/dist/structural-rules/distributed/DS001-saga-rollback-absence.d.ts.map +1 -0
- package/dist/structural-rules/distributed/DS001-saga-rollback-absence.js +212 -0
- package/dist/structural-rules/distributed/DS001-saga-rollback-absence.js.map +1 -0
- package/dist/structural-rules/distributed/DS002-missing-correlation-id.d.ts +11 -0
- package/dist/structural-rules/distributed/DS002-missing-correlation-id.d.ts.map +1 -0
- package/dist/structural-rules/distributed/DS002-missing-correlation-id.js +213 -0
- package/dist/structural-rules/distributed/DS002-missing-correlation-id.js.map +1 -0
- package/dist/structural-rules/distributed/index.d.ts +3 -0
- package/dist/structural-rules/distributed/index.d.ts.map +1 -0
- package/dist/structural-rules/distributed/index.js +8 -0
- package/dist/structural-rules/distributed/index.js.map +1 -0
- package/dist/structural-rules/engine.d.ts +25 -0
- package/dist/structural-rules/engine.d.ts.map +1 -0
- package/dist/structural-rules/engine.js +90 -0
- package/dist/structural-rules/engine.js.map +1 -0
- package/dist/structural-rules/index.d.ts +45 -0
- package/dist/structural-rules/index.d.ts.map +1 -0
- package/dist/structural-rules/index.js +158 -0
- package/dist/structural-rules/index.js.map +1 -0
- package/dist/structural-rules/python/PY001-asyncio-task-without-cancel.d.ts +11 -0
- package/dist/structural-rules/python/PY001-asyncio-task-without-cancel.d.ts.map +1 -0
- package/dist/structural-rules/python/PY001-asyncio-task-without-cancel.js +66 -0
- package/dist/structural-rules/python/PY001-asyncio-task-without-cancel.js.map +1 -0
- package/dist/structural-rules/python/PY002-unbounded-dict-singleton.d.ts +11 -0
- package/dist/structural-rules/python/PY002-unbounded-dict-singleton.d.ts.map +1 -0
- package/dist/structural-rules/python/PY002-unbounded-dict-singleton.js +135 -0
- package/dist/structural-rules/python/PY002-unbounded-dict-singleton.js.map +1 -0
- package/dist/structural-rules/python/PY003-broad-except-clause.d.ts +32 -0
- package/dist/structural-rules/python/PY003-broad-except-clause.d.ts.map +1 -0
- package/dist/structural-rules/python/PY003-broad-except-clause.js +277 -0
- package/dist/structural-rules/python/PY003-broad-except-clause.js.map +1 -0
- package/dist/structural-rules/python/PY004-swallowed-async-exception.d.ts +11 -0
- package/dist/structural-rules/python/PY004-swallowed-async-exception.d.ts.map +1 -0
- package/dist/structural-rules/python/PY004-swallowed-async-exception.js +167 -0
- package/dist/structural-rules/python/PY004-swallowed-async-exception.js.map +1 -0
- package/dist/structural-rules/python/PY005-fastapi-without-pydantic.d.ts +11 -0
- package/dist/structural-rules/python/PY005-fastapi-without-pydantic.d.ts.map +1 -0
- package/dist/structural-rules/python/PY005-fastapi-without-pydantic.js +154 -0
- package/dist/structural-rules/python/PY005-fastapi-without-pydantic.js.map +1 -0
- package/dist/structural-rules/python/PY006-blocking-io-in-async.d.ts +11 -0
- package/dist/structural-rules/python/PY006-blocking-io-in-async.d.ts.map +1 -0
- package/dist/structural-rules/python/PY006-blocking-io-in-async.js +130 -0
- package/dist/structural-rules/python/PY006-blocking-io-in-async.js.map +1 -0
- package/dist/structural-rules/python/PY007-sqlalchemy-session-leak.d.ts +11 -0
- package/dist/structural-rules/python/PY007-sqlalchemy-session-leak.d.ts.map +1 -0
- package/dist/structural-rules/python/PY007-sqlalchemy-session-leak.js +93 -0
- package/dist/structural-rules/python/PY007-sqlalchemy-session-leak.js.map +1 -0
- package/dist/structural-rules/python/PY008-celery-task-without-retry.d.ts +11 -0
- package/dist/structural-rules/python/PY008-celery-task-without-retry.d.ts.map +1 -0
- package/dist/structural-rules/python/PY008-celery-task-without-retry.js +154 -0
- package/dist/structural-rules/python/PY008-celery-task-without-retry.js.map +1 -0
- package/dist/structural-rules/python/PY009-unsafe-pickle-deserialization.d.ts +11 -0
- package/dist/structural-rules/python/PY009-unsafe-pickle-deserialization.d.ts.map +1 -0
- package/dist/structural-rules/python/PY009-unsafe-pickle-deserialization.js +133 -0
- package/dist/structural-rules/python/PY009-unsafe-pickle-deserialization.js.map +1 -0
- package/dist/structural-rules/python/PY010-leaked-aiohttp-session.d.ts +11 -0
- package/dist/structural-rules/python/PY010-leaked-aiohttp-session.d.ts.map +1 -0
- package/dist/structural-rules/python/PY010-leaked-aiohttp-session.js +80 -0
- package/dist/structural-rules/python/PY010-leaked-aiohttp-session.js.map +1 -0
- package/dist/structural-rules/python/PY011-thread-lifecycle.d.ts +11 -0
- package/dist/structural-rules/python/PY011-thread-lifecycle.d.ts.map +1 -0
- package/dist/structural-rules/python/PY011-thread-lifecycle.js +97 -0
- package/dist/structural-rules/python/PY011-thread-lifecycle.js.map +1 -0
- package/dist/structural-rules/python/PY012-asyncio-run-misuse.d.ts +11 -0
- package/dist/structural-rules/python/PY012-asyncio-run-misuse.d.ts.map +1 -0
- package/dist/structural-rules/python/PY012-asyncio-run-misuse.js +83 -0
- package/dist/structural-rules/python/PY012-asyncio-run-misuse.js.map +1 -0
- package/dist/structural-rules/python/PY013-mutable-default-arg.d.ts +11 -0
- package/dist/structural-rules/python/PY013-mutable-default-arg.d.ts.map +1 -0
- package/dist/structural-rules/python/PY013-mutable-default-arg.js +73 -0
- package/dist/structural-rules/python/PY013-mutable-default-arg.js.map +1 -0
- package/dist/structural-rules/python/PY014-fixed-sleep-retry.d.ts +11 -0
- package/dist/structural-rules/python/PY014-fixed-sleep-retry.d.ts.map +1 -0
- package/dist/structural-rules/python/PY014-fixed-sleep-retry.js +115 -0
- package/dist/structural-rules/python/PY014-fixed-sleep-retry.js.map +1 -0
- package/dist/structural-rules/rules/SR001-swallowed-async-rejection.d.ts +11 -0
- package/dist/structural-rules/rules/SR001-swallowed-async-rejection.d.ts.map +1 -0
- package/dist/structural-rules/rules/SR001-swallowed-async-rejection.js +145 -0
- package/dist/structural-rules/rules/SR001-swallowed-async-rejection.js.map +1 -0
- package/dist/structural-rules/rules/SR002-unbounded-collection.d.ts +11 -0
- package/dist/structural-rules/rules/SR002-unbounded-collection.d.ts.map +1 -0
- package/dist/structural-rules/rules/SR002-unbounded-collection.js +196 -0
- package/dist/structural-rules/rules/SR002-unbounded-collection.js.map +1 -0
- package/dist/structural-rules/rules/SR003-timer-without-cleanup.d.ts +11 -0
- package/dist/structural-rules/rules/SR003-timer-without-cleanup.d.ts.map +1 -0
- package/dist/structural-rules/rules/SR003-timer-without-cleanup.js +148 -0
- package/dist/structural-rules/rules/SR003-timer-without-cleanup.js.map +1 -0
- package/dist/structural-rules/rules/SR004-request-boundary-no-validation.d.ts +11 -0
- package/dist/structural-rules/rules/SR004-request-boundary-no-validation.d.ts.map +1 -0
- package/dist/structural-rules/rules/SR004-request-boundary-no-validation.js +162 -0
- package/dist/structural-rules/rules/SR004-request-boundary-no-validation.js.map +1 -0
- package/dist/structural-rules/rules/SR005-halfopen-probe-gate.d.ts +11 -0
- package/dist/structural-rules/rules/SR005-halfopen-probe-gate.d.ts.map +1 -0
- package/dist/structural-rules/rules/SR005-halfopen-probe-gate.js +150 -0
- package/dist/structural-rules/rules/SR005-halfopen-probe-gate.js.map +1 -0
- package/dist/structural-rules/rules/SR006-fanout-error-sanitization.d.ts +11 -0
- package/dist/structural-rules/rules/SR006-fanout-error-sanitization.d.ts.map +1 -0
- package/dist/structural-rules/rules/SR006-fanout-error-sanitization.js +161 -0
- package/dist/structural-rules/rules/SR006-fanout-error-sanitization.js.map +1 -0
- package/dist/structural-rules/rules/SR007-cross-request-error.d.ts +11 -0
- package/dist/structural-rules/rules/SR007-cross-request-error.d.ts.map +1 -0
- package/dist/structural-rules/rules/SR007-cross-request-error.js +175 -0
- package/dist/structural-rules/rules/SR007-cross-request-error.js.map +1 -0
- package/dist/structural-rules/rules/SR008-background-task-orphan.d.ts +11 -0
- package/dist/structural-rules/rules/SR008-background-task-orphan.d.ts.map +1 -0
- package/dist/structural-rules/rules/SR008-background-task-orphan.js +176 -0
- package/dist/structural-rules/rules/SR008-background-task-orphan.js.map +1 -0
- package/dist/structural-rules/rules/SR009-missing-retry-backoff.d.ts +11 -0
- package/dist/structural-rules/rules/SR009-missing-retry-backoff.d.ts.map +1 -0
- package/dist/structural-rules/rules/SR009-missing-retry-backoff.js +168 -0
- package/dist/structural-rules/rules/SR009-missing-retry-backoff.js.map +1 -0
- package/dist/structural-rules/rules/SR010-retry-storm.d.ts +11 -0
- package/dist/structural-rules/rules/SR010-retry-storm.d.ts.map +1 -0
- package/dist/structural-rules/rules/SR010-retry-storm.js +181 -0
- package/dist/structural-rules/rules/SR010-retry-storm.js.map +1 -0
- package/dist/structural-rules/rules/SR011-event-listener-leak.d.ts +11 -0
- package/dist/structural-rules/rules/SR011-event-listener-leak.d.ts.map +1 -0
- package/dist/structural-rules/rules/SR011-event-listener-leak.js +208 -0
- package/dist/structural-rules/rules/SR011-event-listener-leak.js.map +1 -0
- package/dist/structural-rules/rules/SR012-promise-race-leak.d.ts +11 -0
- package/dist/structural-rules/rules/SR012-promise-race-leak.d.ts.map +1 -0
- package/dist/structural-rules/rules/SR012-promise-race-leak.js +191 -0
- package/dist/structural-rules/rules/SR012-promise-race-leak.js.map +1 -0
- package/dist/structural-rules/rules/SR013-missing-idempotency-key.d.ts +11 -0
- package/dist/structural-rules/rules/SR013-missing-idempotency-key.d.ts.map +1 -0
- package/dist/structural-rules/rules/SR013-missing-idempotency-key.js +219 -0
- package/dist/structural-rules/rules/SR013-missing-idempotency-key.js.map +1 -0
- package/dist/structural-rules/rules/SR014-mutable-closure-async.d.ts +11 -0
- package/dist/structural-rules/rules/SR014-mutable-closure-async.d.ts.map +1 -0
- package/dist/structural-rules/rules/SR014-mutable-closure-async.js +208 -0
- package/dist/structural-rules/rules/SR014-mutable-closure-async.js.map +1 -0
- package/dist/structural-rules/rules/SR015-dangling-abort-controller.d.ts +11 -0
- package/dist/structural-rules/rules/SR015-dangling-abort-controller.d.ts.map +1 -0
- package/dist/structural-rules/rules/SR015-dangling-abort-controller.js +190 -0
- package/dist/structural-rules/rules/SR015-dangling-abort-controller.js.map +1 -0
- package/dist/structural-rules/rules/SR016-unsafe-json-parse.d.ts +11 -0
- package/dist/structural-rules/rules/SR016-unsafe-json-parse.d.ts.map +1 -0
- package/dist/structural-rules/rules/SR016-unsafe-json-parse.js +187 -0
- package/dist/structural-rules/rules/SR016-unsafe-json-parse.js.map +1 -0
- package/dist/structural-rules/suppressions.d.ts +43 -0
- package/dist/structural-rules/suppressions.d.ts.map +1 -0
- package/dist/structural-rules/suppressions.js +115 -0
- package/dist/structural-rules/suppressions.js.map +1 -0
- package/dist/structural-rules/types.d.ts +55 -0
- package/dist/structural-rules/types.d.ts.map +1 -0
- package/dist/structural-rules/types.js +3 -0
- package/dist/structural-rules/types.js.map +1 -0
- package/dist/utils/brain-cache.d.ts +100 -0
- package/dist/utils/brain-cache.d.ts.map +1 -0
- package/dist/utils/brain-cache.js +346 -0
- package/dist/utils/brain-cache.js.map +1 -0
- package/dist/utils/governance-provenance.d.ts +95 -0
- package/dist/utils/governance-provenance.d.ts.map +1 -0
- package/dist/utils/governance-provenance.js +187 -0
- package/dist/utils/governance-provenance.js.map +1 -0
- package/dist/utils/pilot-metrics.d.ts +46 -0
- package/dist/utils/pilot-metrics.d.ts.map +1 -0
- package/dist/utils/pilot-metrics.js +240 -0
- package/dist/utils/pilot-metrics.js.map +1 -0
- package/dist/utils/replay-runtime.d.ts +34 -0
- package/dist/utils/replay-runtime.d.ts.map +1 -1
- package/dist/utils/replay-runtime.js +207 -0
- package/dist/utils/replay-runtime.js.map +1 -1
- package/dist/utils/verify-runtime-stability.d.ts +142 -0
- package/dist/utils/verify-runtime-stability.d.ts.map +1 -0
- package/dist/utils/verify-runtime-stability.js +230 -0
- package/dist/utils/verify-runtime-stability.js.map +1 -0
- package/dist/workspace/cross-repo-graph.d.ts +111 -0
- package/dist/workspace/cross-repo-graph.d.ts.map +1 -0
- package/dist/workspace/cross-repo-graph.js +450 -0
- package/dist/workspace/cross-repo-graph.js.map +1 -0
- package/dist/workspace/federated-context.d.ts +144 -0
- package/dist/workspace/federated-context.d.ts.map +1 -0
- package/dist/workspace/federated-context.js +347 -0
- package/dist/workspace/federated-context.js.map +1 -0
- package/dist/workspace/index.d.ts +38 -0
- package/dist/workspace/index.d.ts.map +1 -0
- package/dist/workspace/index.js +48 -0
- package/dist/workspace/index.js.map +1 -0
- package/package.json +9 -9
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { ExplainedViolation, ViolationReport } from './types';
|
|
2
|
+
export declare class ViolationFormatter {
|
|
3
|
+
/**
|
|
4
|
+
* Format a single violation into a concise, actionable terminal string.
|
|
5
|
+
*
|
|
6
|
+
* Example:
|
|
7
|
+
* ┌─ SR001 · BLOCKING · deterministic-structural (confidence: 97%)
|
|
8
|
+
* │ File: packages/server/src/middleware/requestCoalescer.ts:43
|
|
9
|
+
* │ Pattern: .catch() callback contains no throw/reject path
|
|
10
|
+
* │ Code: .catch((err) => { this.pending.delete(key); console.error(err); })
|
|
11
|
+
* │ Risk: All coalesced waiters receive undefined instead of rejection
|
|
12
|
+
* │ Fix: Add `throw err;` before the closing brace of the .catch callback
|
|
13
|
+
* └─────────────────────────────────────────────────────────────────────────────
|
|
14
|
+
*/
|
|
15
|
+
formatSingle(v: ExplainedViolation): string;
|
|
16
|
+
/**
|
|
17
|
+
* Format a ViolationReport into a full terminal report.
|
|
18
|
+
* Sections: Summary header, Blocking violations (grouped by file),
|
|
19
|
+
* Advisory violations (grouped by file), Determinism breakdown.
|
|
20
|
+
*/
|
|
21
|
+
formatReport(report: ViolationReport): string;
|
|
22
|
+
/**
|
|
23
|
+
* Format as GitHub PR comment markdown.
|
|
24
|
+
* Uses GitHub markdown: collapsible sections, code blocks, tables.
|
|
25
|
+
*/
|
|
26
|
+
formatGitHubPRComment(report: ViolationReport, planId?: string): string;
|
|
27
|
+
/**
|
|
28
|
+
* Format as compact JSON for CI/CD pipeline consumption.
|
|
29
|
+
*/
|
|
30
|
+
formatJSON(report: ViolationReport): string;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=ViolationFormatter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ViolationFormatter.d.ts","sourceRoot":"","sources":["../../src/explainability/ViolationFormatter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,eAAe,EAAoB,MAAM,SAAS,CAAC;AAkBrF,qBAAa,kBAAkB;IAC7B;;;;;;;;;;;OAWG;IACH,YAAY,CAAC,CAAC,EAAE,kBAAkB,GAAG,MAAM;IA8B3C;;;;OAIG;IACH,YAAY,CAAC,MAAM,EAAE,eAAe,GAAG,MAAM;IAsF7C;;;OAGG;IACH,qBAAqB,CAAC,MAAM,EAAE,eAAe,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM;IAiIvE;;OAEG;IACH,UAAU,CAAC,MAAM,EAAE,eAAe,GAAG,MAAM;CAG5C"}
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ViolationFormatter = void 0;
|
|
4
|
+
const DeterminismClassifier_1 = require("./DeterminismClassifier");
|
|
5
|
+
// ── Terminal box-drawing helpers ──────────────────────────────────────────────
|
|
6
|
+
const HR = '─'.repeat(77);
|
|
7
|
+
function pad(s, width) {
|
|
8
|
+
return s.length >= width ? s : s + ' '.repeat(width - s.length);
|
|
9
|
+
}
|
|
10
|
+
function truncate(s, maxLen) {
|
|
11
|
+
if (s.length <= maxLen)
|
|
12
|
+
return s;
|
|
13
|
+
return s.slice(0, maxLen - 3) + '...';
|
|
14
|
+
}
|
|
15
|
+
// ── ViolationFormatter ────────────────────────────────────────────────────────
|
|
16
|
+
class ViolationFormatter {
|
|
17
|
+
/**
|
|
18
|
+
* Format a single violation into a concise, actionable terminal string.
|
|
19
|
+
*
|
|
20
|
+
* Example:
|
|
21
|
+
* ┌─ SR001 · BLOCKING · deterministic-structural (confidence: 97%)
|
|
22
|
+
* │ File: packages/server/src/middleware/requestCoalescer.ts:43
|
|
23
|
+
* │ Pattern: .catch() callback contains no throw/reject path
|
|
24
|
+
* │ Code: .catch((err) => { this.pending.delete(key); console.error(err); })
|
|
25
|
+
* │ Risk: All coalesced waiters receive undefined instead of rejection
|
|
26
|
+
* │ Fix: Add `throw err;` before the closing brace of the .catch callback
|
|
27
|
+
* └─────────────────────────────────────────────────────────────────────────────
|
|
28
|
+
*/
|
|
29
|
+
formatSingle(v) {
|
|
30
|
+
const pct = Math.round(v.confidence * 100);
|
|
31
|
+
const icon = DeterminismClassifier_1.DeterminismClassifier.icon(v.determinism);
|
|
32
|
+
const lines = [];
|
|
33
|
+
lines.push(`┌─ ${v.ruleId} · ${v.severity} · ${v.determinism} (confidence: ${pct}%)`);
|
|
34
|
+
lines.push(`│ File: ${v.filePath}:${v.line}`);
|
|
35
|
+
lines.push(`│ Pattern: ${truncate(v.evidence.matchReason, 72)}`);
|
|
36
|
+
const snippet = v.evidence.codeSnippet.replace(/\n/g, ' ').trim();
|
|
37
|
+
lines.push(`│ Code: ${truncate(snippet, 72)}`);
|
|
38
|
+
lines.push(`│ Risk: ${truncate(v.operationalRisk, 72)}`);
|
|
39
|
+
lines.push(`│ Fix: ${truncate(v.remediation, 72)}`);
|
|
40
|
+
if (v.remediationCode) {
|
|
41
|
+
const codeLines = v.remediationCode.split('\n');
|
|
42
|
+
lines.push(`│ Suggested code:`);
|
|
43
|
+
for (const cl of codeLines) {
|
|
44
|
+
lines.push(`│ ${cl}`);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
lines.push(`│ Trust: ${icon} ${DeterminismClassifier_1.DeterminismClassifier.label(v.determinism)}`);
|
|
48
|
+
lines.push(`└${HR}`);
|
|
49
|
+
return lines.join('\n');
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Format a ViolationReport into a full terminal report.
|
|
53
|
+
* Sections: Summary header, Blocking violations (grouped by file),
|
|
54
|
+
* Advisory violations (grouped by file), Determinism breakdown.
|
|
55
|
+
*/
|
|
56
|
+
formatReport(report) {
|
|
57
|
+
const lines = [];
|
|
58
|
+
const ts = report.generatedAt;
|
|
59
|
+
lines.push('');
|
|
60
|
+
lines.push('╔══════════════════════════════════════════════════════════════════════════╗');
|
|
61
|
+
lines.push('║ NEURCODE GOVERNANCE REPORT ║');
|
|
62
|
+
lines.push('╚══════════════════════════════════════════════════════════════════════════╝');
|
|
63
|
+
lines.push(` Generated: ${ts}`);
|
|
64
|
+
lines.push(` Repo: ${report.repoRoot}`);
|
|
65
|
+
lines.push('');
|
|
66
|
+
// Summary
|
|
67
|
+
const blockingCount = report.blocking.length;
|
|
68
|
+
const advisoryCount = report.advisory.length;
|
|
69
|
+
const status = blockingCount === 0 ? 'PASS' : 'FAIL';
|
|
70
|
+
lines.push(` Status: ${status}`);
|
|
71
|
+
lines.push(` Blocking: ${blockingCount}`);
|
|
72
|
+
lines.push(` Advisory: ${advisoryCount}`);
|
|
73
|
+
lines.push(` Total: ${report.totalViolations}`);
|
|
74
|
+
lines.push(` Deterministic findings: ${report.deterministicCount}`);
|
|
75
|
+
lines.push(` Heuristic findings: ${report.heuristicCount}`);
|
|
76
|
+
lines.push(` False-positive risk: ${report.falsePositiveRisk}`);
|
|
77
|
+
lines.push('');
|
|
78
|
+
// Blocking violations grouped by file
|
|
79
|
+
if (blockingCount > 0) {
|
|
80
|
+
lines.push('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
|
|
81
|
+
lines.push(' BLOCKING VIOLATIONS');
|
|
82
|
+
lines.push('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
|
|
83
|
+
lines.push('');
|
|
84
|
+
for (const [filePath, violations] of Object.entries(report.byFile)) {
|
|
85
|
+
const blockingInFile = violations.filter(v => v.severity === 'BLOCKING');
|
|
86
|
+
if (blockingInFile.length === 0)
|
|
87
|
+
continue;
|
|
88
|
+
lines.push(` ${filePath}`);
|
|
89
|
+
for (const v of blockingInFile) {
|
|
90
|
+
lines.push(this.formatSingle(v).split('\n').map(l => ' ' + l).join('\n'));
|
|
91
|
+
}
|
|
92
|
+
lines.push('');
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
// Advisory violations grouped by file
|
|
96
|
+
if (advisoryCount > 0) {
|
|
97
|
+
lines.push('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
|
|
98
|
+
lines.push(' ADVISORY VIOLATIONS');
|
|
99
|
+
lines.push('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
|
|
100
|
+
lines.push('');
|
|
101
|
+
for (const [filePath, violations] of Object.entries(report.byFile)) {
|
|
102
|
+
const advisoryInFile = violations.filter(v => v.severity === 'ADVISORY');
|
|
103
|
+
if (advisoryInFile.length === 0)
|
|
104
|
+
continue;
|
|
105
|
+
lines.push(` ${filePath}`);
|
|
106
|
+
for (const v of advisoryInFile) {
|
|
107
|
+
lines.push(this.formatSingle(v).split('\n').map(l => ' ' + l).join('\n'));
|
|
108
|
+
}
|
|
109
|
+
lines.push('');
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
// Determinism breakdown
|
|
113
|
+
lines.push('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
|
|
114
|
+
lines.push(' DETERMINISM BREAKDOWN');
|
|
115
|
+
lines.push('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
|
|
116
|
+
lines.push('');
|
|
117
|
+
const classes = [
|
|
118
|
+
'deterministic-structural',
|
|
119
|
+
'deterministic-semantic',
|
|
120
|
+
'heuristic-advisory',
|
|
121
|
+
'llm-assisted-planning',
|
|
122
|
+
];
|
|
123
|
+
for (const cls of classes) {
|
|
124
|
+
const count = report.byDeterminism[cls] ?? 0;
|
|
125
|
+
const icon = DeterminismClassifier_1.DeterminismClassifier.icon(cls);
|
|
126
|
+
const label = DeterminismClassifier_1.DeterminismClassifier.label(cls);
|
|
127
|
+
lines.push(` ${icon} ${pad(label, 42)} ${count}`);
|
|
128
|
+
}
|
|
129
|
+
lines.push('');
|
|
130
|
+
return lines.join('\n');
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Format as GitHub PR comment markdown.
|
|
134
|
+
* Uses GitHub markdown: collapsible sections, code blocks, tables.
|
|
135
|
+
*/
|
|
136
|
+
formatGitHubPRComment(report, planId) {
|
|
137
|
+
const blockingCount = report.blocking.length;
|
|
138
|
+
const advisoryCount = report.advisory.length;
|
|
139
|
+
const ts = report.generatedAt;
|
|
140
|
+
const planRef = planId ? ` · Plan ID: ${planId}` : '';
|
|
141
|
+
const parts = [];
|
|
142
|
+
// Header
|
|
143
|
+
if (blockingCount === 0) {
|
|
144
|
+
parts.push('## ✅ Governance: PASS\n');
|
|
145
|
+
parts.push(`No blocking violations found. ${advisoryCount} advisory finding${advisoryCount !== 1 ? 's' : ''}.\n`);
|
|
146
|
+
}
|
|
147
|
+
else {
|
|
148
|
+
parts.push('## 🔍 Neurcode Governance Report\n');
|
|
149
|
+
}
|
|
150
|
+
// Summary table
|
|
151
|
+
const aggResult = DeterminismClassifier_1.DeterminismClassifier.aggregate([
|
|
152
|
+
...report.blocking,
|
|
153
|
+
...report.advisory,
|
|
154
|
+
]);
|
|
155
|
+
parts.push('### Summary\n');
|
|
156
|
+
parts.push('| Category | Count |');
|
|
157
|
+
parts.push('|---|---|');
|
|
158
|
+
parts.push(`| 🚫 Blocking | ${blockingCount} |`);
|
|
159
|
+
parts.push(`| ⚠️ Advisory | ${advisoryCount} |`);
|
|
160
|
+
parts.push(`| ⚙️ Deterministic | ${report.deterministicCount} |`);
|
|
161
|
+
parts.push(`| ⚡ Heuristic | ${report.heuristicCount} |`);
|
|
162
|
+
parts.push(`| Trust score | ${aggResult.trustScore}/100 |`);
|
|
163
|
+
parts.push(`| False-positive risk | ${report.falsePositiveRisk} |`);
|
|
164
|
+
parts.push('');
|
|
165
|
+
// Blocking violations
|
|
166
|
+
if (blockingCount > 0) {
|
|
167
|
+
parts.push('### 🚫 Blocking Violations\n');
|
|
168
|
+
parts.push('These must be resolved before merging.\n');
|
|
169
|
+
for (const v of report.blocking) {
|
|
170
|
+
const pct = Math.round(v.confidence * 100);
|
|
171
|
+
const icon = DeterminismClassifier_1.DeterminismClassifier.icon(v.determinism);
|
|
172
|
+
const label = DeterminismClassifier_1.DeterminismClassifier.label(v.determinism);
|
|
173
|
+
parts.push(`<details>`);
|
|
174
|
+
parts.push(`<summary><strong>${v.ruleId}</strong> — ${v.ruleName} · <code>${v.filePath}:${v.line}</code></summary>\n`);
|
|
175
|
+
parts.push(`**Policy:** \`${v.policyRef}\` `);
|
|
176
|
+
parts.push(`**Severity:** \`BLOCKING\` `);
|
|
177
|
+
parts.push(`**Trust:** ${icon} ${label} (${pct}% confidence)\n`);
|
|
178
|
+
parts.push(`**Location:** \`${v.filePath}\` line ${v.line}, col ${v.column}\n`);
|
|
179
|
+
parts.push(`**Pattern matched:** ${v.evidence.matchReason} `);
|
|
180
|
+
parts.push(`**AST node:** \`${v.evidence.astNodeType}\`\n`);
|
|
181
|
+
parts.push(`\`\`\`${v.language}`);
|
|
182
|
+
parts.push(v.evidence.codeSnippet);
|
|
183
|
+
parts.push('```\n');
|
|
184
|
+
parts.push(`**Operational risk:** ${v.operationalRisk}\n`);
|
|
185
|
+
parts.push(`**Worst case:** ${v.worstCase}\n`);
|
|
186
|
+
parts.push(`**Remediation:** ${v.remediation}\n`);
|
|
187
|
+
if (v.remediationCode) {
|
|
188
|
+
parts.push(`**Suggested fix:**`);
|
|
189
|
+
parts.push(`\`\`\`${v.language}`);
|
|
190
|
+
parts.push(v.remediationCode);
|
|
191
|
+
parts.push('```\n');
|
|
192
|
+
}
|
|
193
|
+
parts.push('</details>\n');
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
// Advisory violations (collapsed by default)
|
|
197
|
+
if (advisoryCount > 0) {
|
|
198
|
+
parts.push('### ⚠️ Advisory Violations\n');
|
|
199
|
+
parts.push('These are non-blocking findings. Review and address where feasible.\n');
|
|
200
|
+
for (const v of report.advisory) {
|
|
201
|
+
const pct = Math.round(v.confidence * 100);
|
|
202
|
+
const icon = DeterminismClassifier_1.DeterminismClassifier.icon(v.determinism);
|
|
203
|
+
parts.push(`<details>`);
|
|
204
|
+
parts.push(`<summary>${v.ruleId} — ${v.ruleName} · <code>${v.filePath}:${v.line}</code> · ${icon} ${pct}%</summary>\n`);
|
|
205
|
+
parts.push(`**Policy:** \`${v.policyRef}\` `);
|
|
206
|
+
parts.push(`**Trust:** ${DeterminismClassifier_1.DeterminismClassifier.label(v.determinism)}\n`);
|
|
207
|
+
parts.push(`\`\`\`${v.language}`);
|
|
208
|
+
parts.push(v.evidence.codeSnippet);
|
|
209
|
+
parts.push('```\n');
|
|
210
|
+
parts.push(`**Risk:** ${v.operationalRisk} `);
|
|
211
|
+
parts.push(`**Fix:** ${v.remediation}\n`);
|
|
212
|
+
parts.push('</details>\n');
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
// Determinism breakdown
|
|
216
|
+
parts.push('<details>');
|
|
217
|
+
parts.push('<summary>Determinism breakdown</summary>\n');
|
|
218
|
+
parts.push('| Class | Label | Count |');
|
|
219
|
+
parts.push('|---|---|---|');
|
|
220
|
+
const classes = [
|
|
221
|
+
'deterministic-structural',
|
|
222
|
+
'deterministic-semantic',
|
|
223
|
+
'heuristic-advisory',
|
|
224
|
+
'llm-assisted-planning',
|
|
225
|
+
];
|
|
226
|
+
for (const cls of classes) {
|
|
227
|
+
const count = report.byDeterminism[cls] ?? 0;
|
|
228
|
+
const icon = DeterminismClassifier_1.DeterminismClassifier.icon(cls);
|
|
229
|
+
parts.push(`| ${icon} \`${cls}\` | ${DeterminismClassifier_1.DeterminismClassifier.label(cls)} | ${count} |`);
|
|
230
|
+
}
|
|
231
|
+
parts.push('');
|
|
232
|
+
parts.push('</details>\n');
|
|
233
|
+
// Footer
|
|
234
|
+
parts.push(`---`);
|
|
235
|
+
parts.push(`*Generated by Neurcode${planRef} · ${ts}*`);
|
|
236
|
+
const result = parts.join('\n');
|
|
237
|
+
// Enforce GitHub PR comment character limit (65,536)
|
|
238
|
+
if (result.length > 65000) {
|
|
239
|
+
const truncationNotice = '\n\n> **Note:** Report truncated to fit GitHub PR comment limit. See CI logs for full output.';
|
|
240
|
+
return result.slice(0, 65000 - truncationNotice.length) + truncationNotice;
|
|
241
|
+
}
|
|
242
|
+
return result;
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Format as compact JSON for CI/CD pipeline consumption.
|
|
246
|
+
*/
|
|
247
|
+
formatJSON(report) {
|
|
248
|
+
return JSON.stringify(report, null, 2);
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
exports.ViolationFormatter = ViolationFormatter;
|
|
252
|
+
//# sourceMappingURL=ViolationFormatter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ViolationFormatter.js","sourceRoot":"","sources":["../../src/explainability/ViolationFormatter.ts"],"names":[],"mappings":";;;AACA,mEAAgE;AAEhE,iFAAiF;AAEjF,MAAM,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AAE1B,SAAS,GAAG,CAAC,CAAS,EAAE,KAAa;IACnC,OAAO,CAAC,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC;AAClE,CAAC;AAED,SAAS,QAAQ,CAAC,CAAS,EAAE,MAAc;IACzC,IAAI,CAAC,CAAC,MAAM,IAAI,MAAM;QAAE,OAAO,CAAC,CAAC;IACjC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC;AACxC,CAAC;AAED,iFAAiF;AAEjF,MAAa,kBAAkB;IAC7B;;;;;;;;;;;OAWG;IACH,YAAY,CAAC,CAAqB;QAChC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,GAAG,GAAG,CAAC,CAAC;QAC3C,MAAM,IAAI,GAAG,6CAAqB,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;QACvD,MAAM,KAAK,GAAa,EAAE,CAAC;QAE3B,KAAK,CAAC,IAAI,CACR,MAAM,CAAC,CAAC,MAAM,MAAM,CAAC,CAAC,QAAQ,MAAM,CAAC,CAAC,WAAW,iBAAiB,GAAG,IAAI,CAC1E,CAAC;QACF,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAClD,KAAK,CAAC,IAAI,CAAC,eAAe,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;QAElE,MAAM,OAAO,GAAG,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;QAClE,KAAK,CAAC,IAAI,CAAC,eAAe,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;QACnD,KAAK,CAAC,IAAI,CAAC,eAAe,QAAQ,CAAC,CAAC,CAAC,eAAe,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;QAC7D,KAAK,CAAC,IAAI,CAAC,eAAe,QAAQ,CAAC,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;QAEzD,IAAI,CAAC,CAAC,eAAe,EAAE,CAAC;YACtB,MAAM,SAAS,GAAG,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAChD,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;YACjC,KAAK,MAAM,EAAE,IAAI,SAAS,EAAE,CAAC;gBAC3B,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;YAC3B,CAAC;QACH,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,eAAe,IAAI,IAAI,6CAAqB,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;QAChF,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAErB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED;;;;OAIG;IACH,YAAY,CAAC,MAAuB;QAClC,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,MAAM,EAAE,GAAG,MAAM,CAAC,WAAW,CAAC;QAE9B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,8EAA8E,CAAC,CAAC;QAC3F,KAAK,CAAC,IAAI,CAAC,6EAA6E,CAAC,CAAC;QAC1F,KAAK,CAAC,IAAI,CAAC,8EAA8E,CAAC,CAAC;QAC3F,KAAK,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC;QACjC,KAAK,CAAC,IAAI,CAAC,gBAAgB,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC9C,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAEf,UAAU;QACV,MAAM,aAAa,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;QAC7C,MAAM,aAAa,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;QAC7C,MAAM,MAAM,GAAG,aAAa,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;QACrD,KAAK,CAAC,IAAI,CAAC,gBAAgB,MAAM,EAAE,CAAC,CAAC;QACrC,KAAK,CAAC,IAAI,CAAC,gBAAgB,aAAa,EAAE,CAAC,CAAC;QAC5C,KAAK,CAAC,IAAI,CAAC,gBAAgB,aAAa,EAAE,CAAC,CAAC;QAC5C,KAAK,CAAC,IAAI,CAAC,gBAAgB,MAAM,CAAC,eAAe,EAAE,CAAC,CAAC;QACrD,KAAK,CAAC,IAAI,CAAC,6BAA6B,MAAM,CAAC,kBAAkB,EAAE,CAAC,CAAC;QACrE,KAAK,CAAC,IAAI,CAAC,6BAA6B,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC;QACjE,KAAK,CAAC,IAAI,CAAC,6BAA6B,MAAM,CAAC,iBAAiB,EAAE,CAAC,CAAC;QACpE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAEf,sCAAsC;QACtC,IAAI,aAAa,GAAG,CAAC,EAAE,CAAC;YACtB,KAAK,CAAC,IAAI,CAAC,4EAA4E,CAAC,CAAC;YACzF,KAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;YACpC,KAAK,CAAC,IAAI,CAAC,4EAA4E,CAAC,CAAC;YACzF,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAEf,KAAK,MAAM,CAAC,QAAQ,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;gBACnE,MAAM,cAAc,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,UAAU,CAAC,CAAC;gBACzE,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC;oBAAE,SAAS;gBAC1C,KAAK,CAAC,IAAI,CAAC,KAAK,QAAQ,EAAE,CAAC,CAAC;gBAC5B,KAAK,MAAM,CAAC,IAAI,cAAc,EAAE,CAAC;oBAC/B,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;gBAC7E,CAAC;gBACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACjB,CAAC;QACH,CAAC;QAED,sCAAsC;QACtC,IAAI,aAAa,GAAG,CAAC,EAAE,CAAC;YACtB,KAAK,CAAC,IAAI,CAAC,4EAA4E,CAAC,CAAC;YACzF,KAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;YACpC,KAAK,CAAC,IAAI,CAAC,4EAA4E,CAAC,CAAC;YACzF,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAEf,KAAK,MAAM,CAAC,QAAQ,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;gBACnE,MAAM,cAAc,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,UAAU,CAAC,CAAC;gBACzE,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC;oBAAE,SAAS;gBAC1C,KAAK,CAAC,IAAI,CAAC,KAAK,QAAQ,EAAE,CAAC,CAAC;gBAC5B,KAAK,MAAM,CAAC,IAAI,cAAc,EAAE,CAAC;oBAC/B,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;gBAC7E,CAAC;gBACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACjB,CAAC;QACH,CAAC;QAED,wBAAwB;QACxB,KAAK,CAAC,IAAI,CAAC,4EAA4E,CAAC,CAAC;QACzF,KAAK,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;QACtC,KAAK,CAAC,IAAI,CAAC,4EAA4E,CAAC,CAAC;QACzF,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAEf,MAAM,OAAO,GAAuB;YAClC,0BAA0B;YAC1B,wBAAwB;YACxB,oBAAoB;YACpB,uBAAuB;SACxB,CAAC;QAEF,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;YAC1B,MAAM,KAAK,GAAG,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAC7C,MAAM,IAAI,GAAG,6CAAqB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC7C,MAAM,KAAK,GAAG,6CAAqB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC/C,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,KAAK,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC;QACvD,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAEf,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED;;;OAGG;IACH,qBAAqB,CAAC,MAAuB,EAAE,MAAe;QAC5D,MAAM,aAAa,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;QAC7C,MAAM,aAAa,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;QAC7C,MAAM,EAAE,GAAG,MAAM,CAAC,WAAW,CAAC;QAC9B,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,eAAe,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAEtD,MAAM,KAAK,GAAa,EAAE,CAAC;QAE3B,SAAS;QACT,IAAI,aAAa,KAAK,CAAC,EAAE,CAAC;YACxB,KAAK,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;YACtC,KAAK,CAAC,IAAI,CAAC,iCAAiC,aAAa,oBAAoB,aAAa,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QACpH,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;QACnD,CAAC;QAED,gBAAgB;QAChB,MAAM,SAAS,GAAG,6CAAqB,CAAC,SAAS,CAAC;YAChD,GAAG,MAAM,CAAC,QAAQ;YAClB,GAAG,MAAM,CAAC,QAAQ;SACnB,CAAC,CAAC;QAEH,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAC5B,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QACnC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACxB,KAAK,CAAC,IAAI,CAAC,mBAAmB,aAAa,IAAI,CAAC,CAAC;QACjD,KAAK,CAAC,IAAI,CAAC,mBAAmB,aAAa,IAAI,CAAC,CAAC;QACjD,KAAK,CAAC,IAAI,CAAC,wBAAwB,MAAM,CAAC,kBAAkB,IAAI,CAAC,CAAC;QAClE,KAAK,CAAC,IAAI,CAAC,mBAAmB,MAAM,CAAC,cAAc,IAAI,CAAC,CAAC;QACzD,KAAK,CAAC,IAAI,CAAC,mBAAmB,SAAS,CAAC,UAAU,QAAQ,CAAC,CAAC;QAC5D,KAAK,CAAC,IAAI,CAAC,2BAA2B,MAAM,CAAC,iBAAiB,IAAI,CAAC,CAAC;QACpE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAEf,sBAAsB;QACtB,IAAI,aAAa,GAAG,CAAC,EAAE,CAAC;YACtB,KAAK,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;YAC3C,KAAK,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC;YAEvD,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;gBAChC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,GAAG,GAAG,CAAC,CAAC;gBAC3C,MAAM,IAAI,GAAG,6CAAqB,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;gBACvD,MAAM,KAAK,GAAG,6CAAqB,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;gBAEzD,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;gBACxB,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,MAAM,eAAe,CAAC,CAAC,QAAQ,YAAY,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,IAAI,qBAAqB,CAAC,CAAC;gBACvH,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,SAAS,MAAM,CAAC,CAAC;gBAC/C,KAAK,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;gBAC3C,KAAK,CAAC,IAAI,CAAC,cAAc,IAAI,IAAI,KAAK,KAAK,GAAG,iBAAiB,CAAC,CAAC;gBACjE,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,QAAQ,WAAW,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC;gBAChF,KAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC,QAAQ,CAAC,WAAW,IAAI,CAAC,CAAC;gBAC/D,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,QAAQ,CAAC,WAAW,MAAM,CAAC,CAAC;gBAC5D,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;gBAClC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;gBACnC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACpB,KAAK,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC,eAAe,IAAI,CAAC,CAAC;gBAC3D,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC;gBAC/C,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC;gBAElD,IAAI,CAAC,CAAC,eAAe,EAAE,CAAC;oBACtB,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;oBACjC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;oBAClC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC;oBAC9B,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACtB,CAAC;gBAED,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC;QAED,6CAA6C;QAC7C,IAAI,aAAa,GAAG,CAAC,EAAE,CAAC;YACtB,KAAK,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;YAC3C,KAAK,CAAC,IAAI,CAAC,uEAAuE,CAAC,CAAC;YAEpF,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;gBAChC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,GAAG,GAAG,CAAC,CAAC;gBAC3C,MAAM,IAAI,GAAG,6CAAqB,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;gBAEvD,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;gBACxB,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,MAAM,MAAM,CAAC,CAAC,QAAQ,YAAY,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,IAAI,aAAa,IAAI,IAAI,GAAG,eAAe,CAAC,CAAC;gBACxH,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,SAAS,MAAM,CAAC,CAAC;gBAC/C,KAAK,CAAC,IAAI,CAAC,cAAc,6CAAqB,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;gBACzE,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;gBAClC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;gBACnC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACpB,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,eAAe,IAAI,CAAC,CAAC;gBAC/C,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC;gBAC1C,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC;QAED,wBAAwB;QACxB,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACxB,KAAK,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;QACzD,KAAK,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;QACxC,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAE5B,MAAM,OAAO,GAAuB;YAClC,0BAA0B;YAC1B,wBAAwB;YACxB,oBAAoB;YACpB,uBAAuB;SACxB,CAAC;QAEF,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;YAC1B,MAAM,KAAK,GAAG,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAC7C,MAAM,IAAI,GAAG,6CAAqB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC7C,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,MAAM,GAAG,QAAQ,6CAAqB,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC;QACxF,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAE3B,SAAS;QACT,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAClB,KAAK,CAAC,IAAI,CAAC,yBAAyB,OAAO,MAAM,EAAE,GAAG,CAAC,CAAC;QAExD,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEhC,qDAAqD;QACrD,IAAI,MAAM,CAAC,MAAM,GAAG,KAAK,EAAE,CAAC;YAC1B,MAAM,gBAAgB,GACpB,+FAA+F,CAAC;YAClG,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,GAAG,gBAAgB,CAAC,MAAM,CAAC,GAAG,gBAAgB,CAAC;QAC7E,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,MAAuB;QAChC,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IACzC,CAAC;CACF;AAjRD,gDAiRC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export { ViolationFormatter } from './ViolationFormatter';
|
|
2
|
+
export { DeterminismClassifier } from './DeterminismClassifier';
|
|
3
|
+
export type { ExplainedViolation, ViolationReport, DeterminismClass } from './types';
|
|
4
|
+
import type { ViolationReport } from './types';
|
|
5
|
+
import type { StructuralViolation } from '../structural-rules/types';
|
|
6
|
+
/**
|
|
7
|
+
* Build a ViolationReport from structural rule violations.
|
|
8
|
+
* This is the bridge between the structural rule engine output
|
|
9
|
+
* and the explainability layer.
|
|
10
|
+
*
|
|
11
|
+
* Deterministic violationId: `${ruleId}:${filePath}:${line}:${column}`
|
|
12
|
+
* Same input always produces the same ID.
|
|
13
|
+
*/
|
|
14
|
+
export declare function buildViolationReport(violations: StructuralViolation[], repoRoot: string): ViolationReport;
|
|
15
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/explainability/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,YAAY,EAAE,kBAAkB,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAErF,OAAO,KAAK,EAAsB,eAAe,EAAoB,MAAM,SAAS,CAAC;AACrF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAKrE;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAClC,UAAU,EAAE,mBAAmB,EAAE,EACjC,QAAQ,EAAE,MAAM,GACf,eAAe,CAoFjB"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DeterminismClassifier = exports.ViolationFormatter = void 0;
|
|
4
|
+
exports.buildViolationReport = buildViolationReport;
|
|
5
|
+
var ViolationFormatter_1 = require("./ViolationFormatter");
|
|
6
|
+
Object.defineProperty(exports, "ViolationFormatter", { enumerable: true, get: function () { return ViolationFormatter_1.ViolationFormatter; } });
|
|
7
|
+
var DeterminismClassifier_1 = require("./DeterminismClassifier");
|
|
8
|
+
Object.defineProperty(exports, "DeterminismClassifier", { enumerable: true, get: function () { return DeterminismClassifier_1.DeterminismClassifier; } });
|
|
9
|
+
const DeterminismClassifier_2 = require("./DeterminismClassifier");
|
|
10
|
+
// ── buildViolationReport ──────────────────────────────────────────────────────
|
|
11
|
+
/**
|
|
12
|
+
* Build a ViolationReport from structural rule violations.
|
|
13
|
+
* This is the bridge between the structural rule engine output
|
|
14
|
+
* and the explainability layer.
|
|
15
|
+
*
|
|
16
|
+
* Deterministic violationId: `${ruleId}:${filePath}:${line}:${column}`
|
|
17
|
+
* Same input always produces the same ID.
|
|
18
|
+
*/
|
|
19
|
+
function buildViolationReport(violations, repoRoot) {
|
|
20
|
+
const generatedAt = new Date().toISOString();
|
|
21
|
+
const explained = violations.map(v => {
|
|
22
|
+
const violationId = `${v.ruleId}:${v.filePath}:${v.line}:${v.column}`;
|
|
23
|
+
// Map DeterminismLevel from structural-rules/types to DeterminismClass.
|
|
24
|
+
// The structural-rules types only define three levels (no llm-assisted-planning),
|
|
25
|
+
// so the cast is safe here.
|
|
26
|
+
const determinism = v.determinism;
|
|
27
|
+
return {
|
|
28
|
+
violationId,
|
|
29
|
+
ruleId: v.ruleId,
|
|
30
|
+
ruleName: v.ruleName,
|
|
31
|
+
policyRef: v.policyRef,
|
|
32
|
+
severity: v.severity,
|
|
33
|
+
filePath: v.filePath,
|
|
34
|
+
line: v.line,
|
|
35
|
+
column: v.column,
|
|
36
|
+
evidence: {
|
|
37
|
+
codeSnippet: v.evidence,
|
|
38
|
+
astNodeType: '', // not available from StructuralViolation; callers may enrich
|
|
39
|
+
matchReason: v.evidence, // use the evidence string as the match reason
|
|
40
|
+
},
|
|
41
|
+
operationalRisk: v.operationalRisk,
|
|
42
|
+
worstCase: '', // not in StructuralViolation; callers may enrich
|
|
43
|
+
remediation: v.remediation,
|
|
44
|
+
determinism,
|
|
45
|
+
confidence: v.confidence,
|
|
46
|
+
language: v.language,
|
|
47
|
+
};
|
|
48
|
+
});
|
|
49
|
+
// Split by severity
|
|
50
|
+
const blocking = explained.filter(v => v.severity === 'BLOCKING');
|
|
51
|
+
const advisory = explained.filter(v => v.severity === 'ADVISORY');
|
|
52
|
+
// byFile aggregate
|
|
53
|
+
const byFile = {};
|
|
54
|
+
for (const v of explained) {
|
|
55
|
+
if (!byFile[v.filePath])
|
|
56
|
+
byFile[v.filePath] = [];
|
|
57
|
+
byFile[v.filePath].push(v);
|
|
58
|
+
}
|
|
59
|
+
// byRule aggregate
|
|
60
|
+
const byRule = {};
|
|
61
|
+
for (const v of explained) {
|
|
62
|
+
if (!byRule[v.ruleId])
|
|
63
|
+
byRule[v.ruleId] = [];
|
|
64
|
+
byRule[v.ruleId].push(v);
|
|
65
|
+
}
|
|
66
|
+
// byDeterminism counts
|
|
67
|
+
const byDeterminism = {
|
|
68
|
+
'deterministic-structural': 0,
|
|
69
|
+
'deterministic-semantic': 0,
|
|
70
|
+
'heuristic-advisory': 0,
|
|
71
|
+
'llm-assisted-planning': 0,
|
|
72
|
+
};
|
|
73
|
+
for (const v of explained) {
|
|
74
|
+
byDeterminism[v.determinism] += 1;
|
|
75
|
+
}
|
|
76
|
+
const deterministicCount = byDeterminism['deterministic-structural'] +
|
|
77
|
+
byDeterminism['deterministic-semantic'];
|
|
78
|
+
const heuristicCount = byDeterminism['heuristic-advisory'];
|
|
79
|
+
const { falsePositiveRisk } = DeterminismClassifier_2.DeterminismClassifier.aggregate(explained);
|
|
80
|
+
return {
|
|
81
|
+
generatedAt,
|
|
82
|
+
repoRoot,
|
|
83
|
+
totalViolations: explained.length,
|
|
84
|
+
blocking,
|
|
85
|
+
advisory,
|
|
86
|
+
byFile,
|
|
87
|
+
byRule,
|
|
88
|
+
byDeterminism,
|
|
89
|
+
deterministicCount,
|
|
90
|
+
heuristicCount,
|
|
91
|
+
falsePositiveRisk,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/explainability/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
export type DeterminismClass = 'deterministic-structural' | 'deterministic-semantic' | 'heuristic-advisory' | 'llm-assisted-planning';
|
|
2
|
+
export interface ExplainedViolation {
|
|
3
|
+
violationId: string;
|
|
4
|
+
ruleId: string;
|
|
5
|
+
ruleName: string;
|
|
6
|
+
policyRef: string;
|
|
7
|
+
severity: 'BLOCKING' | 'ADVISORY';
|
|
8
|
+
filePath: string;
|
|
9
|
+
line: number;
|
|
10
|
+
column: number;
|
|
11
|
+
evidence: {
|
|
12
|
+
codeSnippet: string;
|
|
13
|
+
astNodeType: string;
|
|
14
|
+
matchReason: string;
|
|
15
|
+
};
|
|
16
|
+
operationalRisk: string;
|
|
17
|
+
worstCase: string;
|
|
18
|
+
remediation: string;
|
|
19
|
+
remediationCode?: string;
|
|
20
|
+
determinism: DeterminismClass;
|
|
21
|
+
confidence: number;
|
|
22
|
+
language: string;
|
|
23
|
+
}
|
|
24
|
+
export interface ViolationReport {
|
|
25
|
+
generatedAt: string;
|
|
26
|
+
repoRoot: string;
|
|
27
|
+
totalViolations: number;
|
|
28
|
+
blocking: ExplainedViolation[];
|
|
29
|
+
advisory: ExplainedViolation[];
|
|
30
|
+
byFile: Record<string, ExplainedViolation[]>;
|
|
31
|
+
byRule: Record<string, ExplainedViolation[]>;
|
|
32
|
+
byDeterminism: Record<DeterminismClass, number>;
|
|
33
|
+
deterministicCount: number;
|
|
34
|
+
heuristicCount: number;
|
|
35
|
+
falsePositiveRisk: 'low' | 'medium' | 'high';
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/explainability/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,gBAAgB,GACxB,0BAA0B,GAC1B,wBAAwB,GACxB,oBAAoB,GACpB,uBAAuB,CAAC;AAE5B,MAAM,WAAW,kBAAkB;IAEjC,WAAW,EAAM,MAAM,CAAC;IACxB,MAAM,EAAW,MAAM,CAAC;IACxB,QAAQ,EAAS,MAAM,CAAC;IACxB,SAAS,EAAQ,MAAM,CAAC;IACxB,QAAQ,EAAS,UAAU,GAAG,UAAU,CAAC;IAGzC,QAAQ,EAAS,MAAM,CAAC;IACxB,IAAI,EAAa,MAAM,CAAC;IACxB,MAAM,EAAW,MAAM,CAAC;IAGxB,QAAQ,EAAE;QACR,WAAW,EAAM,MAAM,CAAC;QACxB,WAAW,EAAM,MAAM,CAAC;QACxB,WAAW,EAAM,MAAM,CAAC;KACzB,CAAC;IAGF,eAAe,EAAG,MAAM,CAAC;IACzB,SAAS,EAAS,MAAM,CAAC;IAGzB,WAAW,EAAO,MAAM,CAAC;IACzB,eAAe,CAAC,EAAE,MAAM,CAAC;IAGzB,WAAW,EAAO,gBAAgB,CAAC;IACnC,UAAU,EAAQ,MAAM,CAAC;IACzB,QAAQ,EAAU,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAM,MAAM,CAAC;IACxB,QAAQ,EAAS,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAS,kBAAkB,EAAE,CAAC;IACtC,QAAQ,EAAS,kBAAkB,EAAE,CAAC;IAGtC,MAAM,EAAW,MAAM,CAAC,MAAM,EAAE,kBAAkB,EAAE,CAAC,CAAC;IACtD,MAAM,EAAW,MAAM,CAAC,MAAM,EAAE,kBAAkB,EAAE,CAAC,CAAC;IACtD,aAAa,EAAI,MAAM,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC;IAGlD,kBAAkB,EAAE,MAAM,CAAC;IAC3B,cAAc,EAAM,MAAM,CAAC;IAC3B,iBAAiB,EAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;CAC/C"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/explainability/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Canonical Finding Invariants (Phase 1 + Phase 3)
|
|
3
|
+
*
|
|
4
|
+
* Two responsibilities:
|
|
5
|
+
*
|
|
6
|
+
* 1. Architectural invariant enforcement (Phase 1):
|
|
7
|
+
* - Assert that policyViolations never contain structural:* rows
|
|
8
|
+
* - If violated, emit a deterministic console warning (never throw)
|
|
9
|
+
* - This guards against regressions where future code re-introduces the merge
|
|
10
|
+
*
|
|
11
|
+
* 2. Replay determinism (Phase 3):
|
|
12
|
+
* - computeCanonicalFindingChecksum(): deterministic SHA-256 over finding set
|
|
13
|
+
* - sortFindingsDeterministically(): canonical sort order for stable checksums
|
|
14
|
+
*
|
|
15
|
+
* Both functions are pure and dependency-free (only Node 'crypto').
|
|
16
|
+
*/
|
|
17
|
+
import type { GovernanceFinding } from '@neurcode-ai/contracts';
|
|
18
|
+
import type { RuleViolation } from '@neurcode-ai/policy-engine';
|
|
19
|
+
/**
|
|
20
|
+
* Assert that the policyViolations array contains no structural:* prefixed rows.
|
|
21
|
+
*
|
|
22
|
+
* Structural violations MUST flow only through `payload.structuralViolations`
|
|
23
|
+
* into the canonical pipeline. Structural rows in policyViolations cause
|
|
24
|
+
* cross-source duplicate GovernanceFinding objects.
|
|
25
|
+
*
|
|
26
|
+
* This guard emits a console.warn if violated — it NEVER throws. The intention
|
|
27
|
+
* is observability and regression detection, not hard failure. The pipeline's
|
|
28
|
+
* stripStructuralPolicyRows() provides the actual cleanup.
|
|
29
|
+
*
|
|
30
|
+
* @param violations The policyViolations array before it reaches the pipeline
|
|
31
|
+
* @param context Caller label for the warning message (e.g. 'verify:policy-only')
|
|
32
|
+
* @returns Count of structural rows found (0 = invariant holds)
|
|
33
|
+
*/
|
|
34
|
+
export declare function assertNoStructuralPolicyRows(violations: RuleViolation[], context: string): number;
|
|
35
|
+
/**
|
|
36
|
+
* Sort findings into a canonical deterministic order.
|
|
37
|
+
*
|
|
38
|
+
* Sort key (descending priority):
|
|
39
|
+
* 1. determinismClassification rank (descending — structural first)
|
|
40
|
+
* 2. severity rank (descending — BLOCKING first)
|
|
41
|
+
* 3. filePath (ascending — lexicographic)
|
|
42
|
+
* 4. line number (ascending)
|
|
43
|
+
* 5. id (ascending — stable tiebreaker)
|
|
44
|
+
*
|
|
45
|
+
* This order is stable across multiple runs on the same input, enabling
|
|
46
|
+
* reliable replay checksum comparison.
|
|
47
|
+
*
|
|
48
|
+
* NEVER mutates the input array — returns a new sorted array.
|
|
49
|
+
*/
|
|
50
|
+
export declare function sortFindingsDeterministically(findings: GovernanceFinding[]): GovernanceFinding[];
|
|
51
|
+
/**
|
|
52
|
+
* Compute a deterministic SHA-256 checksum over the canonical finding set.
|
|
53
|
+
*
|
|
54
|
+
* Checksum input is built from sorted findings:
|
|
55
|
+
* for each finding (in canonical sort order):
|
|
56
|
+
* id + '\x1e' + severity + '\x1e' + determinismClassification +
|
|
57
|
+
* '\x1e' + filePath + '\x1e' + line
|
|
58
|
+
* joined with '\x00'
|
|
59
|
+
*
|
|
60
|
+
* This checksum:
|
|
61
|
+
* - Changes if any finding is added, removed, or has severity/determinism changed
|
|
62
|
+
* - Changes if canonical ordering changes (sort key must be stable)
|
|
63
|
+
* - Is stable across process restarts on the same input
|
|
64
|
+
* - Is used to detect replay drift (same commit + diff + rules → same checksum)
|
|
65
|
+
*
|
|
66
|
+
* @param findings Raw findings from the canonical pipeline (NOT pre-sorted)
|
|
67
|
+
* @returns hex SHA-256 string (64 chars)
|
|
68
|
+
*/
|
|
69
|
+
export declare function computeCanonicalFindingChecksum(findings: GovernanceFinding[]): string;
|
|
70
|
+
/**
|
|
71
|
+
* Compare two sets of findings for replay equivalence.
|
|
72
|
+
*
|
|
73
|
+
* Returns a structured comparison result:
|
|
74
|
+
* - 'exact': checksums match — identical governance output
|
|
75
|
+
* - 'drift-detected': checksums differ — replay divergence
|
|
76
|
+
*
|
|
77
|
+
* @param baseline Findings from the baseline (e.g. cached) run
|
|
78
|
+
* @param replay Findings from the current run
|
|
79
|
+
*/
|
|
80
|
+
export declare function compareForReplayEquivalence(baseline: GovernanceFinding[], replay: GovernanceFinding[]): {
|
|
81
|
+
status: 'exact' | 'drift-detected';
|
|
82
|
+
baselineChecksum: string;
|
|
83
|
+
replayChecksum: string;
|
|
84
|
+
baselineCount: number;
|
|
85
|
+
replayCount: number;
|
|
86
|
+
driftDetails?: string;
|
|
87
|
+
};
|
|
88
|
+
//# sourceMappingURL=canonical-invariants.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canonical-invariants.d.ts","sourceRoot":"","sources":["../../src/governance/canonical-invariants.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAIhE;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,4BAA4B,CAC1C,UAAU,EAAE,aAAa,EAAE,EAC3B,OAAO,EAAE,MAAM,GACd,MAAM,CAYR;AA4BD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,6BAA6B,CAAC,QAAQ,EAAE,iBAAiB,EAAE,GAAG,iBAAiB,EAAE,CAyBhG;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,+BAA+B,CAAC,QAAQ,EAAE,iBAAiB,EAAE,GAAG,MAAM,CAgBrF;AAED;;;;;;;;;GASG;AACH,wBAAgB,2BAA2B,CACzC,QAAQ,EAAE,iBAAiB,EAAE,EAC7B,MAAM,EAAE,iBAAiB,EAAE,GAC1B;IACD,MAAM,EAAE,OAAO,GAAG,gBAAgB,CAAC;IACnC,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CA2CA"}
|