@topogram/cli 0.3.64 → 0.3.65
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/package.json +1 -1
- package/src/adoption/plan/index.js +703 -0
- package/src/adoption/plan.js +12 -703
- package/src/agent-ops/query-builders/auth.js +375 -0
- package/src/agent-ops/query-builders/change-risk/change-plan.js +123 -0
- package/src/agent-ops/query-builders/change-risk/import-plan.js +49 -0
- package/src/agent-ops/query-builders/change-risk/maintained.js +286 -0
- package/src/agent-ops/query-builders/change-risk/review-packets.js +123 -0
- package/src/agent-ops/query-builders/change-risk/risk.js +189 -0
- package/src/agent-ops/query-builders/change-risk.js +25 -0
- package/src/agent-ops/query-builders/common.js +149 -0
- package/src/agent-ops/query-builders/maintained-risk.js +539 -0
- package/src/agent-ops/query-builders/maintained-shared.js +120 -0
- package/src/agent-ops/query-builders/multi-agent.js +547 -0
- package/src/agent-ops/query-builders/projection-impacts.js +514 -0
- package/src/agent-ops/query-builders/work-packets.js +417 -0
- package/src/agent-ops/query-builders/workflow-context-shared.js +300 -0
- package/src/agent-ops/query-builders/workflow-context.js +398 -0
- package/src/agent-ops/query-builders/workflow-presets-core.js +676 -0
- package/src/agent-ops/query-builders/workflow-presets.js +341 -0
- package/src/agent-ops/query-builders.d.ts +26 -26
- package/src/agent-ops/query-builders.js +42 -5021
- package/src/catalog/constants.js +10 -0
- package/src/catalog/copy.js +60 -0
- package/src/catalog/diagnostics.js +15 -0
- package/src/catalog/entries.js +42 -0
- package/src/catalog/files.js +67 -0
- package/src/catalog/provenance.js +122 -0
- package/src/catalog/source.js +150 -0
- package/src/catalog/validation.js +252 -0
- package/src/catalog.d.ts +2 -0
- package/src/catalog.js +18 -746
- package/src/cli/commands/catalog/check.js +31 -0
- package/src/cli/commands/catalog/copy.js +59 -0
- package/src/cli/commands/catalog/doctor.js +248 -0
- package/src/cli/commands/catalog/help.js +21 -0
- package/src/cli/commands/catalog/list.js +52 -0
- package/src/cli/commands/catalog/runner.js +92 -0
- package/src/cli/commands/catalog/shared.js +17 -0
- package/src/cli/commands/catalog/show.js +134 -0
- package/src/cli/commands/catalog.js +30 -615
- package/src/cli/commands/generator-policy/package-info.js +162 -0
- package/src/cli/commands/generator-policy/payloads.js +372 -0
- package/src/cli/commands/generator-policy/printers.js +159 -0
- package/src/cli/commands/generator-policy/runner.js +81 -0
- package/src/cli/commands/generator-policy/shared.js +39 -0
- package/src/cli/commands/generator-policy.js +15 -783
- package/src/cli/commands/import/adopt.js +170 -0
- package/src/cli/commands/import/check.js +91 -0
- package/src/cli/commands/import/diff.js +84 -0
- package/src/cli/commands/import/help.js +47 -0
- package/src/cli/commands/import/paths.js +277 -0
- package/src/cli/commands/import/plan.js +284 -0
- package/src/cli/commands/import/refresh.js +470 -0
- package/src/cli/commands/import/status-history.js +196 -0
- package/src/cli/commands/import/workspace.js +230 -0
- package/src/cli/commands/import.js +33 -1732
- package/src/cli/commands/package/constants.js +17 -0
- package/src/cli/commands/package/doctor.js +240 -0
- package/src/cli/commands/package/help.js +27 -0
- package/src/cli/commands/package/lockfile.js +135 -0
- package/src/cli/commands/package/npm.js +97 -0
- package/src/cli/commands/package/reporting.js +35 -0
- package/src/cli/commands/package/runner.js +33 -0
- package/src/cli/commands/package/shared.js +9 -0
- package/src/cli/commands/package/update-cli.js +252 -0
- package/src/cli/commands/package/versions.js +35 -0
- package/src/cli/commands/package.js +29 -813
- package/src/cli/commands/query/change-plan.js +68 -0
- package/src/cli/commands/query/definitions.js +202 -0
- package/src/cli/commands/query/import-adopt.js +121 -0
- package/src/cli/commands/query/runner/artifacts.js +102 -0
- package/src/cli/commands/query/runner/boundaries.js +211 -0
- package/src/cli/commands/query/runner/change.js +182 -0
- package/src/cli/commands/query/runner/import-adopt.js +111 -0
- package/src/cli/commands/query/runner/index.js +31 -0
- package/src/cli/commands/query/runner/output.js +12 -0
- package/src/cli/commands/query/runner/workflow.js +241 -0
- package/src/cli/commands/query/runner.js +3 -0
- package/src/cli/commands/query/workflow-context.js +5 -0
- package/src/cli/commands/query/workspace.js +274 -0
- package/src/cli/commands/query.js +9 -1300
- package/src/cli/commands/template/baseline.js +100 -0
- package/src/cli/commands/template/check.js +466 -0
- package/src/cli/commands/template/constants.js +8 -0
- package/src/cli/commands/template/diagnostics.js +26 -0
- package/src/cli/commands/template/help.js +28 -0
- package/src/cli/commands/template/lifecycle.js +404 -0
- package/src/cli/commands/template/list-show.js +287 -0
- package/src/cli/commands/template/policy.js +422 -0
- package/src/cli/commands/template/shared.js +127 -0
- package/src/cli/commands/template/updates.js +352 -0
- package/src/cli/commands/template.js +41 -2143
- package/src/generator/api/contracts.js +497 -0
- package/src/generator/api/metadata.js +221 -0
- package/src/generator/api/openapi.js +559 -0
- package/src/generator/api/schema.js +124 -0
- package/src/generator/api/types.d.ts +98 -0
- package/src/generator/api.js +3 -1195
- package/src/generator/context/shared/domain-sdlc.js +282 -0
- package/src/generator/context/shared/maintained-boundary.js +665 -0
- package/src/generator/context/shared/metrics.js +85 -0
- package/src/generator/context/shared/primitives.js +64 -0
- package/src/generator/context/shared/relationships.js +453 -0
- package/src/generator/context/shared/summaries.js +263 -0
- package/src/generator/context/shared/types.d.ts +207 -0
- package/src/generator/context/shared.d.ts +42 -0
- package/src/generator/context/shared.js +80 -1390
- package/src/generator/context/slice/core.js +397 -0
- package/src/generator/context/slice/sdlc.js +417 -0
- package/src/generator/context/slice/ui-packets.js +183 -0
- package/src/generator/context/slice.js +2 -859
- package/src/generator/registry/index.js +507 -0
- package/src/generator/registry.js +18 -504
- package/src/generator/runtime/environment/index.js +666 -0
- package/src/generator/runtime/environment.js +4 -666
- package/src/generator/runtime/runtime-check/index.js +554 -0
- package/src/generator/runtime/runtime-check.js +4 -554
- package/src/generator/runtime/shared/index.js +572 -0
- package/src/generator/runtime/shared.js +19 -570
- package/src/generator/shared.d.ts +2 -0
- package/src/generator/surfaces/shared.d.ts +3 -0
- package/src/generator/widget-conformance/behavior-report.js +258 -0
- package/src/generator/widget-conformance/checks.js +371 -0
- package/src/generator/widget-conformance/projection-context.js +200 -0
- package/src/generator/widget-conformance/report.js +166 -0
- package/src/generator/widget-conformance/types.d.ts +121 -0
- package/src/generator/widget-conformance.js +3 -824
- package/src/import/core/context.d.ts +3 -0
- package/src/import/core/contracts.d.ts +1 -0
- package/src/import/core/registry.d.ts +4 -0
- package/src/import/core/runner/candidates.js +217 -0
- package/src/import/core/runner/options.js +22 -0
- package/src/import/core/runner/reports.js +50 -0
- package/src/import/core/runner/run.js +79 -0
- package/src/import/core/runner/tracks.js +150 -0
- package/src/import/core/runner/ui-drafts.js +337 -0
- package/src/import/core/runner.js +3 -698
- package/src/import/core/shared/api-routes.js +221 -0
- package/src/import/core/shared/candidates.js +97 -0
- package/src/import/core/shared/files.js +177 -0
- package/src/import/core/shared/next-app.js +389 -0
- package/src/import/core/shared/types.d.ts +51 -0
- package/src/import/core/shared/ui-routes.js +230 -0
- package/src/import/core/shared.js +60 -861
- package/src/new-project/constants.js +128 -0
- package/src/new-project/create.js +83 -0
- package/src/new-project/json.js +28 -0
- package/src/new-project/metadata.js +96 -0
- package/src/new-project/package-spec.js +161 -0
- package/src/new-project/project-files.js +348 -0
- package/src/new-project/template-policy.js +269 -0
- package/src/new-project/template-resolution.js +368 -0
- package/src/new-project/template-snapshots.js +430 -0
- package/src/new-project/template-updates.js +512 -0
- package/src/new-project/types.d.ts +83 -0
- package/src/new-project.js +6 -2277
- package/src/parser.d.ts +87 -1
- package/src/parser.js +118 -0
- package/src/policy/review-boundaries.d.ts +15 -0
- package/src/project-config/index.js +564 -0
- package/src/project-config.js +19 -561
- package/src/resolver/enrich/acceptance-criterion.js +2 -0
- package/src/resolver/enrich/bug.js +2 -0
- package/src/resolver/enrich/pitch.js +2 -0
- package/src/resolver/enrich/requirement.js +2 -0
- package/src/resolver/enrich/task.js +2 -0
- package/src/resolver/index.js +19 -2089
- package/src/resolver/normalize.js +384 -1
- package/src/resolver/plans.js +168 -0
- package/src/resolver/projections-api.js +494 -0
- package/src/resolver/projections-db.js +133 -0
- package/src/resolver/projections-ui.js +317 -0
- package/src/resolver/shapes.js +251 -0
- package/src/resolver/shared.js +278 -0
- package/src/resolver/widgets.js +132 -0
- package/src/template-trust/constants.js +62 -0
- package/src/template-trust/content.js +258 -0
- package/src/template-trust/diff.js +92 -0
- package/src/template-trust/policy.js +61 -0
- package/src/template-trust/record.js +90 -0
- package/src/template-trust/status.js +182 -0
- package/src/template-trust.js +24 -687
- package/src/text-helpers.d.ts +1 -0
- package/src/topogram-types.d.ts +69 -0
- package/src/validator/common.js +488 -0
- package/src/validator/data-model.js +237 -0
- package/src/validator/docs.js +167 -0
- package/src/validator/expressions.js +146 -1
- package/src/validator/index.d.ts +23 -0
- package/src/validator/index.js +32 -3585
- package/src/validator/kinds.d.ts +41 -0
- package/src/validator/kinds.js +2 -0
- package/src/validator/model-helpers.js +46 -0
- package/src/validator/per-kind/acceptance-criterion.js +5 -0
- package/src/validator/per-kind/bug.js +6 -0
- package/src/validator/per-kind/domain.js +15 -2
- package/src/validator/per-kind/pitch.js +7 -0
- package/src/validator/per-kind/requirement.js +5 -0
- package/src/validator/per-kind/task.js +7 -0
- package/src/validator/per-kind/widget.js +14 -0
- package/src/validator/projections/api-http-async.js +410 -0
- package/src/validator/projections/api-http-authz.js +88 -0
- package/src/validator/projections/api-http-core.js +205 -0
- package/src/validator/projections/api-http-policies.js +339 -0
- package/src/validator/projections/api-http-responses.js +233 -0
- package/src/validator/projections/api-http.js +44 -0
- package/src/validator/projections/db.js +353 -0
- package/src/validator/projections/generator-defaults.js +45 -0
- package/src/validator/projections/helpers.js +87 -0
- package/src/validator/projections/ui-helpers.js +214 -0
- package/src/validator/projections/ui-navigation.js +344 -0
- package/src/validator/projections/ui-structure.js +364 -0
- package/src/validator/projections/ui-widgets.js +493 -0
- package/src/validator/projections/ui.js +46 -0
- package/src/validator/registry.js +48 -1
- package/src/validator/utils.d.ts +20 -0
- package/src/validator/utils.js +115 -12
- package/src/widget-behavior.d.ts +1 -0
- package/src/workflows/import-app/api/collect.js +221 -0
- package/src/workflows/import-app/api/openapi.js +257 -0
- package/src/workflows/import-app/api/routes.js +327 -0
- package/src/workflows/import-app/api/sources.js +22 -0
- package/src/workflows/import-app/api.js +2 -797
- package/src/workflows/reconcile/adoption-plan/build.js +208 -0
- package/src/workflows/reconcile/adoption-plan/dependencies.js +75 -0
- package/src/workflows/reconcile/adoption-plan/outputs.js +143 -0
- package/src/workflows/reconcile/adoption-plan/paths.js +58 -0
- package/src/workflows/reconcile/adoption-plan/projection-patches.js +177 -0
- package/src/workflows/reconcile/adoption-plan/reasons.js +107 -0
- package/src/workflows/reconcile/adoption-plan.js +30 -740
- package/src/workflows/reconcile/auth/closures.js +115 -0
- package/src/workflows/reconcile/auth/formatters.js +142 -0
- package/src/workflows/reconcile/auth/inference.js +330 -0
- package/src/workflows/reconcile/auth/roles.js +122 -0
- package/src/workflows/reconcile/auth.js +35 -690
- package/src/workflows/reconcile/bundle-core/index.js +600 -0
- package/src/workflows/reconcile/bundle-core.js +12 -598
- package/src/workflows/reconcile/canonical-surface.js +1 -1
- package/src/workflows/reconcile/impacts/adoption-plan.js +192 -0
- package/src/workflows/reconcile/impacts/indexes.js +101 -0
- package/src/workflows/reconcile/impacts/patches.js +252 -0
- package/src/workflows/reconcile/impacts/reports.js +80 -0
- package/src/workflows/reconcile/impacts.js +14 -623
- package/src/workspace-docs.d.ts +29 -0
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
|
|
3
|
+
import { recommendedVerificationTargets } from "../../../../generator/context/shared.js";
|
|
4
|
+
import { parsePath } from "../../../../parser.js";
|
|
5
|
+
import { resolveWorkspace } from "../../../../resolver.js";
|
|
6
|
+
import {
|
|
7
|
+
buildMaintainedConformancePayload,
|
|
8
|
+
buildMaintainedDriftPayload,
|
|
9
|
+
buildSeamCheckPayload
|
|
10
|
+
} from "../../../../agent-ops/query-builders.js";
|
|
11
|
+
import {
|
|
12
|
+
artifactOrNull,
|
|
13
|
+
buildDiff,
|
|
14
|
+
buildMaintainedBundle,
|
|
15
|
+
buildSlice,
|
|
16
|
+
buildTaskMode,
|
|
17
|
+
hasSelectors,
|
|
18
|
+
printValidationFailure,
|
|
19
|
+
resultOk,
|
|
20
|
+
selectorOptions
|
|
21
|
+
} from "../workspace.js";
|
|
22
|
+
import { printJson } from "./output.js";
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* @typedef {Record<string, any>} AnyRecord
|
|
26
|
+
*/
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* @param {AnyRecord} context
|
|
30
|
+
* @returns {number|null}
|
|
31
|
+
*/
|
|
32
|
+
export function runBoundaryQuery(context) {
|
|
33
|
+
const queryName = context.commandArgs?.queryName;
|
|
34
|
+
const selectors = selectorOptions(context);
|
|
35
|
+
|
|
36
|
+
if (queryName === "maintained-drift") {
|
|
37
|
+
if (!context.fromTopogramPath) {
|
|
38
|
+
throw new Error("query maintained-drift requires --from-topogram <path>.");
|
|
39
|
+
}
|
|
40
|
+
const ast = parsePath(context.inputPath);
|
|
41
|
+
const diffResult = buildDiff(ast, context.fromTopogramPath);
|
|
42
|
+
if (diffResult && !resultOk(diffResult)) return printValidationFailure(diffResult);
|
|
43
|
+
const maintainedBundleResult = buildMaintainedBundle(ast);
|
|
44
|
+
if (!resultOk(maintainedBundleResult)) return printValidationFailure(maintainedBundleResult);
|
|
45
|
+
const taskModeResult = buildTaskMode(ast, {}, "diff-review", context.fromTopogramPath);
|
|
46
|
+
if (!resultOk(taskModeResult)) return printValidationFailure(taskModeResult);
|
|
47
|
+
return printJson(buildMaintainedDriftPayload({
|
|
48
|
+
diffArtifact: diffResult?.artifact || null,
|
|
49
|
+
maintainedBoundaryArtifact: maintainedBundleResult.artifact.maintained_boundary || null,
|
|
50
|
+
verificationTargets: maintainedBundleResult.artifact.verification_targets || taskModeResult.artifact.verification_targets || null,
|
|
51
|
+
nextAction: taskModeResult.artifact.next_action || null
|
|
52
|
+
}));
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
if (queryName === "maintained-conformance") {
|
|
56
|
+
const ast = parsePath(context.inputPath);
|
|
57
|
+
const resolved = resolveWorkspace(ast);
|
|
58
|
+
if (!resultOk(resolved)) return printValidationFailure(resolved);
|
|
59
|
+
const diffResult = buildDiff(ast, context.fromTopogramPath);
|
|
60
|
+
if (diffResult && !resultOk(diffResult)) return printValidationFailure(diffResult);
|
|
61
|
+
const maintainedBundleResult = buildMaintainedBundle(ast);
|
|
62
|
+
if (!resultOk(maintainedBundleResult)) return printValidationFailure(maintainedBundleResult);
|
|
63
|
+
const taskModeResult = buildTaskMode(ast, {}, context.fromTopogramPath ? "diff-review" : "verification", context.fromTopogramPath);
|
|
64
|
+
if (!resultOk(taskModeResult)) return printValidationFailure(taskModeResult);
|
|
65
|
+
return printJson(buildMaintainedConformancePayload({
|
|
66
|
+
graph: resolved.graph,
|
|
67
|
+
diffArtifact: artifactOrNull(diffResult),
|
|
68
|
+
maintainedBoundaryArtifact: maintainedBundleResult.artifact.maintained_boundary || null,
|
|
69
|
+
verificationTargets: maintainedBundleResult.artifact.verification_targets || taskModeResult.artifact.verification_targets || null,
|
|
70
|
+
nextAction: taskModeResult.artifact.next_action || null
|
|
71
|
+
}));
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
if (queryName === "seam-check") {
|
|
75
|
+
const ast = parsePath(context.inputPath);
|
|
76
|
+
const resolved = resolveWorkspace(ast);
|
|
77
|
+
if (!resultOk(resolved)) return printValidationFailure(resolved);
|
|
78
|
+
const diffResult = buildDiff(ast, context.fromTopogramPath);
|
|
79
|
+
if (diffResult && !resultOk(diffResult)) return printValidationFailure(diffResult);
|
|
80
|
+
const maintainedBundleResult = buildMaintainedBundle(ast);
|
|
81
|
+
if (!resultOk(maintainedBundleResult)) return printValidationFailure(maintainedBundleResult);
|
|
82
|
+
const taskModeResult = buildTaskMode(ast, {}, context.fromTopogramPath ? "diff-review" : "verification", context.fromTopogramPath);
|
|
83
|
+
if (!resultOk(taskModeResult)) return printValidationFailure(taskModeResult);
|
|
84
|
+
return printJson(buildSeamCheckPayload({
|
|
85
|
+
graph: resolved.graph,
|
|
86
|
+
maintainedBoundaryArtifact: maintainedBundleResult.artifact.maintained_boundary || null,
|
|
87
|
+
diffArtifact: artifactOrNull(diffResult),
|
|
88
|
+
verificationTargets: maintainedBundleResult.artifact.verification_targets || taskModeResult.artifact.verification_targets || null,
|
|
89
|
+
nextAction: taskModeResult.artifact.next_action || null,
|
|
90
|
+
seamId: context.seamId
|
|
91
|
+
}));
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
if (queryName === "review-boundary") {
|
|
95
|
+
const result = buildSlice(parsePath(context.inputPath), selectors);
|
|
96
|
+
if (!resultOk(result)) return printValidationFailure(result);
|
|
97
|
+
return printJson({
|
|
98
|
+
type: "review_boundary_query",
|
|
99
|
+
focus: result.artifact.focus,
|
|
100
|
+
review_boundary: result.artifact.review_boundary,
|
|
101
|
+
ownership_boundary: result.artifact.ownership_boundary,
|
|
102
|
+
write_scope: result.artifact.write_scope || null,
|
|
103
|
+
verification_targets: result.artifact.verification_targets || null
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
if (queryName === "write-scope") {
|
|
108
|
+
return runWriteScopeQuery(context, selectors);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
if (queryName === "verification-targets") {
|
|
112
|
+
return runVerificationTargetsQuery(context, selectors);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
return null;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* @param {AnyRecord} context
|
|
120
|
+
* @param {AnyRecord} selectors
|
|
121
|
+
* @returns {number}
|
|
122
|
+
*/
|
|
123
|
+
function runWriteScopeQuery(context, selectors) {
|
|
124
|
+
const ast = parsePath(context.inputPath);
|
|
125
|
+
if (context.modeId || (!hasSelectors(context) && !context.fromTopogramPath)) {
|
|
126
|
+
const result = buildTaskMode(ast, selectors, context.modeId || "verification", context.fromTopogramPath);
|
|
127
|
+
if (!resultOk(result)) return printValidationFailure(result);
|
|
128
|
+
return printJson({
|
|
129
|
+
type: "write_scope_query",
|
|
130
|
+
source: "context-task-mode",
|
|
131
|
+
mode: result.artifact.mode,
|
|
132
|
+
summary: result.artifact.summary || null,
|
|
133
|
+
rationale: "Task mode write scope is the safest file-boundary contract for the selected operating mode.",
|
|
134
|
+
write_scope: result.artifact.write_scope || null
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
if (context.surfaceId === "maintained-boundary") {
|
|
138
|
+
const result = buildMaintainedBundle(ast);
|
|
139
|
+
if (!resultOk(result)) return printValidationFailure(result);
|
|
140
|
+
return printJson({
|
|
141
|
+
type: "write_scope_query",
|
|
142
|
+
source: "maintained-boundary",
|
|
143
|
+
summary: {
|
|
144
|
+
maintained_file_count: (result.artifact.maintained_boundary?.maintained_files_in_scope || []).length
|
|
145
|
+
},
|
|
146
|
+
rationale: "Maintained-boundary write scope isolates the human-owned application files currently in scope.",
|
|
147
|
+
write_scope: result.artifact.write_scope || null
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
const result = buildSlice(ast, selectors);
|
|
151
|
+
if (!resultOk(result)) return printValidationFailure(result);
|
|
152
|
+
return printJson({
|
|
153
|
+
type: "write_scope_query",
|
|
154
|
+
source: "context-slice",
|
|
155
|
+
focus: result.artifact.focus,
|
|
156
|
+
summary: result.artifact.summary || null,
|
|
157
|
+
rationale: "Slice write scope is the narrowest file-boundary contract attached to the selected semantic surface.",
|
|
158
|
+
write_scope: result.artifact.write_scope || null
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* @param {AnyRecord} context
|
|
164
|
+
* @param {AnyRecord} selectors
|
|
165
|
+
* @returns {number}
|
|
166
|
+
*/
|
|
167
|
+
function runVerificationTargetsQuery(context, selectors) {
|
|
168
|
+
const ast = parsePath(context.inputPath);
|
|
169
|
+
if (context.modeId || (!hasSelectors(context) && !context.fromTopogramPath)) {
|
|
170
|
+
const result = buildTaskMode(ast, selectors, context.modeId || "verification", context.fromTopogramPath);
|
|
171
|
+
if (!resultOk(result)) return printValidationFailure(result);
|
|
172
|
+
return printJson({
|
|
173
|
+
type: "verification_targets_query",
|
|
174
|
+
source: "context-task-mode",
|
|
175
|
+
mode: result.artifact.mode,
|
|
176
|
+
summary: result.artifact.summary || null,
|
|
177
|
+
verification_targets: result.artifact.verification_targets || null
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
if (context.fromTopogramPath) {
|
|
181
|
+
const resolved = resolveWorkspace(ast);
|
|
182
|
+
if (!resultOk(resolved)) return printValidationFailure(resolved);
|
|
183
|
+
const result = buildDiff(ast, context.fromTopogramPath);
|
|
184
|
+
if (result && !resultOk(result)) return printValidationFailure(result);
|
|
185
|
+
const affectedVerificationIds = (result?.artifact?.affected_verifications || []).map((/** @type {AnyRecord} */ item) => item.id);
|
|
186
|
+
const verificationTargets = recommendedVerificationTargets(resolved.graph, affectedVerificationIds, {
|
|
187
|
+
includeMaintainedApp: Boolean(result?.artifact?.affected_maintained_surfaces?.ownership_interpretation?.maintained_code_impact),
|
|
188
|
+
rationale: "Diff verification targets should cover the affected semantic proof set and any maintained-app proof gates."
|
|
189
|
+
});
|
|
190
|
+
return printJson({
|
|
191
|
+
type: "verification_targets_query",
|
|
192
|
+
source: "context-diff",
|
|
193
|
+
summary: {
|
|
194
|
+
baseline_root: result?.artifact?.baseline_root,
|
|
195
|
+
affected_verification_count: affectedVerificationIds.length,
|
|
196
|
+
maintained_code_impact: Boolean(result?.artifact?.affected_maintained_surfaces?.ownership_interpretation?.maintained_code_impact)
|
|
197
|
+
},
|
|
198
|
+
verification_targets: verificationTargets,
|
|
199
|
+
affected_verifications: result?.artifact?.affected_verifications || []
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
const result = buildSlice(ast, selectors);
|
|
203
|
+
if (!resultOk(result)) return printValidationFailure(result);
|
|
204
|
+
return printJson({
|
|
205
|
+
type: "verification_targets_query",
|
|
206
|
+
source: "context-slice",
|
|
207
|
+
focus: result.artifact.focus,
|
|
208
|
+
summary: result.artifact.summary || null,
|
|
209
|
+
verification_targets: result.artifact.verification_targets || null
|
|
210
|
+
});
|
|
211
|
+
}
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
|
|
3
|
+
import fs from "node:fs";
|
|
4
|
+
|
|
5
|
+
import {
|
|
6
|
+
buildCanonicalWritesPayloadForChangePlan,
|
|
7
|
+
buildCanonicalWritesPayloadForImportPlan,
|
|
8
|
+
buildResolvedWorkflowContextPayload,
|
|
9
|
+
buildReviewPacketPayloadForChangePlan,
|
|
10
|
+
buildReviewPacketPayloadForImportPlan,
|
|
11
|
+
buildRiskSummaryPayload,
|
|
12
|
+
classifyRisk,
|
|
13
|
+
proceedDecisionFromRisk
|
|
14
|
+
} from "../../../../agent-ops/query-builders.js";
|
|
15
|
+
import { parsePath } from "../../../../parser.js";
|
|
16
|
+
import { buildChangePlanContext } from "../change-plan.js";
|
|
17
|
+
import { buildImportPlanForContext } from "../import-adopt.js";
|
|
18
|
+
import {
|
|
19
|
+
adoptionPlanPath,
|
|
20
|
+
buildTaskMode,
|
|
21
|
+
normalizeTopogramPath,
|
|
22
|
+
printValidationFailure,
|
|
23
|
+
readJson,
|
|
24
|
+
resultOk,
|
|
25
|
+
selectorOptions,
|
|
26
|
+
shouldUseImportAdoptPath,
|
|
27
|
+
workflowPresetSelectors
|
|
28
|
+
} from "../workspace.js";
|
|
29
|
+
import { printJson } from "./output.js";
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* @typedef {Record<string, any>} AnyRecord
|
|
33
|
+
*/
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* @param {AnyRecord} context
|
|
37
|
+
* @returns {number|null}
|
|
38
|
+
*/
|
|
39
|
+
export function runChangeQuery(context) {
|
|
40
|
+
const queryName = context.commandArgs?.queryName;
|
|
41
|
+
const selectors = selectorOptions(context);
|
|
42
|
+
|
|
43
|
+
if (queryName === "change-plan") {
|
|
44
|
+
const built = buildChangePlanContext(context, "modeling");
|
|
45
|
+
const failure = validateChangePlanBuild(built);
|
|
46
|
+
if (failure !== null) return failure;
|
|
47
|
+
return printJson(built.changePlan);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
if (queryName === "risk-summary") {
|
|
51
|
+
if (hasImportPlan(context)) {
|
|
52
|
+
const built = buildImportPlanForContext(context, "risk-summary");
|
|
53
|
+
if (!resultOk(built)) return printValidationFailure(built);
|
|
54
|
+
const risk = classifyRisk({
|
|
55
|
+
importPlan: built.importPlan,
|
|
56
|
+
verificationTargets: built.importPlan.verification_targets,
|
|
57
|
+
maintainedRisk: built.importPlan.maintained_risk || null
|
|
58
|
+
});
|
|
59
|
+
return printJson(buildRiskSummaryPayload({
|
|
60
|
+
source: "import-plan",
|
|
61
|
+
risk,
|
|
62
|
+
nextAction: built.importPlan.next_action || null,
|
|
63
|
+
maintainedRisk: built.importPlan.maintained_risk || null
|
|
64
|
+
}));
|
|
65
|
+
}
|
|
66
|
+
const built = buildChangePlanContext(context, "modeling");
|
|
67
|
+
const failure = validateChangePlanBuild(built);
|
|
68
|
+
if (failure !== null) return failure;
|
|
69
|
+
const risk = riskFromChangePlanBuild(built);
|
|
70
|
+
return printJson(buildRiskSummaryPayload({
|
|
71
|
+
source: "change-plan",
|
|
72
|
+
risk,
|
|
73
|
+
nextAction: built.changePlan.next_action || null,
|
|
74
|
+
maintainedRisk: built.maintainedRisk
|
|
75
|
+
}));
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
if (queryName === "canonical-writes") {
|
|
79
|
+
if (hasImportPlan(context)) {
|
|
80
|
+
const adoptionPlan = readJson(adoptionPlanPath(normalizeTopogramPath(context.inputPath)));
|
|
81
|
+
return printJson(buildCanonicalWritesPayloadForImportPlan(adoptionPlan.imported_proposal_surfaces || []));
|
|
82
|
+
}
|
|
83
|
+
const result = buildTaskMode(parsePath(context.inputPath), selectors, context.modeId || "modeling", context.fromTopogramPath);
|
|
84
|
+
if (!resultOk(result)) return printValidationFailure(result);
|
|
85
|
+
return printJson(buildCanonicalWritesPayloadForChangePlan(result.artifact.write_scope));
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
if (queryName === "proceed-decision") {
|
|
89
|
+
if (hasImportPlan(context)) {
|
|
90
|
+
const built = buildImportPlanForContext(context, "proceed-decision");
|
|
91
|
+
if (!resultOk(built)) return printValidationFailure(built);
|
|
92
|
+
const risk = classifyRisk({
|
|
93
|
+
importPlan: built.importPlan,
|
|
94
|
+
verificationTargets: built.importPlan.verification_targets,
|
|
95
|
+
maintainedRisk: built.importPlan.maintained_risk || null
|
|
96
|
+
});
|
|
97
|
+
const resolvedWorkflowContext = buildResolvedWorkflowContextPayload({
|
|
98
|
+
workspace: built.topogramRoot,
|
|
99
|
+
taskModeArtifact: built.taskModeResult.artifact,
|
|
100
|
+
importPlan: built.importPlan,
|
|
101
|
+
selectors: workflowPresetSelectors(built.taskModeResult.artifact, context.providerId, context.presetId, "proceed-decision")
|
|
102
|
+
});
|
|
103
|
+
return printJson(proceedDecisionFromRisk(
|
|
104
|
+
risk,
|
|
105
|
+
built.importPlan.next_action,
|
|
106
|
+
built.importPlan.write_scope,
|
|
107
|
+
built.importPlan.verification_targets,
|
|
108
|
+
built.importPlan.maintained_risk || null,
|
|
109
|
+
built.importPlan.workflow_presets || null,
|
|
110
|
+
resolvedWorkflowContext
|
|
111
|
+
));
|
|
112
|
+
}
|
|
113
|
+
const built = buildChangePlanContext(context, "modeling");
|
|
114
|
+
const failure = validateChangePlanBuild(built);
|
|
115
|
+
if (failure !== null) return failure;
|
|
116
|
+
const risk = riskFromChangePlanBuild(built);
|
|
117
|
+
return printJson(proceedDecisionFromRisk(
|
|
118
|
+
risk,
|
|
119
|
+
built.changePlan.next_action || null,
|
|
120
|
+
built.changePlan.write_scope || null,
|
|
121
|
+
built.changePlan.verification_targets || null,
|
|
122
|
+
built.maintainedRisk,
|
|
123
|
+
null,
|
|
124
|
+
null
|
|
125
|
+
));
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
if (queryName === "review-packet") {
|
|
129
|
+
if (hasImportPlan(context)) {
|
|
130
|
+
const built = buildImportPlanForContext(context, "review-packet");
|
|
131
|
+
if (!resultOk(built)) return printValidationFailure(built);
|
|
132
|
+
const risk = classifyRisk({
|
|
133
|
+
importPlan: built.importPlan,
|
|
134
|
+
verificationTargets: built.importPlan.verification_targets,
|
|
135
|
+
maintainedRisk: built.importPlan.maintained_risk || null
|
|
136
|
+
});
|
|
137
|
+
return printJson(buildReviewPacketPayloadForImportPlan({ importPlan: built.importPlan, risk }));
|
|
138
|
+
}
|
|
139
|
+
const built = buildChangePlanContext(context, "modeling");
|
|
140
|
+
const failure = validateChangePlanBuild(built);
|
|
141
|
+
if (failure !== null) return failure;
|
|
142
|
+
const risk = riskFromChangePlanBuild(built);
|
|
143
|
+
return printJson(buildReviewPacketPayloadForChangePlan({ changePlan: built.changePlan, risk }));
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
return null;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* @param {AnyRecord} context
|
|
151
|
+
* @returns {boolean}
|
|
152
|
+
*/
|
|
153
|
+
function hasImportPlan(context) {
|
|
154
|
+
return shouldUseImportAdoptPath(context) && fs.existsSync(adoptionPlanPath(normalizeTopogramPath(context.inputPath)));
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* @param {AnyRecord} built
|
|
159
|
+
* @returns {number|null}
|
|
160
|
+
*/
|
|
161
|
+
function validateChangePlanBuild(built) {
|
|
162
|
+
if (!resultOk(built.resolved)) return printValidationFailure(built.resolved);
|
|
163
|
+
if (!resultOk(built.taskModeResult)) return printValidationFailure(built.taskModeResult);
|
|
164
|
+
if (built.sliceResult && !resultOk(built.sliceResult)) return printValidationFailure(built.sliceResult);
|
|
165
|
+
if (built.diffResult && !resultOk(built.diffResult)) return printValidationFailure(built.diffResult);
|
|
166
|
+
if (built.maintainedBundleResult && !resultOk(built.maintainedBundleResult)) return printValidationFailure(built.maintainedBundleResult);
|
|
167
|
+
return null;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
/**
|
|
171
|
+
* @param {AnyRecord} built
|
|
172
|
+
* @returns {AnyRecord}
|
|
173
|
+
*/
|
|
174
|
+
function riskFromChangePlanBuild(built) {
|
|
175
|
+
return classifyRisk({
|
|
176
|
+
reviewBoundary: built.changePlan.review_boundary,
|
|
177
|
+
maintainedBoundary: built.changePlan.maintained_boundary,
|
|
178
|
+
diffSummary: built.diffSummary,
|
|
179
|
+
verificationTargets: built.changePlan.verification_targets,
|
|
180
|
+
maintainedRisk: built.maintainedRisk
|
|
181
|
+
});
|
|
182
|
+
}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
|
|
3
|
+
import fs from "node:fs";
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
|
|
6
|
+
import {
|
|
7
|
+
buildAuthHintsQueryPayload,
|
|
8
|
+
buildAuthReviewPacketPayload,
|
|
9
|
+
buildHandoffStatusPayload,
|
|
10
|
+
buildLaneStatusPayload,
|
|
11
|
+
buildWorkPacketPayload
|
|
12
|
+
} from "../../../../agent-ops/query-builders.js";
|
|
13
|
+
import { buildImportAdoptAgentContext, buildImportPlanForContext } from "../import-adopt.js";
|
|
14
|
+
import { normalizeTopogramPath, printValidationFailure, readJson, resultOk } from "../workspace.js";
|
|
15
|
+
import { printJson } from "./output.js";
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* @typedef {Record<string, any>} AnyRecord
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* @param {AnyRecord} context
|
|
23
|
+
* @returns {number|null}
|
|
24
|
+
*/
|
|
25
|
+
export function runImportAdoptQuery(context) {
|
|
26
|
+
const queryName = context.commandArgs?.queryName;
|
|
27
|
+
|
|
28
|
+
if (queryName === "import-plan") {
|
|
29
|
+
const built = buildImportPlanForContext(context, "import-plan");
|
|
30
|
+
if (!resultOk(built)) return printValidationFailure(built);
|
|
31
|
+
return printJson(built.importPlan);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
if (queryName === "multi-agent-plan") {
|
|
35
|
+
if (context.modeId !== "import-adopt") {
|
|
36
|
+
throw new Error("query multi-agent-plan currently supports only --mode import-adopt.");
|
|
37
|
+
}
|
|
38
|
+
const built = buildImportAdoptAgentContext(context, "multi-agent-plan");
|
|
39
|
+
if (!resultOk(built)) return printValidationFailure(built);
|
|
40
|
+
return printJson(built.multiAgentPlan);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
if (queryName === "work-packet") {
|
|
44
|
+
if (context.modeId !== "import-adopt") {
|
|
45
|
+
throw new Error("query work-packet currently supports only --mode import-adopt.");
|
|
46
|
+
}
|
|
47
|
+
if (!context.laneId) {
|
|
48
|
+
throw new Error("query work-packet requires --lane <id>.");
|
|
49
|
+
}
|
|
50
|
+
const built = buildImportAdoptAgentContext(context, "work-packet");
|
|
51
|
+
if (!resultOk(built)) return printValidationFailure(built);
|
|
52
|
+
return printJson(buildWorkPacketPayload({
|
|
53
|
+
workspace: built.topogramRoot,
|
|
54
|
+
multiAgentPlan: built.multiAgentPlan,
|
|
55
|
+
laneId: context.laneId
|
|
56
|
+
}));
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
if (queryName === "lane-status" || queryName === "handoff-status") {
|
|
60
|
+
if (context.modeId !== "import-adopt") {
|
|
61
|
+
throw new Error(`query ${queryName} currently supports only --mode import-adopt.`);
|
|
62
|
+
}
|
|
63
|
+
const built = buildImportAdoptAgentContext(context, queryName);
|
|
64
|
+
if (!resultOk(built)) return printValidationFailure(built);
|
|
65
|
+
const payload = queryName === "lane-status"
|
|
66
|
+
? buildLaneStatusPayload({
|
|
67
|
+
workspace: built.topogramRoot,
|
|
68
|
+
multiAgentPlan: built.multiAgentPlan,
|
|
69
|
+
report: built.reconcileReport,
|
|
70
|
+
adoptionStatus: built.adoptionStatus
|
|
71
|
+
})
|
|
72
|
+
: buildHandoffStatusPayload({
|
|
73
|
+
workspace: built.topogramRoot,
|
|
74
|
+
multiAgentPlan: built.multiAgentPlan,
|
|
75
|
+
report: built.reconcileReport,
|
|
76
|
+
adoptionStatus: built.adoptionStatus
|
|
77
|
+
});
|
|
78
|
+
return printJson(payload);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
if (queryName === "auth-hints") {
|
|
82
|
+
const topogramRoot = normalizeTopogramPath(context.inputPath);
|
|
83
|
+
const reportPath = path.join(topogramRoot, "candidates", "reconcile", "report.json");
|
|
84
|
+
const adoptionStatusPath = path.join(topogramRoot, "candidates", "reconcile", "adoption-status.json");
|
|
85
|
+
if (!fs.existsSync(reportPath) || !fs.existsSync(adoptionStatusPath)) {
|
|
86
|
+
throw new Error(`No reconcile auth-hint artifacts found under '${path.join(topogramRoot, "candidates", "reconcile")}'. Run 'node ./src/cli.js reconcile ${topogramRoot}' first.`);
|
|
87
|
+
}
|
|
88
|
+
return printJson(buildAuthHintsQueryPayload(readJson(reportPath), readJson(adoptionStatusPath)));
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
if (queryName === "auth-review-packet") {
|
|
92
|
+
if (!context.bundleSlug) {
|
|
93
|
+
throw new Error("query auth-review-packet requires --bundle <slug>.");
|
|
94
|
+
}
|
|
95
|
+
const topogramRoot = normalizeTopogramPath(context.inputPath);
|
|
96
|
+
const reportPath = path.join(topogramRoot, "candidates", "reconcile", "report.json");
|
|
97
|
+
const adoptionStatusPath = path.join(topogramRoot, "candidates", "reconcile", "adoption-status.json");
|
|
98
|
+
if (!fs.existsSync(reportPath) || !fs.existsSync(adoptionStatusPath)) {
|
|
99
|
+
throw new Error(`No reconcile auth-review artifacts found under '${path.join(topogramRoot, "candidates", "reconcile")}'. Run 'node ./src/cli.js reconcile ${topogramRoot}' first.`);
|
|
100
|
+
}
|
|
101
|
+
const reconcileReport = readJson(reportPath);
|
|
102
|
+
const packet = buildAuthReviewPacketPayload(reconcileReport, readJson(adoptionStatusPath), context.bundleSlug);
|
|
103
|
+
if (!packet) {
|
|
104
|
+
const knownBundles = (reconcileReport.candidate_model_bundles || []).map((/** @type {AnyRecord} */ bundle) => bundle.slug).sort();
|
|
105
|
+
throw new Error(`No auth review bundle '${context.bundleSlug}' found in '${path.join(topogramRoot, "candidates", "reconcile")}'. Known bundles: ${knownBundles.length ? knownBundles.join(", ") : "none"}.`);
|
|
106
|
+
}
|
|
107
|
+
return printJson(packet);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
return null;
|
|
111
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
|
|
3
|
+
import { runArtifactQuery } from "./artifacts.js";
|
|
4
|
+
import { runBoundaryQuery } from "./boundaries.js";
|
|
5
|
+
import { runChangeQuery } from "./change.js";
|
|
6
|
+
import { runImportAdoptQuery } from "./import-adopt.js";
|
|
7
|
+
import { runWorkflowQuery } from "./workflow.js";
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* @typedef {Record<string, any>} AnyRecord
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* @param {AnyRecord} context
|
|
15
|
+
* @returns {Promise<number|null>}
|
|
16
|
+
*/
|
|
17
|
+
export async function runQueryCommand(context) {
|
|
18
|
+
for (const handler of [
|
|
19
|
+
runArtifactQuery,
|
|
20
|
+
runBoundaryQuery,
|
|
21
|
+
runChangeQuery,
|
|
22
|
+
runWorkflowQuery,
|
|
23
|
+
runImportAdoptQuery
|
|
24
|
+
]) {
|
|
25
|
+
const result = handler(context);
|
|
26
|
+
if (result !== null) {
|
|
27
|
+
return result;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return null;
|
|
31
|
+
}
|