adl-toolkit 0.0.0-stage → 0.1.3

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.
Files changed (104) hide show
  1. package/INSTALL_TOOLKIT.md +163 -0
  2. package/README.md +269 -2
  3. package/adl_drift/__init__.py +6 -0
  4. package/adl_drift/cli/__init__.py +1 -0
  5. package/adl_drift/cli/commands.py +993 -0
  6. package/adl_drift/cli/main.py +744 -0
  7. package/adl_drift/cortex/__init__.py +1 -0
  8. package/adl_drift/cortex/embeddings.py +96 -0
  9. package/adl_drift/cortex/memory.py +1749 -0
  10. package/adl_drift/cortex/patterns.py +89 -0
  11. package/adl_drift/cortex/telemetry.py +192 -0
  12. package/adl_drift/detectors/__init__.py +1 -0
  13. package/adl_drift/detectors/async_patterns.py +115 -0
  14. package/adl_drift/detectors/base.py +121 -0
  15. package/adl_drift/detectors/config.py +122 -0
  16. package/adl_drift/detectors/data_access.py +128 -0
  17. package/adl_drift/detectors/decorators.py +122 -0
  18. package/adl_drift/detectors/dynamic_patterns.py +260 -0
  19. package/adl_drift/detectors/errors.py +134 -0
  20. package/adl_drift/detectors/imports.py +132 -0
  21. package/adl_drift/detectors/logging_patterns.py +108 -0
  22. package/adl_drift/detectors/routes.py +257 -0
  23. package/adl_drift/detectors/security.py +236 -0
  24. package/adl_drift/detectors/taint.py +406 -0
  25. package/adl_drift/detectors/tests.py +95 -0
  26. package/adl_drift/detectors/type_conventions.py +81 -0
  27. package/adl_drift/graph/__init__.py +1 -0
  28. package/adl_drift/graph/builder.py +2670 -0
  29. package/adl_drift/graph/cfg.py +461 -0
  30. package/adl_drift/graph/cluster.py +40 -0
  31. package/adl_drift/graph/edges.py +86 -0
  32. package/adl_drift/graph/node.py +90 -0
  33. package/adl_drift/harness/__init__.py +10 -0
  34. package/adl_drift/harness/setup.py +832 -0
  35. package/adl_drift/harness/skills/adl-drift.md +25 -0
  36. package/adl_drift/harness/skills/drift-antigravity.md +19 -0
  37. package/adl_drift/harness/skills/drift-generic.md +19 -0
  38. package/adl_drift/harness/watch.py +84 -0
  39. package/adl_drift/lang/__init__.py +8 -0
  40. package/adl_drift/lang/base.py +464 -0
  41. package/adl_drift/lang/java/__init__.py +6 -0
  42. package/adl_drift/lang/java/backend.py +97 -0
  43. package/adl_drift/lang/java/cfg.py +1424 -0
  44. package/adl_drift/lang/java/config.py +707 -0
  45. package/adl_drift/lang/java/detectors/__init__.py +29 -0
  46. package/adl_drift/lang/java/detectors/additional.py +445 -0
  47. package/adl_drift/lang/java/detectors/base.py +154 -0
  48. package/adl_drift/lang/java/detectors/data_access.py +148 -0
  49. package/adl_drift/lang/java/detectors/imports.py +53 -0
  50. package/adl_drift/lang/java/detectors/routes.py +159 -0
  51. package/adl_drift/lang/java/detectors/security.py +386 -0
  52. package/adl_drift/lang/java/detectors/tests.py +74 -0
  53. package/adl_drift/lang/java/extractor.py +582 -0
  54. package/adl_drift/lang/java/ids.py +99 -0
  55. package/adl_drift/lang/java/parser.py +49 -0
  56. package/adl_drift/lang/java/resolution/__init__.py +1 -0
  57. package/adl_drift/lang/java/resolution/constants.py +1619 -0
  58. package/adl_drift/lang/java/resolution/constructors.py +278 -0
  59. package/adl_drift/lang/java/resolution/context.py +305 -0
  60. package/adl_drift/lang/java/resolution/dispatch.py +540 -0
  61. package/adl_drift/lang/java/resolution/functional.py +1318 -0
  62. package/adl_drift/lang/java/resolution/generated.py +95 -0
  63. package/adl_drift/lang/java/resolution/model.py +153 -0
  64. package/adl_drift/lang/java/resolution/orchestration.py +866 -0
  65. package/adl_drift/lang/java/resolution/overloads.py +1275 -0
  66. package/adl_drift/lang/java/resolution/scopes.py +1111 -0
  67. package/adl_drift/lang/java/resolution/types.py +2947 -0
  68. package/adl_drift/lang/java/resolver.py +1401 -0
  69. package/adl_drift/lang/java/scopes.py +69 -0
  70. package/adl_drift/lang/java/taint.py +500 -0
  71. package/adl_drift/lang/java/type_provenance.py +342 -0
  72. package/adl_drift/lang/python/__init__.py +8 -0
  73. package/adl_drift/lang/python/backend.py +94 -0
  74. package/adl_drift/lang/python/cfg.py +537 -0
  75. package/adl_drift/lang/python/extractor.py +454 -0
  76. package/adl_drift/lang/python/parser.py +41 -0
  77. package/adl_drift/lang/python/resolver.py +1789 -0
  78. package/adl_drift/lang/python/taint.py +365 -0
  79. package/adl_drift/lang/registry.py +117 -0
  80. package/adl_drift/parser/__init__.py +1 -0
  81. package/adl_drift/parser/cache.py +38 -0
  82. package/adl_drift/parser/core.py +33 -0
  83. package/adl_drift/parser/extractor.py +17 -0
  84. package/adl_drift/parser/literal_eval.py +326 -0
  85. package/adl_drift/scanner/__init__.py +1 -0
  86. package/adl_drift/scanner/discovery.py +338 -0
  87. package/adl_drift/scanner/incremental.py +261 -0
  88. package/adl_drift/scanner/parallel.py +224 -0
  89. package/adl_drift/server/__init__.py +1 -0
  90. package/adl_drift/server/handlers.py +2849 -0
  91. package/adl_drift/server/mcp_server.py +127 -0
  92. package/adl_drift/server/mcp_stdio.py +335 -0
  93. package/adl_drift/server/protocol.py +71 -0
  94. package/adl_drift/server/static/index.html +696 -0
  95. package/adl_drift/server/web.py +350 -0
  96. package/adl_drift/utils/__init__.py +1 -0
  97. package/adl_drift/utils/config.py +77 -0
  98. package/adl_drift/utils/fswalk.py +52 -0
  99. package/adl_drift/utils/types.py +345 -0
  100. package/bin/adl-drift.mjs +35 -0
  101. package/bin/adl-toolkit.mjs +488 -0
  102. package/package.json +29 -4
  103. package/pyproject.toml +49 -0
  104. package/scripts/install_toolkit.py +3584 -0
@@ -0,0 +1,97 @@
1
+ """`LanguageBackend` for Java (P4.1/P4.2/P4.3/P4.4/P4.6/P4.7, PROBLEMS.md).
2
+
3
+ Parser, symbol extraction, detectors, call resolution, CFG/taint, and
4
+ project configuration are implemented.
5
+
6
+ Cross-cutting persistence/CLI/MCP plumbing (P4.10) is not — P4.8 registers
7
+ this backend for scanner and CLI/MCP discovery, but the CLI's def-use/taint
8
+ passes (`cli/commands.py::_run_def_use_pass`/`_run_taint_pass`) are still
9
+ scoped to Python files only; a Java caller drives `graph.cfg.analyze_function`
10
+ /`detectors.taint.TaintAnalyzer` directly (see `tests/lang/test_java_cfg.py`/
11
+ `test_java_taint.py`) until that CLI plumbing is generalized.
12
+ """
13
+
14
+ from __future__ import annotations
15
+
16
+ from pathlib import Path
17
+ from typing import List
18
+
19
+ from adl_drift.detectors.base import BaseDetector
20
+ from adl_drift.lang.base import CFGConfig, LanguageParser, ResolverConfig
21
+ from adl_drift.lang.java.cfg import default_java_cfg_config
22
+ from adl_drift.lang.java.config import (
23
+ DEFAULT_MAX_BUILD_FILE_BYTES,
24
+ DEFAULT_MAX_BUILD_TOTAL_BYTES,
25
+ JavaProjectConfig,
26
+ )
27
+ from adl_drift.lang.java.extractor import JavaSymbolExtractor
28
+ from adl_drift.lang.java.parser import create_parser
29
+ from adl_drift.lang.java.resolver import default_java_resolver_config
30
+ from adl_drift.lang.java.detectors import (
31
+ JavaAnnotationDetector,
32
+ JavaAsyncDetector,
33
+ JavaConfigDetector,
34
+ JavaDataAccessDetector,
35
+ JavaDynamicDetector,
36
+ JavaImportDetector,
37
+ JavaLoggingDetector,
38
+ JavaRouteDetector,
39
+ JavaSecurityDetector,
40
+ JavaTestDetector,
41
+ JavaTypeDetector,
42
+ )
43
+
44
+
45
+ class JavaBackend:
46
+ """`LanguageBackend` for Java, satisfied structurally (no ABC needed)."""
47
+
48
+ name = "java"
49
+ file_extensions = (".java",)
50
+ project_markers = (
51
+ "pom.xml",
52
+ "build.gradle",
53
+ "build.gradle.kts",
54
+ "settings.gradle",
55
+ "settings.gradle.kts",
56
+ )
57
+
58
+ def parser(self) -> LanguageParser:
59
+ return create_parser()
60
+
61
+ def extractor(self) -> JavaSymbolExtractor:
62
+ return JavaSymbolExtractor(self.parser())
63
+
64
+ def detectors(self) -> List[BaseDetector]:
65
+ parser = self.parser()
66
+ return [
67
+ JavaRouteDetector(parser),
68
+ JavaSecurityDetector(parser),
69
+ JavaDataAccessDetector(parser),
70
+ JavaTestDetector(parser),
71
+ JavaImportDetector(parser),
72
+ JavaAnnotationDetector(parser),
73
+ JavaConfigDetector(parser),
74
+ JavaLoggingDetector(parser),
75
+ JavaTypeDetector(parser),
76
+ JavaAsyncDetector(parser),
77
+ JavaDynamicDetector(parser),
78
+ ]
79
+
80
+ def resolver_config(self) -> ResolverConfig:
81
+ return default_java_resolver_config()
82
+
83
+ def cfg_config(self) -> CFGConfig:
84
+ return default_java_cfg_config()
85
+
86
+ def project_config(
87
+ self,
88
+ root: Path,
89
+ *,
90
+ max_build_file_bytes: int = DEFAULT_MAX_BUILD_FILE_BYTES,
91
+ max_build_total_bytes: int = DEFAULT_MAX_BUILD_TOTAL_BYTES,
92
+ ) -> JavaProjectConfig:
93
+ return JavaProjectConfig(root, max_build_file_bytes, max_build_total_bytes)
94
+
95
+ def module_name(self, file: Path, root: Path) -> str:
96
+ """Read Java identity from the declared package; ``root`` is not authoritative."""
97
+ return self.extractor().module_name_for_file(file)