@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,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Persistent deterministic brain cache infrastructure.
|
|
3
|
+
*
|
|
4
|
+
* Design principles:
|
|
5
|
+
* - Content-hash invalidation: files are only re-indexed when content changes
|
|
6
|
+
* - Replay-safe: cache manifest is deterministic and serializable
|
|
7
|
+
* - CI-restorable: manifest + index can be archived and restored across runs
|
|
8
|
+
* - Governance-neutral: cache accelerates indexing, never affects correctness
|
|
9
|
+
* - Append-only manifest entries (no silent deletion of records)
|
|
10
|
+
*
|
|
11
|
+
* Cache location: <projectRoot>/.neurcode/brain/cache/
|
|
12
|
+
* Manifest: <projectRoot>/.neurcode/brain/cache/manifest.json
|
|
13
|
+
* Semantic index: <projectRoot>/.neurcode/brain/cache/semantic-index.json
|
|
14
|
+
*/
|
|
15
|
+
export declare const BRAIN_CACHE_SCHEMA_VERSION: "2026-05-11.1";
|
|
16
|
+
export interface BrainCacheFileEntry {
|
|
17
|
+
/** Repo-relative file path. */
|
|
18
|
+
filePath: string;
|
|
19
|
+
/** SHA-256 content hash (hex). */
|
|
20
|
+
contentHash: string;
|
|
21
|
+
/** Last-modified timestamp (Unix ms). */
|
|
22
|
+
lastModifiedMs: number;
|
|
23
|
+
/** File size in bytes. */
|
|
24
|
+
sizeBytes: number;
|
|
25
|
+
/** True when this file was included in the semantic index. */
|
|
26
|
+
indexed: boolean;
|
|
27
|
+
}
|
|
28
|
+
export interface BrainCacheManifest {
|
|
29
|
+
schemaVersion: typeof BRAIN_CACHE_SCHEMA_VERSION;
|
|
30
|
+
/** Repository root path at build time. */
|
|
31
|
+
repoRoot: string;
|
|
32
|
+
/** ISO 8601 build timestamp. */
|
|
33
|
+
builtAt: string;
|
|
34
|
+
/** SHA-256 of the manifest itself (for integrity checks). Populated after write. */
|
|
35
|
+
manifestHash: string;
|
|
36
|
+
/** Total files tracked. */
|
|
37
|
+
totalFiles: number;
|
|
38
|
+
/** Total files indexed in semantic index. */
|
|
39
|
+
indexedFiles: number;
|
|
40
|
+
/** Combined content hash of all tracked files (for CI cache key generation). */
|
|
41
|
+
contentFingerprint: string;
|
|
42
|
+
/** Per-file entries. */
|
|
43
|
+
files: BrainCacheFileEntry[];
|
|
44
|
+
}
|
|
45
|
+
export interface BrainCacheStatus {
|
|
46
|
+
exists: boolean;
|
|
47
|
+
manifest: BrainCacheManifest | null;
|
|
48
|
+
staleFiles: string[];
|
|
49
|
+
missingFiles: string[];
|
|
50
|
+
newFiles: string[];
|
|
51
|
+
totalFiles: number;
|
|
52
|
+
freshFiles: number;
|
|
53
|
+
stalePercent: number;
|
|
54
|
+
needsRebuild: boolean;
|
|
55
|
+
cacheDir: string;
|
|
56
|
+
manifestPath: string;
|
|
57
|
+
semanticIndexPath: string;
|
|
58
|
+
sizeBytes: number;
|
|
59
|
+
}
|
|
60
|
+
export declare function getBrainCacheDir(projectRoot: string): string;
|
|
61
|
+
export declare function getBrainCacheManifestPath(projectRoot: string): string;
|
|
62
|
+
export declare function getBrainCacheSemanticIndexPath(projectRoot: string): string;
|
|
63
|
+
export declare function hashFileContent(content: string): string;
|
|
64
|
+
export declare function loadBrainCacheManifest(projectRoot: string): BrainCacheManifest | null;
|
|
65
|
+
export declare function saveBrainCacheManifest(projectRoot: string, manifest: Omit<BrainCacheManifest, 'manifestHash'>): BrainCacheManifest;
|
|
66
|
+
export interface BrainCacheBuildOptions {
|
|
67
|
+
projectRoot: string;
|
|
68
|
+
maxFiles?: number;
|
|
69
|
+
/** If true, force full rebuild ignoring existing manifest. */
|
|
70
|
+
force?: boolean;
|
|
71
|
+
onProgress?: (indexed: number, total: number) => void;
|
|
72
|
+
}
|
|
73
|
+
export interface BrainCacheBuildResult {
|
|
74
|
+
manifest: BrainCacheManifest;
|
|
75
|
+
builtFiles: number;
|
|
76
|
+
skippedFiles: number;
|
|
77
|
+
/** Files re-indexed because content changed. */
|
|
78
|
+
updatedFiles: number;
|
|
79
|
+
elapsedMs: number;
|
|
80
|
+
}
|
|
81
|
+
export declare function buildBrainCache(options: BrainCacheBuildOptions): BrainCacheBuildResult;
|
|
82
|
+
export declare function getBrainCacheStatus(projectRoot: string): BrainCacheStatus;
|
|
83
|
+
export interface BrainCacheRestoreOptions {
|
|
84
|
+
projectRoot: string;
|
|
85
|
+
/** Path to the CI cache artifact (JSON). */
|
|
86
|
+
artifactPath: string;
|
|
87
|
+
}
|
|
88
|
+
export interface BrainCacheRestoreResult {
|
|
89
|
+
success: boolean;
|
|
90
|
+
manifest: BrainCacheManifest | null;
|
|
91
|
+
message: string;
|
|
92
|
+
staleAfterRestore: number;
|
|
93
|
+
}
|
|
94
|
+
export declare function restoreBrainCache(options: BrainCacheRestoreOptions): BrainCacheRestoreResult;
|
|
95
|
+
/**
|
|
96
|
+
* Export the current cache manifest as a CI artifact.
|
|
97
|
+
* CI pipelines can cache this file and restore it on subsequent runs.
|
|
98
|
+
*/
|
|
99
|
+
export declare function exportBrainCacheArtifact(projectRoot: string, outputPath: string): boolean;
|
|
100
|
+
//# sourceMappingURL=brain-cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"brain-cache.d.ts","sourceRoot":"","sources":["../../src/utils/brain-cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,346 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Persistent deterministic brain cache infrastructure.
|
|
4
|
+
*
|
|
5
|
+
* Design principles:
|
|
6
|
+
* - Content-hash invalidation: files are only re-indexed when content changes
|
|
7
|
+
* - Replay-safe: cache manifest is deterministic and serializable
|
|
8
|
+
* - CI-restorable: manifest + index can be archived and restored across runs
|
|
9
|
+
* - Governance-neutral: cache accelerates indexing, never affects correctness
|
|
10
|
+
* - Append-only manifest entries (no silent deletion of records)
|
|
11
|
+
*
|
|
12
|
+
* Cache location: <projectRoot>/.neurcode/brain/cache/
|
|
13
|
+
* Manifest: <projectRoot>/.neurcode/brain/cache/manifest.json
|
|
14
|
+
* Semantic index: <projectRoot>/.neurcode/brain/cache/semantic-index.json
|
|
15
|
+
*/
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.BRAIN_CACHE_SCHEMA_VERSION = void 0;
|
|
18
|
+
exports.getBrainCacheDir = getBrainCacheDir;
|
|
19
|
+
exports.getBrainCacheManifestPath = getBrainCacheManifestPath;
|
|
20
|
+
exports.getBrainCacheSemanticIndexPath = getBrainCacheSemanticIndexPath;
|
|
21
|
+
exports.hashFileContent = hashFileContent;
|
|
22
|
+
exports.loadBrainCacheManifest = loadBrainCacheManifest;
|
|
23
|
+
exports.saveBrainCacheManifest = saveBrainCacheManifest;
|
|
24
|
+
exports.buildBrainCache = buildBrainCache;
|
|
25
|
+
exports.getBrainCacheStatus = getBrainCacheStatus;
|
|
26
|
+
exports.restoreBrainCache = restoreBrainCache;
|
|
27
|
+
exports.exportBrainCacheArtifact = exportBrainCacheArtifact;
|
|
28
|
+
const crypto_1 = require("crypto");
|
|
29
|
+
const fs_1 = require("fs");
|
|
30
|
+
const path_1 = require("path");
|
|
31
|
+
// ── Schema version ─────────────────────────────────────────────────────────────
|
|
32
|
+
exports.BRAIN_CACHE_SCHEMA_VERSION = '2026-05-11.1';
|
|
33
|
+
// ── Cache paths ────────────────────────────────────────────────────────────────
|
|
34
|
+
function getBrainCacheDir(projectRoot) {
|
|
35
|
+
return (0, path_1.join)(projectRoot, '.neurcode', 'brain', 'cache');
|
|
36
|
+
}
|
|
37
|
+
function getBrainCacheManifestPath(projectRoot) {
|
|
38
|
+
return (0, path_1.join)(getBrainCacheDir(projectRoot), 'manifest.json');
|
|
39
|
+
}
|
|
40
|
+
function getBrainCacheSemanticIndexPath(projectRoot) {
|
|
41
|
+
return (0, path_1.join)(getBrainCacheDir(projectRoot), 'semantic-index.json');
|
|
42
|
+
}
|
|
43
|
+
// ── Content hashing ────────────────────────────────────────────────────────────
|
|
44
|
+
function hashFileContent(content) {
|
|
45
|
+
return (0, crypto_1.createHash)('sha256').update(content, 'utf-8').digest('hex');
|
|
46
|
+
}
|
|
47
|
+
function hashFileAtPath(filePath) {
|
|
48
|
+
try {
|
|
49
|
+
const content = (0, fs_1.readFileSync)(filePath, 'utf-8');
|
|
50
|
+
return hashFileContent(content);
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
return '';
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
function contentFingerprint(files) {
|
|
57
|
+
const sorted = [...files]
|
|
58
|
+
.sort((a, b) => a.filePath.localeCompare(b.filePath))
|
|
59
|
+
.map((f) => `${f.filePath}:${f.contentHash}`)
|
|
60
|
+
.join('\n');
|
|
61
|
+
return (0, crypto_1.createHash)('sha256').update(sorted, 'utf-8').digest('hex').slice(0, 32);
|
|
62
|
+
}
|
|
63
|
+
// ── Manifest I/O ───────────────────────────────────────────────────────────────
|
|
64
|
+
function loadBrainCacheManifest(projectRoot) {
|
|
65
|
+
const path = getBrainCacheManifestPath(projectRoot);
|
|
66
|
+
if (!(0, fs_1.existsSync)(path))
|
|
67
|
+
return null;
|
|
68
|
+
try {
|
|
69
|
+
const raw = (0, fs_1.readFileSync)(path, 'utf-8');
|
|
70
|
+
const parsed = JSON.parse(raw);
|
|
71
|
+
if (parsed.schemaVersion !== exports.BRAIN_CACHE_SCHEMA_VERSION) {
|
|
72
|
+
return null; // incompatible schema, treat as cache miss
|
|
73
|
+
}
|
|
74
|
+
return parsed;
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
function saveBrainCacheManifest(projectRoot, manifest) {
|
|
81
|
+
const cacheDir = getBrainCacheDir(projectRoot);
|
|
82
|
+
(0, fs_1.mkdirSync)(cacheDir, { recursive: true });
|
|
83
|
+
const withoutHash = { ...manifest, manifestHash: '' };
|
|
84
|
+
const serialized = JSON.stringify(withoutHash, null, 2);
|
|
85
|
+
const hash = (0, crypto_1.createHash)('sha256').update(serialized, 'utf-8').digest('hex');
|
|
86
|
+
const final = { ...withoutHash, manifestHash: hash };
|
|
87
|
+
(0, fs_1.writeFileSync)(getBrainCacheManifestPath(projectRoot), JSON.stringify(final, null, 2), 'utf-8');
|
|
88
|
+
return final;
|
|
89
|
+
}
|
|
90
|
+
// ── Scan project files for indexable content ───────────────────────────────────
|
|
91
|
+
const INDEXABLE_EXTENSIONS = new Set([
|
|
92
|
+
'.ts', '.tsx', '.js', '.jsx', '.mts', '.mjs',
|
|
93
|
+
'.py', '.go', '.rs', '.java', '.rb', '.swift',
|
|
94
|
+
]);
|
|
95
|
+
const EXCLUDED_DIRS = new Set([
|
|
96
|
+
'node_modules', '.git', '.next', 'dist', 'build', 'out',
|
|
97
|
+
'.neurcode', '__pycache__', '.venv', 'venv', '.cache',
|
|
98
|
+
]);
|
|
99
|
+
function scanIndexableFiles(projectRoot, maxFiles = 5000) {
|
|
100
|
+
const results = [];
|
|
101
|
+
function traverse(dir, depth = 0) {
|
|
102
|
+
if (depth > 10)
|
|
103
|
+
return;
|
|
104
|
+
let entries = [];
|
|
105
|
+
try {
|
|
106
|
+
entries = (0, fs_1.readdirSync)(dir);
|
|
107
|
+
}
|
|
108
|
+
catch {
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
for (const entry of entries) {
|
|
112
|
+
if (EXCLUDED_DIRS.has(entry))
|
|
113
|
+
continue;
|
|
114
|
+
const fullPath = (0, path_1.join)(dir, entry);
|
|
115
|
+
let stat;
|
|
116
|
+
try {
|
|
117
|
+
stat = (0, fs_1.statSync)(fullPath);
|
|
118
|
+
}
|
|
119
|
+
catch {
|
|
120
|
+
continue;
|
|
121
|
+
}
|
|
122
|
+
if (stat.isDirectory()) {
|
|
123
|
+
traverse(fullPath, depth + 1);
|
|
124
|
+
}
|
|
125
|
+
else if (stat.isFile()) {
|
|
126
|
+
const dotIdx = entry.lastIndexOf('.');
|
|
127
|
+
if (dotIdx > 0 && INDEXABLE_EXTENSIONS.has(entry.slice(dotIdx))) {
|
|
128
|
+
results.push(fullPath);
|
|
129
|
+
if (results.length >= maxFiles)
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
traverse(projectRoot);
|
|
136
|
+
return results;
|
|
137
|
+
}
|
|
138
|
+
function buildBrainCache(options) {
|
|
139
|
+
const { projectRoot, maxFiles = 5000, force = false } = options;
|
|
140
|
+
const start = Date.now();
|
|
141
|
+
const existing = force ? null : loadBrainCacheManifest(projectRoot);
|
|
142
|
+
const existingMap = new Map((existing?.files ?? []).map((f) => [f.filePath, f]));
|
|
143
|
+
const allFiles = scanIndexableFiles(projectRoot, maxFiles);
|
|
144
|
+
const entries = [];
|
|
145
|
+
let builtFiles = 0;
|
|
146
|
+
let skippedFiles = 0;
|
|
147
|
+
let updatedFiles = 0;
|
|
148
|
+
for (let i = 0; i < allFiles.length; i++) {
|
|
149
|
+
const fullPath = allFiles[i];
|
|
150
|
+
const relPath = (0, path_1.relative)(projectRoot, fullPath).split(path_1.sep).join('/');
|
|
151
|
+
let stat;
|
|
152
|
+
try {
|
|
153
|
+
stat = (0, fs_1.statSync)(fullPath);
|
|
154
|
+
}
|
|
155
|
+
catch {
|
|
156
|
+
continue;
|
|
157
|
+
}
|
|
158
|
+
const existing = existingMap.get(relPath);
|
|
159
|
+
const lastModifiedMs = stat.mtimeMs;
|
|
160
|
+
// Fast path: mtime unchanged → skip rehash
|
|
161
|
+
if (existing && Math.abs(existing.lastModifiedMs - lastModifiedMs) < 1000) {
|
|
162
|
+
entries.push(existing);
|
|
163
|
+
skippedFiles++;
|
|
164
|
+
}
|
|
165
|
+
else {
|
|
166
|
+
const contentHash = hashFileAtPath(fullPath);
|
|
167
|
+
if (!contentHash)
|
|
168
|
+
continue;
|
|
169
|
+
const isUpdated = existing !== undefined && existing.contentHash !== contentHash;
|
|
170
|
+
if (isUpdated)
|
|
171
|
+
updatedFiles++;
|
|
172
|
+
entries.push({
|
|
173
|
+
filePath: relPath,
|
|
174
|
+
contentHash,
|
|
175
|
+
lastModifiedMs,
|
|
176
|
+
sizeBytes: stat.size,
|
|
177
|
+
indexed: true,
|
|
178
|
+
});
|
|
179
|
+
builtFiles++;
|
|
180
|
+
}
|
|
181
|
+
if (options.onProgress && (i % 100 === 0 || i === allFiles.length - 1)) {
|
|
182
|
+
options.onProgress(i + 1, allFiles.length);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
const manifest = saveBrainCacheManifest(projectRoot, {
|
|
186
|
+
schemaVersion: exports.BRAIN_CACHE_SCHEMA_VERSION,
|
|
187
|
+
repoRoot: projectRoot,
|
|
188
|
+
builtAt: new Date().toISOString(),
|
|
189
|
+
totalFiles: entries.length,
|
|
190
|
+
indexedFiles: entries.filter((e) => e.indexed).length,
|
|
191
|
+
contentFingerprint: contentFingerprint(entries),
|
|
192
|
+
files: entries,
|
|
193
|
+
});
|
|
194
|
+
return {
|
|
195
|
+
manifest,
|
|
196
|
+
builtFiles,
|
|
197
|
+
skippedFiles,
|
|
198
|
+
updatedFiles,
|
|
199
|
+
elapsedMs: Date.now() - start,
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
// ── Cache status ───────────────────────────────────────────────────────────────
|
|
203
|
+
function getBrainCacheStatus(projectRoot) {
|
|
204
|
+
const cacheDir = getBrainCacheDir(projectRoot);
|
|
205
|
+
const manifestPath = getBrainCacheManifestPath(projectRoot);
|
|
206
|
+
const semanticIndexPath = getBrainCacheSemanticIndexPath(projectRoot);
|
|
207
|
+
const manifest = loadBrainCacheManifest(projectRoot);
|
|
208
|
+
if (!manifest) {
|
|
209
|
+
return {
|
|
210
|
+
exists: false,
|
|
211
|
+
manifest: null,
|
|
212
|
+
staleFiles: [],
|
|
213
|
+
missingFiles: [],
|
|
214
|
+
newFiles: [],
|
|
215
|
+
totalFiles: 0,
|
|
216
|
+
freshFiles: 0,
|
|
217
|
+
stalePercent: 0,
|
|
218
|
+
needsRebuild: true,
|
|
219
|
+
cacheDir,
|
|
220
|
+
manifestPath,
|
|
221
|
+
semanticIndexPath,
|
|
222
|
+
sizeBytes: 0,
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
// Check staleness: compare manifest hashes against current files
|
|
226
|
+
const staleFiles = [];
|
|
227
|
+
const missingFiles = [];
|
|
228
|
+
for (const entry of manifest.files) {
|
|
229
|
+
const fullPath = (0, path_1.join)(projectRoot, entry.filePath);
|
|
230
|
+
if (!(0, fs_1.existsSync)(fullPath)) {
|
|
231
|
+
missingFiles.push(entry.filePath);
|
|
232
|
+
continue;
|
|
233
|
+
}
|
|
234
|
+
const currentHash = hashFileAtPath(fullPath);
|
|
235
|
+
if (currentHash !== entry.contentHash) {
|
|
236
|
+
staleFiles.push(entry.filePath);
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
// Detect new files not in manifest
|
|
240
|
+
const manifestFileSet = new Set(manifest.files.map((f) => f.filePath));
|
|
241
|
+
const currentFiles = scanIndexableFiles(projectRoot, 10_000);
|
|
242
|
+
const newFiles = [];
|
|
243
|
+
for (const f of currentFiles) {
|
|
244
|
+
const rel = (0, path_1.relative)(projectRoot, f).split(path_1.sep).join('/');
|
|
245
|
+
if (!manifestFileSet.has(rel))
|
|
246
|
+
newFiles.push(rel);
|
|
247
|
+
}
|
|
248
|
+
const totalFiles = manifest.totalFiles;
|
|
249
|
+
const changedFiles = staleFiles.length + missingFiles.length;
|
|
250
|
+
const freshFiles = totalFiles - changedFiles;
|
|
251
|
+
const stalePercent = totalFiles > 0 ? Math.round((changedFiles / totalFiles) * 100) : 0;
|
|
252
|
+
const needsRebuild = stalePercent > 20 || newFiles.length > 50;
|
|
253
|
+
let sizeBytes = 0;
|
|
254
|
+
for (const path of [manifestPath, semanticIndexPath]) {
|
|
255
|
+
try {
|
|
256
|
+
sizeBytes += (0, fs_1.statSync)(path).size;
|
|
257
|
+
}
|
|
258
|
+
catch { /* ignore */ }
|
|
259
|
+
}
|
|
260
|
+
return {
|
|
261
|
+
exists: true,
|
|
262
|
+
manifest,
|
|
263
|
+
staleFiles,
|
|
264
|
+
missingFiles,
|
|
265
|
+
newFiles,
|
|
266
|
+
totalFiles,
|
|
267
|
+
freshFiles,
|
|
268
|
+
stalePercent,
|
|
269
|
+
needsRebuild,
|
|
270
|
+
cacheDir,
|
|
271
|
+
manifestPath,
|
|
272
|
+
semanticIndexPath,
|
|
273
|
+
sizeBytes,
|
|
274
|
+
};
|
|
275
|
+
}
|
|
276
|
+
function restoreBrainCache(options) {
|
|
277
|
+
const { projectRoot, artifactPath } = options;
|
|
278
|
+
if (!(0, fs_1.existsSync)(artifactPath)) {
|
|
279
|
+
return {
|
|
280
|
+
success: false,
|
|
281
|
+
manifest: null,
|
|
282
|
+
message: `Artifact not found: ${artifactPath}`,
|
|
283
|
+
staleAfterRestore: 0,
|
|
284
|
+
};
|
|
285
|
+
}
|
|
286
|
+
let artifact;
|
|
287
|
+
try {
|
|
288
|
+
artifact = JSON.parse((0, fs_1.readFileSync)(artifactPath, 'utf-8'));
|
|
289
|
+
}
|
|
290
|
+
catch (err) {
|
|
291
|
+
return {
|
|
292
|
+
success: false,
|
|
293
|
+
manifest: null,
|
|
294
|
+
message: `Failed to parse artifact: ${err instanceof Error ? err.message : String(err)}`,
|
|
295
|
+
staleAfterRestore: 0,
|
|
296
|
+
};
|
|
297
|
+
}
|
|
298
|
+
if (artifact.schemaVersion !== exports.BRAIN_CACHE_SCHEMA_VERSION) {
|
|
299
|
+
return {
|
|
300
|
+
success: false,
|
|
301
|
+
manifest: null,
|
|
302
|
+
message: `Incompatible cache schema: ${artifact.schemaVersion} (expected ${exports.BRAIN_CACHE_SCHEMA_VERSION})`,
|
|
303
|
+
staleAfterRestore: 0,
|
|
304
|
+
};
|
|
305
|
+
}
|
|
306
|
+
// Write artifact to cache dir
|
|
307
|
+
const cacheDir = getBrainCacheDir(projectRoot);
|
|
308
|
+
(0, fs_1.mkdirSync)(cacheDir, { recursive: true });
|
|
309
|
+
(0, fs_1.writeFileSync)(getBrainCacheManifestPath(projectRoot), JSON.stringify(artifact, null, 2), 'utf-8');
|
|
310
|
+
// Quick staleness check on restore
|
|
311
|
+
let staleAfterRestore = 0;
|
|
312
|
+
for (const entry of artifact.files.slice(0, 200)) { // sample first 200
|
|
313
|
+
const fullPath = (0, path_1.join)(projectRoot, entry.filePath);
|
|
314
|
+
if (!(0, fs_1.existsSync)(fullPath)) {
|
|
315
|
+
staleAfterRestore++;
|
|
316
|
+
continue;
|
|
317
|
+
}
|
|
318
|
+
const hash = hashFileAtPath(fullPath);
|
|
319
|
+
if (hash !== entry.contentHash)
|
|
320
|
+
staleAfterRestore++;
|
|
321
|
+
}
|
|
322
|
+
return {
|
|
323
|
+
success: true,
|
|
324
|
+
manifest: artifact,
|
|
325
|
+
message: `Cache restored from ${artifactPath} (${artifact.totalFiles} files, built ${artifact.builtAt})`,
|
|
326
|
+
staleAfterRestore,
|
|
327
|
+
};
|
|
328
|
+
}
|
|
329
|
+
// ── CI artifact export ─────────────────────────────────────────────────────────
|
|
330
|
+
/**
|
|
331
|
+
* Export the current cache manifest as a CI artifact.
|
|
332
|
+
* CI pipelines can cache this file and restore it on subsequent runs.
|
|
333
|
+
*/
|
|
334
|
+
function exportBrainCacheArtifact(projectRoot, outputPath) {
|
|
335
|
+
const manifest = loadBrainCacheManifest(projectRoot);
|
|
336
|
+
if (!manifest)
|
|
337
|
+
return false;
|
|
338
|
+
try {
|
|
339
|
+
(0, fs_1.writeFileSync)(outputPath, JSON.stringify(manifest, null, 2), 'utf-8');
|
|
340
|
+
return true;
|
|
341
|
+
}
|
|
342
|
+
catch {
|
|
343
|
+
return false;
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
//# sourceMappingURL=brain-cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"brain-cache.js","sourceRoot":"","sources":["../../src/utils/brain-cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Governance Provenance Chain
|
|
3
|
+
*
|
|
4
|
+
* Every neurcode verify run persists a signed fingerprint record.
|
|
5
|
+
* The record proves exactly why a governance decision happened:
|
|
6
|
+
* which rules ran, what they found, what was suppressed, and why.
|
|
7
|
+
*
|
|
8
|
+
* Stored at: .neurcode/provenance/{runId}.json
|
|
9
|
+
* Index: .neurcode/provenance/index.json
|
|
10
|
+
*
|
|
11
|
+
* @process-local Provenance records are per-workstation/CI runner.
|
|
12
|
+
* For org-wide auditability, upload records to your SIEM or audit log system.
|
|
13
|
+
*/
|
|
14
|
+
export interface ProvenanceRecord {
|
|
15
|
+
runId: string;
|
|
16
|
+
runAt: string;
|
|
17
|
+
schemaVersion: 1;
|
|
18
|
+
repoRoot: string;
|
|
19
|
+
filesAnalyzed: number;
|
|
20
|
+
diffContext: string;
|
|
21
|
+
planId: string | null;
|
|
22
|
+
intentHash: string | null;
|
|
23
|
+
policyHash: string | null;
|
|
24
|
+
ruleIds: string[];
|
|
25
|
+
blockingCount: number;
|
|
26
|
+
advisoryCount: number;
|
|
27
|
+
suppressedCount: number;
|
|
28
|
+
structuralBlockingCount: number;
|
|
29
|
+
structuralAdvisoryCount: number;
|
|
30
|
+
deterministicSignals: number;
|
|
31
|
+
heuristicSignals: number;
|
|
32
|
+
overallTrustScore: number;
|
|
33
|
+
verdict: 'PASS' | 'FAIL' | 'WARN';
|
|
34
|
+
governanceDecision: string;
|
|
35
|
+
fingerprint: string;
|
|
36
|
+
signature: string | null;
|
|
37
|
+
signingKeyId: string | null;
|
|
38
|
+
}
|
|
39
|
+
export interface ProvenanceIndex {
|
|
40
|
+
schemaVersion: 1;
|
|
41
|
+
records: Array<{
|
|
42
|
+
runId: string;
|
|
43
|
+
runAt: string;
|
|
44
|
+
verdict: string;
|
|
45
|
+
planId: string | null;
|
|
46
|
+
fingerprint: string;
|
|
47
|
+
}>;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Build a provenance record from verify run results.
|
|
51
|
+
* The fingerprint is SHA-256 of: runId + runAt + ruleIds.sort().join(',') + blockingCount + verdict
|
|
52
|
+
*/
|
|
53
|
+
export declare function buildProvenanceRecord(input: {
|
|
54
|
+
repoRoot: string;
|
|
55
|
+
filesAnalyzed: number;
|
|
56
|
+
diffContext: string;
|
|
57
|
+
planId: string | null;
|
|
58
|
+
intentHash: string | null;
|
|
59
|
+
policyHash: string | null;
|
|
60
|
+
ruleIds: string[];
|
|
61
|
+
blockingCount: number;
|
|
62
|
+
advisoryCount: number;
|
|
63
|
+
suppressedCount: number;
|
|
64
|
+
structuralBlockingCount: number;
|
|
65
|
+
structuralAdvisoryCount: number;
|
|
66
|
+
deterministicSignals: number;
|
|
67
|
+
heuristicSignals: number;
|
|
68
|
+
overallTrustScore: number;
|
|
69
|
+
verdict: 'PASS' | 'FAIL' | 'WARN';
|
|
70
|
+
governanceDecision: string;
|
|
71
|
+
}): ProvenanceRecord;
|
|
72
|
+
/**
|
|
73
|
+
* Persist a provenance record to .neurcode/provenance/.
|
|
74
|
+
* Updates the index file atomically.
|
|
75
|
+
* Index retains last 1000 records (trims oldest first).
|
|
76
|
+
*/
|
|
77
|
+
export declare function saveProvenanceRecord(repoRoot: string, record: ProvenanceRecord): void;
|
|
78
|
+
/**
|
|
79
|
+
* Load the provenance index.
|
|
80
|
+
*/
|
|
81
|
+
export declare function loadProvenanceIndex(repoRoot: string): ProvenanceIndex;
|
|
82
|
+
/**
|
|
83
|
+
* Load a specific provenance record by runId.
|
|
84
|
+
*/
|
|
85
|
+
export declare function loadProvenanceRecord(repoRoot: string, runId: string): ProvenanceRecord | null;
|
|
86
|
+
/**
|
|
87
|
+
* Get the last N provenance records (most recent first).
|
|
88
|
+
*/
|
|
89
|
+
export declare function getRecentProvenance(repoRoot: string, limit?: number): ProvenanceRecord[];
|
|
90
|
+
/**
|
|
91
|
+
* Verify the integrity fingerprint of a stored record.
|
|
92
|
+
* Returns true if fingerprint matches recomputed value.
|
|
93
|
+
*/
|
|
94
|
+
export declare function verifyProvenanceIntegrity(record: ProvenanceRecord): boolean;
|
|
95
|
+
//# sourceMappingURL=governance-provenance.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"governance-provenance.d.ts","sourceRoot":"","sources":["../../src/utils/governance-provenance.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAMH,MAAM,WAAW,gBAAgB;IAE/B,KAAK,EAAY,MAAM,CAAC;IACxB,KAAK,EAAY,MAAM,CAAC;IACxB,aAAa,EAAI,CAAC,CAAC;IAGnB,QAAQ,EAAS,MAAM,CAAC;IACxB,aAAa,EAAI,MAAM,CAAC;IACxB,WAAW,EAAM,MAAM,CAAC;IAGxB,MAAM,EAAW,MAAM,GAAG,IAAI,CAAC;IAC/B,UAAU,EAAO,MAAM,GAAG,IAAI,CAAC;IAC/B,UAAU,EAAO,MAAM,GAAG,IAAI,CAAC;IAC/B,OAAO,EAAU,MAAM,EAAE,CAAC;IAG1B,aAAa,EAAI,MAAM,CAAC;IACxB,aAAa,EAAI,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,uBAAuB,EAAE,MAAM,CAAC;IAChC,uBAAuB,EAAE,MAAM,CAAC;IAGhC,oBAAoB,EAAG,MAAM,CAAC;IAC9B,gBAAgB,EAAO,MAAM,CAAC;IAC9B,iBAAiB,EAAM,MAAM,CAAC;IAG9B,OAAO,EAAU,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IAC1C,kBAAkB,EAAE,MAAM,CAAC;IAG3B,WAAW,EAAM,MAAM,CAAC;IACxB,SAAS,EAAQ,MAAM,GAAG,IAAI,CAAC;IAC/B,YAAY,EAAK,MAAM,GAAG,IAAI,CAAC;CAChC;AAED,MAAM,WAAW,eAAe;IAC9B,aAAa,EAAE,CAAC,CAAC;IACjB,OAAO,EAAE,KAAK,CAAC;QACb,KAAK,EAAQ,MAAM,CAAC;QACpB,KAAK,EAAQ,MAAM,CAAC;QACpB,OAAO,EAAM,MAAM,CAAC;QACpB,MAAM,EAAO,MAAM,GAAG,IAAI,CAAC;QAC3B,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC,CAAC;CACJ;AAiCD;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE;IAC3C,QAAQ,EAAO,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAI,MAAM,CAAC;IACtB,MAAM,EAAS,MAAM,GAAG,IAAI,CAAC;IAC7B,UAAU,EAAK,MAAM,GAAG,IAAI,CAAC;IAC7B,UAAU,EAAK,MAAM,GAAG,IAAI,CAAC;IAC7B,OAAO,EAAQ,MAAM,EAAE,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,uBAAuB,EAAE,MAAM,CAAC;IAChC,uBAAuB,EAAE,MAAM,CAAC;IAChC,oBAAoB,EAAE,MAAM,CAAC;IAC7B,gBAAgB,EAAE,MAAM,CAAC;IACzB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,OAAO,EAAQ,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IACxC,kBAAkB,EAAE,MAAM,CAAC;CAC5B,GAAG,gBAAgB,CA8CnB;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,GAAG,IAAI,CA+BrF;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,eAAe,CAerE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI,CAW7F;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,SAAK,GAAG,gBAAgB,EAAE,CAepF;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAa3E"}
|