@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.
- package/README.md +90 -58
- package/dist/cli/analyze/normalize-to-diagrams.d.ts +5 -0
- package/dist/cli/analyze/normalize-to-diagrams.d.ts.map +1 -0
- package/dist/cli/analyze/normalize-to-diagrams.js +94 -0
- package/dist/cli/analyze/normalize-to-diagrams.js.map +1 -0
- package/dist/cli/analyze/run-analysis.d.ts +20 -0
- package/dist/cli/analyze/run-analysis.d.ts.map +1 -0
- package/dist/cli/analyze/run-analysis.js +150 -0
- package/dist/cli/analyze/run-analysis.js.map +1 -0
- package/dist/cli/cache/arch-json-disk-cache.d.ts.map +1 -1
- package/dist/cli/cache/arch-json-disk-cache.js +2 -1
- package/dist/cli/cache/arch-json-disk-cache.js.map +1 -1
- package/dist/cli/cache/diagram-manifest.d.ts +13 -0
- package/dist/cli/cache/diagram-manifest.d.ts.map +1 -0
- package/dist/cli/cache/diagram-manifest.js +60 -0
- package/dist/cli/cache/diagram-manifest.js.map +1 -0
- package/dist/cli/cache/render-hash-cache.d.ts +13 -0
- package/dist/cli/cache/render-hash-cache.d.ts.map +1 -0
- package/dist/cli/cache/render-hash-cache.js +39 -0
- package/dist/cli/cache/render-hash-cache.js.map +1 -0
- package/dist/cli/commands/analyze.d.ts +1 -4
- package/dist/cli/commands/analyze.d.ts.map +1 -1
- package/dist/cli/commands/analyze.js +26 -143
- package/dist/cli/commands/analyze.js.map +1 -1
- package/dist/cli/commands/cache.d.ts.map +1 -1
- package/dist/cli/commands/cache.js +7 -0
- package/dist/cli/commands/cache.js.map +1 -1
- package/dist/cli/commands/mcp.d.ts +3 -0
- package/dist/cli/commands/mcp.d.ts.map +1 -0
- package/dist/cli/commands/mcp.js +17 -0
- package/dist/cli/commands/mcp.js.map +1 -0
- package/dist/cli/commands/query.d.ts +3 -0
- package/dist/cli/commands/query.d.ts.map +1 -0
- package/dist/cli/commands/query.js +227 -0
- package/dist/cli/commands/query.js.map +1 -0
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +4 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/mcp/analyze-tool.d.ts +6 -0
- package/dist/cli/mcp/analyze-tool.d.ts.map +1 -0
- package/dist/cli/mcp/analyze-tool.js +112 -0
- package/dist/cli/mcp/analyze-tool.js.map +1 -0
- package/dist/cli/mcp/mcp-server.d.ts +6 -0
- package/dist/cli/mcp/mcp-server.d.ts.map +1 -0
- package/dist/cli/mcp/mcp-server.js +165 -0
- package/dist/cli/mcp/mcp-server.js.map +1 -0
- package/dist/cli/processors/arch-json-provider.d.ts +38 -0
- package/dist/cli/processors/arch-json-provider.d.ts.map +1 -0
- package/dist/cli/processors/arch-json-provider.js +295 -0
- package/dist/cli/processors/arch-json-provider.js.map +1 -0
- package/dist/cli/processors/diagram-output-router.d.ts +26 -0
- package/dist/cli/processors/diagram-output-router.d.ts.map +1 -0
- package/dist/cli/processors/diagram-output-router.js +235 -0
- package/dist/cli/processors/diagram-output-router.js.map +1 -0
- package/dist/cli/processors/diagram-processor.d.ts +11 -22
- package/dist/cli/processors/diagram-processor.d.ts.map +1 -1
- package/dist/cli/processors/diagram-processor.js +37 -455
- package/dist/cli/processors/diagram-processor.js.map +1 -1
- package/dist/cli/progress.d.ts +22 -1
- package/dist/cli/progress.d.ts.map +1 -1
- package/dist/cli/progress.js +24 -0
- package/dist/cli/progress.js.map +1 -1
- package/dist/cli/query/arch-index-builder.d.ts +4 -0
- package/dist/cli/query/arch-index-builder.d.ts.map +1 -0
- package/dist/cli/query/arch-index-builder.js +126 -0
- package/dist/cli/query/arch-index-builder.js.map +1 -0
- package/dist/cli/query/arch-index.d.ts +17 -0
- package/dist/cli/query/arch-index.d.ts.map +1 -0
- package/dist/cli/query/arch-index.js +2 -0
- package/dist/cli/query/arch-index.js.map +1 -0
- package/dist/cli/query/engine-loader.d.ts +7 -0
- package/dist/cli/query/engine-loader.d.ts.map +1 -0
- package/dist/cli/query/engine-loader.js +98 -0
- package/dist/cli/query/engine-loader.js.map +1 -0
- package/dist/cli/query/query-artifacts.d.ts +7 -0
- package/dist/cli/query/query-artifacts.d.ts.map +1 -0
- package/dist/cli/query/query-artifacts.js +78 -0
- package/dist/cli/query/query-artifacts.js.map +1 -0
- package/dist/cli/query/query-engine.d.ts +49 -0
- package/dist/cli/query/query-engine.d.ts.map +1 -0
- package/dist/cli/query/query-engine.js +137 -0
- package/dist/cli/query/query-engine.js.map +1 -0
- package/dist/cli/query/query-manifest.d.ts +24 -0
- package/dist/cli/query/query-manifest.d.ts.map +1 -0
- package/dist/cli/query/query-manifest.js +2 -0
- package/dist/cli/query/query-manifest.js.map +1 -0
- package/dist/cli/utils/canonicalize-arch-json.d.ts +3 -0
- package/dist/cli/utils/canonicalize-arch-json.d.ts.map +1 -0
- package/dist/cli/utils/canonicalize-arch-json.js +81 -0
- package/dist/cli/utils/canonicalize-arch-json.js.map +1 -0
- package/dist/cli/utils/diagram-index-generator.d.ts.map +1 -1
- package/dist/cli/utils/diagram-index-generator.js +0 -5
- package/dist/cli/utils/diagram-index-generator.js.map +1 -1
- package/dist/cli/utils/project-structure-detector.d.ts.map +1 -1
- package/dist/cli/utils/project-structure-detector.js +0 -10
- package/dist/cli/utils/project-structure-detector.js.map +1 -1
- package/dist/mermaid/renderer.d.ts.map +1 -1
- package/dist/mermaid/renderer.js +34 -0
- package/dist/mermaid/renderer.js.map +1 -1
- package/dist/plugins/golang/atlas/index.d.ts.map +1 -1
- package/dist/plugins/golang/atlas/index.js +3 -1
- package/dist/plugins/golang/atlas/index.js.map +1 -1
- package/dist/plugins/golang/atlas/types.d.ts +1 -0
- package/dist/plugins/golang/atlas/types.d.ts.map +1 -1
- package/dist/plugins/golang/index.d.ts.map +1 -1
- package/dist/plugins/golang/index.js +15 -6
- package/dist/plugins/golang/index.js.map +1 -1
- package/dist/plugins/golang/source-scope.d.ts +7 -0
- package/dist/plugins/golang/source-scope.d.ts.map +1 -0
- package/dist/plugins/golang/source-scope.js +83 -0
- package/dist/plugins/golang/source-scope.js.map +1 -0
- package/node_modules/node-addon-api/LICENSE.md +9 -0
- package/node_modules/node-addon-api/README.md +95 -0
- package/node_modules/node-addon-api/common.gypi +21 -0
- package/node_modules/node-addon-api/except.gypi +25 -0
- package/node_modules/node-addon-api/index.js +14 -0
- package/node_modules/node-addon-api/napi-inl.deprecated.h +186 -0
- package/node_modules/node-addon-api/napi-inl.h +7033 -0
- package/node_modules/node-addon-api/napi.h +3309 -0
- package/node_modules/node-addon-api/node_addon_api.gyp +42 -0
- package/node_modules/node-addon-api/node_api.gyp +9 -0
- package/node_modules/node-addon-api/noexcept.gypi +26 -0
- package/node_modules/node-addon-api/nothing.c +0 -0
- package/node_modules/node-addon-api/package-support.json +21 -0
- package/node_modules/node-addon-api/package.json +480 -0
- package/node_modules/node-addon-api/tools/README.md +73 -0
- package/node_modules/node-addon-api/tools/check-napi.js +99 -0
- package/node_modules/node-addon-api/tools/clang-format.js +71 -0
- package/node_modules/node-addon-api/tools/conversion.js +301 -0
- package/node_modules/node-gyp-build/LICENSE +21 -0
- package/node_modules/node-gyp-build/README.md +58 -0
- package/node_modules/node-gyp-build/SECURITY.md +5 -0
- package/node_modules/node-gyp-build/bin.js +84 -0
- package/node_modules/node-gyp-build/build-test.js +19 -0
- package/node_modules/node-gyp-build/index.js +6 -0
- package/node_modules/node-gyp-build/node-gyp-build.js +207 -0
- package/node_modules/node-gyp-build/optional.js +7 -0
- package/node_modules/node-gyp-build/package.json +43 -0
- package/node_modules/tree-sitter/LICENSE +21 -0
- package/node_modules/tree-sitter/README.md +128 -0
- package/node_modules/tree-sitter/binding.gyp +80 -0
- package/node_modules/tree-sitter/index.js +916 -0
- package/node_modules/tree-sitter/package.json +76 -0
- package/node_modules/tree-sitter/prebuilds/linux-x64/node.napi.glibc.node +0 -0
- package/node_modules/tree-sitter/src/addon_data.h +47 -0
- package/node_modules/tree-sitter/src/binding.cc +35 -0
- package/node_modules/tree-sitter/src/conversions.cc +140 -0
- package/node_modules/tree-sitter/src/conversions.h +22 -0
- package/node_modules/tree-sitter/src/language.cc +106 -0
- package/node_modules/tree-sitter/src/language.h +17 -0
- package/node_modules/tree-sitter/src/logger.cc +70 -0
- package/node_modules/tree-sitter/src/logger.h +19 -0
- package/node_modules/tree-sitter/src/lookaheaditerator.cc +122 -0
- package/node_modules/tree-sitter/src/lookaheaditerator.h +33 -0
- package/node_modules/tree-sitter/src/node.cc +1088 -0
- package/node_modules/tree-sitter/src/node.h +30 -0
- package/node_modules/tree-sitter/src/parser.cc +306 -0
- package/node_modules/tree-sitter/src/parser.h +35 -0
- package/node_modules/tree-sitter/src/query.cc +397 -0
- package/node_modules/tree-sitter/src/query.h +40 -0
- package/node_modules/tree-sitter/src/tree.cc +316 -0
- package/node_modules/tree-sitter/src/tree.h +45 -0
- package/node_modules/tree-sitter/src/tree_cursor.cc +213 -0
- package/node_modules/tree-sitter/src/tree_cursor.h +52 -0
- package/node_modules/tree-sitter/tree-sitter.d.ts +1042 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/include/tree_sitter/api.h +1478 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/alloc.c +48 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/alloc.h +41 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/array.h +291 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/atomic.h +68 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/clock.h +146 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/error_costs.h +11 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/get_changed_ranges.c +523 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/get_changed_ranges.h +36 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/host.h +21 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/language.c +293 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/language.h +293 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/length.h +52 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/lexer.c +483 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/lexer.h +54 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/lib.c +12 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/node.c +875 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/parser.c +2293 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/parser.h +286 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/point.h +48 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/portable/endian.h +239 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/query.c +4350 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/reduce_action.h +34 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/reusable_node.h +95 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/stack.c +911 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/stack.h +133 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/subtree.c +1034 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/subtree.h +399 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree.c +170 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree.h +31 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree_cursor.c +717 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree_cursor.h +48 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/ts_assert.h +11 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/ICU_SHA +1 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/LICENSE +414 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/README.md +29 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/ptypes.h +1 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/umachine.h +448 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/urename.h +1 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/utf.h +1 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/utf16.h +733 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/utf8.h +881 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode.h +75 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm/stdlib-symbols.txt +24 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm/stdlib.c +113 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm/wasm-stdlib.h +1314 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm_store.c +1935 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm_store.h +31 -0
- package/package.json +9 -2
- 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,
|
|
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
|
-
- **
|
|
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
|
|
57
|
+
This generates Mermaid diagrams or ArchJSON under the configured output directory, and query artifacts under the work directory.
|
|
58
58
|
|
|
59
|
-
###
|
|
59
|
+
### Level Filtering
|
|
60
60
|
|
|
61
61
|
```bash
|
|
62
|
-
#
|
|
63
|
-
archguard analyze
|
|
62
|
+
# Generate only class and method diagrams
|
|
63
|
+
archguard analyze --diagrams class method
|
|
64
64
|
|
|
65
|
-
#
|
|
66
|
-
archguard analyze -s ./src
|
|
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 &
|
|
79
|
+
**Source & Selection:**
|
|
83
80
|
|
|
84
|
-
- `-s, --sources <paths...>` - Source directories
|
|
85
|
-
-
|
|
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
|
-
- `--
|
|
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
|
-
- `--
|
|
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-
|
|
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
|
-
#
|
|
131
|
-
archguard analyze
|
|
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
|
-
"
|
|
221
|
-
"
|
|
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
|
-
#
|
|
268
|
-
archguard analyze --diagrams
|
|
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
|
|
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
|
-
| `
|
|
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
|
-
|
|
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
|
-
|
|
438
|
+
▼ Shared analysis core (`runAnalysis`)
|
|
439
|
+
Config normalization + diagram selection
|
|
406
440
|
│
|
|
407
|
-
▼
|
|
408
|
-
|
|
441
|
+
▼ DiagramProcessor
|
|
442
|
+
ArchJsonProvider + language plugins
|
|
409
443
|
│
|
|
410
|
-
▼
|
|
411
|
-
.mmd syntax
|
|
444
|
+
▼ ArchJSON (entities + relations + optional extensions)
|
|
412
445
|
│
|
|
413
|
-
|
|
414
|
-
|
|
446
|
+
├─► Query artifacts (`.archguard/query/*`)
|
|
447
|
+
├─► Mermaid / JSON outputs (`.archguard/output/*`)
|
|
448
|
+
└─► Go Atlas extension (package / capability / goroutine / flow)
|
|
415
449
|
│
|
|
416
|
-
▼
|
|
417
|
-
|
|
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
|
|
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":"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"}
|
|
@@ -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;
|
|
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;
|
|
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
|