@neurcode-ai/cli 0.9.64 → 0.9.65
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/brain.d.ts.map +1 -1
- package/dist/commands/brain.js +273 -0
- package/dist/commands/brain.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/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 +307 -24
- 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-pipeline.d.ts +38 -0
- package/dist/governance/canonical-pipeline.d.ts.map +1 -0
- package/dist/governance/canonical-pipeline.js +448 -0
- package/dist/governance/canonical-pipeline.js.map +1 -0
- package/dist/governance/structural-on-diff.d.ts +13 -0
- package/dist/governance/structural-on-diff.d.ts.map +1 -0
- package/dist/governance/structural-on-diff.js +35 -0
- package/dist/governance/structural-on-diff.js.map +1 -0
- package/dist/governance/structural-policy-merge.d.ts +14 -0
- package/dist/governance/structural-policy-merge.d.ts.map +1 -0
- package/dist/governance/structural-policy-merge.js +25 -0
- package/dist/governance/structural-policy-merge.js.map +1 -0
- package/dist/index.js +71 -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/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 +41 -0
- package/dist/structural-rules/index.d.ts.map +1 -0
- package/dist/structural-rules/index.js +141 -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 +11 -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 +86 -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/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 +43 -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/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
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
*/
|
|
7
7
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
8
|
exports.parseIntent = parseIntent;
|
|
9
|
+
const domain_taxonomy_1 = require("./domain-taxonomy");
|
|
9
10
|
// ── Domain keyword map ────────────────────────────────────────────────────────
|
|
10
11
|
const DOMAIN_KEYWORDS = {
|
|
11
12
|
auth: ['auth', 'login', 'logout', 'jwt', 'token', 'session', 'password',
|
|
@@ -24,6 +25,22 @@ const DOMAIN_KEYWORDS = {
|
|
|
24
25
|
notification: ['notification', 'email', 'sms', 'push', 'alert', 'message'],
|
|
25
26
|
file: ['file', 'upload', 'download', 'storage', 's3', 'blob', 'attachment', 'media'],
|
|
26
27
|
testing: ['test', 'spec', 'mock', 'unit', 'integration', 'e2e', 'coverage'],
|
|
28
|
+
// ── New domains ─────────────────────────────────────────────────────────────
|
|
29
|
+
resilience: ['circuit', 'breaker', 'bulkhead', 'retry', 'backoff', 'fallback',
|
|
30
|
+
'timeout', 'half-open', 'coalesce', 'throttle', 'jitter', 'probe',
|
|
31
|
+
'resilience', 'shed'],
|
|
32
|
+
infrastructure: ['middleware', 'proxy', 'gateway', 'kubernetes', 'docker',
|
|
33
|
+
'container', 'deployment', 'health', 'liveness', 'readiness'],
|
|
34
|
+
concurrency: ['concurrent', 'async', 'await', 'promise', 'race', 'mutex',
|
|
35
|
+
'semaphore', 'lock', 'atomic', 'deadlock', 'goroutine', 'asyncio',
|
|
36
|
+
'thread'],
|
|
37
|
+
observability: ['metric', 'trace', 'span', 'telemetry', 'prometheus', 'grafana',
|
|
38
|
+
'datadog', 'alert', 'dashboard', 'monitor'],
|
|
39
|
+
caching: ['cache', 'redis', 'memcached', 'ttl', 'eviction', 'lru', 'invalidat'],
|
|
40
|
+
messaging: ['queue', 'topic', 'kafka', 'rabbitmq', 'sqs', 'sns', 'pubsub',
|
|
41
|
+
'publish', 'subscribe', 'consumer'],
|
|
42
|
+
'ml-inference': ['model', 'inference', 'embedding', 'vector', 'tensor', 'llm',
|
|
43
|
+
'gpu', 'cuda', 'onnx'],
|
|
27
44
|
};
|
|
28
45
|
// ── Domain → expected patterns ────────────────────────────────────────────────
|
|
29
46
|
const DOMAIN_PATTERNS = {
|
|
@@ -41,6 +58,17 @@ const DOMAIN_PATTERNS = {
|
|
|
41
58
|
notification: ['retry logic', 'delivery confirmation', 'template validation'],
|
|
42
59
|
file: ['file type validation', 'size limits', 'virus scanning', 'access control'],
|
|
43
60
|
testing: ['coverage thresholds', 'mock boundaries', 'assertion completeness'],
|
|
61
|
+
// ── New domains ─────────────────────────────────────────────────────────────
|
|
62
|
+
resilience: ['single-probe half-open gate', 'bounded retry with backoff',
|
|
63
|
+
'circuit state hooks', 'fallback handler', 'timeout propagation'],
|
|
64
|
+
infrastructure: ['health endpoint', 'graceful shutdown', 'config validation',
|
|
65
|
+
'middleware chain'],
|
|
66
|
+
concurrency: ['abort signal propagation', 'cancellation token',
|
|
67
|
+
'bounded concurrency', 'timer cleanup'],
|
|
68
|
+
observability: ['structured logging', 'span creation', 'metric emission',
|
|
69
|
+
'alert threshold'],
|
|
70
|
+
caching: ['TTL eviction', 'bounded cache size', 'cache invalidation',
|
|
71
|
+
'stale-while-revalidate'],
|
|
44
72
|
};
|
|
45
73
|
// ── Domain → critical rules ───────────────────────────────────────────────────
|
|
46
74
|
const DOMAIN_RULES = {
|
|
@@ -57,6 +85,12 @@ const DOMAIN_RULES = {
|
|
|
57
85
|
notification: ['validate-recipients', 'rate-limit-sends'],
|
|
58
86
|
file: ['validate-file-type', 'enforce-size-limit', 'sanitize-filename'],
|
|
59
87
|
testing: ['no-test-skips', 'no-only-blocks'],
|
|
88
|
+
// ── New domains ─────────────────────────────────────────────────────────────
|
|
89
|
+
resilience: ['single-probe-halfopen', 'bounded-retry', 'circuit-hooks',
|
|
90
|
+
'timer-cleanup', 'abort-signal'],
|
|
91
|
+
infrastructure: ['validate-config', 'graceful-shutdown', 'health-endpoint'],
|
|
92
|
+
concurrency: ['propagate-abort-signal', 'bounded-concurrency', 'cleanup-timers'],
|
|
93
|
+
caching: ['bound-cache-size', 'ttl-eviction', 'invalidation-strategy'],
|
|
60
94
|
};
|
|
61
95
|
// ── Public API ────────────────────────────────────────────────────────────────
|
|
62
96
|
function parseIntent(intent) {
|
|
@@ -67,6 +101,7 @@ function parseIntent(intent) {
|
|
|
67
101
|
const words = lower.split(/\W+/).filter(Boolean);
|
|
68
102
|
const wordSet = new Set(words);
|
|
69
103
|
const matchedDomains = new Set();
|
|
104
|
+
// Step 1: keyword-heuristic matching (existing approach)
|
|
70
105
|
for (const [domain, keywords] of Object.entries(DOMAIN_KEYWORDS)) {
|
|
71
106
|
for (const keyword of keywords) {
|
|
72
107
|
if (lower.includes(keyword) || wordSet.has(keyword)) {
|
|
@@ -75,6 +110,18 @@ function parseIntent(intent) {
|
|
|
75
110
|
}
|
|
76
111
|
}
|
|
77
112
|
}
|
|
113
|
+
// Step 2: taxonomy-based classification — merge primary domains into results
|
|
114
|
+
const taxonomyResult = (0, domain_taxonomy_1.classifyDomains)(intent);
|
|
115
|
+
for (const domainId of taxonomyResult.primary) {
|
|
116
|
+
// Normalise data-access → database for backward compatibility with
|
|
117
|
+
// existing DOMAIN_PATTERNS / DOMAIN_RULES keys
|
|
118
|
+
if (domainId === 'data-access') {
|
|
119
|
+
matchedDomains.add('database');
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
matchedDomains.add(domainId);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
78
125
|
const domains = [...matchedDomains];
|
|
79
126
|
const expectedPatterns = [];
|
|
80
127
|
const criticalRules = [];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/intent-engine/parser.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;
|
|
1
|
+
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/intent-engine/parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Semantic Intent Expander (Phase 2)
|
|
3
|
+
*
|
|
4
|
+
* Calls an LLM exactly ONCE per unique intent to produce a structured
|
|
5
|
+
* semantic expansion. The result is stored as a signed governance artifact
|
|
6
|
+
* (HMAC-SHA256) so all subsequent enforcement runs against the same
|
|
7
|
+
* deterministic stored result — never re-calling the LLM.
|
|
8
|
+
*
|
|
9
|
+
* ┌──────────────────────────────────────────────────────────────┐
|
|
10
|
+
* │ TRUST MODEL │
|
|
11
|
+
* │ │
|
|
12
|
+
* │ LLM is used for UNDERSTANDING (once, stored, signed). │
|
|
13
|
+
* │ All ENFORCEMENT decisions are deterministic (regex/AST). │
|
|
14
|
+
* │ │
|
|
15
|
+
* │ This mirrors how human architects write design docs: │
|
|
16
|
+
* │ judgment applied once → all reviews check the document. │
|
|
17
|
+
* └──────────────────────────────────────────────────────────────┘
|
|
18
|
+
*
|
|
19
|
+
* Provider support: any OpenAI-compatible HTTP endpoint.
|
|
20
|
+
* - OpenAI: NEURCODE_OPENAI_API_KEY (default)
|
|
21
|
+
* - Anthropic: NEURCODE_ANTHROPIC_API_KEY (maps to their API)
|
|
22
|
+
* - Local: NEURCODE_LLM_BASE_URL=http://localhost:11434/v1 (Ollama)
|
|
23
|
+
*
|
|
24
|
+
* Fallback: if no API key is configured, silently falls back to the
|
|
25
|
+
* deterministic keyword parser — expansion still produced, marked
|
|
26
|
+
* expansionMethod='keyword-fallback'.
|
|
27
|
+
*/
|
|
28
|
+
import { z } from 'zod';
|
|
29
|
+
import { ParsedIntent } from './parser';
|
|
30
|
+
/**
|
|
31
|
+
* The structured output schema enforced on the LLM response.
|
|
32
|
+
* Zod parses and strips any extra fields — if the LLM hallucinates
|
|
33
|
+
* fields outside this schema they are silently dropped.
|
|
34
|
+
*/
|
|
35
|
+
declare const SemanticExpansionResponseSchema: z.ZodObject<{
|
|
36
|
+
semanticDescription: z.ZodString;
|
|
37
|
+
domains: z.ZodArray<z.ZodString>;
|
|
38
|
+
affectedLayerHints: z.ZodArray<z.ZodString>;
|
|
39
|
+
expectedFilePatterns: z.ZodArray<z.ZodString>;
|
|
40
|
+
policyApplicability: z.ZodArray<z.ZodString>;
|
|
41
|
+
riskLevel: z.ZodEnum<{
|
|
42
|
+
low: "low";
|
|
43
|
+
medium: "medium";
|
|
44
|
+
high: "high";
|
|
45
|
+
critical: "critical";
|
|
46
|
+
}>;
|
|
47
|
+
riskRationale: z.ZodString;
|
|
48
|
+
semanticKeywords: z.ZodArray<z.ZodString>;
|
|
49
|
+
}, z.core.$strip>;
|
|
50
|
+
type SemanticExpansionResponse = z.infer<typeof SemanticExpansionResponseSchema>;
|
|
51
|
+
export interface SemanticIntentExpansion extends SemanticExpansionResponse {
|
|
52
|
+
/** SHA-256 of normalized intent — stable identifier for this expansion. */
|
|
53
|
+
intentHash: string;
|
|
54
|
+
rawIntent: string;
|
|
55
|
+
expansionMethod: 'llm' | 'keyword-fallback';
|
|
56
|
+
modelUsed: string | null;
|
|
57
|
+
expandedAt: string;
|
|
58
|
+
/** Carries parsed keyword data for backward-compat with existing matcher. */
|
|
59
|
+
parsedKeyword: ParsedIntent;
|
|
60
|
+
/** HMAC-SHA256 signature — tamper-evident. Present when signing key configured. */
|
|
61
|
+
signature?: {
|
|
62
|
+
algorithm: 'hmac-sha256';
|
|
63
|
+
keyId: string | null;
|
|
64
|
+
signedAt: string;
|
|
65
|
+
payloadHash: string;
|
|
66
|
+
value: string;
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
export interface ExpandIntentOptions {
|
|
70
|
+
cwd: string;
|
|
71
|
+
/** Force a fresh LLM call even if a cached expansion exists. */
|
|
72
|
+
forceRefresh?: boolean;
|
|
73
|
+
/** Skip signing (for tests). */
|
|
74
|
+
skipSigning?: boolean;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Expands an intent into a rich semantic governance artifact.
|
|
78
|
+
*
|
|
79
|
+
* Call flow:
|
|
80
|
+
* 1. Check cache (.neurcode/intent-expansions/{hash}.json)
|
|
81
|
+
* 2. If fresh cached → return it (pure deterministic path)
|
|
82
|
+
* 3. If no cache and LLM available → call LLM once, sign, store, return
|
|
83
|
+
* 4. If no cache and no LLM → keyword fallback, sign, store, return
|
|
84
|
+
*
|
|
85
|
+
* The returned artifact is always HMAC-signed if a signing key is configured.
|
|
86
|
+
* Callers must treat this artifact as the authoritative intent record.
|
|
87
|
+
*/
|
|
88
|
+
export declare function expandIntent(rawIntent: string, options: ExpandIntentOptions): Promise<SemanticIntentExpansion>;
|
|
89
|
+
/**
|
|
90
|
+
* Loads a cached expansion for an intent, or null if not found.
|
|
91
|
+
* Used by verify/plan to retrieve the stored governance artifact.
|
|
92
|
+
*/
|
|
93
|
+
export declare function loadCachedExpansion(cwd: string, rawIntent: string): SemanticIntentExpansion | null;
|
|
94
|
+
/**
|
|
95
|
+
* Lists all cached expansion hashes in this workspace.
|
|
96
|
+
*/
|
|
97
|
+
export declare function listCachedExpansions(cwd: string): string[];
|
|
98
|
+
/**
|
|
99
|
+
* Returns a human-readable summary of what the intent expander knows.
|
|
100
|
+
* Useful for `neurcode intent show` command and audit reports.
|
|
101
|
+
*/
|
|
102
|
+
export declare function formatExpansionSummary(exp: SemanticIntentExpansion): string;
|
|
103
|
+
export {};
|
|
104
|
+
//# sourceMappingURL=semantic-expander.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"semantic-expander.d.ts","sourceRoot":"","sources":["../../src/intent-engine/semantic-expander.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAKH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAe,YAAY,EAAE,MAAM,UAAU,CAAC;AAQrD;;;;GAIG;AACH,QAAA,MAAM,+BAA+B;;;;;;;;;;;;;;iBASnC,CAAC;AAEH,KAAK,yBAAyB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,+BAA+B,CAAC,CAAC;AAEjF,MAAM,WAAW,uBAAwB,SAAQ,yBAAyB;IACxE,2EAA2E;IAC3E,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,KAAK,GAAG,kBAAkB,CAAC;IAC5C,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,6EAA6E;IAC7E,aAAa,EAAE,YAAY,CAAC;IAC5B,mFAAmF;IACnF,SAAS,CAAC,EAAE;QACV,SAAS,EAAE,aAAa,CAAC;QACzB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;QACrB,QAAQ,EAAE,MAAM,CAAC;QACjB,WAAW,EAAE,MAAM,CAAC;QACpB,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;CACH;AA8TD,MAAM,WAAW,mBAAmB;IAClC,GAAG,EAAE,MAAM,CAAC;IACZ,gEAAgE;IAChE,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,gCAAgC;IAChC,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,YAAY,CAChC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,uBAAuB,CAAC,CA6DlC;AAuCD;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,MAAM,GAChB,uBAAuB,GAAG,IAAI,CAEhC;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAW1D;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,uBAAuB,GAAG,MAAM,CAa3E"}
|