@erode-app/core 0.6.0-beta.0
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/dist/adapters/adapter-factory.d.ts +3 -0
- package/dist/adapters/adapter-factory.d.ts.map +1 -0
- package/dist/adapters/adapter-factory.js +19 -0
- package/dist/adapters/adapter-factory.js.map +1 -0
- package/dist/adapters/adapter-metadata.d.ts +12 -0
- package/dist/adapters/adapter-metadata.d.ts.map +1 -0
- package/dist/adapters/adapter-metadata.js +2 -0
- package/dist/adapters/adapter-metadata.js.map +1 -0
- package/dist/adapters/architecture-adapter.d.ts +42 -0
- package/dist/adapters/architecture-adapter.d.ts.map +1 -0
- package/dist/adapters/architecture-adapter.js +2 -0
- package/dist/adapters/architecture-adapter.js.map +1 -0
- package/dist/adapters/architecture-types.d.ts +32 -0
- package/dist/adapters/architecture-types.d.ts.map +1 -0
- package/dist/adapters/architecture-types.js +2 -0
- package/dist/adapters/architecture-types.js.map +1 -0
- package/dist/adapters/base-patcher.d.ts +38 -0
- package/dist/adapters/base-patcher.d.ts.map +1 -0
- package/dist/adapters/base-patcher.js +266 -0
- package/dist/adapters/base-patcher.js.map +1 -0
- package/dist/adapters/dsl-validation.d.ts +2 -0
- package/dist/adapters/dsl-validation.d.ts.map +1 -0
- package/dist/adapters/dsl-validation.js +24 -0
- package/dist/adapters/dsl-validation.js.map +1 -0
- package/dist/adapters/likec4/adapter.d.ts +37 -0
- package/dist/adapters/likec4/adapter.d.ts.map +1 -0
- package/dist/adapters/likec4/adapter.js +302 -0
- package/dist/adapters/likec4/adapter.js.map +1 -0
- package/dist/adapters/likec4/dsl-validator.d.ts +3 -0
- package/dist/adapters/likec4/dsl-validator.d.ts.map +1 -0
- package/dist/adapters/likec4/dsl-validator.js +22 -0
- package/dist/adapters/likec4/dsl-validator.js.map +1 -0
- package/dist/adapters/likec4/index.d.ts +2 -0
- package/dist/adapters/likec4/index.d.ts.map +1 -0
- package/dist/adapters/likec4/index.js +2 -0
- package/dist/adapters/likec4/index.js.map +1 -0
- package/dist/adapters/likec4/likec4-types.d.ts +7 -0
- package/dist/adapters/likec4/likec4-types.d.ts.map +1 -0
- package/dist/adapters/likec4/likec4-types.js +2 -0
- package/dist/adapters/likec4/likec4-types.js.map +1 -0
- package/dist/adapters/likec4/metadata.d.ts +3 -0
- package/dist/adapters/likec4/metadata.d.ts.map +1 -0
- package/dist/adapters/likec4/metadata.js +30 -0
- package/dist/adapters/likec4/metadata.js.map +1 -0
- package/dist/adapters/likec4/patcher.d.ts +15 -0
- package/dist/adapters/likec4/patcher.d.ts.map +1 -0
- package/dist/adapters/likec4/patcher.js +69 -0
- package/dist/adapters/likec4/patcher.js.map +1 -0
- package/dist/adapters/likec4/version-check.d.ts +11 -0
- package/dist/adapters/likec4/version-check.d.ts.map +1 -0
- package/dist/adapters/likec4/version-check.js +75 -0
- package/dist/adapters/likec4/version-check.js.map +1 -0
- package/dist/adapters/model-patcher.d.ts +49 -0
- package/dist/adapters/model-patcher.d.ts.map +1 -0
- package/dist/adapters/model-patcher.js +15 -0
- package/dist/adapters/model-patcher.js.map +1 -0
- package/dist/adapters/structurizr/adapter.d.ts +39 -0
- package/dist/adapters/structurizr/adapter.d.ts.map +1 -0
- package/dist/adapters/structurizr/adapter.js +372 -0
- package/dist/adapters/structurizr/adapter.js.map +1 -0
- package/dist/adapters/structurizr/dsl-validator.d.ts +3 -0
- package/dist/adapters/structurizr/dsl-validator.d.ts.map +1 -0
- package/dist/adapters/structurizr/dsl-validator.js +26 -0
- package/dist/adapters/structurizr/dsl-validator.js.map +1 -0
- package/dist/adapters/structurizr/index.d.ts +2 -0
- package/dist/adapters/structurizr/index.d.ts.map +1 -0
- package/dist/adapters/structurizr/index.js +2 -0
- package/dist/adapters/structurizr/index.js.map +1 -0
- package/dist/adapters/structurizr/metadata.d.ts +3 -0
- package/dist/adapters/structurizr/metadata.d.ts.map +1 -0
- package/dist/adapters/structurizr/metadata.js +35 -0
- package/dist/adapters/structurizr/metadata.js.map +1 -0
- package/dist/adapters/structurizr/patcher.d.ts +15 -0
- package/dist/adapters/structurizr/patcher.d.ts.map +1 -0
- package/dist/adapters/structurizr/patcher.js +53 -0
- package/dist/adapters/structurizr/patcher.js.map +1 -0
- package/dist/adapters/structurizr/structurizr-cli.d.ts +2 -0
- package/dist/adapters/structurizr/structurizr-cli.d.ts.map +1 -0
- package/dist/adapters/structurizr/structurizr-cli.js +91 -0
- package/dist/adapters/structurizr/structurizr-cli.js.map +1 -0
- package/dist/adapters/structurizr/structurizr-types.d.ts +3 -0
- package/dist/adapters/structurizr/structurizr-types.d.ts.map +1 -0
- package/dist/adapters/structurizr/structurizr-types.js +2 -0
- package/dist/adapters/structurizr/structurizr-types.js.map +1 -0
- package/dist/adapters/url-utils.d.ts +3 -0
- package/dist/adapters/url-utils.d.ts.map +1 -0
- package/dist/adapters/url-utils.js +53 -0
- package/dist/adapters/url-utils.js.map +1 -0
- package/dist/analysis/analysis-types.d.ts +152 -0
- package/dist/analysis/analysis-types.d.ts.map +1 -0
- package/dist/analysis/analysis-types.js +2 -0
- package/dist/analysis/analysis-types.js.map +1 -0
- package/dist/analysis/prompt-builder.d.ts +27 -0
- package/dist/analysis/prompt-builder.d.ts.map +1 -0
- package/dist/analysis/prompt-builder.js +159 -0
- package/dist/analysis/prompt-builder.js.map +1 -0
- package/dist/analysis/prompt-variables.d.ts +72 -0
- package/dist/analysis/prompt-variables.d.ts.map +1 -0
- package/dist/analysis/prompt-variables.js +2 -0
- package/dist/analysis/prompt-variables.js.map +1 -0
- package/dist/analysis/prompts/component-selection.md +50 -0
- package/dist/analysis/prompts/dependency-extraction.md +219 -0
- package/dist/analysis/prompts/drift-analysis.md +154 -0
- package/dist/analysis/prompts/model-patch.md +29 -0
- package/dist/analysis/section-formatters.d.ts +54 -0
- package/dist/analysis/section-formatters.d.ts.map +1 -0
- package/dist/analysis/section-formatters.js +95 -0
- package/dist/analysis/section-formatters.js.map +1 -0
- package/dist/analysis/template-engine.d.ts +11 -0
- package/dist/analysis/template-engine.d.ts.map +1 -0
- package/dist/analysis/template-engine.js +64 -0
- package/dist/analysis/template-engine.js.map +1 -0
- package/dist/ci-entry.d.ts +3 -0
- package/dist/ci-entry.d.ts.map +1 -0
- package/dist/ci-entry.js +67 -0
- package/dist/ci-entry.js.map +1 -0
- package/dist/errors.d.ts +60 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +134 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +45 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +38 -0
- package/dist/index.js.map +1 -0
- package/dist/output/ci-output.d.ts +13 -0
- package/dist/output/ci-output.d.ts.map +1 -0
- package/dist/output/ci-output.js +106 -0
- package/dist/output/ci-output.js.map +1 -0
- package/dist/output/structured-output.d.ts +89 -0
- package/dist/output/structured-output.d.ts.map +1 -0
- package/dist/output/structured-output.js +2 -0
- package/dist/output/structured-output.js.map +1 -0
- package/dist/output.d.ts +73 -0
- package/dist/output.d.ts.map +1 -0
- package/dist/output.js +304 -0
- package/dist/output.js.map +1 -0
- package/dist/pipelines/analyze.d.ts +35 -0
- package/dist/pipelines/analyze.d.ts.map +1 -0
- package/dist/pipelines/analyze.js +316 -0
- package/dist/pipelines/analyze.js.map +1 -0
- package/dist/pipelines/check.d.ts +48 -0
- package/dist/pipelines/check.d.ts.map +1 -0
- package/dist/pipelines/check.js +218 -0
- package/dist/pipelines/check.js.map +1 -0
- package/dist/pipelines/components.d.ts +8 -0
- package/dist/pipelines/components.d.ts.map +1 -0
- package/dist/pipelines/components.js +14 -0
- package/dist/pipelines/components.js.map +1 -0
- package/dist/pipelines/connections.d.ts +34 -0
- package/dist/pipelines/connections.d.ts.map +1 -0
- package/dist/pipelines/connections.js +53 -0
- package/dist/pipelines/connections.js.map +1 -0
- package/dist/pipelines/pr-creation.d.ts +30 -0
- package/dist/pipelines/pr-creation.d.ts.map +1 -0
- package/dist/pipelines/pr-creation.js +26 -0
- package/dist/pipelines/pr-creation.js.map +1 -0
- package/dist/pipelines/progress.d.ts +23 -0
- package/dist/pipelines/progress.d.ts.map +1 -0
- package/dist/pipelines/progress.js +22 -0
- package/dist/pipelines/progress.js.map +1 -0
- package/dist/pipelines/publish.d.ts +39 -0
- package/dist/pipelines/publish.d.ts.map +1 -0
- package/dist/pipelines/publish.js +125 -0
- package/dist/pipelines/publish.js.map +1 -0
- package/dist/pipelines/validate.d.ts +24 -0
- package/dist/pipelines/validate.d.ts.map +1 -0
- package/dist/pipelines/validate.js +79 -0
- package/dist/pipelines/validate.js.map +1 -0
- package/dist/platforms/bitbucket/api-client.d.ts +21 -0
- package/dist/platforms/bitbucket/api-client.d.ts.map +1 -0
- package/dist/platforms/bitbucket/api-client.js +98 -0
- package/dist/platforms/bitbucket/api-client.js.map +1 -0
- package/dist/platforms/bitbucket/index.d.ts +3 -0
- package/dist/platforms/bitbucket/index.d.ts.map +1 -0
- package/dist/platforms/bitbucket/index.js +3 -0
- package/dist/platforms/bitbucket/index.js.map +1 -0
- package/dist/platforms/bitbucket/reader.d.ts +9 -0
- package/dist/platforms/bitbucket/reader.d.ts.map +1 -0
- package/dist/platforms/bitbucket/reader.js +119 -0
- package/dist/platforms/bitbucket/reader.js.map +1 -0
- package/dist/platforms/bitbucket/writer.d.ts +15 -0
- package/dist/platforms/bitbucket/writer.d.ts.map +1 -0
- package/dist/platforms/bitbucket/writer.js +172 -0
- package/dist/platforms/bitbucket/writer.js.map +1 -0
- package/dist/platforms/github/index.d.ts +3 -0
- package/dist/platforms/github/index.d.ts.map +1 -0
- package/dist/platforms/github/index.js +3 -0
- package/dist/platforms/github/index.js.map +1 -0
- package/dist/platforms/github/reader.d.ts +9 -0
- package/dist/platforms/github/reader.d.ts.map +1 -0
- package/dist/platforms/github/reader.js +141 -0
- package/dist/platforms/github/reader.js.map +1 -0
- package/dist/platforms/github/writer.d.ts +15 -0
- package/dist/platforms/github/writer.d.ts.map +1 -0
- package/dist/platforms/github/writer.js +225 -0
- package/dist/platforms/github/writer.js.map +1 -0
- package/dist/platforms/gitlab/index.d.ts +3 -0
- package/dist/platforms/gitlab/index.d.ts.map +1 -0
- package/dist/platforms/gitlab/index.js +3 -0
- package/dist/platforms/gitlab/index.js.map +1 -0
- package/dist/platforms/gitlab/reader.d.ts +9 -0
- package/dist/platforms/gitlab/reader.d.ts.map +1 -0
- package/dist/platforms/gitlab/reader.js +136 -0
- package/dist/platforms/gitlab/reader.js.map +1 -0
- package/dist/platforms/gitlab/writer.d.ts +14 -0
- package/dist/platforms/gitlab/writer.d.ts.map +1 -0
- package/dist/platforms/gitlab/writer.js +130 -0
- package/dist/platforms/gitlab/writer.js.map +1 -0
- package/dist/platforms/platform-factory.d.ts +7 -0
- package/dist/platforms/platform-factory.d.ts.map +1 -0
- package/dist/platforms/platform-factory.js +53 -0
- package/dist/platforms/platform-factory.js.map +1 -0
- package/dist/platforms/platform-utils.d.ts +12 -0
- package/dist/platforms/platform-utils.d.ts.map +1 -0
- package/dist/platforms/platform-utils.js +48 -0
- package/dist/platforms/platform-utils.js.map +1 -0
- package/dist/platforms/source-platform.d.ts +117 -0
- package/dist/platforms/source-platform.d.ts.map +1 -0
- package/dist/platforms/source-platform.js +2 -0
- package/dist/platforms/source-platform.js.map +1 -0
- package/dist/providers/ai-provider.d.ts +23 -0
- package/dist/providers/ai-provider.d.ts.map +1 -0
- package/dist/providers/ai-provider.js +2 -0
- package/dist/providers/ai-provider.js.map +1 -0
- package/dist/providers/analysis-phase.d.ts +13 -0
- package/dist/providers/analysis-phase.d.ts.map +1 -0
- package/dist/providers/analysis-phase.js +14 -0
- package/dist/providers/analysis-phase.js.map +1 -0
- package/dist/providers/anthropic/models.d.ts +5 -0
- package/dist/providers/anthropic/models.d.ts.map +1 -0
- package/dist/providers/anthropic/models.js +5 -0
- package/dist/providers/anthropic/models.js.map +1 -0
- package/dist/providers/anthropic/provider.d.ts +12 -0
- package/dist/providers/anthropic/provider.d.ts.map +1 -0
- package/dist/providers/anthropic/provider.js +47 -0
- package/dist/providers/anthropic/provider.js.map +1 -0
- package/dist/providers/base-provider.d.ts +34 -0
- package/dist/providers/base-provider.d.ts.map +1 -0
- package/dist/providers/base-provider.js +100 -0
- package/dist/providers/base-provider.js.map +1 -0
- package/dist/providers/gemini/models.d.ts +5 -0
- package/dist/providers/gemini/models.d.ts.map +1 -0
- package/dist/providers/gemini/models.js +5 -0
- package/dist/providers/gemini/models.js.map +1 -0
- package/dist/providers/gemini/provider.d.ts +12 -0
- package/dist/providers/gemini/provider.d.ts.map +1 -0
- package/dist/providers/gemini/provider.js +42 -0
- package/dist/providers/gemini/provider.js.map +1 -0
- package/dist/providers/openai/models.d.ts +5 -0
- package/dist/providers/openai/models.d.ts.map +1 -0
- package/dist/providers/openai/models.js +5 -0
- package/dist/providers/openai/models.js.map +1 -0
- package/dist/providers/openai/provider.d.ts +12 -0
- package/dist/providers/openai/provider.d.ts.map +1 -0
- package/dist/providers/openai/provider.js +49 -0
- package/dist/providers/openai/provider.js.map +1 -0
- package/dist/providers/provider-factory.d.ts +3 -0
- package/dist/providers/provider-factory.d.ts.map +1 -0
- package/dist/providers/provider-factory.js +45 -0
- package/dist/providers/provider-factory.js.map +1 -0
- package/dist/schemas/bitbucket-api.schema.d.ts +52 -0
- package/dist/schemas/bitbucket-api.schema.d.ts.map +1 -0
- package/dist/schemas/bitbucket-api.schema.js +50 -0
- package/dist/schemas/bitbucket-api.schema.js.map +1 -0
- package/dist/schemas/common.schema.d.ts +46 -0
- package/dist/schemas/common.schema.d.ts.map +1 -0
- package/dist/schemas/common.schema.js +67 -0
- package/dist/schemas/common.schema.js.map +1 -0
- package/dist/schemas/dependency-extraction.schema.d.ts +17 -0
- package/dist/schemas/dependency-extraction.schema.d.ts.map +1 -0
- package/dist/schemas/dependency-extraction.schema.js +13 -0
- package/dist/schemas/dependency-extraction.schema.js.map +1 -0
- package/dist/schemas/drift-analysis.schema.d.ts +40 -0
- package/dist/schemas/drift-analysis.schema.d.ts.map +1 -0
- package/dist/schemas/drift-analysis.schema.js +15 -0
- package/dist/schemas/drift-analysis.schema.js.map +1 -0
- package/dist/schemas/gitlab-api.schema.d.ts +33 -0
- package/dist/schemas/gitlab-api.schema.d.ts.map +1 -0
- package/dist/schemas/gitlab-api.schema.js +33 -0
- package/dist/schemas/gitlab-api.schema.js.map +1 -0
- package/dist/schemas/likec4.schema.d.ts +26 -0
- package/dist/schemas/likec4.schema.d.ts.map +1 -0
- package/dist/schemas/likec4.schema.js +23 -0
- package/dist/schemas/likec4.schema.js.map +1 -0
- package/dist/schemas/package.schema.d.ts +5 -0
- package/dist/schemas/package.schema.d.ts.map +1 -0
- package/dist/schemas/package.schema.js +5 -0
- package/dist/schemas/package.schema.js.map +1 -0
- package/dist/schemas/source-platform.schema.d.ts +56 -0
- package/dist/schemas/source-platform.schema.d.ts.map +1 -0
- package/dist/schemas/source-platform.schema.js +49 -0
- package/dist/schemas/source-platform.schema.js.map +1 -0
- package/dist/schemas/structurizr.schema.d.ts +234 -0
- package/dist/schemas/structurizr.schema.d.ts.map +1 -0
- package/dist/schemas/structurizr.schema.js +54 -0
- package/dist/schemas/structurizr.schema.js.map +1 -0
- package/dist/skip-patterns +62 -0
- package/dist/utils/config.d.ts +156 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +267 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/error-utils.d.ts +2 -0
- package/dist/utils/error-utils.d.ts.map +1 -0
- package/dist/utils/error-utils.js +6 -0
- package/dist/utils/error-utils.js.map +1 -0
- package/dist/utils/git-diff.d.ts +35 -0
- package/dist/utils/git-diff.d.ts.map +1 -0
- package/dist/utils/git-diff.js +114 -0
- package/dist/utils/git-diff.js.map +1 -0
- package/dist/utils/model-source.d.ts +30 -0
- package/dist/utils/model-source.d.ts.map +1 -0
- package/dist/utils/model-source.js +167 -0
- package/dist/utils/model-source.js.map +1 -0
- package/dist/utils/retry.d.ts +9 -0
- package/dist/utils/retry.d.ts.map +1 -0
- package/dist/utils/retry.js +51 -0
- package/dist/utils/retry.js.map +1 -0
- package/dist/utils/skip-patterns.d.ts +7 -0
- package/dist/utils/skip-patterns.d.ts.map +1 -0
- package/dist/utils/skip-patterns.js +35 -0
- package/dist/utils/skip-patterns.js.map +1 -0
- package/dist/utils/validation.d.ts +4 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js +37 -0
- package/dist/utils/validation.js.map +1 -0
- package/package.json +78 -0
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { readdirSync, statSync } from 'fs';
|
|
2
|
+
import { join, resolve } from 'path';
|
|
3
|
+
import { BasePatcher } from '../base-patcher.js';
|
|
4
|
+
import { validateStructurizrDsl } from './dsl-validator.js';
|
|
5
|
+
export class StructurizrPatcher extends BasePatcher {
|
|
6
|
+
formatName = 'StructurizrPatcher';
|
|
7
|
+
formatId = 'structurizr';
|
|
8
|
+
defaultIndent = ' ';
|
|
9
|
+
isModelBlockLine(line) {
|
|
10
|
+
return /\bmodel\s*\{/.test(line);
|
|
11
|
+
}
|
|
12
|
+
generateDslLines(unique, _existing) {
|
|
13
|
+
return unique.map((rel) => {
|
|
14
|
+
const desc = rel.description.replace(/"/g, '');
|
|
15
|
+
const technology = rel.kind ? ` "${rel.kind.replace(/"/g, '')}"` : '';
|
|
16
|
+
return ` ${rel.source} -> ${rel.target} "${desc}"${technology}`;
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
generateComponentDslLines(components) {
|
|
20
|
+
return components.map((comp) => {
|
|
21
|
+
const name = comp.name.replace(/"/g, '');
|
|
22
|
+
const desc = (comp.description ?? '').replace(/"/g, '');
|
|
23
|
+
const tech = comp.technology ? ` "${comp.technology.replace(/"/g, '')}"` : '';
|
|
24
|
+
return ` ${comp.id} = ${comp.kind} "${name}" "${desc}"${tech}`;
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
findTargetFile(modelPath) {
|
|
28
|
+
const resolvedPath = resolve(modelPath);
|
|
29
|
+
// If it's a file, use it directly
|
|
30
|
+
try {
|
|
31
|
+
if (!statSync(resolvedPath).isDirectory()) {
|
|
32
|
+
return resolvedPath;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
catch (err) {
|
|
36
|
+
this.debugLog('statSync failed for path', { path: resolvedPath, error: String(err) });
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
// Look for .dsl files in the directory
|
|
40
|
+
const dslFiles = readdirSync(resolvedPath)
|
|
41
|
+
.filter((f) => f.endsWith('.dsl'))
|
|
42
|
+
.map((f) => join(resolvedPath, f));
|
|
43
|
+
// Prefer workspace.dsl
|
|
44
|
+
const workspaceDsl = dslFiles.find((f) => f.endsWith('workspace.dsl'));
|
|
45
|
+
if (workspaceDsl)
|
|
46
|
+
return workspaceDsl;
|
|
47
|
+
return dslFiles[0] ?? null;
|
|
48
|
+
}
|
|
49
|
+
async validateDsl(workspace, file, content) {
|
|
50
|
+
return validateStructurizrDsl(workspace, file, content);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=patcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"patcher.js","sourceRoot":"","sources":["../../../src/adapters/structurizr/patcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"structurizr-cli.d.ts","sourceRoot":"","sources":["../../../src/adapters/structurizr/structurizr-cli.ts"],"names":[],"mappings":"AAUA,wBAAsB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAwFvE"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { execFile } from 'child_process';
|
|
2
|
+
import { mkdtemp, readFile, readdir, rm } from 'fs/promises';
|
|
3
|
+
import { basename, dirname, join } from 'path';
|
|
4
|
+
import { tmpdir } from 'os';
|
|
5
|
+
import { promisify } from 'util';
|
|
6
|
+
import { AdapterError, ErrorCode } from '../../errors.js';
|
|
7
|
+
import { CONFIG, ENV_VAR_NAMES } from '../../utils/config.js';
|
|
8
|
+
const execFileAsync = promisify(execFile);
|
|
9
|
+
export async function exportDslToJson(dslPath) {
|
|
10
|
+
const tmpDir = await mkdtemp(join(tmpdir(), 'erode-structurizr-'));
|
|
11
|
+
try {
|
|
12
|
+
const cliPath = CONFIG.adapter.structurizr.cliPath;
|
|
13
|
+
const dslDir = dirname(dslPath);
|
|
14
|
+
const dslBasename = basename(dslPath);
|
|
15
|
+
if (cliPath) {
|
|
16
|
+
// Use local WAR file
|
|
17
|
+
try {
|
|
18
|
+
await execFileAsync('java', [
|
|
19
|
+
'-jar',
|
|
20
|
+
cliPath,
|
|
21
|
+
'export',
|
|
22
|
+
'-workspace',
|
|
23
|
+
dslPath,
|
|
24
|
+
'-format',
|
|
25
|
+
'json',
|
|
26
|
+
'-output',
|
|
27
|
+
tmpDir,
|
|
28
|
+
]);
|
|
29
|
+
}
|
|
30
|
+
catch (error) {
|
|
31
|
+
if (isEnoentError(error)) {
|
|
32
|
+
throw new AdapterError('Java or Structurizr not found', ErrorCode.MODEL_LOAD_FAILED, 'structurizr', 'Could not run Structurizr export', { cliPath }, getInstallSuggestions());
|
|
33
|
+
}
|
|
34
|
+
throw error;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
// Use Docker
|
|
39
|
+
try {
|
|
40
|
+
await execFileAsync('docker', [
|
|
41
|
+
'run',
|
|
42
|
+
'--rm',
|
|
43
|
+
'-v',
|
|
44
|
+
`${dslDir}:/workspace`,
|
|
45
|
+
'-v',
|
|
46
|
+
`${tmpDir}:/output`,
|
|
47
|
+
'structurizr/structurizr:2026.02.01',
|
|
48
|
+
'export',
|
|
49
|
+
'-workspace',
|
|
50
|
+
`/workspace/${dslBasename}`,
|
|
51
|
+
'-format',
|
|
52
|
+
'json',
|
|
53
|
+
'-output',
|
|
54
|
+
'/output',
|
|
55
|
+
]);
|
|
56
|
+
}
|
|
57
|
+
catch (error) {
|
|
58
|
+
if (isEnoentError(error)) {
|
|
59
|
+
throw new AdapterError('Docker not found', ErrorCode.MODEL_LOAD_FAILED, 'structurizr', 'Could not run Structurizr export via Docker', {}, getInstallSuggestions());
|
|
60
|
+
}
|
|
61
|
+
throw error;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
// Find and read the JSON file
|
|
65
|
+
const files = await readdir(tmpDir);
|
|
66
|
+
const jsonFile = files.find((f) => f.endsWith('.json'));
|
|
67
|
+
if (!jsonFile) {
|
|
68
|
+
throw new AdapterError('No JSON file generated by Structurizr', ErrorCode.MODEL_LOAD_FAILED, 'structurizr', 'Structurizr export did not produce a JSON file');
|
|
69
|
+
}
|
|
70
|
+
const jsonPath = join(tmpDir, jsonFile);
|
|
71
|
+
const content = await readFile(jsonPath, 'utf-8');
|
|
72
|
+
return JSON.parse(content);
|
|
73
|
+
}
|
|
74
|
+
finally {
|
|
75
|
+
await rm(tmpDir, { recursive: true, force: true });
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
function isEnoentError(error) {
|
|
79
|
+
if (error instanceof Error) {
|
|
80
|
+
return 'code' in error && error.code === 'ENOENT';
|
|
81
|
+
}
|
|
82
|
+
return false;
|
|
83
|
+
}
|
|
84
|
+
function getInstallSuggestions() {
|
|
85
|
+
return [
|
|
86
|
+
`Set ${ENV_VAR_NAMES.structurizrCliPath} to the path of the Structurizr WAR file`,
|
|
87
|
+
'Or install Docker and pull the structurizr/structurizr image',
|
|
88
|
+
'Or pre-export your workspace to JSON: java -jar structurizr.war export -workspace workspace.dsl -format json',
|
|
89
|
+
];
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=structurizr-cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"structurizr-cli.js","sourceRoot":"","sources":["../../../src/adapters/structurizr/structurizr-cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { StructurizrWorkspace, StructurizrSoftwareSystem, StructurizrContainer, StructurizrComponent, StructurizrPerson, StructurizrRelationship } from '../../schemas/structurizr.schema.js';
|
|
2
|
+
export type { StructurizrWorkspace, StructurizrSoftwareSystem, StructurizrContainer, StructurizrComponent, StructurizrPerson, StructurizrRelationship, };
|
|
3
|
+
//# sourceMappingURL=structurizr-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"structurizr-types.d.ts","sourceRoot":"","sources":["../../../src/adapters/structurizr/structurizr-types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,oBAAoB,EACpB,yBAAyB,EACzB,oBAAoB,EACpB,oBAAoB,EACpB,iBAAiB,EACjB,uBAAuB,EACxB,MAAM,qCAAqC,CAAC;AAE7C,YAAY,EACV,oBAAoB,EACpB,yBAAyB,EACzB,oBAAoB,EACpB,oBAAoB,EACpB,iBAAiB,EACjB,uBAAuB,GACxB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"structurizr-types.js","sourceRoot":"","sources":["../../../src/adapters/structurizr/structurizr-types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"url-utils.d.ts","sourceRoot":"","sources":["../../src/adapters/url-utils.ts"],"names":[],"mappings":"AASA,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAMxD;AAED,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAkC1D"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
const REPO_HOSTNAMES = {
|
|
2
|
+
'github.com': 'https://github.com',
|
|
3
|
+
'www.github.com': 'https://github.com',
|
|
4
|
+
'gitlab.com': 'https://gitlab.com',
|
|
5
|
+
'www.gitlab.com': 'https://gitlab.com',
|
|
6
|
+
'bitbucket.org': 'https://bitbucket.org',
|
|
7
|
+
'www.bitbucket.org': 'https://bitbucket.org',
|
|
8
|
+
};
|
|
9
|
+
export function isRepositoryHostUrl(url) {
|
|
10
|
+
try {
|
|
11
|
+
return Object.hasOwn(REPO_HOSTNAMES, new URL(url).hostname);
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
return false;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
export function normalizeRepositoryUrl(url) {
|
|
18
|
+
try {
|
|
19
|
+
const parsed = new URL(url);
|
|
20
|
+
const base = REPO_HOSTNAMES[parsed.hostname];
|
|
21
|
+
if (!base)
|
|
22
|
+
return url;
|
|
23
|
+
// GitLab supports nested groups (e.g. gitlab.com/group/subgroup/project),
|
|
24
|
+
// so preserve all path segments instead of just two.
|
|
25
|
+
if (base === 'https://gitlab.com') {
|
|
26
|
+
const gitlabPath = parsed.pathname.split('/-/')[0] ?? parsed.pathname;
|
|
27
|
+
const parts = gitlabPath.split('/').filter(Boolean);
|
|
28
|
+
if (parts.length >= 2) {
|
|
29
|
+
const last = parts.at(-1);
|
|
30
|
+
if (!last)
|
|
31
|
+
return url;
|
|
32
|
+
const repo = last.replace(/\.git$/, '').toLowerCase();
|
|
33
|
+
const namespace = parts
|
|
34
|
+
.slice(0, -1)
|
|
35
|
+
.map((p) => p.toLowerCase())
|
|
36
|
+
.join('/');
|
|
37
|
+
return `${base}/${namespace}/${repo}`;
|
|
38
|
+
}
|
|
39
|
+
return url;
|
|
40
|
+
}
|
|
41
|
+
const match = /^\/([^/]+)\/([^/]+)/.exec(parsed.pathname);
|
|
42
|
+
if (match?.[1] && match[2]) {
|
|
43
|
+
const owner = match[1].toLowerCase();
|
|
44
|
+
const repo = match[2].replace(/\.git$/, '').toLowerCase();
|
|
45
|
+
return `${base}/${owner}/${repo}`;
|
|
46
|
+
}
|
|
47
|
+
return url;
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
return url;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=url-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"url-utils.js","sourceRoot":"","sources":["../../src/adapters/url-utils.ts"],"names":[],"mappings":"AAAA,MAAM,cAAc,GAA2B;IAC7C,YAAY,EAAE,oBAAoB;IAClC,gBAAgB,EAAE,oBAAoB;IACtC,YAAY,EAAE,oBAAoB;IAClC,gBAAgB,EAAE,oBAAoB;IACtC,eAAe,EAAE,uBAAuB;IACxC,mBAAmB,EAAE,uBAAuB;CAC7C,CAAC;AAEF,MAAM,UAAU,mBAAmB,CAAC,GAAW;IAC7C,IAAI,CAAC;QACH,OAAO,MAAM,CAAC,MAAM,CAAC,cAAc,EAAE,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;IAC9D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,GAAW;IAChD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QAC5B,MAAM,IAAI,GAAG,cAAc,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC7C,IAAI,CAAC,IAAI;YAAE,OAAO,GAAG,CAAC;QAEtB,0EAA0E;QAC1E,qDAAqD;QACrD,IAAI,IAAI,KAAK,oBAAoB,EAAE,CAAC;YAClC,MAAM,UAAU,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC;YACtE,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACpD,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;gBACtB,MAAM,IAAI,GAAG,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC1B,IAAI,CAAC,IAAI;oBAAE,OAAO,GAAG,CAAC;gBACtB,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;gBACtD,MAAM,SAAS,GAAG,KAAK;qBACpB,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;qBACZ,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;qBAC3B,IAAI,CAAC,GAAG,CAAC,CAAC;gBACb,OAAO,GAAG,IAAI,IAAI,SAAS,IAAI,IAAI,EAAE,CAAC;YACxC,CAAC;YACD,OAAO,GAAG,CAAC;QACb,CAAC;QAED,MAAM,KAAK,GAAG,qBAAqB,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC1D,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3B,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;YACrC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;YAC1D,OAAO,GAAG,IAAI,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;QACpC,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,GAAG,CAAC;IACb,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
import type { ArchitecturalComponent, ModelRelationship } from '../adapters/architecture-types.js';
|
|
2
|
+
import type { DependencyExtractionResult } from '../schemas/dependency-extraction.schema.js';
|
|
3
|
+
import type { StructuredRelationshipSchema, NewComponentSchema } from '../schemas/common.schema.js';
|
|
4
|
+
import type { z } from 'zod';
|
|
5
|
+
export type StructuredRelationship = z.infer<typeof StructuredRelationshipSchema>;
|
|
6
|
+
export type NewComponent = z.infer<typeof NewComponentSchema>;
|
|
7
|
+
/**
|
|
8
|
+
* Stage 1: Component selection from monorepo
|
|
9
|
+
* Input for selecting which component in a monorepo is being modified
|
|
10
|
+
*/
|
|
11
|
+
export interface ComponentSelectionPromptData {
|
|
12
|
+
components: ArchitecturalComponent[];
|
|
13
|
+
files: {
|
|
14
|
+
filename: string;
|
|
15
|
+
}[];
|
|
16
|
+
}
|
|
17
|
+
export interface DependencyExtractionPromptData {
|
|
18
|
+
diff: string;
|
|
19
|
+
commit: {
|
|
20
|
+
sha: string;
|
|
21
|
+
message: string;
|
|
22
|
+
author: string;
|
|
23
|
+
};
|
|
24
|
+
repository: {
|
|
25
|
+
owner: string;
|
|
26
|
+
repo: string;
|
|
27
|
+
url: string;
|
|
28
|
+
};
|
|
29
|
+
components?: {
|
|
30
|
+
id: string;
|
|
31
|
+
name: string;
|
|
32
|
+
type: string;
|
|
33
|
+
technology?: string;
|
|
34
|
+
description?: string;
|
|
35
|
+
}[];
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Violation found in a PR with commit context
|
|
39
|
+
*/
|
|
40
|
+
export interface DriftViolation {
|
|
41
|
+
/** Severity of the violation */
|
|
42
|
+
severity: 'high' | 'medium' | 'low';
|
|
43
|
+
/** Description of the violation */
|
|
44
|
+
description: string;
|
|
45
|
+
/** File where the violation occurred */
|
|
46
|
+
file?: string | null;
|
|
47
|
+
/** Line number if applicable */
|
|
48
|
+
line?: number | null;
|
|
49
|
+
/** Commit SHA where this violation was introduced */
|
|
50
|
+
commit?: string | null;
|
|
51
|
+
/** Suggested fix */
|
|
52
|
+
suggestion?: string;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Metadata about a change request for analysis context
|
|
56
|
+
*/
|
|
57
|
+
export interface ChangeRequestMetadata {
|
|
58
|
+
number: number;
|
|
59
|
+
title: string;
|
|
60
|
+
description: string | null;
|
|
61
|
+
repository: string;
|
|
62
|
+
author: {
|
|
63
|
+
login: string;
|
|
64
|
+
name?: string;
|
|
65
|
+
};
|
|
66
|
+
base: {
|
|
67
|
+
ref: string;
|
|
68
|
+
sha: string;
|
|
69
|
+
};
|
|
70
|
+
head: {
|
|
71
|
+
ref: string;
|
|
72
|
+
sha: string;
|
|
73
|
+
};
|
|
74
|
+
stats: {
|
|
75
|
+
commits: number;
|
|
76
|
+
additions: number;
|
|
77
|
+
deletions: number;
|
|
78
|
+
files_changed: number;
|
|
79
|
+
};
|
|
80
|
+
commits: {
|
|
81
|
+
sha: string;
|
|
82
|
+
message: string;
|
|
83
|
+
author: string;
|
|
84
|
+
}[];
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Result of analyzing a change request
|
|
88
|
+
*/
|
|
89
|
+
export interface DriftAnalysisResult {
|
|
90
|
+
/** Whether any violations were found */
|
|
91
|
+
hasViolations: boolean;
|
|
92
|
+
/** List of violations across all commits */
|
|
93
|
+
violations: DriftViolation[];
|
|
94
|
+
/** Architectural improvements or positive findings */
|
|
95
|
+
improvements?: string[];
|
|
96
|
+
/** Warnings that are not critical violations */
|
|
97
|
+
warnings?: string[];
|
|
98
|
+
/** Summary of the analysis */
|
|
99
|
+
summary: string;
|
|
100
|
+
/** Recommended model updates */
|
|
101
|
+
modelUpdates?: {
|
|
102
|
+
add?: string[];
|
|
103
|
+
remove?: string[];
|
|
104
|
+
notes?: string;
|
|
105
|
+
relationships?: StructuredRelationship[];
|
|
106
|
+
newComponents?: NewComponent[];
|
|
107
|
+
};
|
|
108
|
+
/** Change request metadata */
|
|
109
|
+
metadata: ChangeRequestMetadata;
|
|
110
|
+
/** Component that was analyzed */
|
|
111
|
+
component: ArchitecturalComponent;
|
|
112
|
+
/** Aggregated dependency changes across all commits */
|
|
113
|
+
dependencyChanges: DependencyExtractionResult;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Input data for change request analysis prompt
|
|
117
|
+
*/
|
|
118
|
+
export interface DriftAnalysisPromptData {
|
|
119
|
+
/** Change request metadata */
|
|
120
|
+
changeRequest: ChangeRequestMetadata;
|
|
121
|
+
/** Component being analyzed */
|
|
122
|
+
component: ArchitecturalComponent;
|
|
123
|
+
/** Aggregated dependency changes */
|
|
124
|
+
dependencies: DependencyExtractionResult;
|
|
125
|
+
/** Architectural context */
|
|
126
|
+
architectural: {
|
|
127
|
+
dependencies: (ArchitecturalComponent & {
|
|
128
|
+
repository?: string;
|
|
129
|
+
})[];
|
|
130
|
+
dependents: (ArchitecturalComponent & {
|
|
131
|
+
repository?: string;
|
|
132
|
+
})[];
|
|
133
|
+
relationships: {
|
|
134
|
+
target: {
|
|
135
|
+
id: string;
|
|
136
|
+
name: string;
|
|
137
|
+
};
|
|
138
|
+
kind?: string;
|
|
139
|
+
title?: string;
|
|
140
|
+
}[];
|
|
141
|
+
};
|
|
142
|
+
/** Changed files in the PR with their status */
|
|
143
|
+
files?: {
|
|
144
|
+
filename: string;
|
|
145
|
+
status: string;
|
|
146
|
+
}[];
|
|
147
|
+
/** All component IDs in the architecture model */
|
|
148
|
+
allComponentIds?: string[];
|
|
149
|
+
/** All relationships in the architecture model */
|
|
150
|
+
allRelationships?: ModelRelationship[];
|
|
151
|
+
}
|
|
152
|
+
//# sourceMappingURL=analysis-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analysis-types.d.ts","sourceRoot":"","sources":["../../src/analysis/analysis-types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analysis-types.js","sourceRoot":"","sources":["../../src/analysis/analysis-types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { DependencyExtractionPromptData, ComponentSelectionPromptData, DriftAnalysisPromptData } from './analysis-types.js';
|
|
2
|
+
export declare const PromptBuilder: {
|
|
3
|
+
/** Extract the first JSON object from an AI response text, or null if none found. */
|
|
4
|
+
readonly extractJson: (responseText: string) => string | null;
|
|
5
|
+
/**
|
|
6
|
+
* Stage 2: Build dependency extraction prompt to extract architectural dependencies from git diff
|
|
7
|
+
* @param data - Must contain exactly one component (selected in Stage 1)
|
|
8
|
+
*/
|
|
9
|
+
readonly buildDependencyExtractionPrompt: (data: DependencyExtractionPromptData) => string;
|
|
10
|
+
/**
|
|
11
|
+
* Stage 1: Build component selection prompt
|
|
12
|
+
*/
|
|
13
|
+
readonly buildComponentSelectionPrompt: (data: ComponentSelectionPromptData) => string;
|
|
14
|
+
/**
|
|
15
|
+
* Build drift analysis prompt for a change request (aggregates multiple commits)
|
|
16
|
+
*/
|
|
17
|
+
readonly buildDriftAnalysisPrompt: (data: DriftAnalysisPromptData) => string;
|
|
18
|
+
/**
|
|
19
|
+
* Build a prompt for inserting relationship lines into an existing model file
|
|
20
|
+
*/
|
|
21
|
+
readonly buildModelPatchPrompt: (data: {
|
|
22
|
+
fileContent: string;
|
|
23
|
+
linesToInsert: string[];
|
|
24
|
+
modelFormat: string;
|
|
25
|
+
}) => string;
|
|
26
|
+
};
|
|
27
|
+
//# sourceMappingURL=prompt-builder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt-builder.d.ts","sourceRoot":"","sources":["../../src/analysis/prompt-builder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,8BAA8B,EAC9B,4BAA4B,EAC5B,uBAAuB,EACxB,MAAM,qBAAqB,CAAC;AAe7B,eAAO,MAAM,aAAa;IACxB,qFAAqF;yCAC3D,MAAM,KAAG,MAAM,GAAG,IAAI;IA6BhD;;;OAGG;qDACmC,8BAA8B,KAAG,MAAM;IAiC7E;;OAEG;mDACiC,4BAA4B,KAAG,MAAM;IAUzE;;OAEG;8CAC4B,uBAAuB,KAAG,MAAM;IAsE/D;;OAEG;2CACyB;QAC1B,WAAW,EAAE,MAAM,CAAC;QACpB,aAAa,EAAE,MAAM,EAAE,CAAC;QACxB,WAAW,EAAE,MAAM,CAAC;KACrB,KAAG,MAAM;CAOF,CAAC"}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
import { TemplateEngine } from './template-engine.js';
|
|
2
|
+
import { ErodeError, ErrorCode } from '../errors.js';
|
|
3
|
+
import { formatAllowedDependencies, formatDependents, formatDependencyChanges, formatAllRelationships, formatChangedFiles, formatComponentContext, formatComponentList, formatCommits, } from './section-formatters.js';
|
|
4
|
+
export const PromptBuilder = {
|
|
5
|
+
/** Extract the first JSON object from an AI response text, or null if none found. */
|
|
6
|
+
extractJson(responseText) {
|
|
7
|
+
const start = responseText.indexOf('{');
|
|
8
|
+
if (start === -1)
|
|
9
|
+
return null;
|
|
10
|
+
let depth = 0;
|
|
11
|
+
let inString = false;
|
|
12
|
+
let escape = false;
|
|
13
|
+
for (let i = start; i < responseText.length; i++) {
|
|
14
|
+
const ch = responseText[i];
|
|
15
|
+
if (escape) {
|
|
16
|
+
escape = false;
|
|
17
|
+
continue;
|
|
18
|
+
}
|
|
19
|
+
if (ch === '\\' && inString) {
|
|
20
|
+
escape = true;
|
|
21
|
+
continue;
|
|
22
|
+
}
|
|
23
|
+
if (ch === '"') {
|
|
24
|
+
inString = !inString;
|
|
25
|
+
continue;
|
|
26
|
+
}
|
|
27
|
+
if (inString)
|
|
28
|
+
continue;
|
|
29
|
+
if (ch === '{')
|
|
30
|
+
depth++;
|
|
31
|
+
else if (ch === '}') {
|
|
32
|
+
depth--;
|
|
33
|
+
if (depth === 0)
|
|
34
|
+
return responseText.slice(start, i + 1);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return null;
|
|
38
|
+
},
|
|
39
|
+
/**
|
|
40
|
+
* Stage 2: Build dependency extraction prompt to extract architectural dependencies from git diff
|
|
41
|
+
* @param data - Must contain exactly one component (selected in Stage 1)
|
|
42
|
+
*/
|
|
43
|
+
buildDependencyExtractionPrompt(data) {
|
|
44
|
+
const { diff, commit, repository, components } = data;
|
|
45
|
+
let componentsContext;
|
|
46
|
+
if (!components || components.length === 0) {
|
|
47
|
+
componentsContext = 'Component: Unknown (repository not mapped in LikeC4)';
|
|
48
|
+
}
|
|
49
|
+
else if (components.length > 1) {
|
|
50
|
+
throw new ErodeError(`buildDependencyExtractionPrompt requires exactly 1 component, received ${String(components.length)}`, ErrorCode.MODEL_COMPONENT_MISSING, `Component selection error: expected 1 component but received ${String(components.length)}. Component selection must occur in Stage 1.`, { componentCount: components.length });
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
const [comp] = components;
|
|
54
|
+
if (!comp) {
|
|
55
|
+
throw new ErodeError('First component is unexpectedly undefined', ErrorCode.MODEL_COMPONENT_MISSING, 'Unexpected error: first component is undefined. This looks like a programming bug.');
|
|
56
|
+
}
|
|
57
|
+
componentsContext = formatComponentContext(comp);
|
|
58
|
+
}
|
|
59
|
+
return TemplateEngine.loadDependencyExtractionPrompt({
|
|
60
|
+
diff,
|
|
61
|
+
commit,
|
|
62
|
+
repository,
|
|
63
|
+
componentsContext,
|
|
64
|
+
});
|
|
65
|
+
},
|
|
66
|
+
/**
|
|
67
|
+
* Stage 1: Build component selection prompt
|
|
68
|
+
*/
|
|
69
|
+
buildComponentSelectionPrompt(data) {
|
|
70
|
+
const { components, files } = data;
|
|
71
|
+
const componentsText = formatComponentList(components);
|
|
72
|
+
const filesText = files.map((f) => `- ${f.filename}`).join('\n');
|
|
73
|
+
return TemplateEngine.loadComponentSelectionPrompt({
|
|
74
|
+
components: componentsText,
|
|
75
|
+
files: filesText,
|
|
76
|
+
});
|
|
77
|
+
},
|
|
78
|
+
/**
|
|
79
|
+
* Build drift analysis prompt for a change request (aggregates multiple commits)
|
|
80
|
+
*/
|
|
81
|
+
buildDriftAnalysisPrompt(data) {
|
|
82
|
+
const { changeRequest, component, dependencies, architectural } = data;
|
|
83
|
+
const allowedDeps = formatAllowedDependencies(architectural);
|
|
84
|
+
const dependents = formatDependents(architectural.dependents);
|
|
85
|
+
const dependencyChangesSection = formatDependencyChanges(dependencies);
|
|
86
|
+
const { section: commitsSection, note: commitsNote } = formatCommits(changeRequest.commits);
|
|
87
|
+
const allComponentIds = (data.allComponentIds ?? []).map((id) => `- \`${id}\``).join('\n') || '(none)';
|
|
88
|
+
const allRelationships = data.allRelationships?.length
|
|
89
|
+
? formatAllRelationships(data.allRelationships)
|
|
90
|
+
: '(none)';
|
|
91
|
+
const filesSection = data.files?.length
|
|
92
|
+
? formatChangedFiles(data.files)
|
|
93
|
+
: 'No file list available.';
|
|
94
|
+
const isLocal = changeRequest.number === 0;
|
|
95
|
+
const changeContext = isLocal
|
|
96
|
+
? {
|
|
97
|
+
label: 'local changes',
|
|
98
|
+
headerPrefix: 'LOCAL CHANGES',
|
|
99
|
+
refLabel: 'Changes:',
|
|
100
|
+
inSuffix: '',
|
|
101
|
+
considerations: [
|
|
102
|
+
"- Evaluate if the changes align with the component's architectural role",
|
|
103
|
+
'- Consider whether new dependencies should be declared in the model',
|
|
104
|
+
'- Provide recommendations before these changes are committed',
|
|
105
|
+
].join('\n'),
|
|
106
|
+
}
|
|
107
|
+
: {
|
|
108
|
+
label: 'a pull request',
|
|
109
|
+
headerPrefix: 'PULL REQUEST',
|
|
110
|
+
refLabel: `PR #${String(changeRequest.number)}:`,
|
|
111
|
+
inSuffix: ' IN THIS PR',
|
|
112
|
+
considerations: [
|
|
113
|
+
"- Consider the PR's stated goals and description",
|
|
114
|
+
"- Evaluate if the architectural changes align with the PR's purpose",
|
|
115
|
+
'- Provide recommendations for the PR review',
|
|
116
|
+
].join('\n'),
|
|
117
|
+
};
|
|
118
|
+
return TemplateEngine.loadDriftAnalysisPrompt({
|
|
119
|
+
changeContext,
|
|
120
|
+
changeRequest: {
|
|
121
|
+
number: changeRequest.number,
|
|
122
|
+
title: changeRequest.title,
|
|
123
|
+
author: changeRequest.author.name ?? changeRequest.author.login,
|
|
124
|
+
base: { ref: changeRequest.base.ref },
|
|
125
|
+
head: { ref: changeRequest.head.ref },
|
|
126
|
+
stats: changeRequest.stats,
|
|
127
|
+
descriptionSection: changeRequest.description
|
|
128
|
+
? `Description:\n${changeRequest.description}\n`
|
|
129
|
+
: '',
|
|
130
|
+
},
|
|
131
|
+
component: {
|
|
132
|
+
name: component.name,
|
|
133
|
+
id: component.id,
|
|
134
|
+
type: component.type,
|
|
135
|
+
repository: component.repository ?? 'Unknown',
|
|
136
|
+
tags: component.tags.join(', ') || 'None',
|
|
137
|
+
},
|
|
138
|
+
commitsSection,
|
|
139
|
+
commitsNote,
|
|
140
|
+
allowedDeps,
|
|
141
|
+
dependents,
|
|
142
|
+
allComponentIds,
|
|
143
|
+
allRelationships,
|
|
144
|
+
filesSection,
|
|
145
|
+
dependencyChangesSection,
|
|
146
|
+
});
|
|
147
|
+
},
|
|
148
|
+
/**
|
|
149
|
+
* Build a prompt for inserting relationship lines into an existing model file
|
|
150
|
+
*/
|
|
151
|
+
buildModelPatchPrompt(data) {
|
|
152
|
+
return TemplateEngine.loadModelPatchPrompt({
|
|
153
|
+
fileContent: data.fileContent,
|
|
154
|
+
linesToInsert: data.linesToInsert.join('\n'),
|
|
155
|
+
modelFormat: data.modelFormat,
|
|
156
|
+
});
|
|
157
|
+
},
|
|
158
|
+
};
|
|
159
|
+
//# sourceMappingURL=prompt-builder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt-builder.js","sourceRoot":"","sources":["../../src/analysis/prompt-builder.ts"],"names":[],"mappings":"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"}
|