@yalehwang/archguard 0.1.5 → 0.1.7
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 +57 -35
- 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 +64 -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 +147 -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/cache-manager.d.ts.map +1 -1
- package/dist/cli/cache-manager.js +1 -2
- package/dist/cli/cache-manager.js.map +1 -1
- 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 +28 -131
- 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 +12 -2
- 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 +21 -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/config-loader.d.ts +3 -0
- package/dist/cli/config-loader.d.ts.map +1 -1
- package/dist/cli/config-loader.js +21 -2
- package/dist/cli/config-loader.js.map +1 -1
- 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 +10 -0
- package/dist/cli/mcp/analyze-tool.d.ts.map +1 -0
- package/dist/cli/mcp/analyze-tool.js +116 -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 +114 -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 +289 -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 +234 -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 -451
- 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/types.d.ts +4 -0
- package/dist/cli/types.d.ts.map +1 -1
- 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 +63 -4
- package/dist/mermaid/renderer.js.map +1 -1
- package/dist/types/config.d.ts +4 -0
- package/dist/types/config.d.ts.map +1 -1
- package/package.json +2 -1
package/README.md
CHANGED
|
@@ -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,40 @@ 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
|
+
### `mcp`
|
|
169
|
+
|
|
170
|
+
Start the ArchGuard MCP server over stdio.
|
|
171
|
+
|
|
172
|
+
```bash
|
|
173
|
+
archguard mcp [--arch-dir <dir>] [--scope <key>]
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
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.
|
|
177
|
+
|
|
155
178
|
### `init`
|
|
156
179
|
|
|
157
180
|
Initialize configuration file:
|
|
@@ -213,14 +236,13 @@ See [Go Plugin Usage Guide](docs/user-guide/golang-plugin-usage.md) for details.
|
|
|
213
236
|
|
|
214
237
|
```json
|
|
215
238
|
{
|
|
216
|
-
"source": "./src",
|
|
217
239
|
"format": "mermaid",
|
|
218
240
|
"exclude": ["**/*.test.ts", "**/*.spec.ts", "**/node_modules/**"],
|
|
219
241
|
"concurrency": 4,
|
|
220
|
-
"
|
|
221
|
-
"
|
|
242
|
+
"workDir": "./.archguard",
|
|
243
|
+
"outputDir": "./docs/architecture",
|
|
244
|
+
"cache": { "enabled": true, "dir": "./.archguard/cache" },
|
|
222
245
|
"mermaid": {
|
|
223
|
-
"enableLLMGrouping": true,
|
|
224
246
|
"renderer": "isomorphic",
|
|
225
247
|
"theme": "default",
|
|
226
248
|
"transparentBackground": true
|
|
@@ -264,22 +286,22 @@ Generate multiple diagrams with different sources and levels in one run:
|
|
|
264
286
|
# Generate all diagrams
|
|
265
287
|
archguard analyze
|
|
266
288
|
|
|
267
|
-
#
|
|
268
|
-
archguard analyze --diagrams
|
|
289
|
+
# Filter configured diagrams by level
|
|
290
|
+
archguard analyze --diagrams class method
|
|
269
291
|
```
|
|
270
292
|
|
|
271
293
|
### Configuration Fields
|
|
272
294
|
|
|
273
295
|
| Field | Type | Default | Description |
|
|
274
296
|
|-------|------|---------|-------------|
|
|
275
|
-
| `source` | string | `./src` | Source directory (single
|
|
297
|
+
| `source` | string | `./src` | Source directory (single-diagram mode) |
|
|
276
298
|
| `diagrams` | array | — | Multi-diagram config (overrides `source`) |
|
|
277
299
|
| `format` | string | `mermaid` | Output format: `mermaid` or `json` |
|
|
278
300
|
| `exclude` | string[] | `[]` | Glob patterns to exclude |
|
|
279
301
|
| `concurrency` | number | CPU cores | Parallel parsing workers |
|
|
280
|
-
| `
|
|
302
|
+
| `workDir` | string | `./.archguard` | Work directory for cache and query artifacts |
|
|
303
|
+
| `outputDir` | string | `./.archguard/output` | Output directory |
|
|
281
304
|
| `cache.enabled` | boolean | `true` | Enable file-based caching |
|
|
282
|
-
| `mermaid.enableLLMGrouping` | boolean | `true` | LLM-powered entity grouping |
|
|
283
305
|
| `mermaid.theme` | string | `default` | Diagram theme |
|
|
284
306
|
| `mermaid.transparentBackground` | boolean | `true` | Transparent PNG background |
|
|
285
307
|
| `cli.command` | string | `claude` | Claude CLI executable |
|
|
@@ -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":"AAGA,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,CA2D1B;AAED,wBAAgB,cAAc,CAAC,QAAQ,EAAE,aAAa,EAAE,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,GAAG,aAAa,EAAE,CAM5F"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import path from 'path';
|
|
2
|
+
import { detectProjectStructure } from '../utils/project-structure-detector.js';
|
|
3
|
+
import { detectCppProjectStructure } from '../utils/cpp-project-structure-detector.js';
|
|
4
|
+
export async function normalizeToDiagrams(config, cliOptions, rootDir) {
|
|
5
|
+
if (config.diagrams && config.diagrams.length > 0) {
|
|
6
|
+
return filterByLevels(config.diagrams, cliOptions.diagrams);
|
|
7
|
+
}
|
|
8
|
+
if (cliOptions.sources && cliOptions.sources.length > 0) {
|
|
9
|
+
const language = cliOptions.lang ?? (cliOptions.atlas ? 'go' : undefined);
|
|
10
|
+
const atlasEnabled = language === 'go' && !cliOptions.noAtlas;
|
|
11
|
+
if (atlasEnabled) {
|
|
12
|
+
const diagram = {
|
|
13
|
+
name: 'architecture',
|
|
14
|
+
sources: cliOptions.sources,
|
|
15
|
+
level: 'package',
|
|
16
|
+
format: cliOptions.format,
|
|
17
|
+
exclude: cliOptions.exclude,
|
|
18
|
+
language,
|
|
19
|
+
languageSpecific: {
|
|
20
|
+
atlas: {
|
|
21
|
+
enabled: true,
|
|
22
|
+
functionBodyStrategy: cliOptions.atlasStrategy ?? 'selective',
|
|
23
|
+
excludeTests: !cliOptions.atlasIncludeTests,
|
|
24
|
+
protocols: cliOptions.atlasProtocols?.split(',').map((s) => s.trim()),
|
|
25
|
+
layers: cliOptions.atlasLayers?.split(',').map((s) => s.trim()),
|
|
26
|
+
},
|
|
27
|
+
},
|
|
28
|
+
};
|
|
29
|
+
return [diagram];
|
|
30
|
+
}
|
|
31
|
+
if (language === 'go' && cliOptions.noAtlas) {
|
|
32
|
+
const diagram = {
|
|
33
|
+
name: 'architecture',
|
|
34
|
+
sources: cliOptions.sources,
|
|
35
|
+
level: 'class',
|
|
36
|
+
format: cliOptions.format,
|
|
37
|
+
exclude: cliOptions.exclude,
|
|
38
|
+
language,
|
|
39
|
+
};
|
|
40
|
+
return [diagram];
|
|
41
|
+
}
|
|
42
|
+
if (language === 'cpp') {
|
|
43
|
+
const sourcePath = path.resolve(cliOptions.sources[0]);
|
|
44
|
+
const moduleName = path.basename(sourcePath);
|
|
45
|
+
const diagrams = await detectCppProjectStructure(sourcePath, moduleName, {
|
|
46
|
+
format: cliOptions.format,
|
|
47
|
+
exclude: cliOptions.exclude,
|
|
48
|
+
});
|
|
49
|
+
return filterByLevels(diagrams, cliOptions.diagrams);
|
|
50
|
+
}
|
|
51
|
+
const externalSourceRoot = path.resolve(cliOptions.sources[0]);
|
|
52
|
+
const diagrams = await detectProjectStructure(rootDir ?? process.cwd(), externalSourceRoot);
|
|
53
|
+
return filterByLevels(diagrams, cliOptions.diagrams);
|
|
54
|
+
}
|
|
55
|
+
const diagrams = await detectProjectStructure(rootDir ?? process.cwd());
|
|
56
|
+
return filterByLevels(diagrams, cliOptions.diagrams);
|
|
57
|
+
}
|
|
58
|
+
export function filterByLevels(diagrams, levels) {
|
|
59
|
+
if (!levels || levels.length === 0) {
|
|
60
|
+
return diagrams;
|
|
61
|
+
}
|
|
62
|
+
return diagrams.filter((d) => levels.includes(d.level ?? 'class'));
|
|
63
|
+
}
|
|
64
|
+
//# 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,CA+FzF"}
|
|
@@ -0,0 +1,147 @@
|
|
|
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);
|
|
17
|
+
reporter.info(`Found ${selectedDiagrams.length} diagram(s) to generate`);
|
|
18
|
+
if (selectedDiagrams.length === 0) {
|
|
19
|
+
return {
|
|
20
|
+
config,
|
|
21
|
+
diagrams: [],
|
|
22
|
+
results: [],
|
|
23
|
+
queryScopesPersisted: 0,
|
|
24
|
+
persistedScopeKeys: [],
|
|
25
|
+
hasDiagramFailures: false,
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
const cacheDir = config.cache?.dir || path.join(config.workDir || '.archguard', 'cache');
|
|
29
|
+
const outputDir = config.outputDir || path.join(config.workDir || '.archguard', 'output');
|
|
30
|
+
const existingManifest = await readManifest(cacheDir);
|
|
31
|
+
if (existingManifest) {
|
|
32
|
+
const currentNames = selectedDiagrams.map((d) => d.name);
|
|
33
|
+
const stale = await cleanStaleDiagrams(currentNames, existingManifest, outputDir);
|
|
34
|
+
if (stale.length > 0 && config.verbose) {
|
|
35
|
+
reporter.info(`Cleaned ${stale.length} stale diagram(s): ${stale.join(', ')}`);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
const parseCache = new ParseCache();
|
|
39
|
+
const processor = new DiagramProcessor({
|
|
40
|
+
diagrams: selectedDiagrams,
|
|
41
|
+
globalConfig: config,
|
|
42
|
+
progress: reporter,
|
|
43
|
+
parseCache,
|
|
44
|
+
});
|
|
45
|
+
const results = await processor.processAll();
|
|
46
|
+
const successfulNames = results.filter((r) => r.success).map((r) => r.name);
|
|
47
|
+
if (successfulNames.length > 0) {
|
|
48
|
+
try {
|
|
49
|
+
await writeManifest(cacheDir, successfulNames, outputDir);
|
|
50
|
+
}
|
|
51
|
+
catch (err) {
|
|
52
|
+
if (config.verbose) {
|
|
53
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
54
|
+
reporter.warn(`[manifest] Failed to write diagram manifest: ${msg}`);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
let persistedScopeKeys = [];
|
|
59
|
+
let hasArtifactFailures = results.some((r) => !r.success);
|
|
60
|
+
const queryScopes = processor.getQuerySourceGroups();
|
|
61
|
+
if (queryScopes.length > 0) {
|
|
62
|
+
try {
|
|
63
|
+
const entries = await persistQueryScopes(config.workDir || workDir, queryScopes);
|
|
64
|
+
persistedScopeKeys = entries.map((entry) => entry.key);
|
|
65
|
+
if (config.verbose) {
|
|
66
|
+
reporter.info(`Persisted ${entries.length} query scope(s) to ${(config.workDir || workDir)}/query/`);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
catch (err) {
|
|
70
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
71
|
+
reporter.warn(`[query] Failed to persist query scopes: ${msg}`);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
if (results.length > 1) {
|
|
75
|
+
try {
|
|
76
|
+
reporter.start('Generating index...');
|
|
77
|
+
const indexGenerator = new DiagramIndexGenerator(config);
|
|
78
|
+
await indexGenerator.generate(results);
|
|
79
|
+
reporter.succeed('Index generated');
|
|
80
|
+
}
|
|
81
|
+
catch (err) {
|
|
82
|
+
hasArtifactFailures = true;
|
|
83
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
84
|
+
reporter.warn(`[index] Failed to generate index: ${msg}`);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
return {
|
|
88
|
+
config,
|
|
89
|
+
diagrams: selectedDiagrams,
|
|
90
|
+
results,
|
|
91
|
+
queryScopesPersisted: persistedScopeKeys.length,
|
|
92
|
+
persistedScopeKeys,
|
|
93
|
+
hasDiagramFailures: hasArtifactFailures,
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
function buildConfigOverrides(cliOptions, workDir, sessionRoot) {
|
|
97
|
+
const configOverrides = { workDir };
|
|
98
|
+
if (cliOptions.format)
|
|
99
|
+
configOverrides.format = cliOptions.format;
|
|
100
|
+
if (cliOptions.exclude)
|
|
101
|
+
configOverrides.exclude = cliOptions.exclude;
|
|
102
|
+
if (cliOptions.cache !== undefined) {
|
|
103
|
+
configOverrides.cache = { enabled: cliOptions.cache, ttl: 86400 };
|
|
104
|
+
}
|
|
105
|
+
if (cliOptions.cacheDir) {
|
|
106
|
+
configOverrides.cache = {
|
|
107
|
+
enabled: cliOptions.cache ?? true,
|
|
108
|
+
ttl: 86400,
|
|
109
|
+
dir: cliOptions.cacheDir,
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
if (cliOptions.concurrency) {
|
|
113
|
+
configOverrides.concurrency = parseInt(String(cliOptions.concurrency), 10);
|
|
114
|
+
}
|
|
115
|
+
if (cliOptions.verbose !== undefined)
|
|
116
|
+
configOverrides.verbose = cliOptions.verbose;
|
|
117
|
+
if (cliOptions.cliCommand || cliOptions.cliArgs) {
|
|
118
|
+
configOverrides.cli = {
|
|
119
|
+
command: cliOptions.cliCommand || 'claude',
|
|
120
|
+
args: cliOptions.cliArgs ? cliOptions.cliArgs.split(' ') : [],
|
|
121
|
+
timeout: 60000,
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
if (cliOptions.mermaidTheme !== undefined || cliOptions.mermaidRenderer !== undefined) {
|
|
125
|
+
configOverrides.mermaid = {
|
|
126
|
+
theme: cliOptions.mermaidTheme,
|
|
127
|
+
renderer: cliOptions.mermaidRenderer,
|
|
128
|
+
transparentBackground: true,
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
if (cliOptions.outputDir)
|
|
132
|
+
configOverrides.outputDir = cliOptions.outputDir;
|
|
133
|
+
if (cliOptions.sources &&
|
|
134
|
+
cliOptions.sources.length > 0 &&
|
|
135
|
+
!cliOptions.outputDir &&
|
|
136
|
+
!cliOptions.workDir) {
|
|
137
|
+
const sourcePath = path.resolve(sessionRoot, cliOptions.sources[0]);
|
|
138
|
+
if (!sourcePath.startsWith(sessionRoot)) {
|
|
139
|
+
const SOURCE_ROOT_NAMES = ['src', 'lib', 'app', 'source'];
|
|
140
|
+
const basename = path.basename(sourcePath);
|
|
141
|
+
const projectRoot = SOURCE_ROOT_NAMES.includes(basename) ? path.dirname(sourcePath) : sourcePath;
|
|
142
|
+
configOverrides.workDir = path.join(projectRoot, '.archguard');
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
return configOverrides;
|
|
146
|
+
}
|
|
147
|
+
//# 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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diagram-manifest.d.ts","sourceRoot":"","sources":["../../../src/cli/cache/diagram-manifest.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,gBAAgB,QAAQ,CAAC;AACtC,eAAO,MAAM,iBAAiB,0BAA0B,CAAC;AAEzD,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAMD,wBAAsB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAWpF;AAKD,wBAAsB,aAAa,CACjC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAAE,EAClB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC,CAUf;AAiBD,wBAAsB,kBAAkB,CACtC,eAAe,EAAE,MAAM,EAAE,EACzB,QAAQ,EAAE,eAAe,EACzB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,MAAM,EAAE,CAAC,CA4BnB;AAOD,wBAAsB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAK1E"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import fs from 'fs-extra';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import { glob } from 'glob';
|
|
4
|
+
export const MANIFEST_VERSION = '1.0';
|
|
5
|
+
export const MANIFEST_FILENAME = 'diagram-manifest.json';
|
|
6
|
+
export async function readManifest(cacheDir) {
|
|
7
|
+
const filePath = path.join(cacheDir, MANIFEST_FILENAME);
|
|
8
|
+
try {
|
|
9
|
+
if (!(await fs.pathExists(filePath)))
|
|
10
|
+
return null;
|
|
11
|
+
const data = (await fs.readJson(filePath));
|
|
12
|
+
if (!data || typeof data !== 'object' || data.version !== MANIFEST_VERSION)
|
|
13
|
+
return null;
|
|
14
|
+
if (!Array.isArray(data.diagrams))
|
|
15
|
+
return null;
|
|
16
|
+
return data;
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
export async function writeManifest(cacheDir, diagrams, outputDir) {
|
|
23
|
+
const filePath = path.join(cacheDir, MANIFEST_FILENAME);
|
|
24
|
+
await fs.ensureDir(cacheDir);
|
|
25
|
+
const manifest = {
|
|
26
|
+
version: MANIFEST_VERSION,
|
|
27
|
+
lastRun: new Date().toISOString(),
|
|
28
|
+
outputDir: path.resolve(outputDir),
|
|
29
|
+
diagrams: [...diagrams],
|
|
30
|
+
};
|
|
31
|
+
await fs.writeJson(filePath, manifest, { spaces: 2 });
|
|
32
|
+
}
|
|
33
|
+
export async function cleanStaleDiagrams(currentDiagrams, manifest, outputDir) {
|
|
34
|
+
const currentSet = new Set(currentDiagrams);
|
|
35
|
+
const stale = manifest.diagrams.filter((name) => !currentSet.has(name));
|
|
36
|
+
await Promise.all(stale.map(async (name) => {
|
|
37
|
+
const base = path.join(outputDir, name);
|
|
38
|
+
await Promise.all([
|
|
39
|
+
fs.remove(`${base}.mmd`),
|
|
40
|
+
fs.remove(`${base}.mmd.render-hash`),
|
|
41
|
+
fs.remove(`${base}.svg`),
|
|
42
|
+
fs.remove(`${base}.png`),
|
|
43
|
+
]);
|
|
44
|
+
const dir = path.dirname(base);
|
|
45
|
+
const nameBase = path.basename(name);
|
|
46
|
+
if (await fs.pathExists(dir)) {
|
|
47
|
+
const atlasFiles = await glob(`${nameBase}-*.mmd`, { cwd: dir, absolute: true });
|
|
48
|
+
await Promise.all(atlasFiles.flatMap((f) => [fs.remove(f), fs.remove(`${f}.render-hash`)]));
|
|
49
|
+
}
|
|
50
|
+
}));
|
|
51
|
+
return stale;
|
|
52
|
+
}
|
|
53
|
+
export async function clearRenderHashes(outputDir) {
|
|
54
|
+
if (!(await fs.pathExists(outputDir)))
|
|
55
|
+
return 0;
|
|
56
|
+
const files = await glob('**/*.mmd.render-hash', { cwd: outputDir, absolute: true });
|
|
57
|
+
await Promise.all(files.map((f) => fs.remove(f)));
|
|
58
|
+
return files.length;
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=diagram-manifest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diagram-manifest.js","sourceRoot":"","sources":["../../../src/cli/cache/diagram-manifest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,CAAC;AACtC,MAAM,CAAC,MAAM,iBAAiB,GAAG,uBAAuB,CAAC;AAazD,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,QAAgB;IACjD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAC;IACxD,IAAI,CAAC;QACH,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC;QAClD,MAAM,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAoB,CAAC;QAC9D,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,OAAO,KAAK,gBAAgB;YAAE,OAAO,IAAI,CAAC;QACxF,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC;YAAE,OAAO,IAAI,CAAC;QAC/C,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAKD,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,QAAgB,EAChB,QAAkB,EAClB,SAAiB;IAEjB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAC;IACxD,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IAC7B,MAAM,QAAQ,GAAoB;QAChC,OAAO,EAAE,gBAAgB;QACzB,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACjC,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;QAClC,QAAQ,EAAE,CAAC,GAAG,QAAQ,CAAC;KACxB,CAAC;IACF,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,QAAQ,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;AACxD,CAAC;AAiBD,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,eAAyB,EACzB,QAAyB,EACzB,SAAiB;IAEjB,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,eAAe,CAAC,CAAC;IAC5C,MAAM,KAAK,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;IAExE,MAAM,OAAO,CAAC,GAAG,CACf,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACvB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QAExC,MAAM,OAAO,CAAC,GAAG,CAAC;YAChB,EAAE,CAAC,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC;YACxB,EAAE,CAAC,MAAM,CAAC,GAAG,IAAI,kBAAkB,CAAC;YACpC,EAAE,CAAC,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC;YACxB,EAAE,CAAC,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC;SACzB,CAAC,CAAC;QAGH,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC/B,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACrC,IAAI,MAAM,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC7B,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,GAAG,QAAQ,QAAQ,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;YACjF,MAAM,OAAO,CAAC,GAAG,CACf,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,CACzE,CAAC;QACJ,CAAC;IACH,CAAC,CAAC,CACH,CAAC;IAEF,OAAO,KAAK,CAAC;AACf,CAAC;AAOD,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,SAAiB;IACvD,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QAAE,OAAO,CAAC,CAAC;IAChD,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,sBAAsB,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IACrF,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAClD,OAAO,KAAK,CAAC,MAAM,CAAC;AACtB,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export declare const RENDER_CACHE_VERSION = "1.0";
|
|
2
|
+
export interface RenderOptions {
|
|
3
|
+
theme: string;
|
|
4
|
+
transparentBackground: boolean;
|
|
5
|
+
}
|
|
6
|
+
export declare class RenderHashCache {
|
|
7
|
+
computeKey(mmdContent: string, options: RenderOptions): string;
|
|
8
|
+
checkHit(mmdPath: string, mmdContent: string, options: RenderOptions): Promise<boolean>;
|
|
9
|
+
writeHash(mmdPath: string, mmdContent: string, options: RenderOptions): Promise<void>;
|
|
10
|
+
clearHashes(dir: string): Promise<void>;
|
|
11
|
+
static sidecarPath(mmdPath: string): string;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=render-hash-cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render-hash-cache.d.ts","sourceRoot":"","sources":["../../../src/cli/cache/render-hash-cache.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,oBAAoB,QAAQ,CAAC;AAE1C,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,qBAAqB,EAAE,OAAO,CAAC;CAChC;AAED,qBAAa,eAAe;IAK1B,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,MAAM;IASxD,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC;IAgBvF,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IASrF,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAS7C,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;CAG5C"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { createHash } from 'crypto';
|
|
2
|
+
import fs from 'fs-extra';
|
|
3
|
+
import path from 'path';
|
|
4
|
+
export const RENDER_CACHE_VERSION = '1.0';
|
|
5
|
+
export class RenderHashCache {
|
|
6
|
+
computeKey(mmdContent, options) {
|
|
7
|
+
const input = `${RENDER_CACHE_VERSION}|${options.theme}|${String(options.transparentBackground)}|${mmdContent}`;
|
|
8
|
+
return createHash('sha256').update(input, 'utf-8').digest('hex');
|
|
9
|
+
}
|
|
10
|
+
async checkHit(mmdPath, mmdContent, options) {
|
|
11
|
+
const sidecar = RenderHashCache.sidecarPath(mmdPath);
|
|
12
|
+
try {
|
|
13
|
+
if (!(await fs.pathExists(sidecar)))
|
|
14
|
+
return false;
|
|
15
|
+
const storedHash = (await fs.readFile(sidecar, 'utf-8')).trim();
|
|
16
|
+
if (storedHash !== this.computeKey(mmdContent, options))
|
|
17
|
+
return false;
|
|
18
|
+
const svgPath = mmdPath.replace(/\.mmd$/, '.svg');
|
|
19
|
+
return fs.pathExists(svgPath);
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
async writeHash(mmdPath, mmdContent, options) {
|
|
26
|
+
const sidecar = RenderHashCache.sidecarPath(mmdPath);
|
|
27
|
+
await fs.ensureDir(path.dirname(sidecar));
|
|
28
|
+
await fs.writeFile(sidecar, this.computeKey(mmdContent, options), 'utf-8');
|
|
29
|
+
}
|
|
30
|
+
async clearHashes(dir) {
|
|
31
|
+
const { glob } = await import('glob');
|
|
32
|
+
const files = await glob('**/*.mmd.render-hash', { cwd: dir, absolute: true });
|
|
33
|
+
await Promise.all(files.map((f) => fs.remove(f)));
|
|
34
|
+
}
|
|
35
|
+
static sidecarPath(mmdPath) {
|
|
36
|
+
return `${mmdPath}.render-hash`;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=render-hash-cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render-hash-cache.js","sourceRoot":"","sources":["../../../src/cli/cache/render-hash-cache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,MAAM,CAAC,MAAM,oBAAoB,GAAG,KAAK,CAAC;AAO1C,MAAM,OAAO,eAAe;IAK1B,UAAU,CAAC,UAAkB,EAAE,OAAsB;QACnD,MAAM,KAAK,GAAG,GAAG,oBAAoB,IAAI,OAAO,CAAC,KAAK,IAAI,MAAM,CAAC,OAAO,CAAC,qBAAqB,CAAC,IAAI,UAAU,EAAE,CAAC;QAChH,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACnE,CAAC;IAMD,KAAK,CAAC,QAAQ,CAAC,OAAe,EAAE,UAAkB,EAAE,OAAsB;QACxE,MAAM,OAAO,GAAG,eAAe,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QACrD,IAAI,CAAC;YACH,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;gBAAE,OAAO,KAAK,CAAC;YAClD,MAAM,UAAU,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAChE,IAAI,UAAU,KAAK,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,OAAO,CAAC;gBAAE,OAAO,KAAK,CAAC;YACtE,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YAClD,OAAO,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QAChC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAKD,KAAK,CAAC,SAAS,CAAC,OAAe,EAAE,UAAkB,EAAE,OAAsB;QACzE,MAAM,OAAO,GAAG,eAAe,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QACrD,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;QAC1C,MAAM,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC;IAC7E,CAAC;IAKD,KAAK,CAAC,WAAW,CAAC,GAAW;QAC3B,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,CAAC;QACtC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,sBAAsB,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/E,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC;IAKD,MAAM,CAAC,WAAW,CAAC,OAAe;QAChC,OAAO,GAAG,OAAO,cAAc,CAAC;IAClC,CAAC;CACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache-manager.d.ts","sourceRoot":"","sources":["../../src/cli/cache-manager.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"cache-manager.d.ts","sourceRoot":"","sources":["../../src/cli/cache-manager.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAiBD,qBAAa,YAAY;IACvB,SAAgB,QAAQ,EAAE,MAAM,CAAC;IACjC,OAAO,CAAC,KAAK,CAKX;IACF,OAAO,CAAC,UAAU,CAAiB;gBAEvB,QAAQ,CAAC,EAAE,MAAM;IAOvB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IASlD,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;IAoCnE,GAAG,CAAC,CAAC,GAAG,OAAO,EACnB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,CAAC,EACP,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC,IAAI,CAAC;IAiBV,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAiB5B,QAAQ,IAAI,UAAU;IAOhB,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC;YAwBvB,gBAAgB;IA0B9B,OAAO,CAAC,WAAW;IAQnB,OAAO,CAAC,YAAY;IASpB,OAAO,CAAC,aAAa;IAQrB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAOhC,aAAa,IAAI,MAAM;CAGxB"}
|