@jeger-ai/opengantry 2.7.0 → 3.0.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/README.md +132 -328
- package/dist/cli/commands/arch.d.ts +1 -0
- package/dist/cli/commands/arch.d.ts.map +1 -1
- package/dist/cli/commands/arch.js +17 -6
- package/dist/cli/commands/arch.js.map +1 -1
- package/dist/cli/commands/blueprint.d.ts +7 -0
- package/dist/cli/commands/blueprint.d.ts.map +1 -0
- package/dist/cli/commands/blueprint.js +69 -0
- package/dist/cli/commands/blueprint.js.map +1 -0
- package/dist/cli/commands/init.d.ts +3 -0
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +12 -0
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/lib/architecture-drift-doctor.d.ts +4 -0
- package/dist/cli/lib/architecture-drift-doctor.d.ts.map +1 -0
- package/dist/cli/lib/architecture-drift-doctor.js +58 -0
- package/dist/cli/lib/architecture-drift-doctor.js.map +1 -0
- package/dist/cli/lib/blueprint-engine.d.ts +22 -0
- package/dist/cli/lib/blueprint-engine.d.ts.map +1 -0
- package/dist/cli/lib/blueprint-engine.js +127 -0
- package/dist/cli/lib/blueprint-engine.js.map +1 -0
- package/dist/cli/lib/discovery-proposal.d.ts +19 -0
- package/dist/cli/lib/discovery-proposal.d.ts.map +1 -0
- package/dist/cli/lib/discovery-proposal.js +110 -0
- package/dist/cli/lib/discovery-proposal.js.map +1 -0
- package/dist/cli/lib/discovery-scanner.d.ts +47 -0
- package/dist/cli/lib/discovery-scanner.d.ts.map +1 -0
- package/dist/cli/lib/discovery-scanner.js +81 -0
- package/dist/cli/lib/discovery-scanner.js.map +1 -0
- package/dist/cli/lib/doctor-core.d.ts.map +1 -1
- package/dist/cli/lib/doctor-core.js +2 -0
- package/dist/cli/lib/doctor-core.js.map +1 -1
- package/dist/cli/lib/domains/domain-adapter.d.ts +38 -0
- package/dist/cli/lib/domains/domain-adapter.d.ts.map +1 -0
- package/dist/cli/lib/domains/domain-adapter.js +20 -0
- package/dist/cli/lib/domains/domain-adapter.js.map +1 -0
- package/dist/cli/lib/domains/domain-code.d.ts +3 -0
- package/dist/cli/lib/domains/domain-code.d.ts.map +1 -0
- package/dist/cli/lib/domains/domain-code.js +171 -0
- package/dist/cli/lib/domains/domain-code.js.map +1 -0
- package/dist/cli/lib/domains/domain-content.d.ts +3 -0
- package/dist/cli/lib/domains/domain-content.d.ts.map +1 -0
- package/dist/cli/lib/domains/domain-content.js +190 -0
- package/dist/cli/lib/domains/domain-content.js.map +1 -0
- package/dist/cli/lib/domains/index.d.ts +5 -0
- package/dist/cli/lib/domains/index.d.ts.map +1 -0
- package/dist/cli/lib/domains/index.js +5 -0
- package/dist/cli/lib/domains/index.js.map +1 -0
- package/dist/cli/lib/errors.d.ts +0 -6
- package/dist/cli/lib/errors.d.ts.map +1 -1
- package/dist/cli/lib/errors.js +0 -4
- package/dist/cli/lib/errors.js.map +1 -1
- package/dist/cli/lib/gxt-error-codes.d.ts +0 -2
- package/dist/cli/lib/gxt-error-codes.d.ts.map +1 -1
- package/dist/cli/lib/gxt-error-codes.js +0 -2
- package/dist/cli/lib/gxt-error-codes.js.map +1 -1
- package/dist/cli/lib/init-discover.d.ts +14 -0
- package/dist/cli/lib/init-discover.d.ts.map +1 -0
- package/dist/cli/lib/init-discover.js +45 -0
- package/dist/cli/lib/init-discover.js.map +1 -0
- package/dist/cli/lib/target-architecture.d.ts +12 -3
- package/dist/cli/lib/target-architecture.d.ts.map +1 -1
- package/dist/cli/lib/target-architecture.js +108 -8
- package/dist/cli/lib/target-architecture.js.map +1 -1
- package/dist/cli/lib/verification-plan.d.ts +22 -0
- package/dist/cli/lib/verification-plan.d.ts.map +1 -0
- package/dist/cli/lib/verification-plan.js +26 -0
- package/dist/cli/lib/verification-plan.js.map +1 -0
- package/dist/cli/lib/verify-export.d.ts.map +1 -1
- package/dist/cli/lib/verify-export.js +27 -17
- package/dist/cli/lib/verify-export.js.map +1 -1
- package/dist/cli/lib/verify-failure-normalize.d.ts +2 -1
- package/dist/cli/lib/verify-failure-normalize.d.ts.map +1 -1
- package/dist/cli/lib/verify-failure-normalize.js +37 -1
- package/dist/cli/lib/verify-failure-normalize.js.map +1 -1
- package/dist/cli/lib/verify-finding.d.ts +16 -0
- package/dist/cli/lib/verify-finding.d.ts.map +1 -0
- package/dist/cli/lib/verify-finding.js +11 -0
- package/dist/cli/lib/verify-finding.js.map +1 -0
- package/dist/cli/lib/verify-payload.d.ts +4 -0
- package/dist/cli/lib/verify-payload.d.ts.map +1 -1
- package/dist/cli/lib/verify-payload.js +1 -1
- package/dist/cli/lib/verify-payload.js.map +1 -1
- package/dist/cli/lib/version.gen.d.ts +1 -1
- package/dist/cli/lib/version.gen.js +1 -1
- package/dist/cli/program-blueprint.d.ts +3 -0
- package/dist/cli/program-blueprint.d.ts.map +1 -0
- package/dist/cli/program-blueprint.js +12 -0
- package/dist/cli/program-blueprint.js.map +1 -0
- package/dist/cli/program-core.d.ts.map +1 -1
- package/dist/cli/program-core.js +5 -1
- package/dist/cli/program-core.js.map +1 -1
- package/dist/cli/program-workflow.d.ts.map +1 -1
- package/dist/cli/program-workflow.js +19 -1
- package/dist/cli/program-workflow.js.map +1 -1
- package/dist/cli/program.d.ts.map +1 -1
- package/dist/cli/program.js +2 -0
- package/dist/cli/program.js.map +1 -1
- package/package.json +1 -1
- package/templates/.gitagent/foreman/SUBSTRATE.version.json +1 -1
|
@@ -2,7 +2,7 @@ import { logError, logInfo, setExitCode } from "../lib/cli-io.js";
|
|
|
2
2
|
import { reportCommandError, resolveRepoRootAtBoundary, runAtCommandBoundary, runAtCommandBoundaryAsync, } from "../lib/command-boundary.js";
|
|
3
3
|
import { fetchExternalArchitecture } from "../lib/architecture-fetch.js";
|
|
4
4
|
import { loadWorkspace } from "../lib/workspace.js";
|
|
5
|
-
import { formatArchCheckHuman, runArchCheck, } from "../lib/target-architecture.js";
|
|
5
|
+
import { formatArchCheckHuman, loadTargetArchitecture, runArchCheck, walkPerimeterFiles, } from "../lib/target-architecture.js";
|
|
6
6
|
import { loadArchitecturePointer, summarizeArchitecturePointer, } from "../lib/architecture-pointer.js";
|
|
7
7
|
import { logCredentialStatus, parseCredentialValuesFromStdin, readStdinCredentialPayload, removeArchitectureCredential, validateCredentialSlot, writeArchitectureCredential, } from "../lib/architecture-credential.js";
|
|
8
8
|
/** Repo root plus optional credential-slot validation shared by the cred subcommands. */
|
|
@@ -83,11 +83,22 @@ export function runArchCheckCommand(options = {}) {
|
|
|
83
83
|
const repoRoot = resolveRepoRootAtBoundary(options.cwd);
|
|
84
84
|
if (repoRoot === null)
|
|
85
85
|
return;
|
|
86
|
-
const
|
|
86
|
+
const label = options.label ?? "arch";
|
|
87
|
+
let files = options.files?.length ? options.files : [];
|
|
87
88
|
if (files.length === 0) {
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
89
|
+
try {
|
|
90
|
+
const spec = loadTargetArchitecture(repoRoot);
|
|
91
|
+
files = walkPerimeterFiles(repoRoot, spec);
|
|
92
|
+
}
|
|
93
|
+
catch (e) {
|
|
94
|
+
reportCommandError(e);
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
if (files.length === 0) {
|
|
98
|
+
logError(`gantry ${label} check: no files under scan_roots`);
|
|
99
|
+
setExitCode(2);
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
91
102
|
}
|
|
92
103
|
runAtCommandBoundary(2, () => {
|
|
93
104
|
const { manifest } = loadWorkspace();
|
|
@@ -98,7 +109,7 @@ export function runArchCheckCommand(options = {}) {
|
|
|
98
109
|
logInfo(JSON.stringify({ schema_version: 1, ok: result.ok, violations: result.violations }, null, 2));
|
|
99
110
|
}
|
|
100
111
|
else {
|
|
101
|
-
logInfo(formatArchCheckHuman(result));
|
|
112
|
+
logInfo(formatArchCheckHuman(result, label));
|
|
102
113
|
}
|
|
103
114
|
if (!result.ok)
|
|
104
115
|
setExitCode(1);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"arch.js","sourceRoot":"","sources":["../../../src/cli/commands/arch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAClE,OAAO,EACL,kBAAkB,EAClB,yBAAyB,EACzB,oBAAoB,EACpB,yBAAyB,GAC1B,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,yBAAyB,EAAE,MAAM,8BAA8B,CAAC;AACzE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EACL,oBAAoB,EACpB,YAAY,
|
|
1
|
+
{"version":3,"file":"arch.js","sourceRoot":"","sources":["../../../src/cli/commands/arch.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"blueprint.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/blueprint.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,gBAAgB;IAC/B,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAkDD,wBAAsB,mBAAmB,CAAC,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CAuBvF"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { CLI_NAME } from "../lib/constants.js";
|
|
2
|
+
import { logInfo, setExitCode } from "../lib/cli-io.js";
|
|
3
|
+
import { reportCommandError, resolveRepoRootAtBoundary } from "../lib/command-boundary.js";
|
|
4
|
+
import { buildBlueprintQuestions, emitBlueprintArtifacts, runBlueprintDiscovery, } from "../lib/blueprint-engine.js";
|
|
5
|
+
async function runInterview(questions, yes) {
|
|
6
|
+
const answers = [];
|
|
7
|
+
const { select, text, isCancel } = await import("@clack/prompts");
|
|
8
|
+
for (const q of questions) {
|
|
9
|
+
if (yes) {
|
|
10
|
+
answers.push({
|
|
11
|
+
questionId: q.id,
|
|
12
|
+
choice: "enforce",
|
|
13
|
+
gateCommand: "npm test",
|
|
14
|
+
});
|
|
15
|
+
continue;
|
|
16
|
+
}
|
|
17
|
+
const choice = await select({
|
|
18
|
+
message: q.message,
|
|
19
|
+
options: [
|
|
20
|
+
{ value: "enforce", label: "Yes — enforce strictly (add to TARGET_ARCHITECTURE.yaml)" },
|
|
21
|
+
{ value: "warn", label: "No — warn only" },
|
|
22
|
+
{ value: "legacy", label: "Legacy — flag as warning, don't block" },
|
|
23
|
+
],
|
|
24
|
+
});
|
|
25
|
+
if (isCancel(choice)) {
|
|
26
|
+
setExitCode(1);
|
|
27
|
+
return [];
|
|
28
|
+
}
|
|
29
|
+
const gateCommand = await text({
|
|
30
|
+
message: `Verification command for ${q.ruleId} (e.g. npm run test:feature-x):`,
|
|
31
|
+
defaultValue: "npm test",
|
|
32
|
+
});
|
|
33
|
+
if (isCancel(gateCommand)) {
|
|
34
|
+
setExitCode(1);
|
|
35
|
+
return [];
|
|
36
|
+
}
|
|
37
|
+
answers.push({
|
|
38
|
+
questionId: q.id,
|
|
39
|
+
choice: choice,
|
|
40
|
+
gateCommand: String(gateCommand),
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
return answers;
|
|
44
|
+
}
|
|
45
|
+
export async function runBlueprintCommand(options = {}) {
|
|
46
|
+
const repoRoot = resolveRepoRootAtBoundary(options.cwd);
|
|
47
|
+
if (repoRoot === null)
|
|
48
|
+
return;
|
|
49
|
+
try {
|
|
50
|
+
const proposal = runBlueprintDiscovery(repoRoot, options.domain);
|
|
51
|
+
const questions = buildBlueprintQuestions(proposal, options.domain);
|
|
52
|
+
if (questions.length < 3) {
|
|
53
|
+
logInfo(`${CLI_NAME} blueprint: insufficient evidence-anchored questions (${questions.length}) — add source files`);
|
|
54
|
+
setExitCode(2);
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
const answers = await runInterview(questions, options.yes === true);
|
|
58
|
+
if (answers.length === 0)
|
|
59
|
+
return;
|
|
60
|
+
const artifacts = emitBlueprintArtifacts(repoRoot, proposal, questions, answers, options.domain);
|
|
61
|
+
logInfo(`${CLI_NAME} blueprint: wrote ${artifacts.architectureMdPath}`);
|
|
62
|
+
logInfo(`${CLI_NAME} blueprint: wrote ${artifacts.targetArchitecturePath}`);
|
|
63
|
+
logInfo(`${CLI_NAME} blueprint: wrote ${artifacts.verificationPlanPath}`);
|
|
64
|
+
}
|
|
65
|
+
catch (e) {
|
|
66
|
+
reportCommandError(e);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=blueprint.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"blueprint.js","sourceRoot":"","sources":["../../../src/cli/commands/blueprint.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AAC3F,OAAO,EACL,uBAAuB,EACvB,sBAAsB,EACtB,qBAAqB,GAEtB,MAAM,4BAA4B,CAAC;AAQpC,KAAK,UAAU,YAAY,CACzB,SAAqD,EACrD,GAAY;IAEZ,MAAM,OAAO,GAA+B,EAAE,CAAC;IAC/C,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAC;IAElE,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;QAC1B,IAAI,GAAG,EAAE,CAAC;YACR,OAAO,CAAC,IAAI,CAAC;gBACX,UAAU,EAAE,CAAC,CAAC,EAAE;gBAChB,MAAM,EAAE,SAAS;gBACjB,WAAW,EAAE,UAAU;aACxB,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC;YAC1B,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,OAAO,EAAE;gBACP,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,0DAA0D,EAAE;gBACvF,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,gBAAgB,EAAE;gBAC1C,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,uCAAuC,EAAE;aACpE;SACF,CAAC,CAAC;QACH,IAAI,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YACrB,WAAW,CAAC,CAAC,CAAC,CAAC;YACf,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC;YAC7B,OAAO,EAAE,4BAA4B,CAAC,CAAC,MAAM,iCAAiC;YAC9E,YAAY,EAAE,UAAU;SACzB,CAAC,CAAC;QACH,IAAI,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;YAC1B,WAAW,CAAC,CAAC,CAAC,CAAC;YACf,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,OAAO,CAAC,IAAI,CAAC;YACX,UAAU,EAAE,CAAC,CAAC,EAAE;YAChB,MAAM,EAAE,MAA4C;YACpD,WAAW,EAAE,MAAM,CAAC,WAAW,CAAC;SACjC,CAAC,CAAC;IACL,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,UAA4B,EAAE;IACtE,MAAM,QAAQ,GAAG,yBAAyB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACxD,IAAI,QAAQ,KAAK,IAAI;QAAE,OAAO;IAE9B,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,qBAAqB,CAAC,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QACjE,MAAM,SAAS,GAAG,uBAAuB,CAAC,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QACpE,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzB,OAAO,CAAC,GAAG,QAAQ,yDAAyD,SAAS,CAAC,MAAM,sBAAsB,CAAC,CAAC;YACpH,WAAW,CAAC,CAAC,CAAC,CAAC;YACf,OAAO;QACT,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,GAAG,KAAK,IAAI,CAAC,CAAC;QACpE,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAEjC,MAAM,SAAS,GAAG,sBAAsB,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QACjG,OAAO,CAAC,GAAG,QAAQ,qBAAqB,SAAS,CAAC,kBAAkB,EAAE,CAAC,CAAC;QACxE,OAAO,CAAC,GAAG,QAAQ,qBAAqB,SAAS,CAAC,sBAAsB,EAAE,CAAC,CAAC;QAC5E,OAAO,CAAC,GAAG,QAAQ,qBAAqB,SAAS,CAAC,oBAAoB,EAAE,CAAC,CAAC;IAC5E,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,kBAAkB,CAAC,CAAC,CAAC,CAAC;IACxB,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"AA4CA,MAAM,WAAW,WAAW;IAC1B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,EAAE,CAAC,EAAE,OAAO,CAAC;IACb,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AA0JD,wBAAsB,OAAO,CAAC,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"AA4CA,MAAM,WAAW,WAAW;IAC1B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,EAAE,CAAC,EAAE,OAAO,CAAC;IACb,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AA0JD,wBAAsB,OAAO,CAAC,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CA0EtE"}
|
|
@@ -128,6 +128,18 @@ export async function runInit(options = {}) {
|
|
|
128
128
|
if (!workspace)
|
|
129
129
|
return;
|
|
130
130
|
const { repoRoot, templatesRoot, compat } = workspace;
|
|
131
|
+
if (options.discover === true) {
|
|
132
|
+
const { runInitDiscoverFlow } = await import("../lib/init-discover.js");
|
|
133
|
+
await runInitDiscoverFlow(repoRoot, {
|
|
134
|
+
yes: options.yes,
|
|
135
|
+
stdout: options.discoverStdout,
|
|
136
|
+
domain: options.domain,
|
|
137
|
+
});
|
|
138
|
+
if (!options.discoverStdout) {
|
|
139
|
+
logInfo(`${CLI_NAME} init: discovery complete — run init without --discover to scaffold substrate`);
|
|
140
|
+
}
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
131
143
|
if (options.tutorial === true &&
|
|
132
144
|
!options.dryRun &&
|
|
133
145
|
!options.force &&
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,QAAQ,EAAE,wBAAwB,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACvF,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,wBAAwB,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC5F,OAAO,EAAE,kBAAkB,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AAC3F,OAAO,EACL,mBAAmB,EACnB,qBAAqB,EACrB,6BAA6B,GAE9B,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AACxE,OAAO,EACL,0BAA0B,EAC1B,4BAA4B,GAC7B,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAClF,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,mBAAmB,EACnB,0BAA0B,EAC1B,2BAA2B,GAE5B,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,cAAc,EACd,cAAc,GAGf,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,kBAAkB,EAClB,mCAAmC,GACpC,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EACL,0BAA0B,EAC1B,+BAA+B,GAChC,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,4BAA4B,EAAE,MAAM,6BAA6B,CAAC;AAC3E,OAAO,EAAE,4BAA4B,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { DoctorLine } from "./doctor-types.js";
|
|
2
|
+
/** Doctor checks for ARCHITECTURE.md / TARGET_ARCHITECTURE.yaml / verification_plan drift. */
|
|
3
|
+
export declare function runArchitectureDriftDoctorChecks(root: string): DoctorLine[];
|
|
4
|
+
//# sourceMappingURL=architecture-drift-doctor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"architecture-drift-doctor.d.ts","sourceRoot":"","sources":["../../../src/cli/lib/architecture-drift-doctor.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAqBpD,8FAA8F;AAC9F,wBAAgB,gCAAgC,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,EAAE,CAsC3E"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import YAML from "yaml";
|
|
4
|
+
import { ARCHITECTURE_MD_FILENAME } from "./blueprint-engine.js";
|
|
5
|
+
import { TARGET_ARCHITECTURE_FILENAME, validateTargetArchitecture } from "./target-architecture.js";
|
|
6
|
+
import { VERIFICATION_PLAN_REL } from "./verification-plan.js";
|
|
7
|
+
function extractMdRuleIds(mdBody) {
|
|
8
|
+
const ids = [];
|
|
9
|
+
const re = /^### (rule-[\w-]+)/gm;
|
|
10
|
+
let m;
|
|
11
|
+
while ((m = re.exec(mdBody)) !== null) {
|
|
12
|
+
ids.push(m[1]);
|
|
13
|
+
}
|
|
14
|
+
return ids.sort();
|
|
15
|
+
}
|
|
16
|
+
function loadVerificationPlan(repoRoot) {
|
|
17
|
+
const abs = path.join(repoRoot, VERIFICATION_PLAN_REL.split("/").join(path.sep));
|
|
18
|
+
if (!fs.existsSync(abs))
|
|
19
|
+
return null;
|
|
20
|
+
return JSON.parse(fs.readFileSync(abs, "utf8"));
|
|
21
|
+
}
|
|
22
|
+
/** Doctor checks for ARCHITECTURE.md / TARGET_ARCHITECTURE.yaml / verification_plan drift. */
|
|
23
|
+
export function runArchitectureDriftDoctorChecks(root) {
|
|
24
|
+
const lines = [];
|
|
25
|
+
const plan = loadVerificationPlan(root);
|
|
26
|
+
if (!plan) {
|
|
27
|
+
return lines;
|
|
28
|
+
}
|
|
29
|
+
const mdAbs = path.join(root, ARCHITECTURE_MD_FILENAME);
|
|
30
|
+
const yamlAbs = path.join(root, TARGET_ARCHITECTURE_FILENAME);
|
|
31
|
+
if (!fs.existsSync(mdAbs) || !fs.existsSync(yamlAbs)) {
|
|
32
|
+
lines.push({
|
|
33
|
+
level: "warn",
|
|
34
|
+
message: "blueprint drift: verification_plan.json present but ARCHITECTURE.md or TARGET_ARCHITECTURE.yaml missing",
|
|
35
|
+
});
|
|
36
|
+
return lines;
|
|
37
|
+
}
|
|
38
|
+
const mdIds = extractMdRuleIds(fs.readFileSync(mdAbs, "utf8"));
|
|
39
|
+
const yamlSpec = validateTargetArchitecture(YAML.parse(fs.readFileSync(yamlAbs, "utf8")));
|
|
40
|
+
const yamlIds = yamlSpec.rules.map((r) => r.id).sort();
|
|
41
|
+
const planIds = [...plan.rule_ids].sort();
|
|
42
|
+
const same = (a, b) => a.length === b.length && a.every((v, i) => v === b[i]);
|
|
43
|
+
if (!same(mdIds, planIds) || !same(yamlIds, planIds)) {
|
|
44
|
+
lines.push({
|
|
45
|
+
level: "warn",
|
|
46
|
+
message: `blueprint drift: rule_id mismatch (md=${mdIds.length} yaml=${yamlIds.length} plan=${planIds.length})`,
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
lines.push({ level: "ok", message: "blueprint drift: rule IDs aligned across MD, YAML, and verification_plan.json" });
|
|
51
|
+
}
|
|
52
|
+
const recomputed = plan.gate_commands.length > 0;
|
|
53
|
+
if (!recomputed) {
|
|
54
|
+
lines.push({ level: "warn", message: "blueprint drift: verification_plan has no gate_commands" });
|
|
55
|
+
}
|
|
56
|
+
return lines;
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=architecture-drift-doctor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"architecture-drift-doctor.js","sourceRoot":"","sources":["../../../src/cli/lib/architecture-drift-doctor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { type DiscoveryProposal } from "./discovery-scanner.js";
|
|
2
|
+
import { type DomainBlueprintQuestion, type DomainEnforcementChoice } from "./domains/index.js";
|
|
3
|
+
export declare const ARCHITECTURE_MD_FILENAME: "ARCHITECTURE.md";
|
|
4
|
+
export type BlueprintEnforcementChoice = DomainEnforcementChoice;
|
|
5
|
+
export interface BlueprintInterviewAnswer {
|
|
6
|
+
questionId: string;
|
|
7
|
+
choice: BlueprintEnforcementChoice;
|
|
8
|
+
gateCommand?: string;
|
|
9
|
+
}
|
|
10
|
+
export type BlueprintQuestion = DomainBlueprintQuestion;
|
|
11
|
+
export interface BlueprintArtifacts {
|
|
12
|
+
architectureMdPath: string;
|
|
13
|
+
targetArchitecturePath: string;
|
|
14
|
+
verificationPlanPath: string;
|
|
15
|
+
}
|
|
16
|
+
/** Build evidence-anchored interview questions from discovery output via domain adapter. */
|
|
17
|
+
export declare function buildBlueprintQuestions(proposal: DiscoveryProposal, domain?: string): BlueprintQuestion[];
|
|
18
|
+
/** Emit tri-artifact blueprint output from interview answers. */
|
|
19
|
+
export declare function emitBlueprintArtifacts(repoRoot: string, proposal: DiscoveryProposal, questions: BlueprintQuestion[], answers: BlueprintInterviewAnswer[], domain?: string): BlueprintArtifacts;
|
|
20
|
+
export declare function runBlueprintDiscovery(repoRoot: string, domain?: string): DiscoveryProposal;
|
|
21
|
+
export declare function checksumArchitectureMarkdown(mdBody: string, ruleIds: string[]): string;
|
|
22
|
+
//# sourceMappingURL=blueprint-engine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"blueprint-engine.d.ts","sourceRoot":"","sources":["../../../src/cli/lib/blueprint-engine.ts"],"names":[],"mappings":"AAKA,OAAO,EAEL,KAAK,iBAAiB,EACvB,MAAM,wBAAwB,CAAC;AAahC,OAAO,EAEL,KAAK,uBAAuB,EAC5B,KAAK,uBAAuB,EAE7B,MAAM,oBAAoB,CAAC;AAE5B,eAAO,MAAM,wBAAwB,EAAG,iBAA0B,CAAC;AAEnE,MAAM,MAAM,0BAA0B,GAAG,uBAAuB,CAAC;AAEjE,MAAM,WAAW,wBAAwB;IACvC,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,0BAA0B,CAAC;IACnC,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,MAAM,iBAAiB,GAAG,uBAAuB,CAAC;AAExD,MAAM,WAAW,kBAAkB;IACjC,kBAAkB,EAAE,MAAM,CAAC;IAC3B,sBAAsB,EAAE,MAAM,CAAC;IAC/B,oBAAoB,EAAE,MAAM,CAAC;CAC9B;AAED,4FAA4F;AAC5F,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,iBAAiB,EAC3B,MAAM,CAAC,EAAE,MAAM,GACd,iBAAiB,EAAE,CAGrB;AA4ED,iEAAiE;AACjE,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,iBAAiB,EAC3B,SAAS,EAAE,iBAAiB,EAAE,EAC9B,OAAO,EAAE,wBAAwB,EAAE,EACnC,MAAM,CAAC,EAAE,MAAM,GACd,kBAAkB,CAuDpB;AAED,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,iBAAiB,CAE1F;AAED,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,CAMtF"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import YAML from "yaml";
|
|
4
|
+
import { createHash } from "node:crypto";
|
|
5
|
+
import { toPosixRel } from "./cli-io.js";
|
|
6
|
+
import { runDiscoveryScan, } from "./discovery-scanner.js";
|
|
7
|
+
import { TARGET_ARCHITECTURE_FILENAME, TARGET_ARCHITECTURE_V3_SCHEMA_VERSION, } from "./target-architecture.js";
|
|
8
|
+
import { buildVerificationPlan, serializeVerificationPlan, VERIFICATION_PLAN_REL, } from "./verification-plan.js";
|
|
9
|
+
import { getDomainAdapter, } from "./domains/index.js";
|
|
10
|
+
export const ARCHITECTURE_MD_FILENAME = "ARCHITECTURE.md";
|
|
11
|
+
/** Build evidence-anchored interview questions from discovery output via domain adapter. */
|
|
12
|
+
export function buildBlueprintQuestions(proposal, domain) {
|
|
13
|
+
const adapter = getDomainAdapter(domain ?? proposal.domain ?? "code");
|
|
14
|
+
return adapter.buildBlueprintQuestions(proposal.conventions, proposal.anomalies);
|
|
15
|
+
}
|
|
16
|
+
function buildArchitectureMarkdown(questions, answers, ruleIds, domain) {
|
|
17
|
+
const lines = [`# Architecture (blueprint-generated — domain: ${domain})`, "", "## Rules", ""];
|
|
18
|
+
for (const q of questions) {
|
|
19
|
+
const answer = answers.find((a) => a.questionId === q.id);
|
|
20
|
+
lines.push(`### ${q.ruleId}`, "", `- **Evidence:** \`${q.evidence.file}:${q.evidence.line}\``, `- **Decision:** ${answer?.choice ?? "unset"}`, `- **Question:** ${q.message}`, "");
|
|
21
|
+
}
|
|
22
|
+
lines.push("## Provenance", "", `rule_ids: ${ruleIds.join(", ")}`, "");
|
|
23
|
+
return `${lines.join("\n")}\n`;
|
|
24
|
+
}
|
|
25
|
+
function detectRequiredSkills(repoRoot, gateCommands, answers) {
|
|
26
|
+
const needed = new Set();
|
|
27
|
+
const corpus = [
|
|
28
|
+
...gateCommands.map((g) => g.command),
|
|
29
|
+
...answers.map((a) => a.gateCommand ?? ""),
|
|
30
|
+
]
|
|
31
|
+
.join(" ")
|
|
32
|
+
.toLowerCase();
|
|
33
|
+
const skillHints = [
|
|
34
|
+
{ pattern: /redis/, skill: "redis_mock_generator" },
|
|
35
|
+
{ pattern: /docker/, skill: "docker_runner" },
|
|
36
|
+
{ pattern: /kafka/, skill: "kafka_test_harness" },
|
|
37
|
+
{ pattern: /prisma/, skill: "prisma_test_db" },
|
|
38
|
+
];
|
|
39
|
+
for (const { pattern, skill } of skillHints) {
|
|
40
|
+
if (!pattern.test(corpus))
|
|
41
|
+
continue;
|
|
42
|
+
const pkgPath = path.join(repoRoot, "package.json");
|
|
43
|
+
const pkgBody = fs.existsSync(pkgPath) ? fs.readFileSync(pkgPath, "utf8").toLowerCase() : "";
|
|
44
|
+
const skillsDir = path.join(repoRoot, "skills");
|
|
45
|
+
const hasSkill = fs.existsSync(skillsDir) &&
|
|
46
|
+
fs.readdirSync(skillsDir).some((f) => f.toLowerCase().includes(skill.split("_")[0]));
|
|
47
|
+
const hasDep = pkgBody.includes(skill.split("_")[0]);
|
|
48
|
+
if (!hasSkill && !hasDep)
|
|
49
|
+
needed.add(skill);
|
|
50
|
+
}
|
|
51
|
+
return [...needed].sort();
|
|
52
|
+
}
|
|
53
|
+
function buildTargetArchitecture(domain, ruleIds, rules, adapterGlobs) {
|
|
54
|
+
const layerId = domain === "content" ? "content" : "app";
|
|
55
|
+
const layers = [{ id: layerId, globs: [...adapterGlobs] }];
|
|
56
|
+
return {
|
|
57
|
+
schema_version: TARGET_ARCHITECTURE_V3_SCHEMA_VERSION,
|
|
58
|
+
domain,
|
|
59
|
+
scan_roots: adapterGlobs.map((g) => g.replace(/\/\*\*$/, "")),
|
|
60
|
+
languages: domain === "content" ? ["markdown", "html", "text"] : ["typescript"],
|
|
61
|
+
layers,
|
|
62
|
+
rules: rules.filter((r) => r != null),
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
/** Emit tri-artifact blueprint output from interview answers. */
|
|
66
|
+
export function emitBlueprintArtifacts(repoRoot, proposal, questions, answers, domain) {
|
|
67
|
+
const adapter = getDomainAdapter(domain ?? proposal.domain ?? "code");
|
|
68
|
+
const rules = questions
|
|
69
|
+
.map((q) => {
|
|
70
|
+
const answer = answers.find((a) => a.questionId === q.id);
|
|
71
|
+
if (!answer)
|
|
72
|
+
return null;
|
|
73
|
+
const ev = proposal.anomalies
|
|
74
|
+
.flatMap((a) => a.evidence)
|
|
75
|
+
.concat(proposal.conventions.flatMap((c) => c.evidence))
|
|
76
|
+
.find((e) => e.file === q.evidence.file && e.line === q.evidence.line);
|
|
77
|
+
if (!ev)
|
|
78
|
+
return null;
|
|
79
|
+
return adapter.buildRuleFromAnswer(q, answer.choice, ev);
|
|
80
|
+
})
|
|
81
|
+
.filter((r) => r != null);
|
|
82
|
+
const ruleIds = rules.map((r) => r.id);
|
|
83
|
+
const gateCommands = answers
|
|
84
|
+
.filter((a) => a.gateCommand && a.gateCommand.trim().length > 0)
|
|
85
|
+
.map((a, i) => ({
|
|
86
|
+
rule_id: ruleIds[i] ?? `gate-${i + 1}`,
|
|
87
|
+
command: a.gateCommand.trim(),
|
|
88
|
+
description: `Gate for ${a.questionId}`,
|
|
89
|
+
}));
|
|
90
|
+
if (gateCommands.length === 0) {
|
|
91
|
+
gateCommands.push({
|
|
92
|
+
rule_id: "default-gate",
|
|
93
|
+
command: adapter.key === "content" ? "gantry perimeter check" : "npm test",
|
|
94
|
+
description: "Default project gate",
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
const plan = buildVerificationPlan({
|
|
98
|
+
ruleIds,
|
|
99
|
+
gateCommands,
|
|
100
|
+
requiredSkills: detectRequiredSkills(repoRoot, gateCommands, answers),
|
|
101
|
+
});
|
|
102
|
+
const archMd = buildArchitectureMarkdown(questions, answers, ruleIds, adapter.key);
|
|
103
|
+
const archMdAbs = path.join(repoRoot, ARCHITECTURE_MD_FILENAME);
|
|
104
|
+
fs.writeFileSync(archMdAbs, archMd, "utf8");
|
|
105
|
+
const yamlSpec = buildTargetArchitecture(adapter.key, ruleIds, rules, adapter.defaultScanGlobs);
|
|
106
|
+
const yamlAbs = path.join(repoRoot, TARGET_ARCHITECTURE_FILENAME);
|
|
107
|
+
fs.writeFileSync(yamlAbs, YAML.stringify(yamlSpec), "utf8");
|
|
108
|
+
const planAbs = path.join(repoRoot, VERIFICATION_PLAN_REL.split("/").join(path.sep));
|
|
109
|
+
fs.mkdirSync(path.dirname(planAbs), { recursive: true });
|
|
110
|
+
fs.writeFileSync(planAbs, serializeVerificationPlan(plan), "utf8");
|
|
111
|
+
return {
|
|
112
|
+
architectureMdPath: ARCHITECTURE_MD_FILENAME,
|
|
113
|
+
targetArchitecturePath: TARGET_ARCHITECTURE_FILENAME,
|
|
114
|
+
verificationPlanPath: toPosixRel(repoRoot, planAbs),
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
export function runBlueprintDiscovery(repoRoot, domain) {
|
|
118
|
+
return runDiscoveryScan(repoRoot, { domain });
|
|
119
|
+
}
|
|
120
|
+
export function checksumArchitectureMarkdown(mdBody, ruleIds) {
|
|
121
|
+
const payload = JSON.stringify({
|
|
122
|
+
rule_ids: [...ruleIds].sort(),
|
|
123
|
+
md_sha256: createHash("sha256").update(mdBody).digest("hex"),
|
|
124
|
+
});
|
|
125
|
+
return createHash("sha256").update(payload, "utf8").digest("hex");
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=blueprint-engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"blueprint-engine.js","sourceRoot":"","sources":["../../../src/cli/lib/blueprint-engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { type DiscoveryProposal } from "./discovery-scanner.js";
|
|
2
|
+
export declare const DISCOVERY_PROPOSAL_REL: ".gitagent/discovery-proposal.json";
|
|
3
|
+
export interface DiscoveryApplyResult {
|
|
4
|
+
proposalPath: string;
|
|
5
|
+
targetArchitecturePath?: string;
|
|
6
|
+
manifestPath?: string;
|
|
7
|
+
}
|
|
8
|
+
/** Emit discovery proposal JSON without writing baseline governance files. */
|
|
9
|
+
export declare function emitDiscoveryProposal(repoRoot: string, options?: {
|
|
10
|
+
domain?: string;
|
|
11
|
+
onProgress?: (n: number) => void;
|
|
12
|
+
}): {
|
|
13
|
+
proposal: DiscoveryProposal;
|
|
14
|
+
proposalPath: string;
|
|
15
|
+
};
|
|
16
|
+
/** Apply confirmed discovery proposal to draft TARGET_ARCHITECTURE.yaml + MANIFEST.json. */
|
|
17
|
+
export declare function applyDiscoveryProposal(repoRoot: string, proposal: DiscoveryProposal): DiscoveryApplyResult;
|
|
18
|
+
export declare function loadDiscoveryProposal(repoRoot: string): DiscoveryProposal | null;
|
|
19
|
+
//# sourceMappingURL=discovery-proposal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discovery-proposal.d.ts","sourceRoot":"","sources":["../../../src/cli/lib/discovery-proposal.ts"],"names":[],"mappings":"AAYA,OAAO,EACL,KAAK,iBAAiB,EAGvB,MAAM,wBAAwB,CAAC;AAEhC,eAAO,MAAM,sBAAsB,EAAG,mCAA4C,CAAC;AAEnF,MAAM,WAAW,oBAAoB;IACnC,YAAY,EAAE,MAAM,CAAC;IACrB,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAMD,8EAA8E;AAC9E,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAA;CAAO,GAClE;IAAE,QAAQ,EAAE,iBAAiB,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAMvD;AAyED,4FAA4F;AAC5F,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,iBAAiB,GAAG,oBAAoB,CAc1G;AAED,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI,CAIhF"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import YAML from "yaml";
|
|
4
|
+
import { REL_MANIFEST } from "./constants.js";
|
|
5
|
+
import { toPosixRel } from "./cli-io.js";
|
|
6
|
+
import { TARGET_ARCHITECTURE_FILENAME, TARGET_ARCHITECTURE_SCHEMA_VERSION, TARGET_ARCHITECTURE_V3_SCHEMA_VERSION, } from "./target-architecture.js";
|
|
7
|
+
import { getDomainAdapter } from "./domains/index.js";
|
|
8
|
+
import { runDiscoveryScan, serializeDiscoveryProposal, } from "./discovery-scanner.js";
|
|
9
|
+
export const DISCOVERY_PROPOSAL_REL = ".gitagent/discovery-proposal.json";
|
|
10
|
+
function proposalPath(repoRoot) {
|
|
11
|
+
return path.join(repoRoot, DISCOVERY_PROPOSAL_REL.split("/").join(path.sep));
|
|
12
|
+
}
|
|
13
|
+
/** Emit discovery proposal JSON without writing baseline governance files. */
|
|
14
|
+
export function emitDiscoveryProposal(repoRoot, options = {}) {
|
|
15
|
+
const proposal = runDiscoveryScan(repoRoot, options);
|
|
16
|
+
const out = proposalPath(repoRoot);
|
|
17
|
+
fs.mkdirSync(path.dirname(out), { recursive: true });
|
|
18
|
+
fs.writeFileSync(out, serializeDiscoveryProposal(proposal), "utf8");
|
|
19
|
+
return { proposal, proposalPath: toPosixRel(repoRoot, out) };
|
|
20
|
+
}
|
|
21
|
+
function inferLayersFromProposal(proposal) {
|
|
22
|
+
const layerDirs = new Set();
|
|
23
|
+
for (const edge of proposal.dependency_edges) {
|
|
24
|
+
const dir = edge.from_file.includes("/") ? edge.from_file.split("/")[0] : "src";
|
|
25
|
+
layerDirs.add(dir);
|
|
26
|
+
}
|
|
27
|
+
if (layerDirs.size === 0) {
|
|
28
|
+
return [{ id: "app", globs: ["src/**"] }];
|
|
29
|
+
}
|
|
30
|
+
return [...layerDirs]
|
|
31
|
+
.sort()
|
|
32
|
+
.map((dir) => ({ id: dir.replace(/[^a-z0-9_]/gi, "_"), globs: [`${dir}/**`] }));
|
|
33
|
+
}
|
|
34
|
+
function buildDraftTargetArchitecture(proposal) {
|
|
35
|
+
const adapter = getDomainAdapter(proposal.domain ?? "code");
|
|
36
|
+
if (adapter.key === "content") {
|
|
37
|
+
const globs = [...adapter.defaultScanGlobs];
|
|
38
|
+
return {
|
|
39
|
+
schema_version: TARGET_ARCHITECTURE_V3_SCHEMA_VERSION,
|
|
40
|
+
domain: "content",
|
|
41
|
+
scan_roots: globs.map((g) => g.replace(/\/\*\*$/, "")),
|
|
42
|
+
languages: ["markdown", "html", "text"],
|
|
43
|
+
layers: [{ id: "content", globs }],
|
|
44
|
+
rules: [],
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
const layers = inferLayersFromProposal(proposal);
|
|
48
|
+
const scan_roots = layers.map((l) => l.globs[0].replace(/\/\*\*$/, ""));
|
|
49
|
+
return {
|
|
50
|
+
schema_version: TARGET_ARCHITECTURE_SCHEMA_VERSION,
|
|
51
|
+
domain: "code",
|
|
52
|
+
scan_roots,
|
|
53
|
+
languages: ["typescript"],
|
|
54
|
+
layers,
|
|
55
|
+
rules: [],
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
function buildDraftManifest(repoRoot) {
|
|
59
|
+
const pkgPath = path.join(repoRoot, "package.json");
|
|
60
|
+
let skillKey = "app";
|
|
61
|
+
if (fs.existsSync(pkgPath)) {
|
|
62
|
+
try {
|
|
63
|
+
const pkg = JSON.parse(fs.readFileSync(pkgPath, "utf8"));
|
|
64
|
+
const name = pkg.name?.split("/").pop() ?? "app";
|
|
65
|
+
skillKey = name.replace(/[^a-z0-9_-]/gi, "_").slice(0, 32) || "app";
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
/* keep default */
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return {
|
|
72
|
+
schema_version: "0.5.0",
|
|
73
|
+
skills: {
|
|
74
|
+
[skillKey]: {
|
|
75
|
+
desc: "Auto-discovered skill scaffold (confirm before merge).",
|
|
76
|
+
trust_threshold: "Tier-2",
|
|
77
|
+
tmvc_roots: ["src/"],
|
|
78
|
+
forbidden_zones: [".gitagent/foreman/", ".gitagent/planner/RULES.md"],
|
|
79
|
+
},
|
|
80
|
+
},
|
|
81
|
+
path_risks: { "src/": "Tier-2" },
|
|
82
|
+
risk_keywords: ["refactor", "migrate", "delete", "security", "schema"],
|
|
83
|
+
perimeter_protected: [
|
|
84
|
+
"**/.gxt-skill.yaml",
|
|
85
|
+
".gitagent/foreman/MANIFEST.json",
|
|
86
|
+
".gitagent/planner/RULES.md",
|
|
87
|
+
],
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
/** Apply confirmed discovery proposal to draft TARGET_ARCHITECTURE.yaml + MANIFEST.json. */
|
|
91
|
+
export function applyDiscoveryProposal(repoRoot, proposal) {
|
|
92
|
+
const archBody = YAML.stringify(buildDraftTargetArchitecture(proposal));
|
|
93
|
+
const archAbs = path.join(repoRoot, TARGET_ARCHITECTURE_FILENAME);
|
|
94
|
+
fs.writeFileSync(archAbs, archBody, "utf8");
|
|
95
|
+
const manifestAbs = path.join(repoRoot, REL_MANIFEST.split("/").join(path.sep));
|
|
96
|
+
fs.mkdirSync(path.dirname(manifestAbs), { recursive: true });
|
|
97
|
+
fs.writeFileSync(manifestAbs, `${JSON.stringify(buildDraftManifest(repoRoot), null, 2)}\n`, "utf8");
|
|
98
|
+
return {
|
|
99
|
+
proposalPath: DISCOVERY_PROPOSAL_REL,
|
|
100
|
+
targetArchitecturePath: TARGET_ARCHITECTURE_FILENAME,
|
|
101
|
+
manifestPath: REL_MANIFEST,
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
export function loadDiscoveryProposal(repoRoot) {
|
|
105
|
+
const abs = proposalPath(repoRoot);
|
|
106
|
+
if (!fs.existsSync(abs))
|
|
107
|
+
return null;
|
|
108
|
+
return JSON.parse(fs.readFileSync(abs, "utf8"));
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=discovery-proposal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discovery-proposal.js","sourceRoot":"","sources":["../../../src/cli/lib/discovery-proposal.ts"],"names":[],"mappings":"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"}
|