@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.
Files changed (111) hide show
  1. package/README.md +57 -35
  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 +64 -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 +147 -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/cache-manager.d.ts.map +1 -1
  22. package/dist/cli/cache-manager.js +1 -2
  23. package/dist/cli/cache-manager.js.map +1 -1
  24. package/dist/cli/commands/analyze.d.ts +1 -4
  25. package/dist/cli/commands/analyze.d.ts.map +1 -1
  26. package/dist/cli/commands/analyze.js +28 -131
  27. package/dist/cli/commands/analyze.js.map +1 -1
  28. package/dist/cli/commands/cache.d.ts.map +1 -1
  29. package/dist/cli/commands/cache.js +12 -2
  30. package/dist/cli/commands/cache.js.map +1 -1
  31. package/dist/cli/commands/mcp.d.ts +3 -0
  32. package/dist/cli/commands/mcp.d.ts.map +1 -0
  33. package/dist/cli/commands/mcp.js +21 -0
  34. package/dist/cli/commands/mcp.js.map +1 -0
  35. package/dist/cli/commands/query.d.ts +3 -0
  36. package/dist/cli/commands/query.d.ts.map +1 -0
  37. package/dist/cli/commands/query.js +227 -0
  38. package/dist/cli/commands/query.js.map +1 -0
  39. package/dist/cli/config-loader.d.ts +3 -0
  40. package/dist/cli/config-loader.d.ts.map +1 -1
  41. package/dist/cli/config-loader.js +21 -2
  42. package/dist/cli/config-loader.js.map +1 -1
  43. package/dist/cli/index.d.ts.map +1 -1
  44. package/dist/cli/index.js +4 -0
  45. package/dist/cli/index.js.map +1 -1
  46. package/dist/cli/mcp/analyze-tool.d.ts +10 -0
  47. package/dist/cli/mcp/analyze-tool.d.ts.map +1 -0
  48. package/dist/cli/mcp/analyze-tool.js +116 -0
  49. package/dist/cli/mcp/analyze-tool.js.map +1 -0
  50. package/dist/cli/mcp/mcp-server.d.ts +6 -0
  51. package/dist/cli/mcp/mcp-server.d.ts.map +1 -0
  52. package/dist/cli/mcp/mcp-server.js +114 -0
  53. package/dist/cli/mcp/mcp-server.js.map +1 -0
  54. package/dist/cli/processors/arch-json-provider.d.ts +38 -0
  55. package/dist/cli/processors/arch-json-provider.d.ts.map +1 -0
  56. package/dist/cli/processors/arch-json-provider.js +289 -0
  57. package/dist/cli/processors/arch-json-provider.js.map +1 -0
  58. package/dist/cli/processors/diagram-output-router.d.ts +26 -0
  59. package/dist/cli/processors/diagram-output-router.d.ts.map +1 -0
  60. package/dist/cli/processors/diagram-output-router.js +234 -0
  61. package/dist/cli/processors/diagram-output-router.js.map +1 -0
  62. package/dist/cli/processors/diagram-processor.d.ts +11 -22
  63. package/dist/cli/processors/diagram-processor.d.ts.map +1 -1
  64. package/dist/cli/processors/diagram-processor.js +37 -451
  65. package/dist/cli/processors/diagram-processor.js.map +1 -1
  66. package/dist/cli/progress.d.ts +22 -1
  67. package/dist/cli/progress.d.ts.map +1 -1
  68. package/dist/cli/progress.js +24 -0
  69. package/dist/cli/progress.js.map +1 -1
  70. package/dist/cli/query/arch-index-builder.d.ts +4 -0
  71. package/dist/cli/query/arch-index-builder.d.ts.map +1 -0
  72. package/dist/cli/query/arch-index-builder.js +126 -0
  73. package/dist/cli/query/arch-index-builder.js.map +1 -0
  74. package/dist/cli/query/arch-index.d.ts +17 -0
  75. package/dist/cli/query/arch-index.d.ts.map +1 -0
  76. package/dist/cli/query/arch-index.js +2 -0
  77. package/dist/cli/query/arch-index.js.map +1 -0
  78. package/dist/cli/query/engine-loader.d.ts +7 -0
  79. package/dist/cli/query/engine-loader.d.ts.map +1 -0
  80. package/dist/cli/query/engine-loader.js +98 -0
  81. package/dist/cli/query/engine-loader.js.map +1 -0
  82. package/dist/cli/query/query-artifacts.d.ts +7 -0
  83. package/dist/cli/query/query-artifacts.d.ts.map +1 -0
  84. package/dist/cli/query/query-artifacts.js +78 -0
  85. package/dist/cli/query/query-artifacts.js.map +1 -0
  86. package/dist/cli/query/query-engine.d.ts +49 -0
  87. package/dist/cli/query/query-engine.d.ts.map +1 -0
  88. package/dist/cli/query/query-engine.js +137 -0
  89. package/dist/cli/query/query-engine.js.map +1 -0
  90. package/dist/cli/query/query-manifest.d.ts +24 -0
  91. package/dist/cli/query/query-manifest.d.ts.map +1 -0
  92. package/dist/cli/query/query-manifest.js +2 -0
  93. package/dist/cli/query/query-manifest.js.map +1 -0
  94. package/dist/cli/types.d.ts +4 -0
  95. package/dist/cli/types.d.ts.map +1 -1
  96. package/dist/cli/utils/canonicalize-arch-json.d.ts +3 -0
  97. package/dist/cli/utils/canonicalize-arch-json.d.ts.map +1 -0
  98. package/dist/cli/utils/canonicalize-arch-json.js +81 -0
  99. package/dist/cli/utils/canonicalize-arch-json.js.map +1 -0
  100. package/dist/cli/utils/diagram-index-generator.d.ts.map +1 -1
  101. package/dist/cli/utils/diagram-index-generator.js +0 -5
  102. package/dist/cli/utils/diagram-index-generator.js.map +1 -1
  103. package/dist/cli/utils/project-structure-detector.d.ts.map +1 -1
  104. package/dist/cli/utils/project-structure-detector.js +0 -10
  105. package/dist/cli/utils/project-structure-detector.js.map +1 -1
  106. package/dist/mermaid/renderer.d.ts.map +1 -1
  107. package/dist/mermaid/renderer.js +63 -4
  108. package/dist/mermaid/renderer.js.map +1 -1
  109. package/dist/types/config.d.ts +4 -0
  110. package/dist/types/config.d.ts.map +1 -1
  111. 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 `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,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
- "outputDir": "./archguard",
221
- "cache": { "enabled": true },
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
- # Generate specific diagrams only
268
- archguard analyze --diagrams overview modules/cli
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 diagram mode) |
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
- | `outputDir` | string | `./archguard` | Output directory |
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;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
@@ -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":"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"}
@@ -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":"AASA,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"}
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"}