@neurcode-ai/cli 0.9.63 → 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/control-plane.js +7 -7
- package/dist/commands/control-plane.js.map +1 -1
- package/dist/commands/fix.d.ts.map +1 -1
- package/dist/commands/fix.js +108 -1
- package/dist/commands/fix.js.map +1 -1
- package/dist/commands/patch-apply.d.ts +2 -0
- package/dist/commands/patch-apply.d.ts.map +1 -1
- package/dist/commands/patch-apply.js +331 -19
- package/dist/commands/patch-apply.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 +35 -5
- package/dist/commands/replay.js.map +1 -1
- package/dist/commands/verify.d.ts.map +1 -1
- package/dist/commands/verify.js +336 -25
- package/dist/commands/verify.js.map +1 -1
- package/dist/commands/workspace.js +7 -7
- package/dist/commands/workspace.js.map +1 -1
- package/dist/daemon/server.d.ts +2 -2
- package/dist/daemon/server.d.ts.map +1 -1
- package/dist/daemon/server.js +2113 -32
- 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 +86 -4
- 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/matcher.d.ts.map +1 -1
- package/dist/intent-engine/matcher.js +2 -0
- package/dist/intent-engine/matcher.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/diff.d.ts +1 -1
- package/dist/patch-engine/diff.js +1 -1
- package/dist/patch-engine/generator.d.ts +9 -0
- package/dist/patch-engine/generator.d.ts.map +1 -1
- package/dist/patch-engine/generator.js +375 -17
- package/dist/patch-engine/generator.js.map +1 -1
- package/dist/patch-engine/index.d.ts +25 -25
- package/dist/patch-engine/index.d.ts.map +1 -1
- package/dist/patch-engine/index.js +134 -87
- package/dist/patch-engine/index.js.map +1 -1
- package/dist/patch-engine/patterns.d.ts +1 -1
- package/dist/patch-engine/patterns.d.ts.map +1 -1
- package/dist/patch-engine/patterns.js +282 -41
- package/dist/patch-engine/patterns.js.map +1 -1
- package/dist/patch-engine/rollback.d.ts +31 -0
- package/dist/patch-engine/rollback.d.ts.map +1 -0
- package/dist/patch-engine/rollback.js +275 -0
- package/dist/patch-engine/rollback.js.map +1 -0
- package/dist/patch-engine/safety.d.ts +28 -0
- package/dist/patch-engine/safety.d.ts.map +1 -0
- package/dist/patch-engine/safety.js +122 -0
- package/dist/patch-engine/safety.js.map +1 -0
- package/dist/patch-engine/transaction.d.ts +52 -0
- package/dist/patch-engine/transaction.d.ts.map +1 -0
- package/dist/patch-engine/transaction.js +93 -0
- package/dist/patch-engine/transaction.js.map +1 -0
- 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/advisory-signals.d.ts +5 -0
- package/dist/utils/advisory-signals.d.ts.map +1 -1
- package/dist/utils/advisory-signals.js +50 -12
- package/dist/utils/advisory-signals.js.map +1 -1
- package/dist/utils/ai-debt-budget.d.ts.map +1 -1
- package/dist/utils/ai-debt-budget.js +5 -2
- package/dist/utils/ai-debt-budget.js.map +1 -1
- 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/cli-json.d.ts.map +1 -1
- package/dist/utils/cli-json.js +80 -12
- package/dist/utils/cli-json.js.map +1 -1
- package/dist/utils/execution-bus.d.ts +10 -0
- package/dist/utils/execution-bus.d.ts.map +1 -1
- package/dist/utils/execution-bus.js +16 -0
- package/dist/utils/execution-bus.js.map +1 -1
- 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/policy-compiler.d.ts +6 -0
- package/dist/utils/policy-compiler.d.ts.map +1 -1
- package/dist/utils/policy-compiler.js +20 -0
- package/dist/utils/policy-compiler.js.map +1 -1
- 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 +10 -10
|
@@ -0,0 +1,347 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Federated Context Builder
|
|
4
|
+
*
|
|
5
|
+
* Answers the question: "When a developer changes files in repo-A, what is the
|
|
6
|
+
* complete blast radius across ALL repos in the workspace?"
|
|
7
|
+
*
|
|
8
|
+
* This is the enterprise multi-repo answer that single-repo context engines cannot
|
|
9
|
+
* provide. The federated context:
|
|
10
|
+
*
|
|
11
|
+
* 1. Builds the PRIMARY context from the repo where changes are occurring
|
|
12
|
+
* (full depth — constraints, advisory, uncertainty)
|
|
13
|
+
*
|
|
14
|
+
* 2. Resolves SECONDARY context for every repo transitively affected
|
|
15
|
+
* via cross-repo edges (lighter weight — impacted files + why)
|
|
16
|
+
*
|
|
17
|
+
* 3. Returns BLIND SPOTS — coupling that cannot be detected structurally
|
|
18
|
+
* (config coupling, runtime service discovery, infra-level routing)
|
|
19
|
+
*
|
|
20
|
+
* The output is deterministic: same changed files + same workspace topology
|
|
21
|
+
* + same cross-repo graph → identical FederatedContextPackage.
|
|
22
|
+
*
|
|
23
|
+
* Design constraint: this layer is ADDITIVE. It never replaces the primary
|
|
24
|
+
* single-repo context engine. It extends it with cross-repo intelligence.
|
|
25
|
+
*/
|
|
26
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
27
|
+
exports.buildFederatedContext = buildFederatedContext;
|
|
28
|
+
exports.formatFederatedContextSummary = formatFederatedContextSummary;
|
|
29
|
+
const cross_repo_graph_1 = require("./cross-repo-graph");
|
|
30
|
+
/** Hard ceilings for cross-repo expansion — deterministic caps, never silent. */
|
|
31
|
+
const MAX_FEDERATED_DOWNSTREAM_REPOS = 24;
|
|
32
|
+
const MAX_FEDERATED_UPSTREAM_REPOS = 24;
|
|
33
|
+
const MAX_FEDERATED_TOTAL_EDGES = 400;
|
|
34
|
+
/**
|
|
35
|
+
* Build the federated context package for a multi-repo workspace.
|
|
36
|
+
*
|
|
37
|
+
* This is the core function that answers: "What is the blast radius
|
|
38
|
+
* of this change across the entire service mesh?"
|
|
39
|
+
*/
|
|
40
|
+
function buildFederatedContext(input) {
|
|
41
|
+
const { workspaceName, repos, primaryRepoName, changedFiles, brainMaps = {}, } = input;
|
|
42
|
+
const truncationReasons = [];
|
|
43
|
+
const changedFilesSorted = [...changedFiles].sort((a, b) => a.localeCompare(b));
|
|
44
|
+
// Step 1: Build the cross-repo graph (or use pre-built)
|
|
45
|
+
const crossRepoGraph = (0, cross_repo_graph_1.buildCrossRepoGraph)({ repos, brainMaps });
|
|
46
|
+
// Step 2: Find all edges FROM changed files in the primary repo
|
|
47
|
+
// These edges tell us: "this file couples to another repo"
|
|
48
|
+
const allEdgesFromChanges = [];
|
|
49
|
+
for (const changedFile of changedFilesSorted) {
|
|
50
|
+
const edges = (0, cross_repo_graph_1.getEdgesForFile)(crossRepoGraph, primaryRepoName, changedFile);
|
|
51
|
+
allEdgesFromChanges.push(...edges);
|
|
52
|
+
}
|
|
53
|
+
// Step 3: Identify all edges pointing TO the primary repo's changed files
|
|
54
|
+
// These tell us: "another repo imports THIS file we just changed"
|
|
55
|
+
const inboundEdgesFromChanges = [];
|
|
56
|
+
for (const changedFile of changedFilesSorted) {
|
|
57
|
+
const edges = (0, cross_repo_graph_1.getEdgesPointingToFile)(crossRepoGraph, primaryRepoName, changedFile);
|
|
58
|
+
inboundEdgesFromChanges.push(...edges);
|
|
59
|
+
}
|
|
60
|
+
const combinedEdges = [...allEdgesFromChanges, ...inboundEdgesFromChanges];
|
|
61
|
+
if (combinedEdges.length > MAX_FEDERATED_TOTAL_EDGES) {
|
|
62
|
+
truncationReasons.push(`total cross-repo edges capped at ${MAX_FEDERATED_TOTAL_EDGES} (had ${combinedEdges.length})`);
|
|
63
|
+
}
|
|
64
|
+
// Step 4: Resolve downstream repos — repos that DEPEND ON the primary repo
|
|
65
|
+
// When the primary repo's API/contract changes, these are at risk
|
|
66
|
+
const downstreamRepoNames = (0, cross_repo_graph_1.getDownstreamRepos)(crossRepoGraph, primaryRepoName);
|
|
67
|
+
const affectedDownstreamRepos = downstreamRepoNames
|
|
68
|
+
.map((repoName) => {
|
|
69
|
+
const repoConfig = repos.find((r) => r.name === repoName);
|
|
70
|
+
if (!repoConfig)
|
|
71
|
+
return null;
|
|
72
|
+
const relevantEdges = inboundEdgesFromChanges
|
|
73
|
+
.filter((e) => e.fromRepo === repoName)
|
|
74
|
+
.sort((a, b) => confidenceRank(b.confidence) - confidenceRank(a.confidence));
|
|
75
|
+
// Find file-level affected files in this downstream repo
|
|
76
|
+
const affectedFiles = resolveAffectedFilesInRepo(repoConfig, relevantEdges, brainMaps[repoName] ?? null);
|
|
77
|
+
const riskLevel = deriveRiskLevel(relevantEdges);
|
|
78
|
+
const requiresCoordinatedDeploy = relevantEdges.some((e) => e.confidence === 'high' &&
|
|
79
|
+
['shared-contract', 'grpc-client', 'openapi-client'].includes(e.via));
|
|
80
|
+
return {
|
|
81
|
+
repoName,
|
|
82
|
+
repoRoot: repoConfig.rootPath,
|
|
83
|
+
affectedFiles,
|
|
84
|
+
couplingEdges: relevantEdges,
|
|
85
|
+
riskLevel,
|
|
86
|
+
requiresCoordinatedDeploy,
|
|
87
|
+
};
|
|
88
|
+
})
|
|
89
|
+
.filter((r) => r !== null);
|
|
90
|
+
// Step 5: Resolve upstream repos — repos that the primary repo calls
|
|
91
|
+
// When changed files touch those call sites, upstream context matters
|
|
92
|
+
const upstreamRepoNames = (0, cross_repo_graph_1.getUpstreamRepos)(crossRepoGraph, primaryRepoName);
|
|
93
|
+
const relevantUpstreamRepos = upstreamRepoNames
|
|
94
|
+
.filter((repoName) => !repoName.startsWith('external:'))
|
|
95
|
+
.map((repoName) => {
|
|
96
|
+
const repoConfig = repos.find((r) => r.name === repoName);
|
|
97
|
+
if (!repoConfig)
|
|
98
|
+
return null;
|
|
99
|
+
const relevantEdges = allEdgesFromChanges
|
|
100
|
+
.filter((e) => e.toRepo === repoName)
|
|
101
|
+
.sort((a, b) => confidenceRank(b.confidence) - confidenceRank(a.confidence));
|
|
102
|
+
if (relevantEdges.length === 0)
|
|
103
|
+
return null; // upstream but no edge from changed files
|
|
104
|
+
const affectedFiles = resolveAffectedFilesInRepo(repoConfig, relevantEdges, brainMaps[repoName] ?? null);
|
|
105
|
+
const riskLevel = deriveRiskLevel(relevantEdges);
|
|
106
|
+
const requiresCoordinatedDeploy = relevantEdges.some((e) => e.confidence === 'high' &&
|
|
107
|
+
['shared-contract', 'grpc-client', 'openapi-client'].includes(e.via));
|
|
108
|
+
return {
|
|
109
|
+
repoName,
|
|
110
|
+
repoRoot: repoConfig.rootPath,
|
|
111
|
+
affectedFiles,
|
|
112
|
+
couplingEdges: relevantEdges,
|
|
113
|
+
riskLevel,
|
|
114
|
+
requiresCoordinatedDeploy,
|
|
115
|
+
};
|
|
116
|
+
})
|
|
117
|
+
.filter((r) => r !== null);
|
|
118
|
+
// Step 6: Compute federated blindspots
|
|
119
|
+
const federatedBlindSpots = computeFederatedBlindSpots(repos, primaryRepoName, changedFilesSorted, crossRepoGraph);
|
|
120
|
+
let downstreamExport = affectedDownstreamRepos;
|
|
121
|
+
if (downstreamExport.length > MAX_FEDERATED_DOWNSTREAM_REPOS) {
|
|
122
|
+
truncationReasons.push(`downstream repos capped at ${MAX_FEDERATED_DOWNSTREAM_REPOS} (had ${downstreamExport.length})`);
|
|
123
|
+
downstreamExport = downstreamExport
|
|
124
|
+
.slice()
|
|
125
|
+
.sort((a, b) => a.repoName.localeCompare(b.repoName))
|
|
126
|
+
.slice(0, MAX_FEDERATED_DOWNSTREAM_REPOS);
|
|
127
|
+
}
|
|
128
|
+
let upstreamExport = relevantUpstreamRepos;
|
|
129
|
+
if (upstreamExport.length > MAX_FEDERATED_UPSTREAM_REPOS) {
|
|
130
|
+
truncationReasons.push(`upstream repos capped at ${MAX_FEDERATED_UPSTREAM_REPOS} (had ${upstreamExport.length})`);
|
|
131
|
+
upstreamExport = upstreamExport
|
|
132
|
+
.slice()
|
|
133
|
+
.sort((a, b) => a.repoName.localeCompare(b.repoName))
|
|
134
|
+
.slice(0, MAX_FEDERATED_UPSTREAM_REPOS);
|
|
135
|
+
}
|
|
136
|
+
const edgeTotal = Math.min(combinedEdges.length, MAX_FEDERATED_TOTAL_EDGES);
|
|
137
|
+
const coordinatedExport = [
|
|
138
|
+
...downstreamExport.filter((r) => r.requiresCoordinatedDeploy).map((r) => r.repoName),
|
|
139
|
+
...upstreamExport.filter((r) => r.requiresCoordinatedDeploy).map((r) => r.repoName),
|
|
140
|
+
];
|
|
141
|
+
const summary = {
|
|
142
|
+
totalCrossRepoEdgesFromChangedFiles: edgeTotal,
|
|
143
|
+
downstreamRepoCount: downstreamExport.length,
|
|
144
|
+
upstreamRepoCount: upstreamExport.length,
|
|
145
|
+
highConfidenceEdgeCount: combinedEdges
|
|
146
|
+
.filter((e) => e.confidence === 'high')
|
|
147
|
+
.slice(0, MAX_FEDERATED_TOTAL_EDGES)
|
|
148
|
+
.length,
|
|
149
|
+
requiresCoordinatedDeploy: coordinatedExport.length > 0,
|
|
150
|
+
coordinatedDeployRepos: [...new Set(coordinatedExport)].sort(),
|
|
151
|
+
};
|
|
152
|
+
const federationBoundary = {
|
|
153
|
+
maxCrossRepoDepth: 1,
|
|
154
|
+
maxDownstreamReposIncluded: MAX_FEDERATED_DOWNSTREAM_REPOS,
|
|
155
|
+
maxUpstreamReposIncluded: MAX_FEDERATED_UPSTREAM_REPOS,
|
|
156
|
+
maxTotalEdges: MAX_FEDERATED_TOTAL_EDGES,
|
|
157
|
+
traversalOrdering: 'deterministic-alpha',
|
|
158
|
+
truncated: truncationReasons.length > 0,
|
|
159
|
+
truncationReasons,
|
|
160
|
+
};
|
|
161
|
+
return {
|
|
162
|
+
generatedAt: new Date().toISOString(),
|
|
163
|
+
workspaceName,
|
|
164
|
+
primaryRepo: primaryRepoName,
|
|
165
|
+
changedFiles: changedFilesSorted,
|
|
166
|
+
crossRepoGraph,
|
|
167
|
+
affectedDownstreamRepos: downstreamExport,
|
|
168
|
+
relevantUpstreamRepos: upstreamExport,
|
|
169
|
+
federatedBlindSpots,
|
|
170
|
+
summary,
|
|
171
|
+
federationBoundary,
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
// ── Helpers ───────────────────────────────────────────────────────────────────
|
|
175
|
+
function confidenceRank(c) {
|
|
176
|
+
return c === 'high' ? 3 : c === 'medium' ? 2 : 1;
|
|
177
|
+
}
|
|
178
|
+
function deriveRiskLevel(edges) {
|
|
179
|
+
if (edges.some((e) => e.confidence === 'high'))
|
|
180
|
+
return 'high';
|
|
181
|
+
if (edges.some((e) => e.confidence === 'medium'))
|
|
182
|
+
return 'medium';
|
|
183
|
+
return 'low';
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Given edges pointing to/from a repo and its brain map,
|
|
187
|
+
* identify specific files in that repo that are likely affected.
|
|
188
|
+
*/
|
|
189
|
+
function resolveAffectedFilesInRepo(repoConfig, edges, brainMap) {
|
|
190
|
+
const result = [];
|
|
191
|
+
const seen = new Set();
|
|
192
|
+
for (const edge of edges) {
|
|
193
|
+
// If the edge pins a specific file in this repo, include it
|
|
194
|
+
if (edge.toFile && !seen.has(edge.toFile)) {
|
|
195
|
+
seen.add(edge.toFile);
|
|
196
|
+
result.push({
|
|
197
|
+
file: edge.toFile,
|
|
198
|
+
reason: edge.impactSummary,
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
// For shared-contract edges, find the defining file in brain map
|
|
202
|
+
if (edge.via === 'shared-contract' && brainMap) {
|
|
203
|
+
const contractKeyword = edge.evidence[0]
|
|
204
|
+
?.match(/['"]([^'"]+)['"]/)?.[1]
|
|
205
|
+
?.split('/')
|
|
206
|
+
.pop()
|
|
207
|
+
?.replace(/-/g, '') ?? '';
|
|
208
|
+
if (contractKeyword) {
|
|
209
|
+
for (const filePath of Object.keys(brainMap.files)) {
|
|
210
|
+
const norm = filePath.toLowerCase().replace(/[-./]/g, '');
|
|
211
|
+
if (norm.includes(contractKeyword.toLowerCase()) && !seen.has(filePath)) {
|
|
212
|
+
seen.add(filePath);
|
|
213
|
+
result.push({
|
|
214
|
+
file: filePath,
|
|
215
|
+
reason: `Shared contract type definition affected by upstream change`,
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
return result;
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Compute structural blindspots in federated context.
|
|
226
|
+
*
|
|
227
|
+
* These are coupling patterns that exist at infrastructure/config level
|
|
228
|
+
* and cannot be detected by scanning source code.
|
|
229
|
+
*/
|
|
230
|
+
function computeFederatedBlindSpots(repos, primaryRepoName, changedFiles, graph) {
|
|
231
|
+
const spots = [];
|
|
232
|
+
const allRepoNames = repos.filter((r) => r.name !== primaryRepoName).map((r) => r.name);
|
|
233
|
+
// Blindspot 1: Infrastructure-level service routing
|
|
234
|
+
// API gateways, service meshes (Istio/Envoy), and load balancers route
|
|
235
|
+
// traffic based on config files that are not in source code
|
|
236
|
+
const hasApiRouteChanges = changedFiles.some((f) => /route|controller|handler|endpoint/i.test(f));
|
|
237
|
+
if (hasApiRouteChanges) {
|
|
238
|
+
spots.push({
|
|
239
|
+
description: 'API route changes may affect service mesh routing rules (Istio VirtualServices, ' +
|
|
240
|
+
'Kong routes, nginx upstreams) that are defined in infrastructure repos not scanned here.',
|
|
241
|
+
potentialRepos: allRepoNames,
|
|
242
|
+
structuralGap: 'infra-routing-config',
|
|
243
|
+
});
|
|
244
|
+
}
|
|
245
|
+
// Blindspot 2: Runtime service discovery
|
|
246
|
+
// Services registered in consul/etcd/k8s service registry are resolved at runtime.
|
|
247
|
+
// Code scanning cannot see this registration.
|
|
248
|
+
const detectedEnvServiceUrls = graph.edges.filter((e) => e.fromRepo === primaryRepoName && e.via === 'env-service-url');
|
|
249
|
+
if (detectedEnvServiceUrls.length > 0) {
|
|
250
|
+
spots.push({
|
|
251
|
+
description: 'Service URLs resolved via environment variables at runtime — the actual target ' +
|
|
252
|
+
'service depends on deployment configuration (Kubernetes ConfigMaps, Vault, ' +
|
|
253
|
+
'cloud parameter stores) not visible to static analysis.',
|
|
254
|
+
potentialRepos: allRepoNames,
|
|
255
|
+
structuralGap: 'runtime-service-discovery',
|
|
256
|
+
});
|
|
257
|
+
}
|
|
258
|
+
// Blindspot 3: Sidecar proxy / service mesh config
|
|
259
|
+
const hasAuthChanges = changedFiles.some((f) => /auth|jwt|token|session|rbac|permission/i.test(f));
|
|
260
|
+
if (hasAuthChanges) {
|
|
261
|
+
spots.push({
|
|
262
|
+
description: 'Authentication changes may affect sidecar proxy config (Envoy JWT filters, ' +
|
|
263
|
+
'Istio AuthorizationPolicies) applied at the mesh level across ALL services ' +
|
|
264
|
+
'without code-level imports.',
|
|
265
|
+
potentialRepos: allRepoNames,
|
|
266
|
+
structuralGap: 'sidecar-proxy-config',
|
|
267
|
+
});
|
|
268
|
+
}
|
|
269
|
+
// Blindspot 4: Feature flag routing
|
|
270
|
+
// Feature flags can route traffic to different service versions at runtime
|
|
271
|
+
const hasFeatureFlagChanges = changedFiles.some((f) => /feature|flag|experiment|variant|rollout|toggle/i.test(f));
|
|
272
|
+
if (hasFeatureFlagChanges) {
|
|
273
|
+
spots.push({
|
|
274
|
+
description: 'Feature flag changes may affect runtime traffic routing across services ' +
|
|
275
|
+
'(LaunchDarkly, Unleash, custom flag evaluators). The set of affected services ' +
|
|
276
|
+
'depends on flag evaluation trees not visible in source code.',
|
|
277
|
+
potentialRepos: allRepoNames,
|
|
278
|
+
structuralGap: 'feature-flag-routing',
|
|
279
|
+
});
|
|
280
|
+
}
|
|
281
|
+
// Blindspot 5: Shared DB state (services sharing a database)
|
|
282
|
+
const hasDbChanges = changedFiles.some((f) => /migration|schema|entity|model|repository|prisma/i.test(f));
|
|
283
|
+
if (hasDbChanges) {
|
|
284
|
+
const dbEdgeRepos = graph.edges
|
|
285
|
+
.filter((e) => e.fromRepo === primaryRepoName && e.via === 'db-shared-schema')
|
|
286
|
+
.map((e) => e.toRepo);
|
|
287
|
+
spots.push({
|
|
288
|
+
description: 'Database schema/migration changes may affect other services that share the ' +
|
|
289
|
+
'same database. Without explicit db-shared-schema edges detected in code, ' +
|
|
290
|
+
'the full set of affected services cannot be determined statically.',
|
|
291
|
+
potentialRepos: dbEdgeRepos.length > 0 ? dbEdgeRepos : allRepoNames,
|
|
292
|
+
structuralGap: 'db-shared-state',
|
|
293
|
+
});
|
|
294
|
+
}
|
|
295
|
+
// Blindspot 6: Compiled proto drift
|
|
296
|
+
const hasProtoChanges = changedFiles.some((f) => /\.proto$|proto\//i.test(f));
|
|
297
|
+
if (hasProtoChanges) {
|
|
298
|
+
spots.push({
|
|
299
|
+
description: 'Proto schema changes require regenerating clients in ALL consuming services. ' +
|
|
300
|
+
'Services that import generated stubs from a registry (npm, artifact store) ' +
|
|
301
|
+
'may not have a code-level import that traces back to this proto file.',
|
|
302
|
+
potentialRepos: allRepoNames,
|
|
303
|
+
structuralGap: 'compiled-proto-drift',
|
|
304
|
+
});
|
|
305
|
+
}
|
|
306
|
+
return spots;
|
|
307
|
+
}
|
|
308
|
+
// ── Formatting Helpers (for CLI / dashboard rendering) ────────────────────────
|
|
309
|
+
function formatFederatedContextSummary(pkg) {
|
|
310
|
+
const lines = [];
|
|
311
|
+
lines.push(`Federated Context: ${pkg.workspaceName}`);
|
|
312
|
+
lines.push(`Primary repo: ${pkg.primaryRepo}`);
|
|
313
|
+
lines.push(`Changed files: ${pkg.changedFiles.length}`);
|
|
314
|
+
lines.push('');
|
|
315
|
+
if (pkg.summary.requiresCoordinatedDeploy) {
|
|
316
|
+
lines.push(`⚠️ Coordinated deploy required: ${pkg.summary.coordinatedDeployRepos.join(', ')}`);
|
|
317
|
+
lines.push('');
|
|
318
|
+
}
|
|
319
|
+
if (pkg.affectedDownstreamRepos.length > 0) {
|
|
320
|
+
lines.push(`Downstream repos affected (${pkg.affectedDownstreamRepos.length}):`);
|
|
321
|
+
for (const repo of pkg.affectedDownstreamRepos) {
|
|
322
|
+
const risk = repo.riskLevel === 'high' ? '🔴' : repo.riskLevel === 'medium' ? '🟡' : '🟢';
|
|
323
|
+
const coordFlag = repo.requiresCoordinatedDeploy ? ' [coordinated-deploy]' : '';
|
|
324
|
+
lines.push(` ${risk} ${repo.repoName}${coordFlag}`);
|
|
325
|
+
for (const edge of repo.couplingEdges.slice(0, 2)) {
|
|
326
|
+
lines.push(` via ${edge.via} (${edge.confidence}) — ${edge.impactSummary}`);
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
lines.push('');
|
|
330
|
+
}
|
|
331
|
+
if (pkg.relevantUpstreamRepos.length > 0) {
|
|
332
|
+
lines.push(`Upstream repos in scope (${pkg.relevantUpstreamRepos.length}):`);
|
|
333
|
+
for (const repo of pkg.relevantUpstreamRepos) {
|
|
334
|
+
const risk = repo.riskLevel === 'high' ? '🔴' : repo.riskLevel === 'medium' ? '🟡' : '🟢';
|
|
335
|
+
lines.push(` ${risk} ${repo.repoName}`);
|
|
336
|
+
}
|
|
337
|
+
lines.push('');
|
|
338
|
+
}
|
|
339
|
+
if (pkg.federatedBlindSpots.length > 0) {
|
|
340
|
+
lines.push(`Structural blindspots (${pkg.federatedBlindSpots.length}):`);
|
|
341
|
+
for (const spot of pkg.federatedBlindSpots) {
|
|
342
|
+
lines.push(` ⚡ [${spot.structuralGap}] ${spot.description.slice(0, 120)}...`);
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
return lines.join('\n');
|
|
346
|
+
}
|
|
347
|
+
//# sourceMappingURL=federated-context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"federated-context.js","sourceRoot":"","sources":["../../src/workspace/federated-context.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Neurcode Workspace Intelligence Layer
|
|
3
|
+
*
|
|
4
|
+
* Provides cross-repo context building for multi-service architectures.
|
|
5
|
+
*
|
|
6
|
+
* Architecture overview:
|
|
7
|
+
*
|
|
8
|
+
* WorkspaceDefinition (workspace-runtime.ts)
|
|
9
|
+
* └─ repos: WorkspaceRepository[] ← topology declaration
|
|
10
|
+
*
|
|
11
|
+
* CrossRepoGraph (cross-repo-graph.ts)
|
|
12
|
+
* └─ edges: CrossRepoEdge[] ← detected coupling (code-level)
|
|
13
|
+
* via: http-client | grpc-client | event-publish | event-subscribe
|
|
14
|
+
* | shared-contract | env-service-url | openapi-client | db-shared-schema
|
|
15
|
+
* confidence: high | medium | low
|
|
16
|
+
*
|
|
17
|
+
* FederatedContextPackage (federated-context.ts)
|
|
18
|
+
* └─ affectedDownstreamRepos[] ← repos that call the changed files
|
|
19
|
+
* └─ relevantUpstreamRepos[] ← repos being called by changed code
|
|
20
|
+
* └─ federatedBlindSpots[] ← coupling invisible to code scanning
|
|
21
|
+
* └─ summary.requiresCoordinatedDeploy ← true = must deploy together
|
|
22
|
+
*
|
|
23
|
+
* Usage:
|
|
24
|
+
* import { buildFederatedContext } from '@neurcode-ai/cli/workspace';
|
|
25
|
+
*
|
|
26
|
+
* const context = buildFederatedContext({
|
|
27
|
+
* workspaceName: 'platform',
|
|
28
|
+
* repos: workspaceDefinition.repositories,
|
|
29
|
+
* primaryRepoName: 'auth-service',
|
|
30
|
+
* changedFiles: ['src/auth/jwt.service.ts'],
|
|
31
|
+
* brainMaps: { 'auth-service': authBrain, 'billing-service': billingBrain },
|
|
32
|
+
* });
|
|
33
|
+
*
|
|
34
|
+
* console.log(formatFederatedContextSummary(context));
|
|
35
|
+
*/
|
|
36
|
+
export { buildCrossRepoGraph, getDownstreamRepos, getEdgesForFile, getEdgesPointingToFile, getUpstreamRepos, type CrossRepoBuildOptions, type CrossRepoEdge, type CrossRepoEdgeConfidence, type CrossRepoEdgeVia, type CrossRepoGraph, } from './cross-repo-graph';
|
|
37
|
+
export { buildFederatedContext, formatFederatedContextSummary, type AffectedRepoContext, type FederatedBlindSpot, type FederatedContextBuildInput, type FederatedContextPackage, type FederatedExpansionBoundary, } from './federated-context';
|
|
38
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/workspace/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAEH,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EAClB,eAAe,EACf,sBAAsB,EACtB,gBAAgB,EAChB,KAAK,qBAAqB,EAC1B,KAAK,aAAa,EAClB,KAAK,uBAAuB,EAC5B,KAAK,gBAAgB,EACrB,KAAK,cAAc,GACpB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,qBAAqB,EACrB,6BAA6B,EAC7B,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EACvB,KAAK,0BAA0B,EAC/B,KAAK,uBAAuB,EAC5B,KAAK,0BAA0B,GAChC,MAAM,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Neurcode Workspace Intelligence Layer
|
|
4
|
+
*
|
|
5
|
+
* Provides cross-repo context building for multi-service architectures.
|
|
6
|
+
*
|
|
7
|
+
* Architecture overview:
|
|
8
|
+
*
|
|
9
|
+
* WorkspaceDefinition (workspace-runtime.ts)
|
|
10
|
+
* └─ repos: WorkspaceRepository[] ← topology declaration
|
|
11
|
+
*
|
|
12
|
+
* CrossRepoGraph (cross-repo-graph.ts)
|
|
13
|
+
* └─ edges: CrossRepoEdge[] ← detected coupling (code-level)
|
|
14
|
+
* via: http-client | grpc-client | event-publish | event-subscribe
|
|
15
|
+
* | shared-contract | env-service-url | openapi-client | db-shared-schema
|
|
16
|
+
* confidence: high | medium | low
|
|
17
|
+
*
|
|
18
|
+
* FederatedContextPackage (federated-context.ts)
|
|
19
|
+
* └─ affectedDownstreamRepos[] ← repos that call the changed files
|
|
20
|
+
* └─ relevantUpstreamRepos[] ← repos being called by changed code
|
|
21
|
+
* └─ federatedBlindSpots[] ← coupling invisible to code scanning
|
|
22
|
+
* └─ summary.requiresCoordinatedDeploy ← true = must deploy together
|
|
23
|
+
*
|
|
24
|
+
* Usage:
|
|
25
|
+
* import { buildFederatedContext } from '@neurcode-ai/cli/workspace';
|
|
26
|
+
*
|
|
27
|
+
* const context = buildFederatedContext({
|
|
28
|
+
* workspaceName: 'platform',
|
|
29
|
+
* repos: workspaceDefinition.repositories,
|
|
30
|
+
* primaryRepoName: 'auth-service',
|
|
31
|
+
* changedFiles: ['src/auth/jwt.service.ts'],
|
|
32
|
+
* brainMaps: { 'auth-service': authBrain, 'billing-service': billingBrain },
|
|
33
|
+
* });
|
|
34
|
+
*
|
|
35
|
+
* console.log(formatFederatedContextSummary(context));
|
|
36
|
+
*/
|
|
37
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
38
|
+
exports.formatFederatedContextSummary = exports.buildFederatedContext = exports.getUpstreamRepos = exports.getEdgesPointingToFile = exports.getEdgesForFile = exports.getDownstreamRepos = exports.buildCrossRepoGraph = void 0;
|
|
39
|
+
var cross_repo_graph_1 = require("./cross-repo-graph");
|
|
40
|
+
Object.defineProperty(exports, "buildCrossRepoGraph", { enumerable: true, get: function () { return cross_repo_graph_1.buildCrossRepoGraph; } });
|
|
41
|
+
Object.defineProperty(exports, "getDownstreamRepos", { enumerable: true, get: function () { return cross_repo_graph_1.getDownstreamRepos; } });
|
|
42
|
+
Object.defineProperty(exports, "getEdgesForFile", { enumerable: true, get: function () { return cross_repo_graph_1.getEdgesForFile; } });
|
|
43
|
+
Object.defineProperty(exports, "getEdgesPointingToFile", { enumerable: true, get: function () { return cross_repo_graph_1.getEdgesPointingToFile; } });
|
|
44
|
+
Object.defineProperty(exports, "getUpstreamRepos", { enumerable: true, get: function () { return cross_repo_graph_1.getUpstreamRepos; } });
|
|
45
|
+
var federated_context_1 = require("./federated-context");
|
|
46
|
+
Object.defineProperty(exports, "buildFederatedContext", { enumerable: true, get: function () { return federated_context_1.buildFederatedContext; } });
|
|
47
|
+
Object.defineProperty(exports, "formatFederatedContextSummary", { enumerable: true, get: function () { return federated_context_1.formatFederatedContextSummary; } });
|
|
48
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/workspace/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;;;AAEH,uDAW4B;AAV1B,uHAAA,mBAAmB,OAAA;AACnB,sHAAA,kBAAkB,OAAA;AAClB,mHAAA,eAAe,OAAA;AACf,0HAAA,sBAAsB,OAAA;AACtB,oHAAA,gBAAgB,OAAA;AAQlB,yDAQ6B;AAP3B,0HAAA,qBAAqB,OAAA;AACrB,kIAAA,6BAA6B,OAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@neurcode-ai/cli",
|
|
3
|
-
"version": "0.9.
|
|
3
|
+
"version": "0.9.65",
|
|
4
4
|
"description": "Neurcode CLI - AI code governance and diff analysis",
|
|
5
5
|
"bin": {
|
|
6
6
|
"neurcode": "dist/index.js"
|
|
@@ -11,12 +11,6 @@
|
|
|
11
11
|
"dist",
|
|
12
12
|
"README.md"
|
|
13
13
|
],
|
|
14
|
-
"scripts": {
|
|
15
|
-
"build": "rm -rf dist && tsc && chmod +x dist/index.js",
|
|
16
|
-
"dev": "tsc --watch",
|
|
17
|
-
"start": "node dist/index.js",
|
|
18
|
-
"prepublishOnly": "npm run build"
|
|
19
|
-
},
|
|
20
14
|
"keywords": [
|
|
21
15
|
"cli",
|
|
22
16
|
"code-governance",
|
|
@@ -42,7 +36,7 @@
|
|
|
42
36
|
"@neurcode-ai/contracts": "^0.1.1",
|
|
43
37
|
"@neurcode-ai/core": "^0.1.0",
|
|
44
38
|
"@neurcode-ai/diff-parser": "^0.1.0",
|
|
45
|
-
"@neurcode-ai/governance-runtime": "^0.1.
|
|
39
|
+
"@neurcode-ai/governance-runtime": "^0.1.3",
|
|
46
40
|
"@neurcode-ai/policy": "^0.1.0",
|
|
47
41
|
"@neurcode-ai/policy-engine": "^0.1.0",
|
|
48
42
|
"better-sqlite3": "^12.5.0",
|
|
@@ -56,7 +50,8 @@
|
|
|
56
50
|
"open": "^10.1.0",
|
|
57
51
|
"ts-morph": "^24.0.0",
|
|
58
52
|
"uuid": "^9.0.1",
|
|
59
|
-
"zod": "^4.3.5"
|
|
53
|
+
"zod": "^4.3.5",
|
|
54
|
+
"@neurcode-ai/telemetry": "0.1.0"
|
|
60
55
|
},
|
|
61
56
|
"publishConfig": {
|
|
62
57
|
"access": "public"
|
|
@@ -67,5 +62,10 @@
|
|
|
67
62
|
"@types/node": "^20.10.0",
|
|
68
63
|
"@types/uuid": "^9.0.8",
|
|
69
64
|
"typescript": "^5.3.0"
|
|
65
|
+
},
|
|
66
|
+
"scripts": {
|
|
67
|
+
"build": "rm -rf dist && tsc && chmod +x dist/index.js",
|
|
68
|
+
"dev": "tsc --watch",
|
|
69
|
+
"start": "node dist/index.js"
|
|
70
70
|
}
|
|
71
|
-
}
|
|
71
|
+
}
|