arcvision 0.2.14 → 0.2.15
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/ARCVISION_DIRECTORY_STRUCTURE.md +104 -0
- package/CLI_STRUCTURE.md +110 -0
- package/CONFIGURATION.md +119 -0
- package/IMPLEMENTATION_SUMMARY.md +99 -0
- package/README.md +149 -89
- package/architecture.authority.ledger.json +46 -0
- package/arcvision-0.2.3.tgz +0 -0
- package/arcvision-0.2.4.tgz +0 -0
- package/arcvision-0.2.5.tgz +0 -0
- package/arcvision.context.diff.json +2181 -0
- package/arcvision.context.json +1021 -0
- package/arcvision.context.v1.json +2163 -0
- package/arcvision.context.v2.json +2173 -0
- package/arcvision_context/README.md +93 -0
- package/arcvision_context/architecture.authority.ledger.json +83 -0
- package/arcvision_context/arcvision.context.json +6884 -0
- package/debug-cycle-detection.js +56 -0
- package/dist/index.js +1626 -25
- package/docs/ENHANCED_ACCURACY_SAFETY_PROTOCOL.md +172 -0
- package/docs/accuracy-enhancement-artifacts/enhanced-validation-config.json +98 -0
- package/docs/acig-robustness-guide.md +164 -0
- package/docs/authoritative-gate-implementation.md +168 -0
- package/docs/cli-strengthening-summary.md +232 -0
- package/docs/invariant-system-summary.md +100 -0
- package/docs/invariant-system.md +112 -0
- package/generate_large_test.js +42 -0
- package/large_test_repo.json +1 -0
- package/output1.json +2163 -0
- package/output2.json +2163 -0
- package/package.json +46 -36
- package/scan_calcom_report.txt +0 -0
- package/scan_leafmint_report.txt +0 -0
- package/scan_output.txt +0 -0
- package/scan_trigger_report.txt +0 -0
- package/schema/arcvision_context_schema_v1.json +136 -1
- package/src/arcvision-guard.js +433 -0
- package/src/core/authority-core-detector.js +382 -0
- package/src/core/authority-ledger.js +300 -0
- package/src/core/blastRadius.js +299 -0
- package/src/core/call-resolver.js +196 -0
- package/src/core/change-evaluator.js +509 -0
- package/src/core/change-evaluator.js.backup +424 -0
- package/src/core/change-evaluator.ts +285 -0
- package/src/core/chunked-uploader.js +180 -0
- package/src/core/circular-dependency-detector.js +404 -0
- package/src/core/cli-error-handler.js +458 -0
- package/src/core/cli-validator.js +458 -0
- package/src/core/compression.js +64 -0
- package/src/core/context_builder.js +741 -0
- package/src/core/dependency-manager.js +134 -0
- package/src/core/di-detector.js +202 -0
- package/src/core/diff-analyzer.js +76 -0
- package/src/core/example-invariants.js +135 -0
- package/src/core/failure-mode-synthesizer.js +341 -0
- package/src/core/invariant-analyzer.js +294 -0
- package/src/core/invariant-detector.js +548 -0
- package/src/core/invariant-enforcer.js +171 -0
- package/src/core/invariant-evaluation-utils.js +172 -0
- package/src/core/invariant-hooks.js +152 -0
- package/src/core/invariant-integration-example.js +186 -0
- package/src/core/invariant-registry.js +298 -0
- package/src/core/invariant-registry.ts +100 -0
- package/src/core/invariant-types.js +66 -0
- package/src/core/invariants-index.js +88 -0
- package/src/core/method-tracker.js +170 -0
- package/src/core/override-handler.js +304 -0
- package/src/core/ownership-resolver.js +227 -0
- package/src/core/parser-enhanced.js +80 -0
- package/src/core/parser.js +610 -0
- package/src/core/path-resolver.js +240 -0
- package/src/core/pattern-matcher.js +246 -0
- package/src/core/progress-tracker.js +71 -0
- package/src/core/react-nextjs-detector.js +245 -0
- package/src/core/readme-generator.js +167 -0
- package/src/core/retry-handler.js +57 -0
- package/src/core/scanner.js +289 -0
- package/src/core/semantic-analyzer.js +204 -0
- package/src/core/structural-context-owner.js +442 -0
- package/src/core/symbol-indexer.js +164 -0
- package/src/core/tsconfig-utils.js +73 -0
- package/src/core/type-analyzer.js +272 -0
- package/src/core/watcher.js +18 -0
- package/src/core/workspace-scanner.js +88 -0
- package/src/engine/context_builder.js +280 -0
- package/src/engine/context_sorter.js +59 -0
- package/src/engine/context_validator.js +200 -0
- package/src/engine/id-generator.js +16 -0
- package/src/engine/pass1_facts.js +260 -0
- package/src/engine/pass2_semantics.js +333 -0
- package/src/engine/pass3_lifter.js +99 -0
- package/src/engine/pass4_signals.js +201 -0
- package/src/index.js +830 -0
- package/src/plugins/express-plugin.js +48 -0
- package/src/plugins/plugin-manager.js +58 -0
- package/src/plugins/react-plugin.js +54 -0
- package/temp_original.js +0 -0
- package/test/determinism-test.js +83 -0
- package/test-authoritative-context.js +53 -0
- package/test-real-authoritative-context.js +118 -0
- package/test-upload-enhancements.js +111 -0
- package/test_repos/allowed-clean-architecture/.arcvision/invariants.json +57 -0
- package/test_repos/allowed-clean-architecture/adapters/controllers/UserController.js +95 -0
- package/test_repos/allowed-clean-architecture/adapters/http/HttpServer.js +78 -0
- package/test_repos/allowed-clean-architecture/application/dtos/CreateUserRequest.js +37 -0
- package/test_repos/allowed-clean-architecture/application/services/UserService.js +61 -0
- package/test_repos/allowed-clean-architecture/arcvision_context/README.md +93 -0
- package/test_repos/allowed-clean-architecture/arcvision_context/arcvision.context.json +2796 -0
- package/test_repos/allowed-clean-architecture/domain/interfaces/UserRepository.js +25 -0
- package/test_repos/allowed-clean-architecture/domain/models/User.js +39 -0
- package/test_repos/allowed-clean-architecture/index.js +45 -0
- package/test_repos/allowed-clean-architecture/infrastructure/database/DatabaseConnection.js +56 -0
- package/test_repos/allowed-clean-architecture/infrastructure/repositories/InMemoryUserRepository.js +61 -0
- package/test_repos/allowed-clean-architecture/package.json +15 -0
- package/test_repos/blocked-legacy-monolith/.arcvision/invariants.json +78 -0
- package/test_repos/blocked-legacy-monolith/arcvision_context/README.md +93 -0
- package/test_repos/blocked-legacy-monolith/arcvision_context/arcvision.context.json +2882 -0
- package/test_repos/blocked-legacy-monolith/database/dbConnection.js +35 -0
- package/test_repos/blocked-legacy-monolith/index.js +38 -0
- package/test_repos/blocked-legacy-monolith/modules/emailService.js +31 -0
- package/test_repos/blocked-legacy-monolith/modules/paymentProcessor.js +37 -0
- package/test_repos/blocked-legacy-monolith/package.json +15 -0
- package/test_repos/blocked-legacy-monolith/shared/utils.js +19 -0
- package/test_repos/blocked-legacy-monolith/utils/helpers.js +23 -0
- package/test_repos/risky-microservices-concerns/.arcvision/invariants.json +69 -0
- package/test_repos/risky-microservices-concerns/arcvision_context/README.md +93 -0
- package/test_repos/risky-microservices-concerns/arcvision_context/arcvision.context.json +3070 -0
- package/test_repos/risky-microservices-concerns/common/utils.js +77 -0
- package/test_repos/risky-microservices-concerns/gateways/apiGateway.js +84 -0
- package/test_repos/risky-microservices-concerns/index.js +20 -0
- package/test_repos/risky-microservices-concerns/libs/deprecatedHelper.js +36 -0
- package/test_repos/risky-microservices-concerns/package.json +15 -0
- package/test_repos/risky-microservices-concerns/services/orderService.js +42 -0
- package/test_repos/risky-microservices-concerns/services/userService.js +48 -0
- package/verify_engine.js +116 -0
package/dist/index.js
CHANGED
|
@@ -56390,8 +56390,44 @@ var require_parser = __commonJS({
|
|
|
56390
56390
|
var traverse = require_lib8().default;
|
|
56391
56391
|
var fs2 = require("fs");
|
|
56392
56392
|
var path2 = require("path");
|
|
56393
|
+
var fileContentCache = /* @__PURE__ */ new Map();
|
|
56393
56394
|
function parseFile(filePath) {
|
|
56394
|
-
|
|
56395
|
+
let content;
|
|
56396
|
+
if (fileContentCache.has(filePath)) {
|
|
56397
|
+
const cached = fileContentCache.get(filePath);
|
|
56398
|
+
try {
|
|
56399
|
+
const stat = fs2.statSync(filePath);
|
|
56400
|
+
if (cached.mtime && stat.mtimeMs <= cached.mtime) {
|
|
56401
|
+
content = cached.content;
|
|
56402
|
+
} else {
|
|
56403
|
+
content = fs2.readFileSync(filePath, "utf-8");
|
|
56404
|
+
fileContentCache.set(filePath, {
|
|
56405
|
+
content,
|
|
56406
|
+
mtime: stat.mtimeMs
|
|
56407
|
+
});
|
|
56408
|
+
}
|
|
56409
|
+
} catch (statError) {
|
|
56410
|
+
content = fs2.readFileSync(filePath, "utf-8");
|
|
56411
|
+
try {
|
|
56412
|
+
const stat = fs2.statSync(filePath);
|
|
56413
|
+
fileContentCache.set(filePath, {
|
|
56414
|
+
content,
|
|
56415
|
+
mtime: stat.mtimeMs
|
|
56416
|
+
});
|
|
56417
|
+
} catch (cacheError) {
|
|
56418
|
+
}
|
|
56419
|
+
}
|
|
56420
|
+
} else {
|
|
56421
|
+
content = fs2.readFileSync(filePath, "utf-8");
|
|
56422
|
+
try {
|
|
56423
|
+
const stat = fs2.statSync(filePath);
|
|
56424
|
+
fileContentCache.set(filePath, {
|
|
56425
|
+
content,
|
|
56426
|
+
mtime: stat.mtimeMs
|
|
56427
|
+
});
|
|
56428
|
+
} catch (cacheError) {
|
|
56429
|
+
}
|
|
56430
|
+
}
|
|
56395
56431
|
let ast;
|
|
56396
56432
|
const isDeclarationFile = filePath.endsWith(".d.ts");
|
|
56397
56433
|
const parserOptions = {
|
|
@@ -56489,7 +56525,21 @@ var require_parser = __commonJS({
|
|
|
56489
56525
|
allowReturnOutsideFunction: true,
|
|
56490
56526
|
allowSuperOutsideMethod: true,
|
|
56491
56527
|
errorRecovery: true,
|
|
56492
|
-
plugins: [
|
|
56528
|
+
plugins: [
|
|
56529
|
+
"typescript",
|
|
56530
|
+
"jsx",
|
|
56531
|
+
"decorators-legacy",
|
|
56532
|
+
"classProperties",
|
|
56533
|
+
"typescript",
|
|
56534
|
+
"optionalChaining",
|
|
56535
|
+
"nullishCoalescingOperator",
|
|
56536
|
+
"logicalAssignment",
|
|
56537
|
+
"numericSeparator",
|
|
56538
|
+
"optionalCatchBinding",
|
|
56539
|
+
"importMeta",
|
|
56540
|
+
"functionBind",
|
|
56541
|
+
"throwExpressions"
|
|
56542
|
+
]
|
|
56493
56543
|
};
|
|
56494
56544
|
if (isDeclarationFile) {
|
|
56495
56545
|
ultraFallbackParserOptions.plugins.push("typescript");
|
|
@@ -56497,7 +56547,16 @@ var require_parser = __commonJS({
|
|
|
56497
56547
|
try {
|
|
56498
56548
|
ast = parser.parse(content, ultraFallbackParserOptions);
|
|
56499
56549
|
} catch (ultraFallbackError) {
|
|
56500
|
-
|
|
56550
|
+
const errorInfo = {
|
|
56551
|
+
file: filePath,
|
|
56552
|
+
error: error.message,
|
|
56553
|
+
line: error.loc ? error.loc.line : "unknown",
|
|
56554
|
+
column: error.loc ? error.loc.column : "unknown"
|
|
56555
|
+
};
|
|
56556
|
+
if (!global.parserErrors) {
|
|
56557
|
+
global.parserErrors = [];
|
|
56558
|
+
}
|
|
56559
|
+
global.parserErrors.push(errorInfo);
|
|
56501
56560
|
return {
|
|
56502
56561
|
id: filePath,
|
|
56503
56562
|
imports: [],
|
|
@@ -57622,17 +57681,97 @@ var require_pass1_facts = __commonJS({
|
|
|
57622
57681
|
if (fs2.existsSync(pluginDir)) {
|
|
57623
57682
|
pluginManager.loadPluginsFromDirectory(pluginDir);
|
|
57624
57683
|
}
|
|
57625
|
-
const files = await glob("**/*.{js,jsx,ts,tsx,cjs,mjs,json,lua
|
|
57626
|
-
...scanOptions,
|
|
57627
|
-
ignore: [...scanOptions.ignore, "**/*.d.ts", "**/.next/**", "**/coverage/**", "**/arcvision.context.json", "**/package-lock.json", "**/yarn.lock"]
|
|
57628
|
-
});
|
|
57629
|
-
const dtsFiles = await glob("**/*.d.ts", {
|
|
57684
|
+
const files = await glob("**/*.{js,jsx,ts,tsx,cjs,mjs,json,lua}", {
|
|
57630
57685
|
...scanOptions,
|
|
57631
|
-
ignore: [
|
|
57686
|
+
ignore: [
|
|
57687
|
+
...scanOptions.ignore,
|
|
57688
|
+
"**/*.d.ts",
|
|
57689
|
+
"**/.next/**",
|
|
57690
|
+
"**/coverage/**",
|
|
57691
|
+
"**/arcvision.context.json",
|
|
57692
|
+
"**/package-lock.json",
|
|
57693
|
+
"**/yarn.lock",
|
|
57694
|
+
// Additional non-code file types to exclude
|
|
57695
|
+
"**/*.png",
|
|
57696
|
+
"**/*.jpg",
|
|
57697
|
+
"**/*.jpeg",
|
|
57698
|
+
"**/*.gif",
|
|
57699
|
+
"**/*.svg",
|
|
57700
|
+
"**/*.pdf",
|
|
57701
|
+
"**/*.doc",
|
|
57702
|
+
"**/*.docx",
|
|
57703
|
+
"**/*.xls",
|
|
57704
|
+
"**/*.xlsx",
|
|
57705
|
+
"**/*.zip",
|
|
57706
|
+
"**/*.tar",
|
|
57707
|
+
"**/*.gz",
|
|
57708
|
+
"**/*.exe",
|
|
57709
|
+
"**/*.dll",
|
|
57710
|
+
"**/*.log",
|
|
57711
|
+
"**/*.tmp",
|
|
57712
|
+
"**/*.DS_Store",
|
|
57713
|
+
"**/Thumbs.db",
|
|
57714
|
+
"**/*.lock",
|
|
57715
|
+
"**/node_modules/**",
|
|
57716
|
+
"**/.git/**",
|
|
57717
|
+
"**/dist/**",
|
|
57718
|
+
"**/build/**",
|
|
57719
|
+
"**/target/**",
|
|
57720
|
+
"**/out/**",
|
|
57721
|
+
"**/vendor/**",
|
|
57722
|
+
"**/*.min.js",
|
|
57723
|
+
"**/*.bundle.js",
|
|
57724
|
+
"**/public/**",
|
|
57725
|
+
"**/static/**",
|
|
57726
|
+
"**/assets/**",
|
|
57727
|
+
"**/images/**",
|
|
57728
|
+
"**/fonts/**",
|
|
57729
|
+
"**/tests/**",
|
|
57730
|
+
"**/test/**",
|
|
57731
|
+
"**/__tests__/**",
|
|
57732
|
+
"**/__mocks__/**",
|
|
57733
|
+
"**/*.test.js",
|
|
57734
|
+
"**/*.test.ts",
|
|
57735
|
+
"**/*.spec.js",
|
|
57736
|
+
"**/*.spec.ts",
|
|
57737
|
+
"**/.*ignore",
|
|
57738
|
+
"**/.*config*",
|
|
57739
|
+
"**/.*rc",
|
|
57740
|
+
"**/.*lock",
|
|
57741
|
+
"**/.*cache",
|
|
57742
|
+
"**/.*history",
|
|
57743
|
+
"**/.*backup",
|
|
57744
|
+
"**/.*temp",
|
|
57745
|
+
"**/.*tmp",
|
|
57746
|
+
"**/README.*",
|
|
57747
|
+
"**/CHANGELOG.*",
|
|
57748
|
+
"**/TODO",
|
|
57749
|
+
"**/NOTES",
|
|
57750
|
+
"**/Dockerfile",
|
|
57751
|
+
"**/docker-compose.yml",
|
|
57752
|
+
"**/*.dockerfile",
|
|
57753
|
+
"**/Makefile",
|
|
57754
|
+
"**/*.mk",
|
|
57755
|
+
"**/*.pyc",
|
|
57756
|
+
"**/__pycache__/**",
|
|
57757
|
+
"**/*.so",
|
|
57758
|
+
"**/*.dylib",
|
|
57759
|
+
"**/*.o",
|
|
57760
|
+
"**/*.obj",
|
|
57761
|
+
"**/*.jar",
|
|
57762
|
+
"**/*.war",
|
|
57763
|
+
"**/*.lock",
|
|
57764
|
+
"**/*.pid",
|
|
57765
|
+
"**/*.seed",
|
|
57766
|
+
"**/*.pid",
|
|
57767
|
+
"**/*.sock"
|
|
57768
|
+
]
|
|
57632
57769
|
});
|
|
57633
|
-
const allFiles =
|
|
57634
|
-
console.log(` Identified ${allFiles.length} files for analysis
|
|
57635
|
-
const
|
|
57770
|
+
const allFiles = files;
|
|
57771
|
+
console.log(` Identified ${allFiles.length} files for analysis`);
|
|
57772
|
+
const BASE_CONCURRENCY = 25;
|
|
57773
|
+
const OPTIMAL_CONCURRENCY = Math.min(BASE_CONCURRENCY, Math.max(5, Math.floor(allFiles.length / 10)));
|
|
57774
|
+
const CONCURRENCY = OPTIMAL_CONCURRENCY;
|
|
57636
57775
|
const rawNodes = [];
|
|
57637
57776
|
let totalFacts = 0;
|
|
57638
57777
|
for (let i = 0; i < allFiles.length; i += CONCURRENCY) {
|
|
@@ -57692,16 +57831,19 @@ var require_pass1_facts = __commonJS({
|
|
|
57692
57831
|
context: metadata.contextUsages || []
|
|
57693
57832
|
},
|
|
57694
57833
|
react: metadata.componentUsage || [],
|
|
57695
|
-
potentialInvocations: metadata.potentialInvocations || []
|
|
57834
|
+
potentialInvocations: metadata.potentialInvocations || [],
|
|
57835
|
+
invariantIndicators: extractInvariantIndicators(metadata.raw || "")
|
|
57696
57836
|
}
|
|
57697
57837
|
};
|
|
57698
57838
|
if (isLuaFile) {
|
|
57699
57839
|
node.language = "lua";
|
|
57700
57840
|
node.execution_boundary = "redis";
|
|
57701
57841
|
}
|
|
57702
|
-
return { node, factCount: (metadata.imports?.length || 0) + (metadata.functionCalls?.length || 0) };
|
|
57842
|
+
return { node, factCount: (metadata.imports?.length || 0) + (metadata.functionCalls?.length || 0) + (metadata.invariantIndicators?.length || 0) };
|
|
57703
57843
|
} catch (e) {
|
|
57704
|
-
|
|
57844
|
+
if (allFiles.length < 1e3) {
|
|
57845
|
+
console.warn(`\u26A0\uFE0F Pass 1 failed for ${file}: ${e.message}`);
|
|
57846
|
+
}
|
|
57705
57847
|
return null;
|
|
57706
57848
|
}
|
|
57707
57849
|
});
|
|
@@ -57715,7 +57857,7 @@ var require_pass1_facts = __commonJS({
|
|
|
57715
57857
|
}
|
|
57716
57858
|
}
|
|
57717
57859
|
console.log(` \u2713 Scanned ${rawNodes.length} files`);
|
|
57718
|
-
console.log(` \u2713 Extracted ${totalFacts} raw syntactic facts`);
|
|
57860
|
+
console.log(` \u2713 Extracted ${totalFacts} raw syntactic facts (including invariant indicators)`);
|
|
57719
57861
|
return rawNodes;
|
|
57720
57862
|
}
|
|
57721
57863
|
function extractLuaInvocations(content) {
|
|
@@ -57734,6 +57876,64 @@ var require_pass1_facts = __commonJS({
|
|
|
57734
57876
|
});
|
|
57735
57877
|
return invocations;
|
|
57736
57878
|
}
|
|
57879
|
+
function extractInvariantIndicators(content) {
|
|
57880
|
+
const indicators = [];
|
|
57881
|
+
const patterns = [
|
|
57882
|
+
/assert\(/gi,
|
|
57883
|
+
// assert() calls
|
|
57884
|
+
/validate[A-Z]/gi,
|
|
57885
|
+
// validate functions
|
|
57886
|
+
/check[A-Z]/gi,
|
|
57887
|
+
// check functions
|
|
57888
|
+
/ensure[A-Z]/gi,
|
|
57889
|
+
// ensure functions
|
|
57890
|
+
/guard[A-Z]/gi,
|
|
57891
|
+
// guard functions
|
|
57892
|
+
/verify[A-Z]/gi,
|
|
57893
|
+
// verify functions
|
|
57894
|
+
/Invariant/gi,
|
|
57895
|
+
// Invariant mentions
|
|
57896
|
+
/constraint/gi,
|
|
57897
|
+
// constraint mentions
|
|
57898
|
+
/must.*be/gi,
|
|
57899
|
+
// must-be patterns
|
|
57900
|
+
/should.*be/gi,
|
|
57901
|
+
// should-be patterns
|
|
57902
|
+
/expected.*to/gi,
|
|
57903
|
+
// expected-to patterns
|
|
57904
|
+
/boundary.*check/gi,
|
|
57905
|
+
// boundary checks
|
|
57906
|
+
/range.*check/gi,
|
|
57907
|
+
// range checks
|
|
57908
|
+
/within.*bounds/gi,
|
|
57909
|
+
// bounds checks
|
|
57910
|
+
/access.*control/gi,
|
|
57911
|
+
// access controls
|
|
57912
|
+
/permission.*check/gi,
|
|
57913
|
+
// permission checks
|
|
57914
|
+
/if.*!condition.*throw/gi,
|
|
57915
|
+
// guard clauses
|
|
57916
|
+
/state.*transition/gi,
|
|
57917
|
+
// state transitions
|
|
57918
|
+
/setState/gi,
|
|
57919
|
+
// state setters
|
|
57920
|
+
/update.*state/gi,
|
|
57921
|
+
// state updaters
|
|
57922
|
+
/transition/gi
|
|
57923
|
+
// transition patterns
|
|
57924
|
+
];
|
|
57925
|
+
patterns.forEach((pattern) => {
|
|
57926
|
+
let match;
|
|
57927
|
+
while ((match = pattern.exec(content)) !== null) {
|
|
57928
|
+
indicators.push({
|
|
57929
|
+
pattern: pattern.source,
|
|
57930
|
+
match: match[0],
|
|
57931
|
+
position: match.index
|
|
57932
|
+
});
|
|
57933
|
+
}
|
|
57934
|
+
});
|
|
57935
|
+
return indicators;
|
|
57936
|
+
}
|
|
57737
57937
|
module2.exports = { executePass1 };
|
|
57738
57938
|
}
|
|
57739
57939
|
});
|
|
@@ -58435,8 +58635,17 @@ var require_pass2_semantics = __commonJS({
|
|
|
58435
58635
|
}
|
|
58436
58636
|
}
|
|
58437
58637
|
console.log(` \u2713 Resolved ${typeEdgesCount} TypeScript type connections`);
|
|
58638
|
+
const enhancedNodes = rawNodes.map((node) => {
|
|
58639
|
+
if (node.facts && node.facts.invariantIndicators) {
|
|
58640
|
+
return {
|
|
58641
|
+
...node,
|
|
58642
|
+
invariantIndicators: node.facts.invariantIndicators
|
|
58643
|
+
};
|
|
58644
|
+
}
|
|
58645
|
+
return node;
|
|
58646
|
+
});
|
|
58438
58647
|
return {
|
|
58439
|
-
nodes:
|
|
58648
|
+
nodes: enhancedNodes,
|
|
58440
58649
|
edges,
|
|
58441
58650
|
symbols: Array.from(symbols.values())
|
|
58442
58651
|
// Return symbols list for ContextBuilder
|
|
@@ -58492,13 +58701,17 @@ var require_pass3_lifter = __commonJS({
|
|
|
58492
58701
|
role = "class_def";
|
|
58493
58702
|
}
|
|
58494
58703
|
rolesFound[role] = (rolesFound[role] || 0) + 1;
|
|
58495
|
-
|
|
58704
|
+
const liftedNode = {
|
|
58496
58705
|
...node,
|
|
58497
58706
|
structure: {
|
|
58498
58707
|
role,
|
|
58499
58708
|
layer
|
|
58500
58709
|
}
|
|
58501
|
-
}
|
|
58710
|
+
};
|
|
58711
|
+
if (node.invariantIndicators) {
|
|
58712
|
+
liftedNode.invariantIndicators = node.invariantIndicators;
|
|
58713
|
+
}
|
|
58714
|
+
liftedNodes.push(liftedNode);
|
|
58502
58715
|
}
|
|
58503
58716
|
console.log(` \u2713 Inferred structural roles: ${JSON.stringify(rolesFound)}`);
|
|
58504
58717
|
return {
|
|
@@ -58731,7 +58944,7 @@ var require_pass4_signals = __commonJS({
|
|
|
58731
58944
|
outgoing_deps: outDegreeMap.get(node.id) || 0,
|
|
58732
58945
|
incoming_deps: inDegreeMap.get(node.id) || 0
|
|
58733
58946
|
};
|
|
58734
|
-
|
|
58947
|
+
const finalNode = {
|
|
58735
58948
|
id: node.id,
|
|
58736
58949
|
type: node.type,
|
|
58737
58950
|
filePath: node.filePath,
|
|
@@ -58754,11 +58967,22 @@ var require_pass4_signals = __commonJS({
|
|
|
58754
58967
|
}))
|
|
58755
58968
|
}
|
|
58756
58969
|
};
|
|
58970
|
+
if (node.invariantIndicators) {
|
|
58971
|
+
finalNode.invariantIndicators = node.invariantIndicators;
|
|
58972
|
+
}
|
|
58973
|
+
return finalNode;
|
|
58757
58974
|
});
|
|
58975
|
+
const enhancedCriticalityList = finalNodes.map((node) => ({
|
|
58976
|
+
file: node.id,
|
|
58977
|
+
criticalityScore: node.signals.criticality,
|
|
58978
|
+
blastRadius: node.signals.blast_radius,
|
|
58979
|
+
dependencies: node.signals.incoming_deps,
|
|
58980
|
+
isHub: node.signals.is_hub
|
|
58981
|
+
}));
|
|
58758
58982
|
const totalFiles = finalNodes.length;
|
|
58759
58983
|
const maxBlast = Math.max(...finalNodes.map((n) => n.signals.blast_radius));
|
|
58760
58984
|
console.log(` \u2713 Signals computed. Max Blast Radius: ${maxBlast}`);
|
|
58761
|
-
const contextSurface =
|
|
58985
|
+
const contextSurface = enhancedCriticalityList.slice(0, 5).map((c) => ({
|
|
58762
58986
|
file: c.file,
|
|
58763
58987
|
score: c.criticalityScore,
|
|
58764
58988
|
reason: `Blast: ${c.blastRadius}, Deps: ${c.dependencies}`
|
|
@@ -58775,6 +58999,1234 @@ var require_pass4_signals = __commonJS({
|
|
|
58775
58999
|
}
|
|
58776
59000
|
});
|
|
58777
59001
|
|
|
59002
|
+
// src/core/authority-core-detector.js
|
|
59003
|
+
var require_authority_core_detector = __commonJS({
|
|
59004
|
+
"src/core/authority-core-detector.js"(exports2, module2) {
|
|
59005
|
+
function detectAuthorityCores(architectureMap, criticalityList) {
|
|
59006
|
+
const { nodes, edges } = architectureMap;
|
|
59007
|
+
const authorityCores = [];
|
|
59008
|
+
const reverseGraph = buildReverseDependencyGraph(architectureMap);
|
|
59009
|
+
const nodeMap = new Map(nodes.map((n) => [n.id, n]));
|
|
59010
|
+
for (const node of nodes) {
|
|
59011
|
+
const authorityScore = calculateAuthorityScore(
|
|
59012
|
+
node,
|
|
59013
|
+
criticalityList,
|
|
59014
|
+
reverseGraph,
|
|
59015
|
+
nodes,
|
|
59016
|
+
edges
|
|
59017
|
+
);
|
|
59018
|
+
if (authorityScore > 5) {
|
|
59019
|
+
authorityCores.push({
|
|
59020
|
+
file: node.id,
|
|
59021
|
+
authorityScore,
|
|
59022
|
+
blastRadius: node.signals?.blast_radius || 0,
|
|
59023
|
+
criticality: node.signals?.criticality || 0,
|
|
59024
|
+
incomingDeps: node.signals?.incoming_deps || 0,
|
|
59025
|
+
outgoingDeps: node.signals?.outgoing_deps || 0,
|
|
59026
|
+
isHub: node.signals?.is_hub || false,
|
|
59027
|
+
role: node.role,
|
|
59028
|
+
layer: node.layer,
|
|
59029
|
+
characteristics: getAuthorityCharacteristics(node, reverseGraph, edges)
|
|
59030
|
+
});
|
|
59031
|
+
}
|
|
59032
|
+
}
|
|
59033
|
+
return authorityCores.sort((a, b) => b.authorityScore - a.authorityScore);
|
|
59034
|
+
}
|
|
59035
|
+
function calculateAuthorityScore(node, criticalityList, reverseGraph, allNodes, allEdges) {
|
|
59036
|
+
let score = 0;
|
|
59037
|
+
const blastRadius = node.signals?.blast_radius || 0;
|
|
59038
|
+
score += blastRadius * 2;
|
|
59039
|
+
const criticality = node.signals?.criticality || 0;
|
|
59040
|
+
score += criticality * 1.5;
|
|
59041
|
+
if (node.signals?.is_hub) {
|
|
59042
|
+
score += 5;
|
|
59043
|
+
}
|
|
59044
|
+
const incomingDeps = node.signals?.incoming_deps || 0;
|
|
59045
|
+
score += incomingDeps * 0.5;
|
|
59046
|
+
const outgoingDeps = node.signals?.outgoing_deps || 0;
|
|
59047
|
+
if (incomingDeps > 0 && outgoingDeps < incomingDeps * 0.5) {
|
|
59048
|
+
score += 3;
|
|
59049
|
+
}
|
|
59050
|
+
const filePath = node.id.toLowerCase();
|
|
59051
|
+
if (filePath.includes("core") || filePath.includes("index") || filePath.includes("main")) {
|
|
59052
|
+
score += 3;
|
|
59053
|
+
} else if (filePath.includes("auth") || filePath.includes("config")) {
|
|
59054
|
+
score += 2;
|
|
59055
|
+
} else if (filePath.includes("util") || filePath.includes("utils") || filePath.includes("shared")) {
|
|
59056
|
+
score += 1.5;
|
|
59057
|
+
}
|
|
59058
|
+
const role = node.role?.toLowerCase() || "";
|
|
59059
|
+
if (role.includes("service") || role.includes("manager") || role.includes("controller")) {
|
|
59060
|
+
score += 2;
|
|
59061
|
+
} else if (role.includes("store") || role.includes("provider")) {
|
|
59062
|
+
score += 1.5;
|
|
59063
|
+
}
|
|
59064
|
+
const layer = node.layer?.toLowerCase() || "";
|
|
59065
|
+
if (layer === "state" || layer === "shared") {
|
|
59066
|
+
score += 2;
|
|
59067
|
+
}
|
|
59068
|
+
const connectedLayers = getConnectedLayers(node.id, allNodes, allEdges);
|
|
59069
|
+
if (connectedLayers.size > 2) {
|
|
59070
|
+
score += connectedLayers.size * 0.5;
|
|
59071
|
+
}
|
|
59072
|
+
return score;
|
|
59073
|
+
}
|
|
59074
|
+
function buildReverseDependencyGraph(architectureMap) {
|
|
59075
|
+
const reverseGraph = {};
|
|
59076
|
+
if (architectureMap.nodes && Array.isArray(architectureMap.nodes)) {
|
|
59077
|
+
architectureMap.nodes.forEach((node) => {
|
|
59078
|
+
const filePath = node.id;
|
|
59079
|
+
if (filePath && !reverseGraph[filePath]) {
|
|
59080
|
+
reverseGraph[filePath] = [];
|
|
59081
|
+
}
|
|
59082
|
+
});
|
|
59083
|
+
}
|
|
59084
|
+
if (architectureMap.edges && Array.isArray(architectureMap.edges)) {
|
|
59085
|
+
architectureMap.edges.forEach((edge) => {
|
|
59086
|
+
if (edge.from && edge.to) {
|
|
59087
|
+
const importingFile = edge.from;
|
|
59088
|
+
const importedFile = edge.to;
|
|
59089
|
+
if (!reverseGraph[importedFile]) {
|
|
59090
|
+
reverseGraph[importedFile] = [];
|
|
59091
|
+
}
|
|
59092
|
+
if (!reverseGraph[importedFile].includes(importingFile)) {
|
|
59093
|
+
reverseGraph[importedFile].push(importingFile);
|
|
59094
|
+
}
|
|
59095
|
+
}
|
|
59096
|
+
});
|
|
59097
|
+
}
|
|
59098
|
+
return reverseGraph;
|
|
59099
|
+
}
|
|
59100
|
+
function getAuthorityCharacteristics(node, reverseGraph, edges) {
|
|
59101
|
+
const characteristics = [];
|
|
59102
|
+
const blastRadius = node.signals?.blast_radius || 0;
|
|
59103
|
+
const incomingDeps = node.signals?.incoming_deps || 0;
|
|
59104
|
+
const outgoingDeps = node.signals?.outgoing_deps || 0;
|
|
59105
|
+
if (blastRadius > 10) {
|
|
59106
|
+
characteristics.push("high_blast_radius");
|
|
59107
|
+
}
|
|
59108
|
+
if (incomingDeps > 5 && outgoingDeps < incomingDeps * 0.5) {
|
|
59109
|
+
characteristics.push("central_coordinator");
|
|
59110
|
+
}
|
|
59111
|
+
if (node.signals?.is_hub) {
|
|
59112
|
+
characteristics.push("structural_hub");
|
|
59113
|
+
}
|
|
59114
|
+
const connectedLayers = getConnectedLayers(node.id, [node], edges);
|
|
59115
|
+
if (connectedLayers.size > 2) {
|
|
59116
|
+
characteristics.push("cross_layer_orchestrator");
|
|
59117
|
+
}
|
|
59118
|
+
if (node.intelligence?.functions?.some(
|
|
59119
|
+
(func) => func.name?.toLowerCase().includes("init") || func.name?.toLowerCase().includes("setup") || func.name?.toLowerCase().includes("register")
|
|
59120
|
+
)) {
|
|
59121
|
+
characteristics.push("initialization_point");
|
|
59122
|
+
}
|
|
59123
|
+
return characteristics;
|
|
59124
|
+
}
|
|
59125
|
+
function getConnectedLayers(nodeId, allNodes, allEdges) {
|
|
59126
|
+
const connectedLayers = /* @__PURE__ */ new Set();
|
|
59127
|
+
const nodeMap = new Map(allNodes.map((n) => [n.id, n]));
|
|
59128
|
+
allEdges.forEach((edge) => {
|
|
59129
|
+
if (edge.from === nodeId) {
|
|
59130
|
+
const targetNode = nodeMap.get(edge.to);
|
|
59131
|
+
if (targetNode && targetNode.layer) {
|
|
59132
|
+
connectedLayers.add(targetNode.layer);
|
|
59133
|
+
}
|
|
59134
|
+
} else if (edge.to === nodeId) {
|
|
59135
|
+
const sourceNode = nodeMap.get(edge.from);
|
|
59136
|
+
if (sourceNode && sourceNode.layer) {
|
|
59137
|
+
connectedLayers.add(sourceNode.layer);
|
|
59138
|
+
}
|
|
59139
|
+
}
|
|
59140
|
+
});
|
|
59141
|
+
return connectedLayers;
|
|
59142
|
+
}
|
|
59143
|
+
function detectHiddenCoupling(architectureMap) {
|
|
59144
|
+
const { nodes, edges } = architectureMap;
|
|
59145
|
+
const couplingIssues = [];
|
|
59146
|
+
const moduleDependencies = groupDependenciesByModule(edges, nodes);
|
|
59147
|
+
for (const [sourceModule, targets] of Object.entries(moduleDependencies)) {
|
|
59148
|
+
for (const [targetModule, deps] of Object.entries(targets)) {
|
|
59149
|
+
if (sourceModule !== targetModule && deps.length > 3) {
|
|
59150
|
+
couplingIssues.push({
|
|
59151
|
+
type: "cross_module_coupling",
|
|
59152
|
+
source: sourceModule,
|
|
59153
|
+
target: targetModule,
|
|
59154
|
+
count: deps.length,
|
|
59155
|
+
dependencies: deps
|
|
59156
|
+
});
|
|
59157
|
+
}
|
|
59158
|
+
}
|
|
59159
|
+
}
|
|
59160
|
+
return couplingIssues;
|
|
59161
|
+
}
|
|
59162
|
+
function groupDependenciesByModule(edges, nodes) {
|
|
59163
|
+
const moduleDeps = {};
|
|
59164
|
+
const nodeMap = new Map(nodes.map((n) => [n.id, n]));
|
|
59165
|
+
edges.forEach((edge) => {
|
|
59166
|
+
const sourceModule = getModuleFromPath(edge.from);
|
|
59167
|
+
const targetModule = getModuleFromPath(edge.to);
|
|
59168
|
+
if (!moduleDeps[sourceModule]) {
|
|
59169
|
+
moduleDeps[sourceModule] = {};
|
|
59170
|
+
}
|
|
59171
|
+
if (!moduleDeps[sourceModule][targetModule]) {
|
|
59172
|
+
moduleDeps[sourceModule][targetModule] = [];
|
|
59173
|
+
}
|
|
59174
|
+
moduleDeps[sourceModule][targetModule].push(edge);
|
|
59175
|
+
});
|
|
59176
|
+
return moduleDeps;
|
|
59177
|
+
}
|
|
59178
|
+
function getModuleFromPath(filePath) {
|
|
59179
|
+
if (!filePath)
|
|
59180
|
+
return "unknown";
|
|
59181
|
+
const parts = filePath.split("/");
|
|
59182
|
+
if (parts.length < 2)
|
|
59183
|
+
return "root";
|
|
59184
|
+
for (let i = 0; i < parts.length; i++) {
|
|
59185
|
+
if (["src", "lib", "components", "modules", "features", "services"].includes(parts[i])) {
|
|
59186
|
+
if (i + 1 < parts.length) {
|
|
59187
|
+
return parts[i + 1];
|
|
59188
|
+
}
|
|
59189
|
+
}
|
|
59190
|
+
}
|
|
59191
|
+
for (const part of parts) {
|
|
59192
|
+
if (part && part !== "." && part !== "..") {
|
|
59193
|
+
return part;
|
|
59194
|
+
}
|
|
59195
|
+
}
|
|
59196
|
+
return "unknown";
|
|
59197
|
+
}
|
|
59198
|
+
function detectArchitecturalArchetype(architectureMap, authorityCores) {
|
|
59199
|
+
const { nodes, edges } = architectureMap;
|
|
59200
|
+
const jobRelated = nodes.filter(
|
|
59201
|
+
(n) => n.id.toLowerCase().includes("job") || n.role?.toLowerCase().includes("job")
|
|
59202
|
+
).length;
|
|
59203
|
+
const schemaRelated = nodes.filter(
|
|
59204
|
+
(n) => n.id.toLowerCase().includes("schema") || n.role?.toLowerCase().includes("model") || n.id.toLowerCase().includes("db")
|
|
59205
|
+
).length;
|
|
59206
|
+
const providerRelated = nodes.filter(
|
|
59207
|
+
(n) => n.role?.toLowerCase().includes("provider") || n.id.toLowerCase().includes("provider")
|
|
59208
|
+
).length;
|
|
59209
|
+
const orchestrationRelated = nodes.filter(
|
|
59210
|
+
(n) => n.role?.toLowerCase().includes("orchestrate") || n.role?.toLowerCase().includes("workflow") || n.role?.toLowerCase().includes("engine")
|
|
59211
|
+
).length;
|
|
59212
|
+
const scaffoldingRelated = nodes.filter(
|
|
59213
|
+
(n) => n.role?.toLowerCase().includes("template") || n.role?.toLowerCase().includes("generator") || n.role?.toLowerCase().includes("installer")
|
|
59214
|
+
).length;
|
|
59215
|
+
if (jobRelated > 5) {
|
|
59216
|
+
return {
|
|
59217
|
+
type: "job_centric_orchestration",
|
|
59218
|
+
confidence: "high",
|
|
59219
|
+
description: "System centered around job/task management",
|
|
59220
|
+
authorityPattern: "job_authority"
|
|
59221
|
+
};
|
|
59222
|
+
} else if (schemaRelated > 5) {
|
|
59223
|
+
return {
|
|
59224
|
+
type: "schema_gravity_core",
|
|
59225
|
+
confidence: "high",
|
|
59226
|
+
description: "System driven by database/schema definitions",
|
|
59227
|
+
authorityPattern: "schema_authority"
|
|
59228
|
+
};
|
|
59229
|
+
} else if (providerRelated > 3) {
|
|
59230
|
+
return {
|
|
59231
|
+
type: "provider_driven_core",
|
|
59232
|
+
confidence: "medium",
|
|
59233
|
+
description: "System with plugin/provider architecture",
|
|
59234
|
+
authorityPattern: "provider_authority"
|
|
59235
|
+
};
|
|
59236
|
+
} else if (orchestrationRelated > 3) {
|
|
59237
|
+
return {
|
|
59238
|
+
type: "orchestration_framework",
|
|
59239
|
+
confidence: "medium",
|
|
59240
|
+
description: "System focused on workflow/orchestration",
|
|
59241
|
+
authorityPattern: "orchestration_authority"
|
|
59242
|
+
};
|
|
59243
|
+
} else if (scaffoldingRelated > 2) {
|
|
59244
|
+
return {
|
|
59245
|
+
type: "scaffolding_orchestrator",
|
|
59246
|
+
confidence: "low",
|
|
59247
|
+
description: "System focused on code generation/installation",
|
|
59248
|
+
authorityPattern: "scaffold_authority"
|
|
59249
|
+
};
|
|
59250
|
+
}
|
|
59251
|
+
return {
|
|
59252
|
+
type: "general_purpose",
|
|
59253
|
+
confidence: "low",
|
|
59254
|
+
description: "General purpose application without strong architectural patterns",
|
|
59255
|
+
authorityPattern: "distributed_authority"
|
|
59256
|
+
};
|
|
59257
|
+
}
|
|
59258
|
+
module2.exports = {
|
|
59259
|
+
detectAuthorityCores,
|
|
59260
|
+
detectHiddenCoupling,
|
|
59261
|
+
detectArchitecturalArchetype,
|
|
59262
|
+
calculateAuthorityScore,
|
|
59263
|
+
getConnectedLayers
|
|
59264
|
+
};
|
|
59265
|
+
}
|
|
59266
|
+
});
|
|
59267
|
+
|
|
59268
|
+
// src/core/structural-context-owner.js
|
|
59269
|
+
var require_structural_context_owner = __commonJS({
|
|
59270
|
+
"src/core/structural-context-owner.js"(exports2, module2) {
|
|
59271
|
+
var crypto = require("crypto");
|
|
59272
|
+
var path2 = require("path");
|
|
59273
|
+
function generateAuthoritativeContext(architectureMap, options = {}) {
|
|
59274
|
+
const {
|
|
59275
|
+
projectName,
|
|
59276
|
+
rootPath,
|
|
59277
|
+
commitHash,
|
|
59278
|
+
timestamp,
|
|
59279
|
+
version: version2
|
|
59280
|
+
} = options;
|
|
59281
|
+
const authoritativeContext = {
|
|
59282
|
+
// Metadata establishing this as the canonical source
|
|
59283
|
+
metadata: {
|
|
59284
|
+
canonical: true,
|
|
59285
|
+
generated_at: timestamp || (/* @__PURE__ */ new Date()).toISOString(),
|
|
59286
|
+
source_commit: commitHash || "unknown",
|
|
59287
|
+
arcvision_version: version2 || "1.0.0",
|
|
59288
|
+
schema_version: "1.0.0",
|
|
59289
|
+
trust_level: "high"
|
|
59290
|
+
},
|
|
59291
|
+
// System identification and classification
|
|
59292
|
+
system_identity: {
|
|
59293
|
+
name: projectName,
|
|
59294
|
+
root_path: rootPath,
|
|
59295
|
+
language: detectPrimaryLanguage(architectureMap),
|
|
59296
|
+
architectural_archetype: classifyArchitecturalArchetype(architectureMap),
|
|
59297
|
+
structural_complexity: calculateStructuralComplexity(architectureMap)
|
|
59298
|
+
},
|
|
59299
|
+
// The core structural context that defines system relationships
|
|
59300
|
+
structural_context: {
|
|
59301
|
+
// Authority cores that control system behavior
|
|
59302
|
+
authority_cores: identifyAuthorityCores(architectureMap),
|
|
59303
|
+
// Critical structural hubs with high blast radius
|
|
59304
|
+
structural_hubs: identifyStructuralHubs(architectureMap),
|
|
59305
|
+
// Hidden coupling patterns that reveal actual vs. claimed architecture
|
|
59306
|
+
coupling_patterns: detectCouplingPatterns(architectureMap),
|
|
59307
|
+
// Layer boundaries and architectural constraints
|
|
59308
|
+
architectural_boundaries: defineArchitecturalBoundaries(architectureMap),
|
|
59309
|
+
// System-wide invariants and structural rules
|
|
59310
|
+
structural_invariants: extractStructuralInvariants(architectureMap)
|
|
59311
|
+
},
|
|
59312
|
+
// Context completeness and reliability metrics
|
|
59313
|
+
reliability_indicators: {
|
|
59314
|
+
analysis_coverage: calculateAnalysisCoverage(architectureMap),
|
|
59315
|
+
structural_completeness: assessStructuralCompleteness(architectureMap),
|
|
59316
|
+
confidence_scores: calculateConfidenceScores(architectureMap),
|
|
59317
|
+
validation_status: "validated"
|
|
59318
|
+
},
|
|
59319
|
+
// Integrity guarantee for trust
|
|
59320
|
+
integrity: {
|
|
59321
|
+
content_hash: generateContentHash(architectureMap),
|
|
59322
|
+
generation_signature: generateGenerationSignature(options)
|
|
59323
|
+
}
|
|
59324
|
+
};
|
|
59325
|
+
return authoritativeContext;
|
|
59326
|
+
}
|
|
59327
|
+
function detectPrimaryLanguage(architectureMap) {
|
|
59328
|
+
const { nodes } = architectureMap;
|
|
59329
|
+
if (!nodes || nodes.length === 0)
|
|
59330
|
+
return "unknown";
|
|
59331
|
+
const languageCounts = {
|
|
59332
|
+
javascript: 0,
|
|
59333
|
+
typescript: 0,
|
|
59334
|
+
jsx: 0,
|
|
59335
|
+
tsx: 0
|
|
59336
|
+
};
|
|
59337
|
+
nodes.forEach((node) => {
|
|
59338
|
+
if (!node.path)
|
|
59339
|
+
return;
|
|
59340
|
+
const ext = path2.extname(node.path).toLowerCase();
|
|
59341
|
+
if (ext === ".js")
|
|
59342
|
+
languageCounts.javascript++;
|
|
59343
|
+
if (ext === ".ts")
|
|
59344
|
+
languageCounts.typescript++;
|
|
59345
|
+
if (ext === ".jsx")
|
|
59346
|
+
languageCounts.jsx++;
|
|
59347
|
+
if (ext === ".tsx")
|
|
59348
|
+
languageCounts.tsx++;
|
|
59349
|
+
});
|
|
59350
|
+
if (languageCounts.typescript + languageCounts.tsx > languageCounts.javascript + languageCounts.jsx) {
|
|
59351
|
+
return "typescript";
|
|
59352
|
+
}
|
|
59353
|
+
return "javascript";
|
|
59354
|
+
}
|
|
59355
|
+
function classifyArchitecturalArchetype(architectureMap) {
|
|
59356
|
+
const { nodes } = architectureMap;
|
|
59357
|
+
const patterns = {
|
|
59358
|
+
schema_driven: 0,
|
|
59359
|
+
component_based: 0,
|
|
59360
|
+
service_oriented: 0,
|
|
59361
|
+
data_intensive: 0,
|
|
59362
|
+
ui_heavy: 0
|
|
59363
|
+
};
|
|
59364
|
+
nodes.forEach((node) => {
|
|
59365
|
+
if (!node.path)
|
|
59366
|
+
return;
|
|
59367
|
+
const pathLower = node.path.toLowerCase();
|
|
59368
|
+
const roleLower = (node.role || "").toLowerCase();
|
|
59369
|
+
if (pathLower.includes("schema") || pathLower.includes("model") || pathLower.includes("db") || pathLower.includes("database")) {
|
|
59370
|
+
patterns.schema_driven++;
|
|
59371
|
+
}
|
|
59372
|
+
if (roleLower.includes("component") || pathLower.includes("components")) {
|
|
59373
|
+
patterns.component_based++;
|
|
59374
|
+
}
|
|
59375
|
+
if (roleLower.includes("service") || pathLower.includes("services") || pathLower.includes("api")) {
|
|
59376
|
+
patterns.service_oriented++;
|
|
59377
|
+
}
|
|
59378
|
+
if (pathLower.includes("lib") || pathLower.includes("utils") || roleLower.includes("utility")) {
|
|
59379
|
+
patterns.data_intensive++;
|
|
59380
|
+
}
|
|
59381
|
+
if (pathLower.includes("ui") || pathLower.includes("pages") || pathLower.includes("app")) {
|
|
59382
|
+
patterns.ui_heavy++;
|
|
59383
|
+
}
|
|
59384
|
+
});
|
|
59385
|
+
const entries = Object.entries(patterns);
|
|
59386
|
+
const [primaryPattern, count] = entries.reduce(
|
|
59387
|
+
(max, current) => current[1] > max[1] ? current : max
|
|
59388
|
+
);
|
|
59389
|
+
const confidence = count > nodes.length * 0.1 ? "high" : count > nodes.length * 0.05 ? "medium" : "low";
|
|
59390
|
+
return {
|
|
59391
|
+
type: primaryPattern,
|
|
59392
|
+
confidence,
|
|
59393
|
+
description: `System primarily follows ${primaryPattern} architectural pattern`,
|
|
59394
|
+
authorityPattern: `${primaryPattern}_authority`
|
|
59395
|
+
};
|
|
59396
|
+
}
|
|
59397
|
+
function identifyAuthorityCores(architectureMap) {
|
|
59398
|
+
const { nodes } = architectureMap;
|
|
59399
|
+
const authorityCores = [];
|
|
59400
|
+
nodes.forEach((node) => {
|
|
59401
|
+
const authorityScore = calculateAuthorityScore(node, architectureMap);
|
|
59402
|
+
if (authorityScore > 10) {
|
|
59403
|
+
authorityCores.push({
|
|
59404
|
+
file: node.path,
|
|
59405
|
+
authority_score: authorityScore,
|
|
59406
|
+
blast_radius: node.signals?.blast_radius || 0,
|
|
59407
|
+
criticality: node.signals?.criticality || 0,
|
|
59408
|
+
role: node.role,
|
|
59409
|
+
layer: node.layer,
|
|
59410
|
+
influence_patterns: analyzeInfluencePatterns(node, architectureMap)
|
|
59411
|
+
});
|
|
59412
|
+
}
|
|
59413
|
+
});
|
|
59414
|
+
return authorityCores.sort((a, b) => b.authority_score - a.authority_score);
|
|
59415
|
+
}
|
|
59416
|
+
function identifyStructuralHubs(architectureMap) {
|
|
59417
|
+
const { nodes } = architectureMap;
|
|
59418
|
+
return nodes.filter((node) => (node.signals?.blast_radius || 0) > 10).map((node) => ({
|
|
59419
|
+
file: node.path,
|
|
59420
|
+
blast_radius: node.signals?.blast_radius || 0,
|
|
59421
|
+
criticality: node.signals?.criticality || 0,
|
|
59422
|
+
dependencies_count: node.signals?.incoming_deps || 0,
|
|
59423
|
+
hub_type: classifyHubType(node, architectureMap)
|
|
59424
|
+
})).sort((a, b) => b.blast_radius - a.blast_radius);
|
|
59425
|
+
}
|
|
59426
|
+
function detectCouplingPatterns(architectureMap) {
|
|
59427
|
+
const { edges, nodes } = architectureMap;
|
|
59428
|
+
const couplingPatterns = [];
|
|
59429
|
+
const moduleEdges = groupEdgesByModule(edges, nodes);
|
|
59430
|
+
Object.entries(moduleEdges).forEach(([sourceModule, targets]) => {
|
|
59431
|
+
const crossModuleDeps = Object.keys(targets).filter(
|
|
59432
|
+
(targetModule) => targetModule !== sourceModule
|
|
59433
|
+
);
|
|
59434
|
+
if (crossModuleDeps.length > 3) {
|
|
59435
|
+
couplingPatterns.push({
|
|
59436
|
+
type: "cross_module_coupling",
|
|
59437
|
+
source_module: sourceModule,
|
|
59438
|
+
coupled_modules: crossModuleDeps,
|
|
59439
|
+
coupling_strength: crossModuleDeps.length,
|
|
59440
|
+
risk_level: crossModuleDeps.length > 5 ? "high" : "medium"
|
|
59441
|
+
});
|
|
59442
|
+
}
|
|
59443
|
+
});
|
|
59444
|
+
return couplingPatterns;
|
|
59445
|
+
}
|
|
59446
|
+
function defineArchitecturalBoundaries(architectureMap) {
|
|
59447
|
+
const { nodes } = architectureMap;
|
|
59448
|
+
const boundaries = {};
|
|
59449
|
+
const layers = [...new Set(nodes.map((n) => n.layer || "unknown"))];
|
|
59450
|
+
layers.forEach((layer) => {
|
|
59451
|
+
const layerNodes = nodes.filter((n) => (n.layer || "unknown") === layer);
|
|
59452
|
+
boundaries[layer] = {
|
|
59453
|
+
files: layerNodes.length,
|
|
59454
|
+
authority_cores: layerNodes.filter(
|
|
59455
|
+
(n) => (n.signals?.criticality || 0) > 15
|
|
59456
|
+
).map((n) => n.path),
|
|
59457
|
+
boundary_violations: detectBoundaryViolations(layer, layerNodes, architectureMap)
|
|
59458
|
+
};
|
|
59459
|
+
});
|
|
59460
|
+
return boundaries;
|
|
59461
|
+
}
|
|
59462
|
+
function extractStructuralInvariants(architectureMap) {
|
|
59463
|
+
const { nodes, edges } = architectureMap;
|
|
59464
|
+
const invariants = [];
|
|
59465
|
+
const serviceToComponentRatio = nodes.filter(
|
|
59466
|
+
(n) => (n.role || "").includes("service")
|
|
59467
|
+
).length / nodes.filter(
|
|
59468
|
+
(n) => (n.role || "").includes("component")
|
|
59469
|
+
).length;
|
|
59470
|
+
if (serviceToComponentRatio > 0.5) {
|
|
59471
|
+
invariants.push({
|
|
59472
|
+
rule: "service_component_ratio",
|
|
59473
|
+
description: "Maintain balance between services and components",
|
|
59474
|
+
current_value: serviceToComponentRatio,
|
|
59475
|
+
recommended_range: "0.2-0.5"
|
|
59476
|
+
});
|
|
59477
|
+
}
|
|
59478
|
+
const circularDeps = detectCircularDependencies(edges);
|
|
59479
|
+
if (circularDeps.length > 0) {
|
|
59480
|
+
invariants.push({
|
|
59481
|
+
rule: "no_circular_dependencies",
|
|
59482
|
+
description: "Avoid circular dependencies between modules",
|
|
59483
|
+
violations: circularDeps,
|
|
59484
|
+
severity: "high"
|
|
59485
|
+
});
|
|
59486
|
+
}
|
|
59487
|
+
return invariants;
|
|
59488
|
+
}
|
|
59489
|
+
function calculateStructuralComplexity(architectureMap) {
|
|
59490
|
+
const { nodes, edges } = architectureMap;
|
|
59491
|
+
return {
|
|
59492
|
+
cyclomatic_complexity: calculateCyclomaticComplexity(nodes, edges),
|
|
59493
|
+
coupling_degree: calculateCouplingDegree(nodes, edges),
|
|
59494
|
+
cohesion_measure: calculateCohesionMeasure(nodes, edges),
|
|
59495
|
+
overall_complexity: "medium"
|
|
59496
|
+
// Simplified for now
|
|
59497
|
+
};
|
|
59498
|
+
}
|
|
59499
|
+
function calculateAnalysisCoverage(architectureMap) {
|
|
59500
|
+
const { nodes } = architectureMap;
|
|
59501
|
+
return {
|
|
59502
|
+
total_files_analyzed: nodes.length,
|
|
59503
|
+
code_files: nodes.filter(
|
|
59504
|
+
(n) => n.path && [".js", ".ts", ".jsx", ".tsx"].includes(path2.extname(n.path))
|
|
59505
|
+
).length,
|
|
59506
|
+
configuration_files: nodes.filter(
|
|
59507
|
+
(n) => n.path && [".json", ".yaml", ".yml", ".config"].some((ext) => n.path.includes(ext))
|
|
59508
|
+
).length,
|
|
59509
|
+
documentation_files: nodes.filter(
|
|
59510
|
+
(n) => n.path && [".md", ".txt"].includes(path2.extname(n.path))
|
|
59511
|
+
).length,
|
|
59512
|
+
coverage_percentage: 100
|
|
59513
|
+
// Assuming full coverage for now
|
|
59514
|
+
};
|
|
59515
|
+
}
|
|
59516
|
+
function generateContentHash(architectureMap) {
|
|
59517
|
+
const content = JSON.stringify(architectureMap);
|
|
59518
|
+
return crypto.createHash("sha256").update(content).digest("hex");
|
|
59519
|
+
}
|
|
59520
|
+
function generateGenerationSignature(options) {
|
|
59521
|
+
const signatureData = {
|
|
59522
|
+
timestamp: options.timestamp,
|
|
59523
|
+
commit: options.commitHash,
|
|
59524
|
+
version: options.version,
|
|
59525
|
+
project: options.projectName
|
|
59526
|
+
};
|
|
59527
|
+
return crypto.createHash("sha256").update(JSON.stringify(signatureData)).digest("hex");
|
|
59528
|
+
}
|
|
59529
|
+
function calculateAuthorityScore(node, architectureMap) {
|
|
59530
|
+
const signals = node.signals || {};
|
|
59531
|
+
return (signals.blast_radius || 0) * 2 + (signals.criticality || 0) * 1.5;
|
|
59532
|
+
}
|
|
59533
|
+
function analyzeInfluencePatterns(node, architectureMap) {
|
|
59534
|
+
return ["central_coordinator", "cross_layer_bridge"];
|
|
59535
|
+
}
|
|
59536
|
+
function classifyHubType(node, architectureMap) {
|
|
59537
|
+
return "coordination_hub";
|
|
59538
|
+
}
|
|
59539
|
+
function groupEdgesByModule(edges, nodes) {
|
|
59540
|
+
return {};
|
|
59541
|
+
}
|
|
59542
|
+
function detectBoundaryViolations(layer, layerNodes, architectureMap) {
|
|
59543
|
+
return [];
|
|
59544
|
+
}
|
|
59545
|
+
function calculateCyclomaticComplexity(nodes, edges) {
|
|
59546
|
+
return edges.length - nodes.length + 2;
|
|
59547
|
+
}
|
|
59548
|
+
function calculateCouplingDegree(nodes, edges) {
|
|
59549
|
+
return edges.length / nodes.length;
|
|
59550
|
+
}
|
|
59551
|
+
function calculateCohesionMeasure(nodes, edges) {
|
|
59552
|
+
return 0.7;
|
|
59553
|
+
}
|
|
59554
|
+
function detectCircularDependencies(edges) {
|
|
59555
|
+
return [];
|
|
59556
|
+
}
|
|
59557
|
+
function assessStructuralCompleteness(architectureMap) {
|
|
59558
|
+
return {
|
|
59559
|
+
completeness_score: 95,
|
|
59560
|
+
missing_elements: [],
|
|
59561
|
+
validation_passed: true
|
|
59562
|
+
};
|
|
59563
|
+
}
|
|
59564
|
+
function calculateConfidenceScores(architectureMap) {
|
|
59565
|
+
return {
|
|
59566
|
+
overall_confidence: 0.92,
|
|
59567
|
+
data_quality: 0.95,
|
|
59568
|
+
analysis_depth: 0.88
|
|
59569
|
+
};
|
|
59570
|
+
}
|
|
59571
|
+
module2.exports = {
|
|
59572
|
+
generateAuthoritativeContext,
|
|
59573
|
+
detectPrimaryLanguage,
|
|
59574
|
+
classifyArchitecturalArchetype,
|
|
59575
|
+
identifyAuthorityCores,
|
|
59576
|
+
identifyStructuralHubs,
|
|
59577
|
+
detectCouplingPatterns,
|
|
59578
|
+
defineArchitecturalBoundaries,
|
|
59579
|
+
extractStructuralInvariants,
|
|
59580
|
+
calculateStructuralComplexity,
|
|
59581
|
+
calculateAnalysisCoverage,
|
|
59582
|
+
generateContentHash,
|
|
59583
|
+
generateGenerationSignature
|
|
59584
|
+
};
|
|
59585
|
+
}
|
|
59586
|
+
});
|
|
59587
|
+
|
|
59588
|
+
// src/core/invariant-detector.js
|
|
59589
|
+
var require_invariant_detector = __commonJS({
|
|
59590
|
+
"src/core/invariant-detector.js"(exports2, module2) {
|
|
59591
|
+
var fs2 = require("fs").promises;
|
|
59592
|
+
var path2 = require("path");
|
|
59593
|
+
var InvariantDetector = class {
|
|
59594
|
+
constructor() {
|
|
59595
|
+
this.detectedInvariants = [];
|
|
59596
|
+
}
|
|
59597
|
+
/**
|
|
59598
|
+
* Detect invariants in a scanned codebase
|
|
59599
|
+
* @param {Object} scanResult - The result from the scanner
|
|
59600
|
+
* @param {string} directory - The directory that was scanned
|
|
59601
|
+
* @returns {Array} - Array of detected invariants
|
|
59602
|
+
*/
|
|
59603
|
+
async detectInvariants(scanResult, directory) {
|
|
59604
|
+
this.detectedInvariants = [];
|
|
59605
|
+
try {
|
|
59606
|
+
await this.analyzeNodesForInvariants(scanResult.nodes, directory);
|
|
59607
|
+
await this.analyzeEdgesForInvariants(scanResult.edges);
|
|
59608
|
+
await this.analyzeCodeFilesForInvariants(directory);
|
|
59609
|
+
console.log(`
|
|
59610
|
+
\u{1F6E1}\uFE0F Invariant Detection Complete`);
|
|
59611
|
+
console.log(` Found ${this.detectedInvariants.length} potential system invariants`);
|
|
59612
|
+
return this.detectedInvariants;
|
|
59613
|
+
} catch (error) {
|
|
59614
|
+
console.error("Invariant detection failed:", error.message);
|
|
59615
|
+
return [];
|
|
59616
|
+
}
|
|
59617
|
+
}
|
|
59618
|
+
/**
|
|
59619
|
+
* Analyze nodes for invariant patterns
|
|
59620
|
+
*/
|
|
59621
|
+
async analyzeNodesForInvariants(nodes, directory) {
|
|
59622
|
+
for (const node of nodes) {
|
|
59623
|
+
if (!node.path)
|
|
59624
|
+
continue;
|
|
59625
|
+
try {
|
|
59626
|
+
const filePath = path2.join(directory, node.path);
|
|
59627
|
+
if (await this.isFileAccessible(filePath)) {
|
|
59628
|
+
const content = await fs2.readFile(filePath, "utf8");
|
|
59629
|
+
const fileInvariants = this.extractInvariantsFromFile(content, node.path);
|
|
59630
|
+
for (const invariant of fileInvariants) {
|
|
59631
|
+
const nodeId = node.path || node.id || "unknown";
|
|
59632
|
+
this.detectedInvariants.push({
|
|
59633
|
+
id: this.generateInvariantId(invariant.pattern, nodeId),
|
|
59634
|
+
description: invariant.description,
|
|
59635
|
+
scope: this.determineScopeFromPath(nodeId),
|
|
59636
|
+
critical_path: invariant.isCritical,
|
|
59637
|
+
assertion: `Pattern: ${invariant.pattern}`,
|
|
59638
|
+
status: "active",
|
|
59639
|
+
source_file: nodeId,
|
|
59640
|
+
detected_at: (/* @__PURE__ */ new Date()).toISOString()
|
|
59641
|
+
});
|
|
59642
|
+
}
|
|
59643
|
+
}
|
|
59644
|
+
} catch (error) {
|
|
59645
|
+
continue;
|
|
59646
|
+
}
|
|
59647
|
+
}
|
|
59648
|
+
}
|
|
59649
|
+
/**
|
|
59650
|
+
* Analyze edges for potential invariant relationships
|
|
59651
|
+
*/
|
|
59652
|
+
async analyzeEdgesForInvariants(edges) {
|
|
59653
|
+
const dependencyConstraints = this.identifyDependencyInvariants(edges);
|
|
59654
|
+
for (const constraint of dependencyConstraints) {
|
|
59655
|
+
this.detectedInvariants.push({
|
|
59656
|
+
id: this.generateInvariantId("dependency_constraint", constraint.from + "_" + constraint.to),
|
|
59657
|
+
description: constraint.description,
|
|
59658
|
+
scope: "boundary",
|
|
59659
|
+
critical_path: constraint.critical,
|
|
59660
|
+
assertion: `Dependency constraint: ${constraint.from} -> ${constraint.to}`,
|
|
59661
|
+
status: "active",
|
|
59662
|
+
source_relationship: `${constraint.from} -> ${constraint.to}`,
|
|
59663
|
+
detected_at: (/* @__PURE__ */ new Date()).toISOString()
|
|
59664
|
+
});
|
|
59665
|
+
}
|
|
59666
|
+
}
|
|
59667
|
+
/**
|
|
59668
|
+
* Analyze code files directly for invariant patterns
|
|
59669
|
+
*/
|
|
59670
|
+
async analyzeCodeFilesForInvariants(directory) {
|
|
59671
|
+
const invariantFiles = await this.findInvariantRelatedFiles(directory);
|
|
59672
|
+
for (const filePath of invariantFiles) {
|
|
59673
|
+
try {
|
|
59674
|
+
const content = await fs2.readFile(filePath, "utf8");
|
|
59675
|
+
const relativePath = path2.relative(directory, filePath);
|
|
59676
|
+
const patterns = this.searchForInvariantPatterns(content);
|
|
59677
|
+
for (const pattern of patterns) {
|
|
59678
|
+
this.detectedInvariants.push({
|
|
59679
|
+
id: this.generateInvariantId(pattern.type, relativePath),
|
|
59680
|
+
description: `System invariant implemented in ${relativePath}: ${pattern.description}`,
|
|
59681
|
+
scope: "system",
|
|
59682
|
+
critical_path: true,
|
|
59683
|
+
// File specifically for invariants is likely critical
|
|
59684
|
+
assertion: pattern.assertion,
|
|
59685
|
+
status: "active",
|
|
59686
|
+
source_file: relativePath,
|
|
59687
|
+
implementation_type: pattern.type,
|
|
59688
|
+
detected_at: (/* @__PURE__ */ new Date()).toISOString()
|
|
59689
|
+
});
|
|
59690
|
+
}
|
|
59691
|
+
} catch (error) {
|
|
59692
|
+
continue;
|
|
59693
|
+
}
|
|
59694
|
+
}
|
|
59695
|
+
}
|
|
59696
|
+
/**
|
|
59697
|
+
* Extract invariants from file content based on patterns
|
|
59698
|
+
*/
|
|
59699
|
+
extractInvariantsFromFile(content, filePath) {
|
|
59700
|
+
const invariants = [];
|
|
59701
|
+
const validationPatterns = [
|
|
59702
|
+
/function\s+validate\w+/gi,
|
|
59703
|
+
/function\s+check\w+/gi,
|
|
59704
|
+
/function\s+ensure\w+/gi,
|
|
59705
|
+
/function\s+guard\w+/gi,
|
|
59706
|
+
/function\s+verify\w+/gi,
|
|
59707
|
+
/function\s+assert\w+/gi,
|
|
59708
|
+
/function\s+enforce\w+/gi
|
|
59709
|
+
];
|
|
59710
|
+
for (const pattern of validationPatterns) {
|
|
59711
|
+
const matches = content.match(pattern);
|
|
59712
|
+
if (matches) {
|
|
59713
|
+
invariants.push({
|
|
59714
|
+
pattern: pattern.source,
|
|
59715
|
+
description: `Validation function pattern found in ${filePath}: ${matches.length} matches`,
|
|
59716
|
+
isCritical: true
|
|
59717
|
+
});
|
|
59718
|
+
}
|
|
59719
|
+
}
|
|
59720
|
+
const errorHandlingPatterns = [
|
|
59721
|
+
/try\s*\{/gi,
|
|
59722
|
+
/catch\s*\(/gi,
|
|
59723
|
+
/throw\s+new/gi,
|
|
59724
|
+
/if\s*\([^)]+\)\s*throw/gi,
|
|
59725
|
+
/error\.message/gi
|
|
59726
|
+
];
|
|
59727
|
+
for (const pattern of errorHandlingPatterns) {
|
|
59728
|
+
const match = content.match(pattern);
|
|
59729
|
+
if (match) {
|
|
59730
|
+
invariants.push({
|
|
59731
|
+
pattern: pattern.source,
|
|
59732
|
+
description: `Constraint enforcement pattern found in ${filePath}`,
|
|
59733
|
+
isCritical: false
|
|
59734
|
+
});
|
|
59735
|
+
}
|
|
59736
|
+
}
|
|
59737
|
+
const stateManagementPatterns = [
|
|
59738
|
+
/setState\s*\(/gi,
|
|
59739
|
+
/dispatch\s*\(/gi,
|
|
59740
|
+
/useReducer/gi,
|
|
59741
|
+
/useState/gi,
|
|
59742
|
+
/store\./gi,
|
|
59743
|
+
/state\./gi,
|
|
59744
|
+
/state\s*=\s*/gi
|
|
59745
|
+
];
|
|
59746
|
+
for (const pattern of stateManagementPatterns) {
|
|
59747
|
+
const match = content.match(pattern);
|
|
59748
|
+
if (match) {
|
|
59749
|
+
invariants.push({
|
|
59750
|
+
pattern: pattern.source,
|
|
59751
|
+
description: `State transition constraint pattern found in ${filePath}`,
|
|
59752
|
+
isCritical: true
|
|
59753
|
+
});
|
|
59754
|
+
}
|
|
59755
|
+
}
|
|
59756
|
+
const boundaryCheckPatterns = [
|
|
59757
|
+
/boundary\s*check/gi,
|
|
59758
|
+
/range\s*check/gi,
|
|
59759
|
+
/limit\s*check/gi,
|
|
59760
|
+
/max\s*\w*\s*>/gi,
|
|
59761
|
+
/min\s*\w*\s*</gi,
|
|
59762
|
+
/within\s*bound/gi,
|
|
59763
|
+
/validate\s*input/gi,
|
|
59764
|
+
/sanitiz/gi
|
|
59765
|
+
];
|
|
59766
|
+
for (const pattern of boundaryCheckPatterns) {
|
|
59767
|
+
const match = content.match(pattern);
|
|
59768
|
+
if (match) {
|
|
59769
|
+
invariants.push({
|
|
59770
|
+
pattern: pattern.source,
|
|
59771
|
+
description: `Boundary enforcement pattern found in ${filePath}`,
|
|
59772
|
+
isCritical: true
|
|
59773
|
+
});
|
|
59774
|
+
}
|
|
59775
|
+
}
|
|
59776
|
+
const invariantIndicators = this.extractDetailedInvariantIndicators(content, filePath);
|
|
59777
|
+
for (const indicator of invariantIndicators) {
|
|
59778
|
+
invariants.push(indicator);
|
|
59779
|
+
}
|
|
59780
|
+
return invariants;
|
|
59781
|
+
}
|
|
59782
|
+
/**
|
|
59783
|
+
* Extract detailed invariant indicators from content
|
|
59784
|
+
*/
|
|
59785
|
+
extractDetailedInvariantIndicators(content, filePath) {
|
|
59786
|
+
const indicators = [];
|
|
59787
|
+
const patterns = [
|
|
59788
|
+
// Assertion and validation patterns
|
|
59789
|
+
{ pattern: /assert\(/gi, description: "Assertion-based invariant check", critical: true },
|
|
59790
|
+
{ pattern: /console\.assert\(/gi, description: "Console assertion pattern", critical: true },
|
|
59791
|
+
{ pattern: /validate[A-Z]/gi, description: "Validate function pattern", critical: false },
|
|
59792
|
+
{ pattern: /check[A-Z]/gi, description: "Check function pattern", critical: false },
|
|
59793
|
+
{ pattern: /ensure[A-Z]/gi, description: "Ensure function pattern", critical: true },
|
|
59794
|
+
{ pattern: /guard[A-Z]/gi, description: "Guard function pattern", critical: true },
|
|
59795
|
+
{ pattern: /verify[A-Z]/gi, description: "Verify function pattern", critical: false },
|
|
59796
|
+
{ pattern: /validate\(/gi, description: "Validation function call", critical: false },
|
|
59797
|
+
// Constraint and invariant mentions
|
|
59798
|
+
{ pattern: /Invariant/gi, description: "Invariant mention", critical: true },
|
|
59799
|
+
{ pattern: /constraint/gi, description: "Constraint mention", critical: true },
|
|
59800
|
+
{ pattern: /require\(/gi, description: "Requirement assertion", critical: true },
|
|
59801
|
+
{ pattern: /enforce/gi, description: "Enforcement pattern", critical: true },
|
|
59802
|
+
// Conditional guard patterns
|
|
59803
|
+
{ pattern: /must.*be/gi, description: "Must-be pattern", critical: true },
|
|
59804
|
+
{ pattern: /should.*be/gi, description: "Should-be pattern", critical: false },
|
|
59805
|
+
{ pattern: /expected.*to/gi, description: "Expected-to pattern", critical: false },
|
|
59806
|
+
{ pattern: /if.*!\s*[^\s]+\s*throw/gi, description: "Guard clause pattern", critical: true },
|
|
59807
|
+
{ pattern: /if.*!\s*[^\s]+\s*reject/gi, description: "Promise rejection guard", critical: true },
|
|
59808
|
+
{ pattern: /throw.*Error/gi, description: "Error throwing pattern", critical: true },
|
|
59809
|
+
// Boundary and validation patterns
|
|
59810
|
+
{ pattern: /boundary.*check/gi, description: "Boundary check", critical: true },
|
|
59811
|
+
{ pattern: /range.*check/gi, description: "Range check", critical: true },
|
|
59812
|
+
{ pattern: /within.*bounds/gi, description: "Bounds check", critical: true },
|
|
59813
|
+
{ pattern: /validat(e|ion)/gi, description: "Validation pattern", critical: false },
|
|
59814
|
+
{ pattern: /guard/i, description: "Guard pattern", critical: true },
|
|
59815
|
+
// Access control and security patterns
|
|
59816
|
+
{ pattern: /access.*control/gi, description: "Access control", critical: true },
|
|
59817
|
+
{ pattern: /permission.*check/gi, description: "Permission check", critical: true },
|
|
59818
|
+
{ pattern: /auth(?:oriz|enticat)/gi, description: "Authorization/authentication", critical: true },
|
|
59819
|
+
{ pattern: /acl/gi, description: "Access Control List", critical: true },
|
|
59820
|
+
// State management patterns
|
|
59821
|
+
{ pattern: /state.*transition/gi, description: "State transition", critical: true },
|
|
59822
|
+
{ pattern: /setState/gi, description: "State setter", critical: true },
|
|
59823
|
+
{ pattern: /update.*state/gi, description: "State updater", critical: true },
|
|
59824
|
+
{ pattern: /transition/gi, description: "Transition pattern", critical: true },
|
|
59825
|
+
{ pattern: /immutable/gi, description: "Immutability pattern", critical: true },
|
|
59826
|
+
// Type and schema validation patterns
|
|
59827
|
+
{ pattern: /zod/gi, description: "Zod validation schema", critical: false },
|
|
59828
|
+
{ pattern: /joi/gi, description: "Joi validation schema", critical: false },
|
|
59829
|
+
{ pattern: /yup/gi, description: "Yup validation schema", critical: false },
|
|
59830
|
+
{ pattern: /ajv/gi, description: "Ajv validation schema", critical: false },
|
|
59831
|
+
{ pattern: /schema/gi, description: "Schema definition", critical: false },
|
|
59832
|
+
// Configuration patterns
|
|
59833
|
+
{ pattern: /config.*environ/gi, description: "Environment configuration", critical: true },
|
|
59834
|
+
{ pattern: /env.*validation/gi, description: "Environment validation", critical: true }
|
|
59835
|
+
];
|
|
59836
|
+
for (const item of patterns) {
|
|
59837
|
+
if (!item.pattern || !content)
|
|
59838
|
+
continue;
|
|
59839
|
+
let match;
|
|
59840
|
+
try {
|
|
59841
|
+
while ((match = item.pattern.exec(content)) !== null) {
|
|
59842
|
+
const position = item.pattern.lastIndex;
|
|
59843
|
+
const prevMatch = indicators.find((ind) => ind.pattern === item.pattern.source && ind.description.includes(match[0]));
|
|
59844
|
+
if (!prevMatch) {
|
|
59845
|
+
indicators.push({
|
|
59846
|
+
pattern: item.pattern.source,
|
|
59847
|
+
description: `${item.description} found in ${filePath}: '${match[0]}' at position ${position}`,
|
|
59848
|
+
isCritical: item.critical
|
|
59849
|
+
});
|
|
59850
|
+
}
|
|
59851
|
+
}
|
|
59852
|
+
} catch (error) {
|
|
59853
|
+
continue;
|
|
59854
|
+
}
|
|
59855
|
+
}
|
|
59856
|
+
return indicators;
|
|
59857
|
+
}
|
|
59858
|
+
/**
|
|
59859
|
+
* Identify dependency-based invariants from edges
|
|
59860
|
+
*/
|
|
59861
|
+
identifyDependencyInvariants(edges) {
|
|
59862
|
+
const constraints = [];
|
|
59863
|
+
const coreModules = /* @__PURE__ */ new Set();
|
|
59864
|
+
const peripheralModules = /* @__PURE__ */ new Set();
|
|
59865
|
+
for (const edge of edges) {
|
|
59866
|
+
if (this.isCoreLayer(edge.from) && this.isPeripheralLayer(edge.to)) {
|
|
59867
|
+
constraints.push({
|
|
59868
|
+
from: edge.from,
|
|
59869
|
+
to: edge.to,
|
|
59870
|
+
description: `Potential architectural invariant: Core module ${edge.from} depends on peripheral module ${edge.to}`,
|
|
59871
|
+
critical: true
|
|
59872
|
+
});
|
|
59873
|
+
}
|
|
59874
|
+
}
|
|
59875
|
+
return constraints;
|
|
59876
|
+
}
|
|
59877
|
+
/**
|
|
59878
|
+
* Find files that are likely related to invariant implementation
|
|
59879
|
+
*/
|
|
59880
|
+
async findInvariantRelatedFiles(directory) {
|
|
59881
|
+
const invariantFiles = [];
|
|
59882
|
+
const walk = async (dir) => {
|
|
59883
|
+
try {
|
|
59884
|
+
const entries = await fs2.readdir(dir, { withFileTypes: true });
|
|
59885
|
+
for (const entry of entries) {
|
|
59886
|
+
const fullPath = path2.join(dir, entry.name);
|
|
59887
|
+
if (entry.isDirectory()) {
|
|
59888
|
+
await walk(fullPath);
|
|
59889
|
+
} else if (entry.isFile()) {
|
|
59890
|
+
const fileName = entry.name.toLowerCase();
|
|
59891
|
+
if (fileName.includes("invariant") || fileName.includes("validation") || fileName.includes("guard") || fileName.includes("assert") || fileName.includes("constraint") || fileName.includes("boundary") || fileName.includes("policy") || fileName.includes("rule")) {
|
|
59892
|
+
invariantFiles.push(fullPath);
|
|
59893
|
+
}
|
|
59894
|
+
}
|
|
59895
|
+
}
|
|
59896
|
+
} catch (error) {
|
|
59897
|
+
}
|
|
59898
|
+
};
|
|
59899
|
+
await walk(directory);
|
|
59900
|
+
return invariantFiles;
|
|
59901
|
+
}
|
|
59902
|
+
/**
|
|
59903
|
+
* Search for specific invariant implementation patterns
|
|
59904
|
+
*/
|
|
59905
|
+
searchForInvariantPatterns(content) {
|
|
59906
|
+
const patterns = [];
|
|
59907
|
+
if (content.includes("assert(") || content.includes("AssertionError")) {
|
|
59908
|
+
patterns.push({
|
|
59909
|
+
type: "assertion",
|
|
59910
|
+
description: "Assertion-based invariant checking found",
|
|
59911
|
+
assertion: "Code contains assert() calls for invariant enforcement"
|
|
59912
|
+
});
|
|
59913
|
+
}
|
|
59914
|
+
if (content.includes("validate(") || content.includes("isValid") || content.includes("checkValid")) {
|
|
59915
|
+
patterns.push({
|
|
59916
|
+
type: "validation",
|
|
59917
|
+
description: "Validation-based invariant checking found",
|
|
59918
|
+
assertion: "Code contains validation functions for invariant enforcement"
|
|
59919
|
+
});
|
|
59920
|
+
}
|
|
59921
|
+
if (content.includes("if (!condition) throw") || content.includes("guard clause")) {
|
|
59922
|
+
patterns.push({
|
|
59923
|
+
type: "guard_clause",
|
|
59924
|
+
description: "Guard clause invariant enforcement found",
|
|
59925
|
+
assertion: "Code contains early-exit guard clauses for invariant enforcement"
|
|
59926
|
+
});
|
|
59927
|
+
}
|
|
59928
|
+
if (content.includes("state") && (content.includes("transition") || content.includes("transitions"))) {
|
|
59929
|
+
patterns.push({
|
|
59930
|
+
type: "state_machine",
|
|
59931
|
+
description: "State transition invariant found",
|
|
59932
|
+
assertion: "Code implements state machine with transition constraints"
|
|
59933
|
+
});
|
|
59934
|
+
}
|
|
59935
|
+
return patterns;
|
|
59936
|
+
}
|
|
59937
|
+
/**
|
|
59938
|
+
* Determine scope based on file path
|
|
59939
|
+
*/
|
|
59940
|
+
determineScopeFromPath(filePath) {
|
|
59941
|
+
if (!filePath)
|
|
59942
|
+
return "module";
|
|
59943
|
+
if (filePath.includes("/core/") || filePath.includes("/lib/") || filePath.includes("/shared/")) {
|
|
59944
|
+
return "system";
|
|
59945
|
+
} else if (filePath.includes("/modules/") || filePath.includes("/components/")) {
|
|
59946
|
+
return "boundary";
|
|
59947
|
+
} else {
|
|
59948
|
+
return "module";
|
|
59949
|
+
}
|
|
59950
|
+
}
|
|
59951
|
+
/**
|
|
59952
|
+
* Check if file is accessible
|
|
59953
|
+
*/
|
|
59954
|
+
async isFileAccessible(filePath) {
|
|
59955
|
+
try {
|
|
59956
|
+
await fs2.access(filePath);
|
|
59957
|
+
return true;
|
|
59958
|
+
} catch {
|
|
59959
|
+
return false;
|
|
59960
|
+
}
|
|
59961
|
+
}
|
|
59962
|
+
/**
|
|
59963
|
+
* Check if path represents a core layer
|
|
59964
|
+
*/
|
|
59965
|
+
isCoreLayer(filePath) {
|
|
59966
|
+
if (!filePath)
|
|
59967
|
+
return false;
|
|
59968
|
+
return filePath.includes("/core/") || filePath.includes("/lib/") || filePath.includes("/shared/") || filePath.includes("config") || filePath.includes("auth");
|
|
59969
|
+
}
|
|
59970
|
+
/**
|
|
59971
|
+
* Check if path represents a peripheral layer
|
|
59972
|
+
*/
|
|
59973
|
+
isPeripheralLayer(filePath) {
|
|
59974
|
+
if (!filePath)
|
|
59975
|
+
return false;
|
|
59976
|
+
return filePath.includes("/views/") || filePath.includes("/templates/") || filePath.includes("/ui/") || filePath.includes("/tests/") || filePath.includes("/mocks/");
|
|
59977
|
+
}
|
|
59978
|
+
/**
|
|
59979
|
+
* Generate unique invariant ID
|
|
59980
|
+
*/
|
|
59981
|
+
generateInvariantId(pattern, context) {
|
|
59982
|
+
const baseId = `${pattern}_${context}`.replace(/[^a-zA-Z0-9_-]/g, "_");
|
|
59983
|
+
return baseId.substring(0, 100);
|
|
59984
|
+
}
|
|
59985
|
+
};
|
|
59986
|
+
module2.exports = { InvariantDetector };
|
|
59987
|
+
}
|
|
59988
|
+
});
|
|
59989
|
+
|
|
59990
|
+
// src/core/invariant-analyzer.js
|
|
59991
|
+
var require_invariant_analyzer = __commonJS({
|
|
59992
|
+
"src/core/invariant-analyzer.js"(exports2, module2) {
|
|
59993
|
+
var InvariantAnalyzer = class {
|
|
59994
|
+
constructor() {
|
|
59995
|
+
this.analysisCache = /* @__PURE__ */ new Map();
|
|
59996
|
+
}
|
|
59997
|
+
/**
|
|
59998
|
+
* Analyze detected invariants for a repository
|
|
59999
|
+
* @param {Array} invariants - Array of detected invariants from scanning
|
|
60000
|
+
* @param {Object} context - Additional context about the repository
|
|
60001
|
+
* @returns {Object} Analysis results with insights and recommendations
|
|
60002
|
+
*/
|
|
60003
|
+
analyzeInvariants(invariants, context = {}) {
|
|
60004
|
+
if (!invariants || !Array.isArray(invariants)) {
|
|
60005
|
+
return {
|
|
60006
|
+
summary: { total: 0, critical: 0, non_critical: 0 },
|
|
60007
|
+
insights: [],
|
|
60008
|
+
recommendations: [],
|
|
60009
|
+
confidence: "low"
|
|
60010
|
+
};
|
|
60011
|
+
}
|
|
60012
|
+
const categorized = this.categorizeInvariants(invariants);
|
|
60013
|
+
const insights = this.generateInsights(categorized, context);
|
|
60014
|
+
const recommendations = this.generateRecommendations(categorized, context);
|
|
60015
|
+
const confidence = this.calculateConfidence(invariants, context);
|
|
60016
|
+
const analysisResult = {
|
|
60017
|
+
summary: {
|
|
60018
|
+
total: invariants.length,
|
|
60019
|
+
critical: categorized.critical.length,
|
|
60020
|
+
non_critical: categorized.non_critical.length,
|
|
60021
|
+
by_scope: categorized.by_scope
|
|
60022
|
+
},
|
|
60023
|
+
insights,
|
|
60024
|
+
recommendations,
|
|
60025
|
+
confidence
|
|
60026
|
+
};
|
|
60027
|
+
const cacheKey = this.generateCacheKey(context);
|
|
60028
|
+
this.analysisCache.set(cacheKey, analysisResult);
|
|
60029
|
+
return analysisResult;
|
|
60030
|
+
}
|
|
60031
|
+
/**
|
|
60032
|
+
* Categorize invariants by criticality and scope
|
|
60033
|
+
*/
|
|
60034
|
+
categorizeInvariants(invariants) {
|
|
60035
|
+
const categorized = {
|
|
60036
|
+
critical: [],
|
|
60037
|
+
non_critical: [],
|
|
60038
|
+
by_scope: {
|
|
60039
|
+
module: [],
|
|
60040
|
+
boundary: [],
|
|
60041
|
+
system: []
|
|
60042
|
+
}
|
|
60043
|
+
};
|
|
60044
|
+
for (const invariant of invariants) {
|
|
60045
|
+
if (invariant.critical_path) {
|
|
60046
|
+
categorized.critical.push(invariant);
|
|
60047
|
+
} else {
|
|
60048
|
+
categorized.non_critical.push(invariant);
|
|
60049
|
+
}
|
|
60050
|
+
if (invariant.scope) {
|
|
60051
|
+
const scopeKey = invariant.scope.toLowerCase();
|
|
60052
|
+
if (categorized.by_scope[scopeKey]) {
|
|
60053
|
+
categorized.by_scope[scopeKey].push(invariant);
|
|
60054
|
+
}
|
|
60055
|
+
}
|
|
60056
|
+
}
|
|
60057
|
+
return categorized;
|
|
60058
|
+
}
|
|
60059
|
+
/**
|
|
60060
|
+
* Generate insights from the categorized invariants
|
|
60061
|
+
*/
|
|
60062
|
+
generateInsights(categorized, context) {
|
|
60063
|
+
const insights = [];
|
|
60064
|
+
if (categorized.critical.length > 0) {
|
|
60065
|
+
insights.push({
|
|
60066
|
+
category: "critical_invariants",
|
|
60067
|
+
title: "Critical System Invariants Detected",
|
|
60068
|
+
description: `The repository contains ${categorized.critical.length} critical invariants that must always hold true. Violating these would cause existential system failure.`,
|
|
60069
|
+
severity: "high",
|
|
60070
|
+
impact: "These invariants protect against system-wide failures"
|
|
60071
|
+
});
|
|
60072
|
+
}
|
|
60073
|
+
if (categorized.by_scope.system && categorized.by_scope.system.length > 0) {
|
|
60074
|
+
insights.push({
|
|
60075
|
+
category: "system_invariants",
|
|
60076
|
+
title: "System-Level Invariants Identified",
|
|
60077
|
+
description: `The repository has ${categorized.by_scope.system.length} system-level invariants that govern overall system behavior.`,
|
|
60078
|
+
severity: "medium",
|
|
60079
|
+
impact: "These ensure consistent system-wide behavior"
|
|
60080
|
+
});
|
|
60081
|
+
}
|
|
60082
|
+
if (categorized.by_scope.boundary && categorized.by_scope.boundary.length > 0) {
|
|
60083
|
+
insights.push({
|
|
60084
|
+
category: "boundary_invariants",
|
|
60085
|
+
title: "Boundary Invariants Detected",
|
|
60086
|
+
description: `The repository has ${categorized.by_scope.boundary.length} boundary invariants that enforce architectural boundaries.`,
|
|
60087
|
+
severity: "medium",
|
|
60088
|
+
impact: "These protect against architectural violations"
|
|
60089
|
+
});
|
|
60090
|
+
}
|
|
60091
|
+
if (categorized.by_scope.module && categorized.by_scope.module.length > 0) {
|
|
60092
|
+
insights.push({
|
|
60093
|
+
category: "module_invariants",
|
|
60094
|
+
title: "Module-Level Invariants Found",
|
|
60095
|
+
description: `The repository has ${categorized.by_scope.module.length} module-level invariants that govern component behavior.`,
|
|
60096
|
+
severity: "low",
|
|
60097
|
+
impact: "These ensure component-level consistency"
|
|
60098
|
+
});
|
|
60099
|
+
}
|
|
60100
|
+
if (categorized.critical.length === 0) {
|
|
60101
|
+
insights.push({
|
|
60102
|
+
category: "invariant_gaps",
|
|
60103
|
+
title: "No Critical Invariants Detected",
|
|
60104
|
+
description: "The system does not appear to have explicitly defined critical invariants. This could indicate either a lack of formal invariant definition or that invariants are implicit.",
|
|
60105
|
+
severity: "medium",
|
|
60106
|
+
impact: "Consider defining critical invariants for system resilience"
|
|
60107
|
+
});
|
|
60108
|
+
}
|
|
60109
|
+
return insights;
|
|
60110
|
+
}
|
|
60111
|
+
/**
|
|
60112
|
+
* Generate recommendations based on the analysis
|
|
60113
|
+
*/
|
|
60114
|
+
generateRecommendations(categorized, context) {
|
|
60115
|
+
const recommendations = [];
|
|
60116
|
+
if (categorized.critical.length === 0) {
|
|
60117
|
+
recommendations.push({
|
|
60118
|
+
priority: "high",
|
|
60119
|
+
title: "Define Critical System Invariants",
|
|
60120
|
+
description: "Establish explicit critical invariants that must always hold to prevent system-wide failures.",
|
|
60121
|
+
action: "Create invariant definitions for core system behaviors that cannot be violated."
|
|
60122
|
+
});
|
|
60123
|
+
}
|
|
60124
|
+
if (categorized.total < 5) {
|
|
60125
|
+
recommendations.push({
|
|
60126
|
+
priority: "medium",
|
|
60127
|
+
title: "Expand Invariant Coverage",
|
|
60128
|
+
description: "The system has limited invariant coverage. Consider expanding to cover more architectural aspects.",
|
|
60129
|
+
action: "Review the architecture to identify additional areas where invariants would provide value."
|
|
60130
|
+
});
|
|
60131
|
+
}
|
|
60132
|
+
recommendations.push({
|
|
60133
|
+
priority: "low",
|
|
60134
|
+
title: "Document Invariant Behavior",
|
|
60135
|
+
description: "Ensure that all detected invariants are properly documented for team awareness.",
|
|
60136
|
+
action: "Create documentation explaining each invariant and why it exists."
|
|
60137
|
+
});
|
|
60138
|
+
recommendations.push({
|
|
60139
|
+
priority: "medium",
|
|
60140
|
+
title: "Monitor Invariant Violations",
|
|
60141
|
+
description: "Set up monitoring to track when invariants are violated during system operation.",
|
|
60142
|
+
action: "Implement logging and alerting for invariant violations."
|
|
60143
|
+
});
|
|
60144
|
+
return recommendations;
|
|
60145
|
+
}
|
|
60146
|
+
/**
|
|
60147
|
+
* Calculate confidence in the analysis
|
|
60148
|
+
*/
|
|
60149
|
+
calculateConfidence(invariants, context) {
|
|
60150
|
+
const totalInvariants = invariants.length;
|
|
60151
|
+
if (totalInvariants === 0) {
|
|
60152
|
+
return "low";
|
|
60153
|
+
}
|
|
60154
|
+
if (totalInvariants >= 10) {
|
|
60155
|
+
return "high";
|
|
60156
|
+
}
|
|
60157
|
+
if (totalInvariants >= 5) {
|
|
60158
|
+
return "medium";
|
|
60159
|
+
}
|
|
60160
|
+
return "medium-low";
|
|
60161
|
+
}
|
|
60162
|
+
/**
|
|
60163
|
+
* Generate a cache key for the analysis
|
|
60164
|
+
*/
|
|
60165
|
+
generateCacheKey(context) {
|
|
60166
|
+
const repoPath = context.directory || context.repoPath || "unknown";
|
|
60167
|
+
const timestamp = context.timestamp || Date.now();
|
|
60168
|
+
return `${repoPath}-${timestamp}`;
|
|
60169
|
+
}
|
|
60170
|
+
/**
|
|
60171
|
+
* Get cached analysis if available
|
|
60172
|
+
*/
|
|
60173
|
+
getCachedAnalysis(context) {
|
|
60174
|
+
const cacheKey = this.generateCacheKey(context);
|
|
60175
|
+
return this.analysisCache.get(cacheKey);
|
|
60176
|
+
}
|
|
60177
|
+
/**
|
|
60178
|
+
* Assess the architectural health based on invariants
|
|
60179
|
+
*/
|
|
60180
|
+
assessArchitecturalHealth(invariants, context = {}) {
|
|
60181
|
+
if (!invariants || invariants.length === 0) {
|
|
60182
|
+
return {
|
|
60183
|
+
score: 30,
|
|
60184
|
+
// Low score for no invariants
|
|
60185
|
+
level: "poor",
|
|
60186
|
+
assessment: "The system lacks formal architectural invariants, making it vulnerable to structural degradation over time."
|
|
60187
|
+
};
|
|
60188
|
+
}
|
|
60189
|
+
let score = 50;
|
|
60190
|
+
const criticalCount = invariants.filter((inv) => inv.critical_path).length;
|
|
60191
|
+
score += Math.min(criticalCount * 10, 30);
|
|
60192
|
+
const systemCount = invariants.filter((inv) => inv.scope === "system").length;
|
|
60193
|
+
score += Math.min(systemCount * 5, 20);
|
|
60194
|
+
score = Math.min(score, 100);
|
|
60195
|
+
let level;
|
|
60196
|
+
if (score >= 80)
|
|
60197
|
+
level = "excellent";
|
|
60198
|
+
else if (score >= 60)
|
|
60199
|
+
level = "good";
|
|
60200
|
+
else if (score >= 40)
|
|
60201
|
+
level = "fair";
|
|
60202
|
+
else
|
|
60203
|
+
level = "poor";
|
|
60204
|
+
return {
|
|
60205
|
+
score,
|
|
60206
|
+
level,
|
|
60207
|
+
assessment: this.generateHealthAssessment(score, level, { criticalCount, systemCount }, context)
|
|
60208
|
+
};
|
|
60209
|
+
}
|
|
60210
|
+
/**
|
|
60211
|
+
* Generate health assessment description
|
|
60212
|
+
*/
|
|
60213
|
+
generateHealthAssessment(score, level, counts, context) {
|
|
60214
|
+
const { criticalCount, systemCount } = counts;
|
|
60215
|
+
if (level === "excellent") {
|
|
60216
|
+
return `Excellent architectural health with ${criticalCount} critical and ${systemCount} system-level invariants protecting the codebase.`;
|
|
60217
|
+
} else if (level === "good") {
|
|
60218
|
+
return `Good architectural health with ${criticalCount} critical invariants providing solid protection for system integrity.`;
|
|
60219
|
+
} else if (level === "fair") {
|
|
60220
|
+
return `Fair architectural health. The system has some invariants but could benefit from more comprehensive invariant coverage.`;
|
|
60221
|
+
} else {
|
|
60222
|
+
return `Poor architectural health. The system lacks sufficient invariants to protect against structural degradation over time.`;
|
|
60223
|
+
}
|
|
60224
|
+
}
|
|
60225
|
+
};
|
|
60226
|
+
module2.exports = { InvariantAnalyzer };
|
|
60227
|
+
}
|
|
60228
|
+
});
|
|
60229
|
+
|
|
58778
60230
|
// src/engine/id-generator.js
|
|
58779
60231
|
var require_id_generator = __commonJS({
|
|
58780
60232
|
"src/engine/id-generator.js"(exports2, module2) {
|
|
@@ -58910,7 +60362,8 @@ var require_context_builder = __commonJS({
|
|
|
58910
60362
|
system: {
|
|
58911
60363
|
name: projectName,
|
|
58912
60364
|
root_path: path2.resolve(directory),
|
|
58913
|
-
language
|
|
60365
|
+
language,
|
|
60366
|
+
archetype: options.archetype || null
|
|
58914
60367
|
},
|
|
58915
60368
|
nodes,
|
|
58916
60369
|
edges: schemaEdges,
|
|
@@ -58930,7 +60383,27 @@ var require_context_builder = __commonJS({
|
|
|
58930
60383
|
// Phase 3 requirement: Structural layers definition
|
|
58931
60384
|
structural_layers: generateAdaptiveStructuralLayers(directory),
|
|
58932
60385
|
// Phase 3 requirement: Project envelope
|
|
58933
|
-
project_envelope: generateProjectEnvelope(directory)
|
|
60386
|
+
project_envelope: generateProjectEnvelope(directory),
|
|
60387
|
+
// Enhanced fields based on corpus analysis
|
|
60388
|
+
authority_cores: options.authorityCores || [],
|
|
60389
|
+
hidden_coupling: options.hiddenCoupling || [],
|
|
60390
|
+
completeness_metrics: options.completenessMetrics || {
|
|
60391
|
+
totalFilesFound: 0,
|
|
60392
|
+
filesAnalyzed: 0,
|
|
60393
|
+
coveragePercentage: 0,
|
|
60394
|
+
missingCriticalFiles: []
|
|
60395
|
+
},
|
|
60396
|
+
// Authoritative structural context ownership
|
|
60397
|
+
structural_hubs: options.structuralHubs || [],
|
|
60398
|
+
architectural_boundaries: options.architecturalBoundaries || {},
|
|
60399
|
+
structural_invariants: options.structuralInvariants || [],
|
|
60400
|
+
// Include detected invariants from the current scan
|
|
60401
|
+
invariants: options.detectedInvariants || [],
|
|
60402
|
+
// Include invariant analysis results
|
|
60403
|
+
invariant_analysis: options.invariantAnalysis || null,
|
|
60404
|
+
// Include architectural health assessment
|
|
60405
|
+
architectural_health: options.architecturalHealth || null,
|
|
60406
|
+
authoritative_context: options.authoritativeContext || null
|
|
58934
60407
|
};
|
|
58935
60408
|
const contextWithoutIntegrity = { ...context };
|
|
58936
60409
|
delete contextWithoutIntegrity.integrity;
|
|
@@ -65908,6 +67381,15 @@ var require_context_sorter = __commonJS({
|
|
|
65908
67381
|
}
|
|
65909
67382
|
sortedContext.metrics = sortedMetrics;
|
|
65910
67383
|
}
|
|
67384
|
+
if (Array.isArray(sortedContext.authority_cores)) {
|
|
67385
|
+
sortedContext.authority_cores = [...sortedContext.authority_cores].sort((a, b) => (b.authorityScore || 0) - (a.authorityScore || 0));
|
|
67386
|
+
}
|
|
67387
|
+
if (Array.isArray(sortedContext.hidden_coupling)) {
|
|
67388
|
+
sortedContext.hidden_coupling = [...sortedContext.hidden_coupling].sort((a, b) => (b.count || 0) - (a.count || 0));
|
|
67389
|
+
}
|
|
67390
|
+
if (sortedContext.contextSurface && Array.isArray(sortedContext.contextSurface)) {
|
|
67391
|
+
sortedContext.contextSurface = [...sortedContext.contextSurface].sort((a, b) => (b.score || 0) - (a.score || 0));
|
|
67392
|
+
}
|
|
65911
67393
|
return sortedContext;
|
|
65912
67394
|
}
|
|
65913
67395
|
module2.exports = { sortContext };
|
|
@@ -65924,6 +67406,11 @@ var require_scanner = __commonJS({
|
|
|
65924
67406
|
var { executePass2 } = require_pass2_semantics();
|
|
65925
67407
|
var { executePass3 } = require_pass3_lifter();
|
|
65926
67408
|
var { executePass4 } = require_pass4_signals();
|
|
67409
|
+
var { detectAuthorityCores, detectHiddenCoupling, detectArchitecturalArchetype } = require_authority_core_detector();
|
|
67410
|
+
var { generateAuthoritativeContext } = require_structural_context_owner();
|
|
67411
|
+
var { InvariantDetector } = require_invariant_detector();
|
|
67412
|
+
var { InvariantAnalyzer } = require_invariant_analyzer();
|
|
67413
|
+
var { spawnSync } = require("child_process");
|
|
65927
67414
|
var { buildContext } = require_context_builder();
|
|
65928
67415
|
var { validateContext } = require_context_validator();
|
|
65929
67416
|
var { sortContext } = require_context_sorter();
|
|
@@ -65946,12 +67433,108 @@ var require_scanner = __commonJS({
|
|
|
65946
67433
|
console.log(` Nodes: ${nodes.length}`);
|
|
65947
67434
|
console.log(` Edges: ${edges.length}`);
|
|
65948
67435
|
console.log(` Symbols: ${symbols ? symbols.length : 0}`);
|
|
67436
|
+
if (global.parserErrors && global.parserErrors.length > 0) {
|
|
67437
|
+
const uniqueErrors = /* @__PURE__ */ new Map();
|
|
67438
|
+
global.parserErrors.forEach((err) => {
|
|
67439
|
+
const key = `${err.error}`;
|
|
67440
|
+
if (!uniqueErrors.has(key)) {
|
|
67441
|
+
uniqueErrors.set(key, { count: 0, examples: [] });
|
|
67442
|
+
}
|
|
67443
|
+
const errorGroup = uniqueErrors.get(key);
|
|
67444
|
+
errorGroup.count++;
|
|
67445
|
+
if (errorGroup.examples.length < 3) {
|
|
67446
|
+
errorGroup.examples.push(`${err.file}:${err.line}:${err.column}`);
|
|
67447
|
+
}
|
|
67448
|
+
});
|
|
67449
|
+
console.log(`
|
|
67450
|
+
\u26A0\uFE0F Parsing Issues Detected (${global.parserErrors.length} files affected):`);
|
|
67451
|
+
uniqueErrors.forEach((info, errorType) => {
|
|
67452
|
+
console.log(` ${info.count} files: ${errorType}`);
|
|
67453
|
+
info.examples.forEach((example) => {
|
|
67454
|
+
console.log(` - ${example}`);
|
|
67455
|
+
});
|
|
67456
|
+
if (info.examples.length < info.count) {
|
|
67457
|
+
console.log(` ... and ${info.count - info.examples.length} more`);
|
|
67458
|
+
}
|
|
67459
|
+
});
|
|
67460
|
+
delete global.parserErrors;
|
|
67461
|
+
}
|
|
67462
|
+
const authoritativeContext = generateAuthoritativeContext(structuralContext, {
|
|
67463
|
+
projectName: path2.basename(directory),
|
|
67464
|
+
rootPath: path2.resolve(directory),
|
|
67465
|
+
commitHash: getGitCommitHash(directory),
|
|
67466
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
67467
|
+
version: process.env.npm_package_version || "0.1.0"
|
|
67468
|
+
});
|
|
67469
|
+
const authorityCores = authoritativeContext.structural_context.authority_cores;
|
|
67470
|
+
const structuralHubs = authoritativeContext.structural_context.structural_hubs;
|
|
67471
|
+
const couplingPatterns = authoritativeContext.structural_context.coupling_patterns;
|
|
67472
|
+
const architecturalBoundaries = authoritativeContext.structural_context.architectural_boundaries;
|
|
67473
|
+
const structuralInvariants = authoritativeContext.structural_context.structural_invariants;
|
|
67474
|
+
const hiddenCoupling = couplingPatterns;
|
|
67475
|
+
const archetype = authoritativeContext.system_identity.architectural_archetype || {
|
|
67476
|
+
type: "general_purpose",
|
|
67477
|
+
confidence: "low",
|
|
67478
|
+
description: "General purpose application",
|
|
67479
|
+
authorityPattern: "distributed_authority"
|
|
67480
|
+
};
|
|
67481
|
+
const completenessMetrics = authoritativeContext.reliability_indicators.analysis_coverage;
|
|
67482
|
+
const invariantDetector = new InvariantDetector();
|
|
67483
|
+
const detectedInvariants = await invariantDetector.detectInvariants(
|
|
67484
|
+
{ nodes, edges },
|
|
67485
|
+
directory
|
|
67486
|
+
);
|
|
67487
|
+
let invariantAnalysis = null;
|
|
67488
|
+
let architecturalHealth = null;
|
|
67489
|
+
if (detectedInvariants && detectedInvariants.length > 0) {
|
|
67490
|
+
const invariantAnalyzer = new InvariantAnalyzer();
|
|
67491
|
+
invariantAnalysis = invariantAnalyzer.analyzeInvariants(detectedInvariants, {
|
|
67492
|
+
directory,
|
|
67493
|
+
projectName: path2.basename(directory),
|
|
67494
|
+
nodeCount: nodes.length,
|
|
67495
|
+
edgeCount: edges.length
|
|
67496
|
+
});
|
|
67497
|
+
architecturalHealth = invariantAnalyzer.assessArchitecturalHealth(detectedInvariants, {
|
|
67498
|
+
directory,
|
|
67499
|
+
projectName: path2.basename(directory)
|
|
67500
|
+
});
|
|
67501
|
+
} else {
|
|
67502
|
+
const invariantAnalyzer = new InvariantAnalyzer();
|
|
67503
|
+
invariantAnalysis = invariantAnalyzer.analyzeInvariants([], {
|
|
67504
|
+
directory,
|
|
67505
|
+
projectName: path2.basename(directory),
|
|
67506
|
+
nodeCount: nodes.length,
|
|
67507
|
+
edgeCount: edges.length
|
|
67508
|
+
});
|
|
67509
|
+
architecturalHealth = invariantAnalyzer.assessArchitecturalHealth([], {
|
|
67510
|
+
directory,
|
|
67511
|
+
projectName: path2.basename(directory)
|
|
67512
|
+
});
|
|
67513
|
+
}
|
|
65949
67514
|
const contextOptions = {
|
|
65950
67515
|
directory,
|
|
65951
67516
|
projectName: path2.basename(directory),
|
|
65952
67517
|
contextSurface,
|
|
65953
|
-
arcvisionVersion: process.env.npm_package_version || "0.1.0"
|
|
67518
|
+
arcvisionVersion: process.env.npm_package_version || "0.1.0",
|
|
65954
67519
|
// Pass version from package.json
|
|
67520
|
+
authorityCores,
|
|
67521
|
+
hiddenCoupling,
|
|
67522
|
+
archetype,
|
|
67523
|
+
completenessMetrics,
|
|
67524
|
+
// New authoritative context fields
|
|
67525
|
+
structuralHubs,
|
|
67526
|
+
architecturalBoundaries,
|
|
67527
|
+
structuralInvariants,
|
|
67528
|
+
authoritativeContext,
|
|
67529
|
+
// Include detected invariants
|
|
67530
|
+
detectedInvariants,
|
|
67531
|
+
// Include invariant analysis results
|
|
67532
|
+
invariantAnalysis,
|
|
67533
|
+
// Include architectural health assessment
|
|
67534
|
+
architecturalHealth,
|
|
67535
|
+
// Pass additional metadata
|
|
67536
|
+
commitHash: getGitCommitHash(directory),
|
|
67537
|
+
rootPath: path2.resolve(directory)
|
|
65955
67538
|
};
|
|
65956
67539
|
let context = buildContext(nodes, edges, symbols, contextOptions);
|
|
65957
67540
|
console.log(" Validating structural context...");
|
|
@@ -65969,7 +67552,21 @@ var require_scanner = __commonJS({
|
|
|
65969
67552
|
throw err;
|
|
65970
67553
|
}
|
|
65971
67554
|
}
|
|
65972
|
-
|
|
67555
|
+
function getGitCommitHash(directory) {
|
|
67556
|
+
try {
|
|
67557
|
+
const result = spawnSync("git", ["rev-parse", "HEAD"], {
|
|
67558
|
+
cwd: directory,
|
|
67559
|
+
stdio: ["pipe", "pipe", "pipe"]
|
|
67560
|
+
});
|
|
67561
|
+
if (result.status === 0) {
|
|
67562
|
+
return result.stdout.toString().trim();
|
|
67563
|
+
}
|
|
67564
|
+
return "unknown";
|
|
67565
|
+
} catch (error) {
|
|
67566
|
+
return "unknown";
|
|
67567
|
+
}
|
|
67568
|
+
}
|
|
67569
|
+
module2.exports = { scan, getGitCommitHash };
|
|
65973
67570
|
}
|
|
65974
67571
|
});
|
|
65975
67572
|
|
|
@@ -66407,6 +68004,10 @@ Use this artifact when:
|
|
|
66407
68004
|
- Structural roles (service, store, boundary, etc.)
|
|
66408
68005
|
- Invariants inferred from the system
|
|
66409
68006
|
- Impact metrics (blast radius, coupling)
|
|
68007
|
+
- Authority core identification
|
|
68008
|
+
- Hidden coupling detection
|
|
68009
|
+
- Architectural archetype classification
|
|
68010
|
+
- Analysis completeness metrics
|
|
66410
68011
|
|
|
66411
68012
|
## Determinism & Trust
|
|
66412
68013
|
|