@yalehwang/archguard 0.1.6 → 0.1.8

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 (215) hide show
  1. package/README.md +90 -58
  2. package/dist/cli/analyze/normalize-to-diagrams.d.ts +5 -0
  3. package/dist/cli/analyze/normalize-to-diagrams.d.ts.map +1 -0
  4. package/dist/cli/analyze/normalize-to-diagrams.js +94 -0
  5. package/dist/cli/analyze/normalize-to-diagrams.js.map +1 -0
  6. package/dist/cli/analyze/run-analysis.d.ts +20 -0
  7. package/dist/cli/analyze/run-analysis.d.ts.map +1 -0
  8. package/dist/cli/analyze/run-analysis.js +150 -0
  9. package/dist/cli/analyze/run-analysis.js.map +1 -0
  10. package/dist/cli/cache/arch-json-disk-cache.d.ts.map +1 -1
  11. package/dist/cli/cache/arch-json-disk-cache.js +2 -1
  12. package/dist/cli/cache/arch-json-disk-cache.js.map +1 -1
  13. package/dist/cli/cache/diagram-manifest.d.ts +13 -0
  14. package/dist/cli/cache/diagram-manifest.d.ts.map +1 -0
  15. package/dist/cli/cache/diagram-manifest.js +60 -0
  16. package/dist/cli/cache/diagram-manifest.js.map +1 -0
  17. package/dist/cli/cache/render-hash-cache.d.ts +13 -0
  18. package/dist/cli/cache/render-hash-cache.d.ts.map +1 -0
  19. package/dist/cli/cache/render-hash-cache.js +39 -0
  20. package/dist/cli/cache/render-hash-cache.js.map +1 -0
  21. package/dist/cli/commands/analyze.d.ts +1 -4
  22. package/dist/cli/commands/analyze.d.ts.map +1 -1
  23. package/dist/cli/commands/analyze.js +26 -143
  24. package/dist/cli/commands/analyze.js.map +1 -1
  25. package/dist/cli/commands/cache.d.ts.map +1 -1
  26. package/dist/cli/commands/cache.js +7 -0
  27. package/dist/cli/commands/cache.js.map +1 -1
  28. package/dist/cli/commands/mcp.d.ts +3 -0
  29. package/dist/cli/commands/mcp.d.ts.map +1 -0
  30. package/dist/cli/commands/mcp.js +17 -0
  31. package/dist/cli/commands/mcp.js.map +1 -0
  32. package/dist/cli/commands/query.d.ts +3 -0
  33. package/dist/cli/commands/query.d.ts.map +1 -0
  34. package/dist/cli/commands/query.js +227 -0
  35. package/dist/cli/commands/query.js.map +1 -0
  36. package/dist/cli/index.d.ts.map +1 -1
  37. package/dist/cli/index.js +4 -0
  38. package/dist/cli/index.js.map +1 -1
  39. package/dist/cli/mcp/analyze-tool.d.ts +6 -0
  40. package/dist/cli/mcp/analyze-tool.d.ts.map +1 -0
  41. package/dist/cli/mcp/analyze-tool.js +112 -0
  42. package/dist/cli/mcp/analyze-tool.js.map +1 -0
  43. package/dist/cli/mcp/mcp-server.d.ts +6 -0
  44. package/dist/cli/mcp/mcp-server.d.ts.map +1 -0
  45. package/dist/cli/mcp/mcp-server.js +165 -0
  46. package/dist/cli/mcp/mcp-server.js.map +1 -0
  47. package/dist/cli/processors/arch-json-provider.d.ts +38 -0
  48. package/dist/cli/processors/arch-json-provider.d.ts.map +1 -0
  49. package/dist/cli/processors/arch-json-provider.js +295 -0
  50. package/dist/cli/processors/arch-json-provider.js.map +1 -0
  51. package/dist/cli/processors/diagram-output-router.d.ts +26 -0
  52. package/dist/cli/processors/diagram-output-router.d.ts.map +1 -0
  53. package/dist/cli/processors/diagram-output-router.js +235 -0
  54. package/dist/cli/processors/diagram-output-router.js.map +1 -0
  55. package/dist/cli/processors/diagram-processor.d.ts +11 -22
  56. package/dist/cli/processors/diagram-processor.d.ts.map +1 -1
  57. package/dist/cli/processors/diagram-processor.js +37 -455
  58. package/dist/cli/processors/diagram-processor.js.map +1 -1
  59. package/dist/cli/progress.d.ts +22 -1
  60. package/dist/cli/progress.d.ts.map +1 -1
  61. package/dist/cli/progress.js +24 -0
  62. package/dist/cli/progress.js.map +1 -1
  63. package/dist/cli/query/arch-index-builder.d.ts +4 -0
  64. package/dist/cli/query/arch-index-builder.d.ts.map +1 -0
  65. package/dist/cli/query/arch-index-builder.js +126 -0
  66. package/dist/cli/query/arch-index-builder.js.map +1 -0
  67. package/dist/cli/query/arch-index.d.ts +17 -0
  68. package/dist/cli/query/arch-index.d.ts.map +1 -0
  69. package/dist/cli/query/arch-index.js +2 -0
  70. package/dist/cli/query/arch-index.js.map +1 -0
  71. package/dist/cli/query/engine-loader.d.ts +7 -0
  72. package/dist/cli/query/engine-loader.d.ts.map +1 -0
  73. package/dist/cli/query/engine-loader.js +98 -0
  74. package/dist/cli/query/engine-loader.js.map +1 -0
  75. package/dist/cli/query/query-artifacts.d.ts +7 -0
  76. package/dist/cli/query/query-artifacts.d.ts.map +1 -0
  77. package/dist/cli/query/query-artifacts.js +78 -0
  78. package/dist/cli/query/query-artifacts.js.map +1 -0
  79. package/dist/cli/query/query-engine.d.ts +49 -0
  80. package/dist/cli/query/query-engine.d.ts.map +1 -0
  81. package/dist/cli/query/query-engine.js +137 -0
  82. package/dist/cli/query/query-engine.js.map +1 -0
  83. package/dist/cli/query/query-manifest.d.ts +24 -0
  84. package/dist/cli/query/query-manifest.d.ts.map +1 -0
  85. package/dist/cli/query/query-manifest.js +2 -0
  86. package/dist/cli/query/query-manifest.js.map +1 -0
  87. package/dist/cli/utils/canonicalize-arch-json.d.ts +3 -0
  88. package/dist/cli/utils/canonicalize-arch-json.d.ts.map +1 -0
  89. package/dist/cli/utils/canonicalize-arch-json.js +81 -0
  90. package/dist/cli/utils/canonicalize-arch-json.js.map +1 -0
  91. package/dist/cli/utils/diagram-index-generator.d.ts.map +1 -1
  92. package/dist/cli/utils/diagram-index-generator.js +0 -5
  93. package/dist/cli/utils/diagram-index-generator.js.map +1 -1
  94. package/dist/cli/utils/project-structure-detector.d.ts.map +1 -1
  95. package/dist/cli/utils/project-structure-detector.js +0 -10
  96. package/dist/cli/utils/project-structure-detector.js.map +1 -1
  97. package/dist/mermaid/renderer.d.ts.map +1 -1
  98. package/dist/mermaid/renderer.js +34 -0
  99. package/dist/mermaid/renderer.js.map +1 -1
  100. package/dist/plugins/golang/atlas/index.d.ts.map +1 -1
  101. package/dist/plugins/golang/atlas/index.js +3 -1
  102. package/dist/plugins/golang/atlas/index.js.map +1 -1
  103. package/dist/plugins/golang/atlas/types.d.ts +1 -0
  104. package/dist/plugins/golang/atlas/types.d.ts.map +1 -1
  105. package/dist/plugins/golang/index.d.ts.map +1 -1
  106. package/dist/plugins/golang/index.js +15 -6
  107. package/dist/plugins/golang/index.js.map +1 -1
  108. package/dist/plugins/golang/source-scope.d.ts +7 -0
  109. package/dist/plugins/golang/source-scope.d.ts.map +1 -0
  110. package/dist/plugins/golang/source-scope.js +83 -0
  111. package/dist/plugins/golang/source-scope.js.map +1 -0
  112. package/node_modules/node-addon-api/LICENSE.md +9 -0
  113. package/node_modules/node-addon-api/README.md +95 -0
  114. package/node_modules/node-addon-api/common.gypi +21 -0
  115. package/node_modules/node-addon-api/except.gypi +25 -0
  116. package/node_modules/node-addon-api/index.js +14 -0
  117. package/node_modules/node-addon-api/napi-inl.deprecated.h +186 -0
  118. package/node_modules/node-addon-api/napi-inl.h +7033 -0
  119. package/node_modules/node-addon-api/napi.h +3309 -0
  120. package/node_modules/node-addon-api/node_addon_api.gyp +42 -0
  121. package/node_modules/node-addon-api/node_api.gyp +9 -0
  122. package/node_modules/node-addon-api/noexcept.gypi +26 -0
  123. package/node_modules/node-addon-api/nothing.c +0 -0
  124. package/node_modules/node-addon-api/package-support.json +21 -0
  125. package/node_modules/node-addon-api/package.json +480 -0
  126. package/node_modules/node-addon-api/tools/README.md +73 -0
  127. package/node_modules/node-addon-api/tools/check-napi.js +99 -0
  128. package/node_modules/node-addon-api/tools/clang-format.js +71 -0
  129. package/node_modules/node-addon-api/tools/conversion.js +301 -0
  130. package/node_modules/node-gyp-build/LICENSE +21 -0
  131. package/node_modules/node-gyp-build/README.md +58 -0
  132. package/node_modules/node-gyp-build/SECURITY.md +5 -0
  133. package/node_modules/node-gyp-build/bin.js +84 -0
  134. package/node_modules/node-gyp-build/build-test.js +19 -0
  135. package/node_modules/node-gyp-build/index.js +6 -0
  136. package/node_modules/node-gyp-build/node-gyp-build.js +207 -0
  137. package/node_modules/node-gyp-build/optional.js +7 -0
  138. package/node_modules/node-gyp-build/package.json +43 -0
  139. package/node_modules/tree-sitter/LICENSE +21 -0
  140. package/node_modules/tree-sitter/README.md +128 -0
  141. package/node_modules/tree-sitter/binding.gyp +80 -0
  142. package/node_modules/tree-sitter/index.js +916 -0
  143. package/node_modules/tree-sitter/package.json +76 -0
  144. package/node_modules/tree-sitter/prebuilds/linux-x64/node.napi.glibc.node +0 -0
  145. package/node_modules/tree-sitter/src/addon_data.h +47 -0
  146. package/node_modules/tree-sitter/src/binding.cc +35 -0
  147. package/node_modules/tree-sitter/src/conversions.cc +140 -0
  148. package/node_modules/tree-sitter/src/conversions.h +22 -0
  149. package/node_modules/tree-sitter/src/language.cc +106 -0
  150. package/node_modules/tree-sitter/src/language.h +17 -0
  151. package/node_modules/tree-sitter/src/logger.cc +70 -0
  152. package/node_modules/tree-sitter/src/logger.h +19 -0
  153. package/node_modules/tree-sitter/src/lookaheaditerator.cc +122 -0
  154. package/node_modules/tree-sitter/src/lookaheaditerator.h +33 -0
  155. package/node_modules/tree-sitter/src/node.cc +1088 -0
  156. package/node_modules/tree-sitter/src/node.h +30 -0
  157. package/node_modules/tree-sitter/src/parser.cc +306 -0
  158. package/node_modules/tree-sitter/src/parser.h +35 -0
  159. package/node_modules/tree-sitter/src/query.cc +397 -0
  160. package/node_modules/tree-sitter/src/query.h +40 -0
  161. package/node_modules/tree-sitter/src/tree.cc +316 -0
  162. package/node_modules/tree-sitter/src/tree.h +45 -0
  163. package/node_modules/tree-sitter/src/tree_cursor.cc +213 -0
  164. package/node_modules/tree-sitter/src/tree_cursor.h +52 -0
  165. package/node_modules/tree-sitter/tree-sitter.d.ts +1042 -0
  166. package/node_modules/tree-sitter/vendor/tree-sitter/lib/include/tree_sitter/api.h +1478 -0
  167. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/alloc.c +48 -0
  168. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/alloc.h +41 -0
  169. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/array.h +291 -0
  170. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/atomic.h +68 -0
  171. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/clock.h +146 -0
  172. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/error_costs.h +11 -0
  173. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/get_changed_ranges.c +523 -0
  174. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/get_changed_ranges.h +36 -0
  175. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/host.h +21 -0
  176. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/language.c +293 -0
  177. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/language.h +293 -0
  178. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/length.h +52 -0
  179. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/lexer.c +483 -0
  180. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/lexer.h +54 -0
  181. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/lib.c +12 -0
  182. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/node.c +875 -0
  183. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/parser.c +2293 -0
  184. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/parser.h +286 -0
  185. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/point.h +48 -0
  186. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/portable/endian.h +239 -0
  187. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/query.c +4350 -0
  188. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/reduce_action.h +34 -0
  189. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/reusable_node.h +95 -0
  190. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/stack.c +911 -0
  191. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/stack.h +133 -0
  192. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/subtree.c +1034 -0
  193. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/subtree.h +399 -0
  194. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree.c +170 -0
  195. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree.h +31 -0
  196. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree_cursor.c +717 -0
  197. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree_cursor.h +48 -0
  198. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/ts_assert.h +11 -0
  199. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/ICU_SHA +1 -0
  200. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/LICENSE +414 -0
  201. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/README.md +29 -0
  202. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/ptypes.h +1 -0
  203. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/umachine.h +448 -0
  204. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/urename.h +1 -0
  205. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/utf.h +1 -0
  206. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/utf16.h +733 -0
  207. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/utf8.h +881 -0
  208. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode.h +75 -0
  209. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm/stdlib-symbols.txt +24 -0
  210. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm/stdlib.c +113 -0
  211. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm/wasm-stdlib.h +1314 -0
  212. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm_store.c +1935 -0
  213. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm_store.h +31 -0
  214. package/package.json +9 -2
  215. package/scripts/postinstall-tree-sitter.mjs +28 -0
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # ArchGuard
2
2
 
3
- ArchGuard analyzes source code to extract architectural insights and generates **Mermaid diagrams** at multiple levels of detail. It supports TypeScript (stable), Go (stable), Java (beta), and Python (beta) through a plugin system, with optional LLM-powered grouping for better diagram organization.
3
+ ArchGuard analyzes source code to extract architectural insights and generates **Mermaid diagrams** at multiple levels of detail. It supports TypeScript (stable), Go (stable), Java (beta), and Python (beta) through a plugin system, and exposes query and MCP workflows for architecture inspection.
4
4
 
5
5
  ## Screenshots
6
6
 
@@ -20,7 +20,7 @@ ArchGuard analyzes source code to extract architectural insights and generates *
20
20
  - **Go Architecture Atlas**: 4-layer visualization — package graph, capability graph, goroutine topology, flow graph
21
21
  - **Parallel Processing**: High-performance parsing with configurable concurrency
22
22
  - **Smart Caching**: File-based caching with SHA-256 hashing for fast repeated runs
23
- - **AI-Powered Grouping**: Optional LLM-powered intelligent grouping via Claude API
23
+ - **Query & MCP Workflows**: Persisted architecture data can be inspected via CLI query tools or MCP
24
24
  - **Zero External Dependencies**: Local Mermaid rendering using isomorphic-mermaid
25
25
  - **Five-Layer Validation**: Automatic syntax, structure, render, quality, and auto-repair validation
26
26
  - **Configuration Files**: Project-level config with `archguard.config.json` support
@@ -54,19 +54,16 @@ Analyze a Go project:
54
54
  archguard analyze -s ./cmd --lang go --output-dir ./docs/architecture
55
55
  ```
56
56
 
57
- This generates `architecture.mmd` (Mermaid source), `architecture.svg`, and `architecture.png`.
57
+ This generates Mermaid diagrams or ArchJSON under the configured output directory, and query artifacts under the work directory.
58
58
 
59
- ### Multi-Level Diagrams
59
+ ### Level Filtering
60
60
 
61
61
  ```bash
62
- # Package-level overview (high-level)
63
- archguard analyze -s ./src -l package -n overview
62
+ # Generate only class and method diagrams
63
+ archguard analyze --diagrams class method
64
64
 
65
- # Class-level detail (default)
66
- archguard analyze -s ./src -l class -n architecture
67
-
68
- # Method-level detail (granular)
69
- archguard analyze -s ./src/core -l method -n core-detail
65
+ # Generate only package diagrams for a source set
66
+ archguard analyze -s ./src --diagrams package
70
67
  ```
71
68
 
72
69
  ## CLI Commands
@@ -79,16 +76,18 @@ Analyze a project and generate architecture diagrams.
79
76
  archguard analyze [options]
80
77
  ```
81
78
 
82
- **Source & Level:**
79
+ **Source & Selection:**
83
80
 
84
- - `-s, --sources <paths...>` - Source directories (repeatable)
85
- - `-l, --level <level>` - Detail level: `package` | `class` | `method` (default: `class`)
86
- - `-n, --name <name>` - Diagram name, supports paths like `modules/auth` (default: `architecture`)
81
+ - `-s, --sources <paths...>` - Source directories; triggers auto-detection and multi-diagram generation
82
+ - `--diagrams <levels...>` - Filter by level: `package` | `class` | `method` (language-dependent)
87
83
  - `--lang <language>` - Language: `typescript` | `go` | `java` | `python` (auto-detected)
84
+ - `--config <path>` - Config file path (default: `archguard.config.json`)
88
85
 
89
86
  **Output:**
90
87
 
91
- - `--output-dir <dir>` - Output directory (default: `./archguard`)
88
+ - `--work-dir <dir>` - ArchGuard work directory (default: `./.archguard`)
89
+ - `--cache-dir <dir>` - Cache directory (default: `<work-dir>/cache`)
90
+ - `--output-dir <dir>` - Output directory
92
91
  - `-f, --format <type>` - Output format: `mermaid` | `json` (default: `mermaid`)
93
92
  - `-e, --exclude <patterns...>` - Exclude glob patterns
94
93
 
@@ -101,20 +100,17 @@ archguard analyze [options]
101
100
  **Mermaid:**
102
101
 
103
102
  - `--mermaid-theme <theme>` - Theme: `default` | `forest` | `dark` | `neutral`
104
- - `--no-llm-grouping` - Use heuristic grouping instead of LLM
103
+ - `--mermaid-renderer <renderer>` - Renderer: `isomorphic` | `cli`
105
104
 
106
105
  **Go Atlas** (enabled by default for Go):
107
106
 
107
+ - `--atlas` - Enable Atlas mode
108
108
  - `--no-atlas` - Disable Atlas mode, use standard Go parsing
109
109
  - `--atlas-layers <layers>` - Comma-separated layers: `package,capability,goroutine,flow`
110
110
  - `--atlas-strategy <strategy>` - Analysis strategy: `none` | `selective` | `full`
111
- - `--atlas-entry-points <types>` - Entry point types to focus on
111
+ - `--atlas-no-tests` - Exclude test files from Atlas extraction
112
112
  - `--atlas-include-tests` - Include test packages in Atlas
113
-
114
- **Multi-Diagram (config file):**
115
-
116
- - `--config <path>` - Config file path (default: `archguard.config.json`)
117
- - `--diagrams <names...>` - Generate only specific diagrams by name
113
+ - `--atlas-protocols <protocols>` - Protocols included in flow graph
118
114
 
119
115
  **Claude CLI:**
120
116
 
@@ -127,8 +123,8 @@ archguard analyze [options]
127
123
  # Basic analysis
128
124
  archguard analyze
129
125
 
130
- # Analyze specific directory with custom output
131
- archguard analyze -s ./packages/core --output-dir ./docs/core-architecture
126
+ # Filter generated diagrams by level
127
+ archguard analyze --diagrams class method
132
128
 
133
129
  # Generate JSON for tooling integration
134
130
  archguard analyze -s ./src --output-dir . -f json
@@ -145,13 +141,51 @@ archguard analyze -s ./src -c 8 -v
145
141
  # Exclude test files
146
142
  archguard analyze -s ./src -e "**/*.test.ts" "**/*.spec.ts"
147
143
 
148
- # Disable LLM grouping (heuristic, no Claude needed)
149
- archguard analyze -s ./src --no-llm-grouping
150
-
151
144
  # Dark theme
152
145
  archguard analyze -s ./src --mermaid-theme dark
153
146
  ```
154
147
 
148
+ ### `query`
149
+
150
+ Query persisted architecture entities and relationships.
151
+
152
+ ```bash
153
+ archguard query [options]
154
+ ```
155
+
156
+ Common examples:
157
+
158
+ ```bash
159
+ archguard query --summary
160
+ archguard query --entity "DiagramProcessor"
161
+ archguard query --entity "DiagramProcessor" --format json
162
+ archguard query --entity "DiagramProcessor" --format json --verbose
163
+ archguard query --deps-of "DiagramProcessor" --depth 2
164
+ archguard query --implementers-of "ILanguagePlugin"
165
+ archguard query --list-scopes
166
+ ```
167
+
168
+ Typical architecture checking tasks:
169
+
170
+ - Dependency impact: `archguard query --deps-of "DiagramProcessor" --depth 2`
171
+ - Reverse impact: `archguard query --used-by "DiagramProcessor" --depth 2`
172
+ - Extension points: `archguard query --implementers-of "ILanguagePlugin"`
173
+ - Circular dependencies: `archguard query --cycles`
174
+ - Refactoring hotspots: `archguard query --high-coupling`
175
+ - Orphans: `archguard query --orphans`
176
+
177
+ See [Architecture Checking Scenarios](docs/user-guide/architecture-checking-scenarios.md) for task-oriented workflows.
178
+
179
+ ### `mcp`
180
+
181
+ Start the ArchGuard MCP server over stdio.
182
+
183
+ ```bash
184
+ archguard mcp [--arch-dir <dir>] [--scope <key>]
185
+ ```
186
+
187
+ The MCP server exposes the query tools plus `archguard_analyze`, which refreshes query artifacts for the current MCP session. Query tools default to the persisted global scope and return summary entities unless `verbose: true` is requested.
188
+
155
189
  ### `init`
156
190
 
157
191
  Initialize configuration file:
@@ -213,14 +247,13 @@ See [Go Plugin Usage Guide](docs/user-guide/golang-plugin-usage.md) for details.
213
247
 
214
248
  ```json
215
249
  {
216
- "source": "./src",
217
250
  "format": "mermaid",
218
251
  "exclude": ["**/*.test.ts", "**/*.spec.ts", "**/node_modules/**"],
219
252
  "concurrency": 4,
220
- "outputDir": "./archguard",
221
- "cache": { "enabled": true },
253
+ "workDir": "./.archguard",
254
+ "outputDir": "./docs/architecture",
255
+ "cache": { "enabled": true, "dir": "./.archguard/cache" },
222
256
  "mermaid": {
223
- "enableLLMGrouping": true,
224
257
  "renderer": "isomorphic",
225
258
  "theme": "default",
226
259
  "transparentBackground": true
@@ -264,22 +297,22 @@ Generate multiple diagrams with different sources and levels in one run:
264
297
  # Generate all diagrams
265
298
  archguard analyze
266
299
 
267
- # Generate specific diagrams only
268
- archguard analyze --diagrams overview modules/cli
300
+ # Filter configured diagrams by level
301
+ archguard analyze --diagrams class method
269
302
  ```
270
303
 
271
304
  ### Configuration Fields
272
305
 
273
306
  | Field | Type | Default | Description |
274
307
  |-------|------|---------|-------------|
275
- | `source` | string | `./src` | Source directory (single diagram mode) |
308
+ | `source` | string | `./src` | Source directory (single-diagram mode) |
276
309
  | `diagrams` | array | — | Multi-diagram config (overrides `source`) |
277
310
  | `format` | string | `mermaid` | Output format: `mermaid` or `json` |
278
311
  | `exclude` | string[] | `[]` | Glob patterns to exclude |
279
312
  | `concurrency` | number | CPU cores | Parallel parsing workers |
280
- | `outputDir` | string | `./archguard` | Output directory |
313
+ | `workDir` | string | `./.archguard` | Work directory for cache and query artifacts |
314
+ | `outputDir` | string | `./.archguard/output` | Output directory |
281
315
  | `cache.enabled` | boolean | `true` | Enable file-based caching |
282
- | `mermaid.enableLLMGrouping` | boolean | `true` | LLM-powered entity grouping |
283
316
  | `mermaid.theme` | string | `default` | Diagram theme |
284
317
  | `mermaid.transparentBackground` | boolean | `true` | Transparent PNG background |
285
318
  | `cli.command` | string | `claude` | Claude CLI executable |
@@ -355,6 +388,12 @@ archguard analyze -s ./src -c 1 # sequential (debugging)
355
388
 
356
389
  ## Architecture
357
390
 
391
+ For current implementation details, see:
392
+
393
+ - [Architecture Checking Scenarios](docs/user-guide/architecture-checking-scenarios.md)
394
+ - [Architecture Overview](docs/dev-guide/architecture.md)
395
+ - [CLI Usage](docs/user-guide/cli-usage.md)
396
+
358
397
  ### Project Structure
359
398
 
360
399
  ```
@@ -394,27 +433,22 @@ archguard/
394
433
  ### Data Flow
395
434
 
396
435
  ```
397
- Source Files
398
-
399
- ▼ Language Plugin (TypeScript / Go / Java / Python)
400
- AST / Tree-sitter Parse
401
-
402
- ▼ Extractors
403
- ArchJSON (entities + relations)
436
+ CLI / MCP entrypoint
404
437
 
405
- ├─► (Go) Atlas Builders → 4-layer extension
438
+ Shared analysis core (`runAnalysis`)
439
+ Config normalization + diagram selection
406
440
 
407
- LLM Grouper (optional, Claude API)
408
- Grouped ArchJSON
441
+ DiagramProcessor
442
+ ArchJsonProvider + language plugins
409
443
 
410
- Mermaid Generator
411
- .mmd syntax
444
+ ArchJSON (entities + relations + optional extensions)
412
445
 
413
- Five-Layer Validator + Auto-repair
414
- Valid .mmd
446
+ ├─► Query artifacts (`.archguard/query/*`)
447
+ ├─► Mermaid / JSON outputs (`.archguard/output/*`)
448
+ └─► Go Atlas extension (package / capability / goroutine / flow)
415
449
 
416
- isomorphic-mermaid + sharp
417
- .svg + .png
450
+ QueryEngine / MCP query tools
451
+ Architecture inspection workflows
418
452
  ```
419
453
 
420
454
  ## Development
@@ -425,7 +459,6 @@ Valid .mmd
425
459
  - npm or yarn
426
460
 
427
461
  Optional, for enhanced features:
428
- - **Claude CLI** — LLM-powered diagram grouping
429
462
  - **gopls** — Semantic interface detection for Go projects
430
463
 
431
464
  ### Setup
@@ -485,7 +518,6 @@ node dist/cli/index.js analyze -s ./src/cli -l method -n cli-module
485
518
  | Go LSP | gopls | latest | Semantic interface detection |
486
519
  | Diagram Generation | isomorphic-mermaid | ^0.1.1 | Local Mermaid rendering |
487
520
  | Image Processing | sharp | ^0.34.5 | SVG → PNG conversion |
488
- | LLM Integration | @anthropic-ai/sdk | ^0.20.0 | Optional LLM grouping |
489
521
  | Process Management | execa | ^8.0.0 | Subprocess execution |
490
522
  | Testing | Vitest | ^1.2.0 | Unit/integration tests |
491
523
  | CLI | commander | ^11.1.0 | Command-line interface |
@@ -499,17 +531,18 @@ See [TROUBLESHOOTING.md](docs/user-guide/troubleshooting.md) for common issues.
499
531
 
500
532
  Quick fixes:
501
533
 
502
- - **LLM grouping fails** — run with `--no-llm-grouping` to use heuristic mode
503
534
  - **Go interface detection low** — install gopls: `go install golang.org/x/tools/gopls@latest`
504
535
  - **Slow first run** — normal; subsequent runs use cache (80%+ hit rate)
505
536
  - **Render errors** — the five-layer validator auto-repairs most issues; run with `-v` for details
506
- - **Install fails on macOS arm64 + Node.js 25** — `tree-sitter` native addon compilation requires C++20; use `npm install -g @yalehwang/archguard --ignore-scripts` to skip native build (JS functionality unaffected), or use Node.js 22 LTS
537
+ - **Install fails with missing `tree-sitter` binding** use the packaged release tarball that bundles the required prebuilt `tree-sitter` binary for your platform/runtime; source rebuild fallback is disabled
507
538
 
508
539
  ## Documentation
509
540
 
510
541
  - [CLI Usage Guide](docs/user-guide/cli-usage.md)
542
+ - [Architecture Checking Scenarios](docs/user-guide/architecture-checking-scenarios.md)
511
543
  - [Configuration Reference](docs/user-guide/configuration.md)
512
544
  - [Go Plugin Usage Guide](docs/user-guide/golang-plugin-usage.md)
545
+ - [Architecture Overview](docs/dev-guide/architecture.md)
513
546
  - [Plugin Development Guide](docs/dev-guide/plugin-development-guide.md)
514
547
  - [Plugin Registry](docs/user-guide/plugin-registry.md)
515
548
  - [Troubleshooting](docs/user-guide/troubleshooting.md)
@@ -535,4 +568,3 @@ Built with:
535
568
  - [tree-sitter](https://tree-sitter.github.io/) for Go/Java/Python parsing
536
569
  - [Mermaid](https://mermaid.js.org/) for diagram syntax
537
570
  - [isomorphic-mermaid](https://github.com/brede95/isomorphic-mermaid) for rendering
538
- - [Claude AI](https://www.anthropic.com/claude) for optional LLM-powered grouping
@@ -0,0 +1,5 @@
1
+ import type { Config } from '../config-loader.js';
2
+ import type { CLIOptions, DiagramConfig } from '../../types/config.js';
3
+ export declare function normalizeToDiagrams(config: Config, cliOptions: CLIOptions, rootDir?: string): Promise<DiagramConfig[]>;
4
+ export declare function filterByLevels(diagrams: DiagramConfig[], levels?: string[]): DiagramConfig[];
5
+ //# sourceMappingURL=normalize-to-diagrams.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalize-to-diagrams.d.ts","sourceRoot":"","sources":["../../../src/cli/analyze/normalize-to-diagrams.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAKvE,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,UAAU,EACtB,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,aAAa,EAAE,CAAC,CAoF1B;AASD,wBAAgB,cAAc,CAAC,QAAQ,EAAE,aAAa,EAAE,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,GAAG,aAAa,EAAE,CAM5F"}
@@ -0,0 +1,94 @@
1
+ import path from 'path';
2
+ import fs from 'fs-extra';
3
+ import { detectProjectStructure } from '../utils/project-structure-detector.js';
4
+ import { detectCppProjectStructure } from '../utils/cpp-project-structure-detector.js';
5
+ export async function normalizeToDiagrams(config, cliOptions, rootDir) {
6
+ const resolvedRoot = rootDir ?? process.cwd();
7
+ if (config.diagrams && config.diagrams.length > 0) {
8
+ return filterByLevels(config.diagrams, cliOptions.diagrams);
9
+ }
10
+ if (cliOptions.sources && cliOptions.sources.length > 0) {
11
+ const language = cliOptions.lang ?? (cliOptions.atlas ? 'go' : undefined);
12
+ const atlasEnabled = language === 'go' && cliOptions.atlas !== false;
13
+ if (atlasEnabled) {
14
+ const diagram = {
15
+ name: 'architecture',
16
+ sources: cliOptions.sources,
17
+ level: 'package',
18
+ format: cliOptions.format,
19
+ exclude: cliOptions.exclude,
20
+ language,
21
+ languageSpecific: {
22
+ atlas: {
23
+ enabled: true,
24
+ functionBodyStrategy: cliOptions.atlasStrategy ?? 'selective',
25
+ excludeTests: !cliOptions.atlasIncludeTests,
26
+ protocols: cliOptions.atlasProtocols?.split(',').map((s) => s.trim()),
27
+ layers: cliOptions.atlasLayers?.split(',').map((s) => s.trim()),
28
+ },
29
+ },
30
+ };
31
+ return [diagram];
32
+ }
33
+ if (language === 'go' && cliOptions.atlas === false) {
34
+ const diagram = {
35
+ name: 'architecture',
36
+ sources: cliOptions.sources,
37
+ level: 'class',
38
+ format: cliOptions.format,
39
+ exclude: cliOptions.exclude,
40
+ language,
41
+ };
42
+ return [diagram];
43
+ }
44
+ if (language === 'cpp') {
45
+ const sourcePath = path.resolve(cliOptions.sources[0]);
46
+ const moduleName = path.basename(sourcePath);
47
+ const diagrams = await detectCppProjectStructure(sourcePath, moduleName, {
48
+ format: cliOptions.format,
49
+ exclude: cliOptions.exclude,
50
+ });
51
+ return filterByLevels(diagrams, cliOptions.diagrams);
52
+ }
53
+ const externalSourceRoot = path.resolve(cliOptions.sources[0]);
54
+ const diagrams = await detectProjectStructure(resolvedRoot, externalSourceRoot);
55
+ return filterByLevels(diagrams, cliOptions.diagrams);
56
+ }
57
+ const inferredLanguage = cliOptions.lang ?? (cliOptions.atlas ? 'go' : await detectRootLanguage(resolvedRoot));
58
+ if (inferredLanguage === 'go') {
59
+ return [
60
+ {
61
+ name: 'architecture',
62
+ sources: ['.'],
63
+ level: 'package',
64
+ format: cliOptions.format,
65
+ exclude: cliOptions.exclude,
66
+ language: 'go',
67
+ languageSpecific: {
68
+ atlas: {
69
+ enabled: cliOptions.atlas !== false,
70
+ functionBodyStrategy: cliOptions.atlasStrategy ?? 'selective',
71
+ excludeTests: !cliOptions.atlasIncludeTests,
72
+ protocols: cliOptions.atlasProtocols?.split(',').map((s) => s.trim()),
73
+ layers: cliOptions.atlasLayers?.split(',').map((s) => s.trim()),
74
+ },
75
+ },
76
+ },
77
+ ];
78
+ }
79
+ const diagrams = await detectProjectStructure(resolvedRoot);
80
+ return filterByLevels(diagrams, cliOptions.diagrams);
81
+ }
82
+ async function detectRootLanguage(rootDir) {
83
+ if (await fs.pathExists(path.join(rootDir, 'go.mod'))) {
84
+ return 'go';
85
+ }
86
+ return undefined;
87
+ }
88
+ export function filterByLevels(diagrams, levels) {
89
+ if (!levels || levels.length === 0) {
90
+ return diagrams;
91
+ }
92
+ return diagrams.filter((d) => levels.includes(d.level ?? 'class'));
93
+ }
94
+ //# sourceMappingURL=normalize-to-diagrams.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalize-to-diagrams.js","sourceRoot":"","sources":["../../../src/cli/analyze/normalize-to-diagrams.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,EAAE,sBAAsB,EAAE,MAAM,wCAAwC,CAAC;AAChF,OAAO,EAAE,yBAAyB,EAAE,MAAM,4CAA4C,CAAC;AAOvF,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,MAAc,EACd,UAAsB,EACtB,OAAgB;IAEhB,MAAM,YAAY,GAAG,OAAO,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAE9C,IAAI,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClD,OAAO,cAAc,CAAC,MAAM,CAAC,QAA2B,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC;IACjF,CAAC;IAED,IAAI,UAAU,CAAC,OAAO,IAAI,UAAU,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxD,MAAM,QAAQ,GAAG,UAAU,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAC1E,MAAM,YAAY,GAAG,QAAQ,KAAK,IAAI,IAAI,UAAU,CAAC,KAAK,KAAK,KAAK,CAAC;QAErE,IAAI,YAAY,EAAE,CAAC;YACjB,MAAM,OAAO,GAAkB;gBAC7B,IAAI,EAAE,cAAc;gBACpB,OAAO,EAAE,UAAU,CAAC,OAAO;gBAC3B,KAAK,EAAE,SAAS;gBAChB,MAAM,EAAE,UAAU,CAAC,MAAM;gBACzB,OAAO,EAAE,UAAU,CAAC,OAAO;gBAC3B,QAAQ;gBACR,gBAAgB,EAAE;oBAChB,KAAK,EAAE;wBACL,OAAO,EAAE,IAAI;wBACb,oBAAoB,EAAE,UAAU,CAAC,aAAa,IAAI,WAAW;wBAC7D,YAAY,EAAE,CAAC,UAAU,CAAC,iBAAiB;wBAC3C,SAAS,EAAE,UAAU,CAAC,cAAc,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;wBACrE,MAAM,EAAE,UAAU,CAAC,WAAW,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;qBAChE;iBACF;aACF,CAAC;YACF,OAAO,CAAC,OAAO,CAAC,CAAC;QACnB,CAAC;QAED,IAAI,QAAQ,KAAK,IAAI,IAAI,UAAU,CAAC,KAAK,KAAK,KAAK,EAAE,CAAC;YACpD,MAAM,OAAO,GAAkB;gBAC7B,IAAI,EAAE,cAAc;gBACpB,OAAO,EAAE,UAAU,CAAC,OAAO;gBAC3B,KAAK,EAAE,OAAO;gBACd,MAAM,EAAE,UAAU,CAAC,MAAM;gBACzB,OAAO,EAAE,UAAU,CAAC,OAAO;gBAC3B,QAAQ;aACT,CAAC;YACF,OAAO,CAAC,OAAO,CAAC,CAAC;QACnB,CAAC;QAED,IAAI,QAAQ,KAAK,KAAK,EAAE,CAAC;YACvB,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;YACvD,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;YAC7C,MAAM,QAAQ,GAAG,MAAM,yBAAyB,CAAC,UAAU,EAAE,UAAU,EAAE;gBACvE,MAAM,EAAE,UAAU,CAAC,MAAM;gBACzB,OAAO,EAAE,UAAU,CAAC,OAAO;aAC5B,CAAC,CAAC;YACH,OAAO,cAAc,CAAC,QAAQ,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC;QACvD,CAAC;QAED,MAAM,kBAAkB,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/D,MAAM,QAAQ,GAAG,MAAM,sBAAsB,CAAC,YAAY,EAAE,kBAAkB,CAAC,CAAC;QAChF,OAAO,cAAc,CAAC,QAAQ,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC;IACvD,CAAC;IAED,MAAM,gBAAgB,GAAG,UAAU,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,kBAAkB,CAAC,YAAY,CAAC,CAAC,CAAC;IAC/G,IAAI,gBAAgB,KAAK,IAAI,EAAE,CAAC;QAC9B,OAAO;YACL;gBACE,IAAI,EAAE,cAAc;gBACpB,OAAO,EAAE,CAAC,GAAG,CAAC;gBACd,KAAK,EAAE,SAAS;gBAChB,MAAM,EAAE,UAAU,CAAC,MAAM;gBACzB,OAAO,EAAE,UAAU,CAAC,OAAO;gBAC3B,QAAQ,EAAE,IAAI;gBACd,gBAAgB,EAAE;oBAChB,KAAK,EAAE;wBACL,OAAO,EAAE,UAAU,CAAC,KAAK,KAAK,KAAK;wBACnC,oBAAoB,EAAE,UAAU,CAAC,aAAa,IAAI,WAAW;wBAC7D,YAAY,EAAE,CAAC,UAAU,CAAC,iBAAiB;wBAC3C,SAAS,EAAE,UAAU,CAAC,cAAc,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;wBACrE,MAAM,EAAE,UAAU,CAAC,WAAW,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;qBAChE;iBACF;aACF;SACF,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,sBAAsB,CAAC,YAAY,CAAC,CAAC;IAC5D,OAAO,cAAc,CAAC,QAAQ,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC;AACvD,CAAC;AAED,KAAK,UAAU,kBAAkB,CAAC,OAAe;IAC/C,IAAI,MAAM,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,EAAE,CAAC;QACtD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,QAAyB,EAAE,MAAiB;IACzE,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACnC,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,IAAI,OAAO,CAAC,CAAC,CAAC;AACrE,CAAC"}
@@ -0,0 +1,20 @@
1
+ import type { Config } from '../config-loader.js';
2
+ import type { CLIOptions, DiagramConfig } from '../../types/config.js';
3
+ import type { ProgressReporterLike } from '../progress.js';
4
+ import type { DiagramResult } from '../processors/diagram-processor.js';
5
+ export interface RunAnalysisOptions {
6
+ sessionRoot: string;
7
+ workDir: string;
8
+ cliOptions: Partial<CLIOptions>;
9
+ reporter: ProgressReporterLike;
10
+ }
11
+ export interface RunAnalysisResult {
12
+ config: Config;
13
+ diagrams: DiagramConfig[];
14
+ results: DiagramResult[];
15
+ queryScopesPersisted: number;
16
+ persistedScopeKeys: string[];
17
+ hasDiagramFailures: boolean;
18
+ }
19
+ export declare function runAnalysis(options: RunAnalysisOptions): Promise<RunAnalysisResult>;
20
+ //# sourceMappingURL=run-analysis.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-analysis.d.ts","sourceRoot":"","sources":["../../../src/cli/analyze/run-analysis.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACnE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAO3D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AAExE,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;IAChC,QAAQ,EAAE,oBAAoB,CAAC;CAChC;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,kBAAkB,EAAE,OAAO,CAAC;CAC7B;AAED,wBAAsB,WAAW,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAoGzF"}
@@ -0,0 +1,150 @@
1
+ import path from 'path';
2
+ import { ConfigLoader } from '../config-loader.js';
3
+ import { DiagramProcessor } from '../processors/diagram-processor.js';
4
+ import { DiagramIndexGenerator } from '../utils/diagram-index-generator.js';
5
+ import { ParseCache } from '../../parser/parse-cache.js';
6
+ import { persistQueryScopes } from '../query/query-artifacts.js';
7
+ import { readManifest, writeManifest, cleanStaleDiagrams } from '../cache/diagram-manifest.js';
8
+ import { normalizeToDiagrams } from './normalize-to-diagrams.js';
9
+ export async function runAnalysis(options) {
10
+ const { sessionRoot, workDir, cliOptions, reporter } = options;
11
+ reporter.start('Loading configuration...');
12
+ const configLoader = new ConfigLoader(sessionRoot);
13
+ const configOverrides = buildConfigOverrides(cliOptions, workDir, sessionRoot);
14
+ const config = await configLoader.load(configOverrides, cliOptions.config);
15
+ reporter.succeed('Configuration loaded');
16
+ const selectedDiagrams = (await normalizeToDiagrams(config, cliOptions, sessionRoot)).map((diagram) => ({
17
+ ...diagram,
18
+ sources: diagram.sources.map((source) => path.resolve(sessionRoot, source)),
19
+ }));
20
+ reporter.info(`Found ${selectedDiagrams.length} diagram(s) to generate`);
21
+ if (selectedDiagrams.length === 0) {
22
+ return {
23
+ config,
24
+ diagrams: [],
25
+ results: [],
26
+ queryScopesPersisted: 0,
27
+ persistedScopeKeys: [],
28
+ hasDiagramFailures: false,
29
+ };
30
+ }
31
+ const cacheDir = config.cache?.dir || path.join(config.workDir || '.archguard', 'cache');
32
+ const outputDir = config.outputDir || path.join(config.workDir || '.archguard', 'output');
33
+ const existingManifest = await readManifest(cacheDir);
34
+ if (existingManifest) {
35
+ const currentNames = selectedDiagrams.map((d) => d.name);
36
+ const stale = await cleanStaleDiagrams(currentNames, existingManifest, outputDir);
37
+ if (stale.length > 0 && config.verbose) {
38
+ reporter.info(`Cleaned ${stale.length} stale diagram(s): ${stale.join(', ')}`);
39
+ }
40
+ }
41
+ const parseCache = new ParseCache();
42
+ const processor = new DiagramProcessor({
43
+ diagrams: selectedDiagrams,
44
+ globalConfig: config,
45
+ progress: reporter,
46
+ parseCache,
47
+ });
48
+ const results = await processor.processAll();
49
+ const successfulNames = results.filter((r) => r.success).map((r) => r.name);
50
+ if (successfulNames.length > 0) {
51
+ try {
52
+ await writeManifest(cacheDir, successfulNames, outputDir);
53
+ }
54
+ catch (err) {
55
+ if (config.verbose) {
56
+ const msg = err instanceof Error ? err.message : String(err);
57
+ reporter.warn(`[manifest] Failed to write diagram manifest: ${msg}`);
58
+ }
59
+ }
60
+ }
61
+ let persistedScopeKeys = [];
62
+ let hasArtifactFailures = results.some((r) => !r.success);
63
+ const queryScopes = processor.getQuerySourceGroups();
64
+ if (queryScopes.length > 0) {
65
+ try {
66
+ const entries = await persistQueryScopes(config.workDir || workDir, queryScopes);
67
+ persistedScopeKeys = entries.map((entry) => entry.key);
68
+ if (config.verbose) {
69
+ reporter.info(`Persisted ${entries.length} query scope(s) to ${(config.workDir || workDir)}/query/`);
70
+ }
71
+ }
72
+ catch (err) {
73
+ const msg = err instanceof Error ? err.message : String(err);
74
+ reporter.warn(`[query] Failed to persist query scopes: ${msg}`);
75
+ }
76
+ }
77
+ if (results.length > 1) {
78
+ try {
79
+ reporter.start('Generating index...');
80
+ const indexGenerator = new DiagramIndexGenerator(config);
81
+ await indexGenerator.generate(results);
82
+ reporter.succeed('Index generated');
83
+ }
84
+ catch (err) {
85
+ hasArtifactFailures = true;
86
+ const msg = err instanceof Error ? err.message : String(err);
87
+ reporter.warn(`[index] Failed to generate index: ${msg}`);
88
+ }
89
+ }
90
+ return {
91
+ config,
92
+ diagrams: selectedDiagrams,
93
+ results,
94
+ queryScopesPersisted: persistedScopeKeys.length,
95
+ persistedScopeKeys,
96
+ hasDiagramFailures: hasArtifactFailures,
97
+ };
98
+ }
99
+ function buildConfigOverrides(cliOptions, workDir, sessionRoot) {
100
+ const configOverrides = { workDir };
101
+ if (cliOptions.format)
102
+ configOverrides.format = cliOptions.format;
103
+ if (cliOptions.exclude)
104
+ configOverrides.exclude = cliOptions.exclude;
105
+ if (cliOptions.cache !== undefined) {
106
+ configOverrides.cache = { enabled: cliOptions.cache, ttl: 86400 };
107
+ }
108
+ if (cliOptions.cacheDir) {
109
+ configOverrides.cache = {
110
+ enabled: cliOptions.cache ?? true,
111
+ ttl: 86400,
112
+ dir: cliOptions.cacheDir,
113
+ };
114
+ }
115
+ if (cliOptions.concurrency) {
116
+ configOverrides.concurrency = parseInt(String(cliOptions.concurrency), 10);
117
+ }
118
+ if (cliOptions.verbose !== undefined)
119
+ configOverrides.verbose = cliOptions.verbose;
120
+ if (cliOptions.cliCommand || cliOptions.cliArgs) {
121
+ configOverrides.cli = {
122
+ command: cliOptions.cliCommand || 'claude',
123
+ args: cliOptions.cliArgs ? cliOptions.cliArgs.split(' ') : [],
124
+ timeout: 60000,
125
+ };
126
+ }
127
+ if (cliOptions.mermaidTheme !== undefined || cliOptions.mermaidRenderer !== undefined) {
128
+ configOverrides.mermaid = {
129
+ theme: cliOptions.mermaidTheme,
130
+ renderer: cliOptions.mermaidRenderer,
131
+ transparentBackground: true,
132
+ };
133
+ }
134
+ if (cliOptions.outputDir)
135
+ configOverrides.outputDir = cliOptions.outputDir;
136
+ if (cliOptions.sources &&
137
+ cliOptions.sources.length > 0 &&
138
+ !cliOptions.outputDir &&
139
+ !cliOptions.workDir) {
140
+ const sourcePath = path.resolve(sessionRoot, cliOptions.sources[0]);
141
+ if (!sourcePath.startsWith(sessionRoot)) {
142
+ const SOURCE_ROOT_NAMES = ['src', 'lib', 'app', 'source'];
143
+ const basename = path.basename(sourcePath);
144
+ const projectRoot = SOURCE_ROOT_NAMES.includes(basename) ? path.dirname(sourcePath) : sourcePath;
145
+ configOverrides.workDir = path.join(projectRoot, '.archguard');
146
+ }
147
+ }
148
+ return configOverrides;
149
+ }
150
+ //# sourceMappingURL=run-analysis.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-analysis.js","sourceRoot":"","sources":["../../../src/cli/analyze/run-analysis.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"arch-json-disk-cache.d.ts","sourceRoot":"","sources":["../../../src/cli/cache/arch-json-disk-cache.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEjD,eAAO,MAAM,aAAa,UAAU,CAAC;AAQrC,qBAAa,iBAAiB;IAChB,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAAR,QAAQ,EAAE,MAAM;IAE7C,OAAO,CAAC,OAAO;IAKT,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IAY1C,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAWnD,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAY5C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAG7B"}
1
+ {"version":3,"file":"arch-json-disk-cache.d.ts","sourceRoot":"","sources":["../../../src/cli/cache/arch-json-disk-cache.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAGjD,eAAO,MAAM,aAAa,UAAU,CAAC;AAQrC,qBAAa,iBAAiB;IAChB,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAAR,QAAQ,EAAE,MAAM;IAE7C,OAAO,CAAC,OAAO;IAKT,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IAY1C,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAWnD,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAY5C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAG7B"}
@@ -1,6 +1,7 @@
1
1
  import fs from 'fs-extra';
2
2
  import path from 'path';
3
3
  import { createHash } from 'crypto';
4
+ import { canonicalizeArchJson } from '../utils/canonicalize-arch-json.js';
4
5
  export const CACHE_VERSION = '1.0.0';
5
6
  export class ArchJsonDiskCache {
6
7
  cacheDir;
@@ -31,7 +32,7 @@ export class ArchJsonDiskCache {
31
32
  const entry = {
32
33
  version: CACHE_VERSION,
33
34
  createdAt: new Date().toISOString(),
34
- archJson,
35
+ archJson: canonicalizeArchJson(archJson),
35
36
  };
36
37
  await fs.writeJson(filePath, entry);
37
38
  }
@@ -1 +1 @@
1
- {"version":3,"file":"arch-json-disk-cache.js","sourceRoot":"","sources":["../../../src/cli/cache/arch-json-disk-cache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAGpC,MAAM,CAAC,MAAM,aAAa,GAAG,OAAO,CAAC;AAQrC,MAAM,OAAO,iBAAiB;IACC;IAA7B,YAA6B,QAAgB;QAAhB,aAAQ,GAAR,QAAQ,CAAQ;IAAG,CAAC;IAEzC,OAAO,CAAC,GAAW;QACzB,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5B,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,CAAC;IACtD,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW;QACnB,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACnC,IAAI,CAAC;YACH,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;gBAAE,OAAO,IAAI,CAAC;YAClD,MAAM,KAAK,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAe,CAAC;YAC1D,IAAI,KAAK,CAAC,OAAO,KAAK,aAAa;gBAAE,OAAO,IAAI,CAAC;YACjD,OAAO,KAAK,CAAC,QAAQ,CAAC;QACxB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW,EAAE,QAAkB;QACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACnC,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC3C,MAAM,KAAK,GAAe;YACxB,OAAO,EAAE,aAAa;YACtB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,QAAQ;SACT,CAAC;QACF,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IACtC,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,KAAe;QAC9B,MAAM,MAAM,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;QACjC,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,CAC9B,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;YACrB,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YACrC,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC5D,CAAC,CAAC,CACH,CAAC;QACF,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtE,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC7D,CAAC;IAED,KAAK,CAAC,KAAK;QACT,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACnC,CAAC;CACF"}
1
+ {"version":3,"file":"arch-json-disk-cache.js","sourceRoot":"","sources":["../../../src/cli/cache/arch-json-disk-cache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAEpC,OAAO,EAAE,oBAAoB,EAAE,MAAM,uCAAuC,CAAC;AAE7E,MAAM,CAAC,MAAM,aAAa,GAAG,OAAO,CAAC;AAQrC,MAAM,OAAO,iBAAiB;IACC;IAA7B,YAA6B,QAAgB;QAAhB,aAAQ,GAAR,QAAQ,CAAQ;IAAG,CAAC;IAEzC,OAAO,CAAC,GAAW;QACzB,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5B,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,CAAC;IACtD,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW;QACnB,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACnC,IAAI,CAAC;YACH,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;gBAAE,OAAO,IAAI,CAAC;YAClD,MAAM,KAAK,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAe,CAAC;YAC1D,IAAI,KAAK,CAAC,OAAO,KAAK,aAAa;gBAAE,OAAO,IAAI,CAAC;YACjD,OAAO,KAAK,CAAC,QAAQ,CAAC;QACxB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW,EAAE,QAAkB;QACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACnC,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC3C,MAAM,KAAK,GAAe;YACxB,OAAO,EAAE,aAAa;YACtB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,QAAQ,EAAE,oBAAoB,CAAC,QAAQ,CAAC;SACzC,CAAC;QACF,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IACtC,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,KAAe;QAC9B,MAAM,MAAM,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;QACjC,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,CAC9B,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;YACrB,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YACrC,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC5D,CAAC,CAAC,CACH,CAAC;QACF,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtE,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC7D,CAAC;IAED,KAAK,CAAC,KAAK;QACT,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACnC,CAAC;CACF"}
@@ -0,0 +1,13 @@
1
+ export declare const MANIFEST_VERSION = "1.0";
2
+ export declare const MANIFEST_FILENAME = "diagram-manifest.json";
3
+ export interface DiagramManifest {
4
+ version: string;
5
+ lastRun: string;
6
+ outputDir: string;
7
+ diagrams: string[];
8
+ }
9
+ export declare function readManifest(cacheDir: string): Promise<DiagramManifest | null>;
10
+ export declare function writeManifest(cacheDir: string, diagrams: string[], outputDir: string): Promise<void>;
11
+ export declare function cleanStaleDiagrams(currentDiagrams: string[], manifest: DiagramManifest, outputDir: string): Promise<string[]>;
12
+ export declare function clearRenderHashes(outputDir: string): Promise<number>;
13
+ //# sourceMappingURL=diagram-manifest.d.ts.map