gitgalaxy 2.0.9__tar.gz → 2.2.0__tar.gz
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.
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/.github/workflows/codeql.yml +3 -3
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/.github/workflows/deploy-docs.yml +2 -2
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/.github/workflows/publish.yml +2 -2
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/.gitignore +14 -0
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/PKG-INFO +9 -8
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/README.md +8 -7
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/action.yml +1 -1
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/gitgalaxy/core/aperture.py +42 -45
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/gitgalaxy/core/detector.py +6 -1
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/gitgalaxy/core/network_risk_sensor.py +20 -13
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/gitgalaxy/galaxyscope.py +53 -6
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/gitgalaxy/physics/neural_auditor.py +1 -1
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/gitgalaxy/physics/signal_processor.py +6 -6
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/gitgalaxy/recorders/llm_recorder.py +51 -37
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/gitgalaxy/recorders/record_keeper.py +18 -14
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/gitgalaxy/security/security_auditor.py +60 -18
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/gitgalaxy/security/security_lens.py +52 -61
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/gitgalaxy/standards/language_lens.py +7 -0
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/gitgalaxy/standards/language_standards.py +598 -182
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/gitgalaxy/tools/cobol_to_cobol/README.md +3 -2
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/gitgalaxy/tools/cobol_to_cobol/cobol_compiler_forge.py +12 -1
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/gitgalaxy/tools/cobol_to_cobol/cobol_graveyard_finder.py +3 -3
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/gitgalaxy/tools/cobol_to_cobol/cobol_lexical_patcher.py +1 -1
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/gitgalaxy/tools/cobol_to_cobol/cobol_microservice_slicer.py +5 -4
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/gitgalaxy/tools/cobol_to_cobol/cobol_schema_forge.py +2 -1
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/gitgalaxy/tools/cobol_to_java/cobol_to_java_build_forge.py +6 -0
- gitgalaxy-2.2.0/gitgalaxy/tools/cobol_to_java/cobol_to_java_test_forge.py +104 -0
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/gitgalaxy.egg-info/PKG-INFO +9 -8
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/gitgalaxy.egg-info/SOURCES.txt +54 -2
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/mkdocs.yml +141 -2
- gitgalaxy-2.2.0/tests/README.md +94 -0
- gitgalaxy-2.2.0/tests/cobol_mainframe/readme.md +70 -0
- gitgalaxy-2.2.0/tests/cobol_mainframe/test_cobol_agent_task_forge.py +117 -0
- gitgalaxy-2.2.0/tests/cobol_mainframe/test_cobol_compiler_forge.py +104 -0
- gitgalaxy-2.2.0/tests/cobol_mainframe/test_cobol_dag_architect.py +138 -0
- gitgalaxy-2.2.0/tests/cobol_mainframe/test_cobol_etl_unpacker.py +132 -0
- gitgalaxy-2.2.0/tests/cobol_mainframe/test_cobol_graveyard_finder.py +117 -0
- gitgalaxy-2.2.0/tests/cobol_mainframe/test_cobol_jcl_auditor.py +123 -0
- gitgalaxy-2.2.0/tests/cobol_mainframe/test_cobol_jcl_forge.py +127 -0
- gitgalaxy-2.2.0/tests/cobol_mainframe/test_cobol_lexical_patcher.py +87 -0
- gitgalaxy-2.2.0/tests/cobol_mainframe/test_cobol_microservice_slicer.py +111 -0
- gitgalaxy-2.2.0/tests/cobol_mainframe/test_cobol_refractor_controller.py +88 -0
- gitgalaxy-2.2.0/tests/cobol_mainframe/test_cobol_schema_forge.py +88 -0
- gitgalaxy-2.2.0/tests/cobol_mainframe/test_cobol_system_limits_reporter.py +105 -0
- gitgalaxy-2.2.0/tests/core_engine/readme.md +76 -0
- gitgalaxy-2.2.0/tests/core_engine/test_aperture.py +165 -0
- gitgalaxy-2.2.0/tests/core_engine/test_chronometer_timeout.py +73 -0
- gitgalaxy-2.2.0/tests/core_engine/test_detector.py +161 -0
- {gitgalaxy-2.0.9/tests → gitgalaxy-2.2.0/tests/core_engine}/test_galaxyscope.py +2 -2
- gitgalaxy-2.2.0/tests/core_engine/test_guidestar_lens.py +134 -0
- gitgalaxy-2.2.0/tests/core_engine/test_language_lens.py +48 -0
- gitgalaxy-2.2.0/tests/core_engine/test_language_standards_strict.py +191 -0
- gitgalaxy-2.2.0/tests/core_engine/test_prism.py +165 -0
- gitgalaxy-2.2.0/tests/core_engine/test_signal_processor.py +161 -0
- gitgalaxy-2.2.0/tests/core_engine/test_state_rehydrator.py +119 -0
- gitgalaxy-2.2.0/tests/core_engine/test_zero_dependency.py +85 -0
- gitgalaxy-2.2.0/tests/extraction/readme.md +72 -0
- gitgalaxy-2.2.0/tests/extraction/test_args_extraction_strict.py +289 -0
- gitgalaxy-2.2.0/tests/extraction/test_class_extraction_strict.py +329 -0
- gitgalaxy-2.2.0/tests/extraction/test_dependency_extraction_strict.py +462 -0
- gitgalaxy-2.2.0/tests/extraction/test_function_extraction_strict.py +472 -0
- gitgalaxy-2.2.0/tests/security_auditing/readme.md +45 -0
- gitgalaxy-2.2.0/tests/security_auditing/test_ai_appsec_sensor.py +105 -0
- gitgalaxy-2.2.0/tests/security_auditing/test_api_network_map.py +80 -0
- gitgalaxy-2.2.0/tests/security_auditing/test_binary_anomaly_detector.py +102 -0
- gitgalaxy-2.2.0/tests/security_auditing/test_dev_agent_firewall.py +137 -0
- gitgalaxy-2.2.0/tests/security_auditing/test_network_risk_sensor.py +148 -0
- gitgalaxy-2.2.0/tests/security_auditing/test_neural_auditor.py +107 -0
- gitgalaxy-2.2.0/tests/security_auditing/test_pii_leak_hunter.py +78 -0
- gitgalaxy-2.2.0/tests/security_auditing/test_redos_poison.py +113 -0
- gitgalaxy-2.2.0/tests/security_auditing/test_sbom_generator.py +101 -0
- gitgalaxy-2.2.0/tests/security_auditing/test_spectral_auditor.py +147 -0
- gitgalaxy-2.2.0/tests/security_auditing/test_supply_chain_firewall.py +93 -0
- gitgalaxy-2.2.0/tests/security_auditing/test_terabyte_log_scanner.py +127 -0
- gitgalaxy-2.2.0/tests/security_auditing/test_vault_sentinel.py +101 -0
- gitgalaxy-2.2.0/tests/tools_recorders/readme.md +36 -0
- gitgalaxy-2.2.0/tests/tools_recorders/test_agent_forge.py +60 -0
- gitgalaxy-2.2.0/tests/tools_recorders/test_batch_test_harness.py +102 -0
- gitgalaxy-2.2.0/tests/tools_recorders/test_decoder_forge.py +103 -0
- gitgalaxy-2.2.0/tests/tools_recorders/test_golden_forge.py +113 -0
- gitgalaxy-2.2.0/tests/tools_recorders/test_gpu_recorder.py +51 -0
- gitgalaxy-2.2.0/tests/tools_recorders/test_service_forge.py +60 -0
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/.github/ISSUE_TEMPLATE/parsing_discrepancy.yml +0 -0
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/.github/dependabot.yml +0 -0
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/.github/pull_request_template.md +0 -0
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/.github/workflows/smoke-test.yml +0 -0
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/CONTRIBUTING.md +0 -0
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/LICENSE +0 -0
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/MANIFEST.in +0 -0
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/gitgalaxy/README.md +0 -0
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/gitgalaxy/__init__.py +0 -0
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/gitgalaxy/cobol_refractor_controller.py +0 -0
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/gitgalaxy/cobol_to_java_controller.py +0 -0
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/gitgalaxy/core/README.md +0 -0
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/gitgalaxy/core/__init__.py +0 -0
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/gitgalaxy/core/guidestar_lens.py +0 -0
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/gitgalaxy/core/prism.py +0 -0
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/gitgalaxy/core/state_rehydrator.py +0 -0
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/gitgalaxy/physics/README.md +0 -0
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/gitgalaxy/physics/__init__.py +0 -0
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/gitgalaxy/physics/chronometer.py +0 -0
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/gitgalaxy/physics/spectral_auditor.py +0 -0
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/gitgalaxy/recorders/README.md +0 -0
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/gitgalaxy/recorders/__init__.py +0 -0
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/gitgalaxy/recorders/audit_recorder.py +0 -0
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/gitgalaxy/recorders/gpu_recorder.py +0 -0
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/gitgalaxy/security/README.md +0 -0
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/gitgalaxy/security/__init__.py +0 -0
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/gitgalaxy/standards/README.md +0 -0
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/gitgalaxy/standards/__init__.py +0 -0
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/gitgalaxy/standards/analysis_lens.py +0 -0
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/gitgalaxy/standards/gitgalaxy_config.py +0 -0
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/gitgalaxy/standards/how_to_add_a_language.md +0 -0
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/gitgalaxy/tools/README.md +0 -0
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/gitgalaxy/tools/__init__.py +0 -0
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/gitgalaxy/tools/ai_guardrails/README.md +0 -0
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/gitgalaxy/tools/ai_guardrails/ai_appsec_sensor.py +0 -0
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/gitgalaxy/tools/ai_guardrails/dev_agent_firewall.py +0 -0
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/gitgalaxy/tools/cobol_to_cobol/cobol_agent_task_forge.py +0 -0
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/gitgalaxy/tools/cobol_to_cobol/cobol_dag_architect.py +0 -0
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/gitgalaxy/tools/cobol_to_cobol/cobol_etl_unpacker.py +0 -0
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/gitgalaxy/tools/cobol_to_cobol/cobol_jcl_auditor.py +0 -0
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/gitgalaxy/tools/cobol_to_cobol/cobol_jcl_forge.py +0 -0
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/gitgalaxy/tools/cobol_to_cobol/cobol_system_limits_reporter.py +0 -0
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/gitgalaxy/tools/cobol_to_java/README.md +0 -0
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/gitgalaxy/tools/cobol_to_java/batch_test_harness.py +0 -0
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/gitgalaxy/tools/cobol_to_java/cobol_to_java_agent_forge.py +0 -0
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/gitgalaxy/tools/cobol_to_java/cobol_to_java_api_contract_forge.py +0 -0
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/gitgalaxy/tools/cobol_to_java/cobol_to_java_decoder_forge.py +0 -0
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/gitgalaxy/tools/cobol_to_java/cobol_to_java_service_forge.py +0 -0
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/gitgalaxy/tools/cobol_to_java/cobol_to_java_spring_forge.py +0 -0
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/gitgalaxy/tools/compliance/README.md +0 -0
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/gitgalaxy/tools/compliance/sbom_generator.py +0 -0
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/gitgalaxy/tools/network_auditing/README.md +0 -0
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/gitgalaxy/tools/network_auditing/full_api_network_map.py +0 -0
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/gitgalaxy/tools/supply_chain_security/README.md +0 -0
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/gitgalaxy/tools/supply_chain_security/binary_anomaly_detector.py +0 -0
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/gitgalaxy/tools/supply_chain_security/supply_chain_firewall.py +0 -0
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/gitgalaxy/tools/supply_chain_security/vault_sentinel.py +0 -0
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/gitgalaxy/tools/terabyte_log_scanning/README.md +0 -0
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/gitgalaxy/tools/terabyte_log_scanning/pii_leak_hunter.py +0 -0
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/gitgalaxy/tools/terabyte_log_scanning/terabyte_log_scanner.py +0 -0
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/gitgalaxy.egg-info/dependency_links.txt +0 -0
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/gitgalaxy.egg-info/entry_points.txt +0 -0
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/gitgalaxy.egg-info/top_level.txt +0 -0
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/pyproject.toml +0 -0
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/setup.cfg +0 -0
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/tests/fixtures/iwubi_frankenstein_test/.gitattributes +0 -0
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/tests/fixtures/iwubi_frankenstein_test/.gitignore +0 -0
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/tests/fixtures/iwubi_frankenstein_test/LICENSE +0 -0
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/tests/fixtures/iwubi_frankenstein_test/Makefile +0 -0
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/tests/fixtures/iwubi_frankenstein_test/README.md +0 -0
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/tests/fixtures/iwubi_frankenstein_test/bufio/bufio.go +0 -0
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/tests/fixtures/iwubi_frankenstein_test/bufio/bufio_test.go +0 -0
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/tests/fixtures/iwubi_frankenstein_test/bufio/example_test.go +0 -0
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/tests/fixtures/iwubi_frankenstein_test/bufio/export_test.go +0 -0
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/tests/fixtures/iwubi_frankenstein_test/bufio/net_test.go +0 -0
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/tests/fixtures/iwubi_frankenstein_test/bufio/scan.go +0 -0
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/tests/fixtures/iwubi_frankenstein_test/bufio/scan_test.go +0 -0
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/tests/fixtures/iwubi_frankenstein_test/config.py +0 -0
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/tests/fixtures/iwubi_frankenstein_test/convert_em.F +0 -0
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/tests/fixtures/iwubi_frankenstein_test/dnn_converters.cpp +0 -0
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/tests/fixtures/iwubi_frankenstein_test/dnn_converters.hpp +0 -0
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/tests/fixtures/iwubi_frankenstein_test/insert_pinyin_to_db.py +0 -0
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/tests/fixtures/iwubi_frankenstein_test/iwubi.py +0 -0
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/tests/fixtures/iwubi_frankenstein_test/iwubi.svg +0 -0
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/tests/fixtures/iwubi_frankenstein_test/iwubi.xml +0 -0
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/tests/fixtures/iwubi_frankenstein_test/logconfig.py +0 -0
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/tests/fixtures/iwubi_frankenstein_test/logconfig.yaml +0 -0
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/tests/fixtures/iwubi_frankenstein_test/pinyin_simp.dict.csv +0 -0
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/tests/fixtures/iwubi_frankenstein_test/screenshot/add.png +0 -0
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/tests/fixtures/iwubi_frankenstein_test/screenshot/iwubi.gif +0 -0
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/tests/fixtures/iwubi_frankenstein_test/screenshot/set_ibus.png +0 -0
- {gitgalaxy-2.0.9 → gitgalaxy-2.2.0}/tests/fixtures/iwubi_frankenstein_test/wubi-jidian86.db +0 -0
|
@@ -24,10 +24,10 @@ jobs:
|
|
|
24
24
|
|
|
25
25
|
steps:
|
|
26
26
|
- name: Checkout repository
|
|
27
|
-
uses: actions/checkout@
|
|
27
|
+
uses: actions/checkout@v6
|
|
28
28
|
|
|
29
29
|
- name: Initialize CodeQL
|
|
30
|
-
uses: github/codeql-action/init@
|
|
30
|
+
uses: github/codeql-action/init@v4
|
|
31
31
|
with:
|
|
32
32
|
languages: ${{ matrix.language }}
|
|
33
33
|
# If you have specific queries you want to run, you can specify them here.
|
|
@@ -35,6 +35,6 @@ jobs:
|
|
|
35
35
|
queries: security-extended,security-and-quality
|
|
36
36
|
|
|
37
37
|
- name: Perform CodeQL Analysis
|
|
38
|
-
uses: github/codeql-action/analyze@
|
|
38
|
+
uses: github/codeql-action/analyze@v4
|
|
39
39
|
with:
|
|
40
40
|
category: "/language:${{matrix.language}}"
|
|
@@ -15,7 +15,7 @@ jobs:
|
|
|
15
15
|
runs-on: ubuntu-latest
|
|
16
16
|
steps:
|
|
17
17
|
- name: Checkout Repository
|
|
18
|
-
uses: actions/checkout@
|
|
18
|
+
uses: actions/checkout@v6
|
|
19
19
|
with:
|
|
20
20
|
fetch-depth: 0 # Required for git info/history (like last updated timestamps)
|
|
21
21
|
|
|
@@ -25,7 +25,7 @@ jobs:
|
|
|
25
25
|
git config user.email 41898282+github-actions[bot]@users.noreply.github.com
|
|
26
26
|
|
|
27
27
|
- name: Set up Python
|
|
28
|
-
uses: actions/setup-python@
|
|
28
|
+
uses: actions/setup-python@v6
|
|
29
29
|
with:
|
|
30
30
|
python-version: 3.x
|
|
31
31
|
|
|
@@ -21,12 +21,12 @@ jobs:
|
|
|
21
21
|
|
|
22
22
|
steps:
|
|
23
23
|
- name: Checkout repository
|
|
24
|
-
uses: actions/checkout@
|
|
24
|
+
uses: actions/checkout@v6
|
|
25
25
|
with:
|
|
26
26
|
fetch-depth: 0 # <--- ADD THIS so it downloads your Git tags!
|
|
27
27
|
|
|
28
28
|
- name: Set up Python
|
|
29
|
-
uses: actions/setup-python@
|
|
29
|
+
uses: actions/setup-python@v6
|
|
30
30
|
with:
|
|
31
31
|
python-version: "3.10"
|
|
32
32
|
|
|
@@ -71,3 +71,17 @@ site/museum/
|
|
|
71
71
|
museum/
|
|
72
72
|
updated_results_expanded_story/
|
|
73
73
|
updated_results_2/
|
|
74
|
+
gitgalaxy/README gitgalaxy.md
|
|
75
|
+
gitgalaxy/core/README core.md
|
|
76
|
+
gitgalaxy/physics/README physics.md
|
|
77
|
+
gitgalaxy/recorders/README recorder.md
|
|
78
|
+
gitgalaxy/security/README security.md
|
|
79
|
+
gitgalaxy/standards/README standards.md
|
|
80
|
+
gitgalaxy/tools/README tools.md
|
|
81
|
+
gitgalaxy/tools/ai_guardrails/README ai.md
|
|
82
|
+
gitgalaxy/tools/cobol_to_cobol/README c2c.md
|
|
83
|
+
gitgalaxy/tools/cobol_to_java/README c2j.md
|
|
84
|
+
gitgalaxy/tools/compliance/README sbom.md
|
|
85
|
+
gitgalaxy/tools/network_auditing/README network.md
|
|
86
|
+
gitgalaxy/tools/supply_chain_security/README supply_chain.md
|
|
87
|
+
gitgalaxy/tools/terabyte_log_scanning/README terabyte.md
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: gitgalaxy
|
|
3
|
-
Version: 2.0
|
|
3
|
+
Version: 2.2.0
|
|
4
4
|
Summary: An AST-free, LLM-free zero-trust static analysis engine for mapping architectural risk, securing CI/CD pipelines, and modernizing legacy monoliths.
|
|
5
5
|
Author: Joe Esquibel
|
|
6
6
|
Project-URL: Homepage, https://gitgalaxy.io
|
|
@@ -173,15 +173,20 @@ Unindexed, tactical log analysis operating at 0.07 GB/sec. It streams massive da
|
|
|
173
173
|
### [AI Agent Guardrails & Codebase Protection](gitgalaxy/tools/ai_guardrails/)
|
|
174
174
|
Specialized keyword sensors protecting both your application and your codebase. The AppSec Sensor detects weaponized LLM features (RCE funnels, exfiltration risks), while the Dev Agent Firewall evaluates token mass and blast radius to restrict autonomous coding agents from modifying dangerous over context token-draining files. Helps identify which files need to be chunked to reduce context overload.
|
|
175
175
|
|
|
176
|
-
|
|
176
|
+
## Local Browser-Based 3D Codebase Visualization
|
|
177
177
|
|
|
178
178
|
If you prefer visual analytics, we've built a non-numerical dashboard where each file represents a star, sized and colored according to specific risk metrics.
|
|
179
179
|
|
|
180
180
|
Simply drag and drop your generated `your_repo_GPU_galaxy.json` file (or a `.zip` of your raw repository) directly into [GitGalaxy.io](https://gitgalaxy.io/). All rendering and scanning happens entirely in your browser's local memory.
|
|
181
181
|
|
|
182
|
-
|
|
182
|
+
### 🔭 Watch GitGalaxy in Action
|
|
183
183
|
|
|
184
|
-
|
|
184
|
+
**Mapping 3.2 Million Lines of C++ in 11 Seconds | OpenCV** [](https://youtu.be/3ScQCSUBdZw)
|
|
185
|
+
|
|
186
|
+
**Visualizing Architectural Risk | Ruby on Rails** [](https://youtu.be/3ScQCSUBdZw)
|
|
187
|
+
*(Note: Replace the video IDs in this link with your actual Rails video ID)*
|
|
188
|
+
|
|
189
|
+

|
|
185
190
|
|
|
186
191
|
## Zero-Trust Data Security
|
|
187
192
|
|
|
@@ -191,10 +196,6 @@ Your code never leaves your machine. GitGalaxy performs 100% of its scanning and
|
|
|
191
196
|
* **Ephemeral Memory Processing:** Repositories are unpacked into a volatile memory buffer (RAM) and are automatically purged when the browser tab is closed.
|
|
192
197
|
* **Privacy-by-Design:** Even when using the web-based viewer, the data remains behind the user's firewall at all times.
|
|
193
198
|
|
|
194
|
-

|
|
195
|
-
|
|
196
|
-

|
|
197
|
-
|
|
198
199
|
## License & Copyright
|
|
199
200
|
|
|
200
201
|
Copyright (c) 2026 Joe Esquibel
|
|
@@ -150,15 +150,20 @@ Unindexed, tactical log analysis operating at 0.07 GB/sec. It streams massive da
|
|
|
150
150
|
### [AI Agent Guardrails & Codebase Protection](gitgalaxy/tools/ai_guardrails/)
|
|
151
151
|
Specialized keyword sensors protecting both your application and your codebase. The AppSec Sensor detects weaponized LLM features (RCE funnels, exfiltration risks), while the Dev Agent Firewall evaluates token mass and blast radius to restrict autonomous coding agents from modifying dangerous over context token-draining files. Helps identify which files need to be chunked to reduce context overload.
|
|
152
152
|
|
|
153
|
-
|
|
153
|
+
## Local Browser-Based 3D Codebase Visualization
|
|
154
154
|
|
|
155
155
|
If you prefer visual analytics, we've built a non-numerical dashboard where each file represents a star, sized and colored according to specific risk metrics.
|
|
156
156
|
|
|
157
157
|
Simply drag and drop your generated `your_repo_GPU_galaxy.json` file (or a `.zip` of your raw repository) directly into [GitGalaxy.io](https://gitgalaxy.io/). All rendering and scanning happens entirely in your browser's local memory.
|
|
158
158
|
|
|
159
|
-
|
|
159
|
+
### 🔭 Watch GitGalaxy in Action
|
|
160
160
|
|
|
161
|
-
|
|
161
|
+
**Mapping 3.2 Million Lines of C++ in 11 Seconds | OpenCV** [](https://youtu.be/3ScQCSUBdZw)
|
|
162
|
+
|
|
163
|
+
**Visualizing Architectural Risk | Ruby on Rails** [](https://youtu.be/3ScQCSUBdZw)
|
|
164
|
+
*(Note: Replace the video IDs in this link with your actual Rails video ID)*
|
|
165
|
+
|
|
166
|
+

|
|
162
167
|
|
|
163
168
|
## Zero-Trust Data Security
|
|
164
169
|
|
|
@@ -168,10 +173,6 @@ Your code never leaves your machine. GitGalaxy performs 100% of its scanning and
|
|
|
168
173
|
* **Ephemeral Memory Processing:** Repositories are unpacked into a volatile memory buffer (RAM) and are automatically purged when the browser tab is closed.
|
|
169
174
|
* **Privacy-by-Design:** Even when using the web-based viewer, the data remains behind the user's firewall at all times.
|
|
170
175
|
|
|
171
|
-

|
|
172
|
-
|
|
173
|
-

|
|
174
|
-
|
|
175
176
|
## License & Copyright
|
|
176
177
|
|
|
177
178
|
Copyright (c) 2026 Joe Esquibel
|
|
@@ -16,7 +16,7 @@ from typing import Dict, Any, Set, Optional, TypedDict, Union, List, Tuple
|
|
|
16
16
|
|
|
17
17
|
# ==============================================================================
|
|
18
18
|
# GitGalaxy Phase 0.1: Ingestion & Filtering (The Solar Shield)
|
|
19
|
-
# Strategy: v6.3.
|
|
19
|
+
# Strategy: v6.3.1 (Monolith Ceilings, Array Shields & Intent Overrides)
|
|
20
20
|
# Architecture: Lead Shield -> Path Gate -> Intent Gate -> Content Gate
|
|
21
21
|
# ==============================================================================
|
|
22
22
|
|
|
@@ -148,11 +148,6 @@ class ApertureFilter:
|
|
|
148
148
|
if path_obj.name in self.config.get("SECRETS_EXACT", set()) or \
|
|
149
149
|
ext.lower() in self.config.get("SECRETS_EXTENSIONS", set()):
|
|
150
150
|
reason = f"CRITICAL LEAK (Exposed Secret: '{path_obj.name}')"
|
|
151
|
-
|
|
152
|
-
# Muted logger to prevent UI overlap; spokes now handle their own alerts
|
|
153
|
-
# self.logger.critical(f"🛡️ SECURITY BREACH: {reason} at {relative_path}")
|
|
154
|
-
|
|
155
|
-
# THE FIX: Return False so it drops into Dark Matter for the Supernova Injection
|
|
156
151
|
return False, size_bytes, reason
|
|
157
152
|
|
|
158
153
|
# --- TIER 0.2: THE NEURAL AUDITOR SHUNT (Model Weights) ---
|
|
@@ -160,7 +155,6 @@ class ApertureFilter:
|
|
|
160
155
|
if ext.lower() in AI_MODEL_EXTS:
|
|
161
156
|
reason = f"AI MODEL WEIGHTS (Bypassing Standard Logic: '{ext}')"
|
|
162
157
|
self.logger.info(f"🧠 NEURAL AUDITOR SHUNT: Routing {path_obj.name} away from regex engines.")
|
|
163
|
-
# Return False to drop into Dark Matter, bypassing the memory-crashing I/O read
|
|
164
158
|
return False, size_bytes, reason
|
|
165
159
|
|
|
166
160
|
# --- TIER 0.5: THE ABSOLUTE EXTENSION SHIELD ---
|
|
@@ -235,8 +229,6 @@ class ApertureFilter:
|
|
|
235
229
|
return result
|
|
236
230
|
|
|
237
231
|
# --- THE SHUNT: Content Bypass for Secrets ---
|
|
238
|
-
# If the path gate tagged this as a secret, skip the hex/binary
|
|
239
|
-
# content checks so it doesn't accidentally get dropped.
|
|
240
232
|
if reason and "CRITICAL LEAK" in reason:
|
|
241
233
|
result.update({
|
|
242
234
|
"is_in_scope": True,
|
|
@@ -269,7 +261,7 @@ class ApertureFilter:
|
|
|
269
261
|
|
|
270
262
|
def _check_artifact_integrity(self, content: str, rel_path: str, has_intent: bool = False) -> Dict[str, Any]:
|
|
271
263
|
"""
|
|
272
|
-
Deep-scans the content buffer for corruption, binary data,
|
|
264
|
+
Deep-scans the content buffer for corruption, binary data, arrays,
|
|
273
265
|
or documentation generator signatures.
|
|
274
266
|
"""
|
|
275
267
|
report = {"valid": True, "band": self.bands.get("VISIBLE", "source_code"), "reason": None, "loc": 0}
|
|
@@ -286,6 +278,17 @@ class ApertureFilter:
|
|
|
286
278
|
"reason": "Blocked (Binary Format Detected)"
|
|
287
279
|
})
|
|
288
280
|
return report
|
|
281
|
+
|
|
282
|
+
# --- TIER 3.1: THE MONOLITH AMALGAMATION SHIELD ---
|
|
283
|
+
# 30,000+ lines in a single file is an amalgamation (e.g. sqlite3.c) or massive test array.
|
|
284
|
+
# It will saturate and choke the standard regex engine. Override Intent.
|
|
285
|
+
if report["loc"] > 30000:
|
|
286
|
+
report.update({
|
|
287
|
+
"valid": False,
|
|
288
|
+
"band": self.bands.get("INFRARED", "saturated"),
|
|
289
|
+
"reason": f"Blocked (Monolithic Amalgamation: {report['loc']} LOC exceeds safe regex boundaries)"
|
|
290
|
+
})
|
|
291
|
+
return report
|
|
289
292
|
|
|
290
293
|
# --- TIER 3.5: THE AUTO-GEN DOC SHIELD ---
|
|
291
294
|
low_path = rel_path.lower()
|
|
@@ -305,9 +308,6 @@ class ApertureFilter:
|
|
|
305
308
|
return report
|
|
306
309
|
|
|
307
310
|
# --- TIER 3.6: THE MACHINE-GENERATED SOURCE SHIELD ---
|
|
308
|
-
# THE FIX: We now evaluate the machine-gen shield for ALL files.
|
|
309
|
-
# If a file has a VIP pass (has_intent) but is an unreadable monolith (>1000 lines),
|
|
310
|
-
# we strip its VIP status and banish it to Dark Matter as procedural debris.
|
|
311
311
|
head_sample = "\n".join(lines_list[:100])
|
|
312
312
|
if self.machine_gen_shield.search(head_sample):
|
|
313
313
|
if not has_intent or report["loc"] > 1000:
|
|
@@ -319,8 +319,6 @@ class ApertureFilter:
|
|
|
319
319
|
return report
|
|
320
320
|
|
|
321
321
|
# --- TIER 3.7: THE LEXICAL MONOTONY SHIELD (Generated Code) ---
|
|
322
|
-
# Detects massive generated boilerplate by checking structural entropy
|
|
323
|
-
# EXEMPTION: COBOL Data Divisions and Copybooks are naturally highly repetitive.
|
|
324
322
|
if report["loc"] > 2000 and not has_intent and not low_path.endswith(('.cpy', '.cbl', '.cob')):
|
|
325
323
|
sample_lines = lines_list[:500]
|
|
326
324
|
meaningful_lines = [l for l in sample_lines if l.strip()]
|
|
@@ -340,50 +338,52 @@ class ApertureFilter:
|
|
|
340
338
|
})
|
|
341
339
|
return report
|
|
342
340
|
|
|
343
|
-
# --- TIER 3.8: THE DECLARATIVE DATA SHIELD ---
|
|
344
|
-
if low_path.endswith(('.yml', '.yaml', '.json', '.xml')):
|
|
345
|
-
|
|
341
|
+
# --- TIER 3.8: THE DECLARATIVE & VECTOR DATA SHIELD ---
|
|
342
|
+
if low_path.endswith(('.yml', '.yaml', '.json', '.xml', '.svg', '.sql', '.csv', '.tsv')):
|
|
343
|
+
# If the file is massive, absolutely drop it. Even if Git tracks it.
|
|
344
|
+
if report["loc"] > 2500:
|
|
345
|
+
report.update({
|
|
346
|
+
"valid": False,
|
|
347
|
+
"band": self.bands.get("RADIO", "radio_noise"),
|
|
348
|
+
"reason": f"Blocked (Massive Declarative/Vector Blob: {report['loc']} LOC)"
|
|
349
|
+
})
|
|
350
|
+
return report
|
|
351
|
+
elif not has_intent and report["loc"] > 1000:
|
|
346
352
|
report.update({
|
|
347
353
|
"valid": False,
|
|
348
354
|
"band": self.bands.get("RADIO", "radio_noise"),
|
|
349
|
-
"reason": f"Blocked (Declarative Data Blob: {report['loc']}
|
|
355
|
+
"reason": f"Blocked (Declarative Data Blob without Intent: {report['loc']} LOC)"
|
|
350
356
|
})
|
|
351
357
|
return report
|
|
352
358
|
|
|
353
|
-
# --- TIER 3.9: THE
|
|
354
|
-
# Drops massive test vectors, crypto keys, or
|
|
355
|
-
|
|
356
|
-
|
|
359
|
+
# --- TIER 3.9: THE TEST DATA & ARRAY SHIELD ---
|
|
360
|
+
# Drops massive test vectors, crypto keys, or arrays compiled into headers/tests.
|
|
361
|
+
if report["loc"] > 500:
|
|
362
|
+
# Check 1: Hex Arrays
|
|
357
363
|
hex_count = content.count('0x') + content.count('0X')
|
|
358
|
-
|
|
359
|
-
# Scenario A: High Absolute Hex Density.
|
|
360
|
-
# Catches files where hex values are densely packed on single lines,
|
|
361
|
-
# even if interleaved with verbose C-struct initializations.
|
|
362
364
|
if hex_count > report["loc"]:
|
|
363
365
|
report.update({
|
|
364
366
|
"valid": False,
|
|
365
367
|
"band": self.bands.get("MICROWAVE", "binary_debris"),
|
|
366
|
-
"reason": f"Blocked (Embedded
|
|
368
|
+
"reason": f"Blocked (Embedded Hex Payload: {hex_count} hex tokens in {report['loc']} LOC)"
|
|
367
369
|
})
|
|
368
370
|
return report
|
|
369
371
|
|
|
370
|
-
#
|
|
371
|
-
#
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
return report
|
|
372
|
+
# Check 2: Massive Data Arrays (Comma Density)
|
|
373
|
+
# If there are more than 3 commas per line on average in a massive file, it's a data array/matrix.
|
|
374
|
+
comma_count = content.count(',')
|
|
375
|
+
if comma_count > (report["loc"] * 3):
|
|
376
|
+
report.update({
|
|
377
|
+
"valid": False,
|
|
378
|
+
"band": self.bands.get("MICROWAVE", "binary_debris"),
|
|
379
|
+
"reason": f"Blocked (Embedded Array/Matrix Payload: {comma_count} commas in {report['loc']} LOC)"
|
|
380
|
+
})
|
|
381
|
+
return report
|
|
381
382
|
|
|
382
383
|
# --- TIER 4: INFRARED GATE (Minification & Saturation) ---
|
|
383
384
|
max_line = self.config.get("MAX_LINE_LENGTH", 500)
|
|
384
385
|
|
|
385
|
-
|
|
386
|
-
is_prose = low_path.endswith(('.md', '.markdown', '.txt', '.json', '.csv', '.rst'))
|
|
386
|
+
is_prose = low_path.endswith(('.md', '.markdown', '.txt', '.json', '.csv', '.rst', '.sql', '.svg'))
|
|
387
387
|
|
|
388
388
|
for i, line in enumerate(lines_list[:100]):
|
|
389
389
|
if len(line) > max_line and not is_prose:
|
|
@@ -432,7 +432,6 @@ class ApertureFilter:
|
|
|
432
432
|
return False
|
|
433
433
|
|
|
434
434
|
# 4. Standard Iterative Gitignore Logic (The Fix)
|
|
435
|
-
# Bypasses the massive OR Regex bottleneck
|
|
436
435
|
for pattern in self.ignore_patterns:
|
|
437
436
|
if pattern.endswith('/'):
|
|
438
437
|
if any(fnmatch.fnmatch(p + '/', pattern) for p in parts):
|
|
@@ -453,11 +452,9 @@ class ApertureFilter:
|
|
|
453
452
|
with ignore_file.open('r', encoding='utf-8') as f:
|
|
454
453
|
for line in f:
|
|
455
454
|
l = line.strip()
|
|
456
|
-
# Ignore comments and empty lines
|
|
457
455
|
if l and not l.startswith('#'):
|
|
458
456
|
patterns.append(l)
|
|
459
457
|
except Exception as e:
|
|
460
458
|
self.logger.warning(f"Failed to parse .gitignore: {e}")
|
|
461
459
|
|
|
462
|
-
return patterns
|
|
463
|
-
|
|
460
|
+
return patterns
|
|
@@ -348,7 +348,9 @@ class LogicSplicer:
|
|
|
348
348
|
safe_lines = []
|
|
349
349
|
for line in code_stream.split('\n'):
|
|
350
350
|
if len(line) > 1500:
|
|
351
|
-
|
|
351
|
+
# Preserve indentation and inject a single safe char so it isn't counted as a blank line
|
|
352
|
+
indent = len(line) - len(line.lstrip())
|
|
353
|
+
safe_lines.append(' ' * indent + 'x' + ' ' * (len(line) - indent - 1))
|
|
352
354
|
else:
|
|
353
355
|
safe_lines.append(line)
|
|
354
356
|
code_stream = '\n'.join(safe_lines)
|
|
@@ -478,6 +480,9 @@ class LogicSplicer:
|
|
|
478
480
|
result_payload["regex_telemetry"] = regex_telemetry
|
|
479
481
|
return result_payload
|
|
480
482
|
|
|
483
|
+
except TimeoutError:
|
|
484
|
+
# Let the Hardware Guillotine drop cleanly to the Worker thread!
|
|
485
|
+
raise
|
|
481
486
|
except Exception as e:
|
|
482
487
|
self.logger.error(f"Catastrophic failure during structural splicing: {e}", exc_info=True)
|
|
483
488
|
return {
|
|
@@ -92,14 +92,16 @@ class NetworkRiskSensor:
|
|
|
92
92
|
# PageRank determines the absolute "Load-Bearing" gravity of a file
|
|
93
93
|
try:
|
|
94
94
|
pagerank = nx.pagerank(G, weight='weight')
|
|
95
|
-
|
|
96
|
-
#
|
|
97
|
-
|
|
95
|
+
|
|
96
|
+
# THE FIX: Drop the exact threshold from 5000 down to 500.
|
|
97
|
+
# Force a maximum sample size of 100 nodes for anything larger.
|
|
98
|
+
k_val = min(len(G.nodes()), 100) if len(G.nodes()) > 500 else None
|
|
98
99
|
betweenness = nx.betweenness_centrality(G, k=k_val, weight='weight')
|
|
99
100
|
|
|
100
|
-
#
|
|
101
|
-
|
|
102
|
-
|
|
101
|
+
# THE FIX: Closeness Centrality has no built-in sampling.
|
|
102
|
+
# Drop the bypass threshold from 5000 to 1500 to prevent minute-long hangs.
|
|
103
|
+
if len(G.nodes()) > 1500:
|
|
104
|
+
self.logger.warning("Graph too massive for exact Closeness Centrality. Bypassing.")
|
|
103
105
|
closeness = {n: 0.0 for n in G.nodes()}
|
|
104
106
|
else:
|
|
105
107
|
closeness = nx.closeness_centrality(G)
|
|
@@ -194,7 +196,12 @@ class NetworkRiskSensor:
|
|
|
194
196
|
self.logger.warning("Graph too massive for Modularity. Bypassing.")
|
|
195
197
|
macro_metrics["modularity"] = 0.0
|
|
196
198
|
else:
|
|
197
|
-
|
|
199
|
+
# THE FIX: Attempt Louvain (blazing fast), fallback to Greedy (slow)
|
|
200
|
+
try:
|
|
201
|
+
communities = community.louvain_communities(U)
|
|
202
|
+
except AttributeError:
|
|
203
|
+
communities = community.greedy_modularity_communities(U)
|
|
204
|
+
|
|
198
205
|
macro_metrics["modularity"] = round(community.modularity(U, communities), 4)
|
|
199
206
|
except Exception: pass
|
|
200
207
|
|
|
@@ -275,16 +282,16 @@ class NetworkRiskSensor:
|
|
|
275
282
|
|
|
276
283
|
if "telemetry" not in s: s["telemetry"] = {}
|
|
277
284
|
s["telemetry"]["network_metrics"] = {
|
|
278
|
-
"pagerank_score":
|
|
279
|
-
"normalized_blast_radius":
|
|
280
|
-
"betweenness_score":
|
|
281
|
-
"closeness_score":
|
|
285
|
+
"pagerank_score": 0.0,
|
|
286
|
+
"normalized_blast_radius": 0.0,
|
|
287
|
+
"betweenness_score": 0.0,
|
|
288
|
+
"closeness_score": 0.0,
|
|
282
289
|
"in_degree": in_d,
|
|
283
290
|
"out_degree": out_d,
|
|
284
291
|
"producer_ratio": round(producer_ratio, 3),
|
|
285
292
|
"ecosystem_role": ecosystem_role,
|
|
286
|
-
"systemic_threat_vector":
|
|
287
|
-
"is_algorithmic_bottleneck":
|
|
293
|
+
"systemic_threat_vector": [],
|
|
294
|
+
"is_algorithmic_bottleneck": False
|
|
288
295
|
}
|
|
289
296
|
s["telemetry"]["popularity"] = in_d
|
|
290
297
|
|
|
@@ -371,20 +371,38 @@ def _process_file_worker(rel_path: str) -> Dict[str, Any]:
|
|
|
371
371
|
if is_file_profiling: phase_times["5.5_Security_Lens"] = time.perf_counter() - t_security
|
|
372
372
|
# ----------------------------------------------------
|
|
373
373
|
|
|
374
|
-
# Phase 6: Raw Imports
|
|
374
|
+
# Phase 6: Raw Imports & Named Tokens
|
|
375
375
|
t_imports = time.perf_counter()
|
|
376
376
|
raw_imports = set()
|
|
377
|
+
named_tokens = set() # <--- NEW: Initialize token tracker
|
|
378
|
+
|
|
377
379
|
if not is_inert:
|
|
380
|
+
# 1. Extract raw file dependencies
|
|
378
381
|
import_regex = lang_defs.get(lang_id, {}).get("rules", {}).get("_dependency_capture")
|
|
379
382
|
if import_regex:
|
|
380
383
|
try:
|
|
381
384
|
for match in import_regex.finditer(content_buffer):
|
|
382
|
-
# Grab the first non-empty capture group (the actual dependency name)
|
|
383
385
|
extracted_path = next((g for g in match.groups() if g), None)
|
|
384
386
|
if extracted_path:
|
|
385
387
|
raw_imports.add(extracted_path)
|
|
386
388
|
except Exception:
|
|
387
389
|
pass
|
|
390
|
+
|
|
391
|
+
# 2. ---> NEW: Extract Named Imports (TS/JS/Python) <---
|
|
392
|
+
try:
|
|
393
|
+
# Captures 'import { a, b }' and 'from x import a, b'
|
|
394
|
+
import_blocks = re.findall(r'(?:import\s+\{([^}]+)\}|from\s+[\w.]+\s+import\s+([^({\n]+))', content_buffer)
|
|
395
|
+
for block in import_blocks:
|
|
396
|
+
for match in block:
|
|
397
|
+
if match:
|
|
398
|
+
# Split by comma, handle 'as' aliases
|
|
399
|
+
for token in match.split(','):
|
|
400
|
+
clean_token = token.split(' as ')[0].strip()
|
|
401
|
+
if clean_token:
|
|
402
|
+
named_tokens.add(clean_token)
|
|
403
|
+
except Exception:
|
|
404
|
+
pass
|
|
405
|
+
|
|
388
406
|
if is_file_profiling: phase_times["6_Import_Regex"] = time.perf_counter() - t_imports
|
|
389
407
|
|
|
390
408
|
# Phase 7: Tokenization & Census
|
|
@@ -429,7 +447,8 @@ def _process_file_worker(rel_path: str) -> Dict[str, Any]:
|
|
|
429
447
|
"prior_lock": has_prior,
|
|
430
448
|
"coding_loc": refraction["coding_loc"],
|
|
431
449
|
"doc_loc": refraction["doc_loc"],
|
|
432
|
-
"raw_imports": list(raw_imports),
|
|
450
|
+
"raw_imports": list(raw_imports),
|
|
451
|
+
"named_tokens": list(named_tokens), # <--- NEW: Send tokens to Orchestrator
|
|
433
452
|
"popularity_hits": popularity_hits,
|
|
434
453
|
"regex_telemetry": logic_data.pop("regex_telemetry", {}) if is_profiling else {}
|
|
435
454
|
}
|
|
@@ -660,11 +679,11 @@ class Orchestrator:
|
|
|
660
679
|
"zero_dependency_mode": (not HAS_NETWORKX or not HAS_TIKTOKEN or not ML_AVAILABLE)
|
|
661
680
|
}
|
|
662
681
|
|
|
663
|
-
if "
|
|
664
|
-
summary["
|
|
682
|
+
if "unparsable_files" not in summary:
|
|
683
|
+
summary["unparsable_files"] = {}
|
|
665
684
|
|
|
666
685
|
# Pass the array into the function, and merge the results directly
|
|
667
|
-
summary["
|
|
686
|
+
summary["unparsable_files"].update(self._summarize_anomalies(total_unparsable))
|
|
668
687
|
|
|
669
688
|
# --- PURE OUTPUT ROUTER ---
|
|
670
689
|
# Respect the exact path provided, just ensure the parent folder exists
|
|
@@ -1247,6 +1266,15 @@ class Orchestrator:
|
|
|
1247
1266
|
# --- NEW: CALCULATE THE GLOBAL TEST UMBRELLA ---
|
|
1248
1267
|
total_loc = 0
|
|
1249
1268
|
test_loc = 0
|
|
1269
|
+
|
|
1270
|
+
# ==============================================================
|
|
1271
|
+
# ---> NEW: BUILD GLOBAL TOKEN TRACKER <---
|
|
1272
|
+
# ==============================================================
|
|
1273
|
+
self.used_tokens = set()
|
|
1274
|
+
for meta in self.cryolink.values():
|
|
1275
|
+
self.used_tokens.update(meta.get("named_tokens", []))
|
|
1276
|
+
# ==============================================================
|
|
1277
|
+
|
|
1250
1278
|
for rel_path, meta in self.cryolink.items():
|
|
1251
1279
|
loc = meta.get("coding_loc", 0)
|
|
1252
1280
|
total_loc += loc
|
|
@@ -1273,6 +1301,25 @@ class Orchestrator:
|
|
|
1273
1301
|
meta["metadata"]["folder_dominant_lang"] = folder_dominant_langs.get(folder, meta.get("lang_id", "unknown"))
|
|
1274
1302
|
# -----------------------------------------------------------------
|
|
1275
1303
|
|
|
1304
|
+
# =================================================================
|
|
1305
|
+
# ---> THE NETWORK GRAVITY FIX <---
|
|
1306
|
+
# If the file is imported by the ecosystem, its "orphans" are actually its API.
|
|
1307
|
+
# =================================================================
|
|
1308
|
+
popularity = self.popularity_scores.get(rel_path, 0)
|
|
1309
|
+
if popularity > 0 and "equations" in meta:
|
|
1310
|
+
orphans = meta["equations"].get("design_slop_orphans", 0)
|
|
1311
|
+
if orphans > 0:
|
|
1312
|
+
# 1. Convert the dead weight into API Exposure
|
|
1313
|
+
meta["equations"]["api"] = meta["equations"].get("api", 0) + orphans
|
|
1314
|
+
# 2. Wipe the Technical Debt
|
|
1315
|
+
meta["equations"]["design_slop_orphans"] = 0
|
|
1316
|
+
|
|
1317
|
+
# 3. Heal the function metadata
|
|
1318
|
+
for func in meta.get("functions", []):
|
|
1319
|
+
if func.get("usage_status") == 1:
|
|
1320
|
+
func["usage_status"] = 0
|
|
1321
|
+
# =================================================================
|
|
1322
|
+
|
|
1276
1323
|
meta["temporal_telemetry"] = self.chronometer.get_temporal_signals(rel_path)
|
|
1277
1324
|
meta["authors"] = meta["temporal_telemetry"].get("authors", {})
|
|
1278
1325
|
stem = Path(rel_path).stem.lower()
|
|
@@ -57,7 +57,7 @@ class NeuralAuditor:
|
|
|
57
57
|
|
|
58
58
|
# 3. Extract Metadata
|
|
59
59
|
metadata = header.get('__metadata__', {})
|
|
60
|
-
architecture = metadata.get('
|
|
60
|
+
architecture = metadata.get('architecture', metadata.get('format', 'Unknown Transformer'))
|
|
61
61
|
|
|
62
62
|
# 4. Calculate Parameters (Sum of the product of all tensor shapes)
|
|
63
63
|
total_params = 0
|
|
@@ -837,13 +837,13 @@ class SignalProcessor:
|
|
|
837
837
|
# ---> N-DIMENSIONAL AI NETWORK POSTURE <---
|
|
838
838
|
if ai_files:
|
|
839
839
|
# Find the most heavily relied-upon AI node in the graph
|
|
840
|
-
ai_files.sort(key=lambda x: x.get("telemetry", {}).get("network_metrics", {}).get("pagerank_score"
|
|
840
|
+
ai_files.sort(key=lambda x: x.get("telemetry", {}).get("network_metrics", {}).get("pagerank_score") or 0.0, reverse=True)
|
|
841
841
|
primary_ai_node = ai_files[0]
|
|
842
842
|
net_mets = primary_ai_node.get("telemetry", {}).get("network_metrics", {})
|
|
843
843
|
|
|
844
844
|
role = net_mets.get("ecosystem_role", "Unknown")
|
|
845
|
-
pr = net_mets.get("normalized_blast_radius"
|
|
846
|
-
btw = net_mets.get("betweenness_score"
|
|
845
|
+
pr = net_mets.get("normalized_blast_radius") or 0.0
|
|
846
|
+
btw = net_mets.get("betweenness_score") or 0.0
|
|
847
847
|
|
|
848
848
|
ai_topology["insights"].append(f"Structural Posture: The primary AI integration acts as a '{role}' within the repository.")
|
|
849
849
|
|
|
@@ -1675,9 +1675,9 @@ class SignalProcessor:
|
|
|
1675
1675
|
rv = file_data.get("risk_vector", [])
|
|
1676
1676
|
p = file_data.get("path", "")
|
|
1677
1677
|
|
|
1678
|
-
btw = net.get("betweenness_score"
|
|
1679
|
-
close = net.get("closeness_score"
|
|
1680
|
-
pr = net.get("normalized_blast_radius"
|
|
1678
|
+
btw = net.get("betweenness_score") or 0.0
|
|
1679
|
+
close = net.get("closeness_score") or 0.0
|
|
1680
|
+
pr = net.get("normalized_blast_radius") or 0.0
|
|
1681
1681
|
|
|
1682
1682
|
flux_risk = rv[flux_idx] if flux_idx >= 0 and len(rv) > flux_idx else 0.0
|
|
1683
1683
|
err_risk = rv[err_idx] if err_idx >= 0 and len(rv) > err_idx else 0.0
|