@topogram/cli 0.3.63 → 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.d.ts +6 -0
- package/src/adoption/plan.js +12 -703
- package/src/adoption/reporting.d.ts +10 -0
- package/src/adoption/review-groups.d.ts +6 -0
- package/src/agent-brief.d.ts +3 -0
- package/src/agent-brief.js +495 -0
- 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 -0
- package/src/agent-ops/query-builders.js +42 -5021
- package/src/archive/archive.d.ts +2 -0
- package/src/archive/compact.d.ts +1 -0
- package/src/archive/unarchive.d.ts +1 -0
- 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 +12 -0
- package/src/catalog.js +18 -750
- package/src/cli/catalog-alias.d.ts +1 -0
- package/src/cli/command-parser.js +38 -0
- package/src/cli/command-parsers/core.js +102 -0
- package/src/cli/command-parsers/generator.js +39 -0
- package/src/cli/command-parsers/import.js +44 -0
- package/src/cli/command-parsers/legacy-workflow.js +21 -0
- package/src/cli/command-parsers/project.js +47 -0
- package/src/cli/command-parsers/sdlc.js +47 -0
- package/src/cli/command-parsers/shared.js +51 -0
- package/src/cli/command-parsers/template.js +48 -0
- package/src/cli/commands/agent.js +47 -0
- 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 +32 -0
- package/src/cli/commands/check.js +268 -0
- package/src/cli/commands/doctor.js +268 -0
- package/src/cli/commands/emit.js +149 -0
- package/src/cli/commands/generate.js +96 -0
- 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 +17 -0
- package/src/cli/commands/generator.js +443 -0
- 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-runner.js +157 -0
- package/src/cli/commands/import.js +35 -0
- package/src/cli/commands/inspect.js +55 -0
- package/src/cli/commands/new.js +94 -0
- 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 +31 -0
- 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 +11 -0
- package/src/cli/commands/release-rollout.js +257 -0
- package/src/cli/commands/release-shared.js +528 -0
- package/src/cli/commands/release-status.js +429 -0
- package/src/cli/commands/release.js +107 -0
- package/src/cli/commands/sdlc.js +168 -0
- package/src/cli/commands/setup.js +76 -0
- package/src/cli/commands/source.js +291 -0
- 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-runner.js +198 -0
- package/src/cli/commands/template.js +43 -0
- package/src/cli/commands/trust.js +219 -0
- package/src/cli/commands/version.js +40 -0
- package/src/cli/commands/widget.js +168 -0
- package/src/cli/commands/workflow.js +63 -0
- package/src/cli/dispatcher.js +392 -0
- package/src/cli/help-dispatch.js +188 -0
- package/src/cli/help.js +296 -0
- package/src/cli/migration-guidance.js +59 -0
- package/src/cli/options.js +96 -0
- package/src/cli/output-safety.js +107 -0
- package/src/cli/path-normalization.js +29 -0
- package/src/cli.js +47 -11711
- package/src/example-implementation.d.ts +2 -0
- package/src/format.d.ts +1 -0
- 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/check.d.ts +1 -0
- package/src/generator/context/bundle.d.ts +1 -0
- 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 +44 -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/native/parity-bundle.js +2 -1
- 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/surfaces/web/html-escape.js +22 -0
- package/src/generator/surfaces/web/react.js +10 -8
- package/src/generator/surfaces/web/sveltekit.js +7 -5
- package/src/generator/surfaces/web/vanilla.js +8 -4
- 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/generator.d.ts +2 -0
- package/src/github-client.js +520 -0
- 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 +67 -910
- package/src/import/extractors/api/flutter-dio.js +4 -8
- package/src/import/extractors/api/react-native-repository.js +4 -8
- package/src/import/index.d.ts +4 -0
- package/src/import/provenance.d.ts +4 -0
- 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 -2188
- package/src/npm-safety.js +79 -0
- package/src/parser.d.ts +87 -0
- package/src/parser.js +118 -0
- package/src/path-helpers.d.ts +1 -0
- package/src/path-helpers.js +20 -0
- package/src/policy/review-boundaries.d.ts +15 -0
- package/src/project-config/index.js +564 -0
- package/src/project-config.js +19 -560
- package/src/reconcile/docs.d.ts +8 -0
- package/src/reconcile/journeys.d.ts +1 -0
- 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/resolver.d.ts +1 -0
- package/src/runtime-support.js +29 -0
- package/src/sdlc/adopt.d.ts +1 -0
- package/src/sdlc/check.d.ts +1 -0
- package/src/sdlc/explain.d.ts +1 -0
- package/src/sdlc/release.d.ts +1 -0
- package/src/sdlc/scaffold.d.ts +1 -0
- package/src/sdlc/transition.d.ts +1 -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 +7 -0
- package/src/text-helpers.js +245 -0
- package/src/topogram-config.js +306 -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/validator.d.ts +2 -0
- package/src/widget-behavior.d.ts +1 -0
- package/src/workflows/adoption/index.js +26 -0
- package/src/workflows/docs-generate.js +262 -0
- package/src/workflows/docs-scan.js +703 -0
- package/src/workflows/docs.js +15 -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 +4 -0
- package/src/workflows/import-app/db.js +538 -0
- package/src/workflows/import-app/index.js +30 -0
- package/src/workflows/import-app/shared.js +218 -0
- package/src/workflows/import-app/ui.js +443 -0
- package/src/workflows/import-app/workflow.js +159 -0
- 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 +32 -0
- 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 +37 -0
- package/src/workflows/reconcile/bundle-core/index.js +600 -0
- package/src/workflows/reconcile/bundle-core.js +14 -0
- package/src/workflows/reconcile/bundle-shared.js +75 -0
- package/src/workflows/reconcile/candidate-model.js +477 -0
- package/src/workflows/reconcile/canonical-surface.js +264 -0
- package/src/workflows/reconcile/gap-report.js +333 -0
- package/src/workflows/reconcile/ids.js +6 -0
- 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 +16 -0
- package/src/workflows/reconcile/index.js +7 -0
- package/src/workflows/reconcile/renderers.js +461 -0
- package/src/workflows/reconcile/summary.js +90 -0
- package/src/workflows/reconcile/workflow.js +309 -0
- package/src/workflows/shared.js +189 -0
- package/src/workflows/types.d.ts +93 -0
- package/src/workflows.d.ts +1 -0
- package/src/workflows.js +10 -7652
- package/src/workspace-docs.d.ts +29 -0
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
|
|
3
|
+
import fs from "node:fs";
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
|
|
6
|
+
import { assertSafeNpmSpec } from "../../../npm-safety.js";
|
|
7
|
+
import {
|
|
8
|
+
CLI_PACKAGE_NAME,
|
|
9
|
+
NPMJS_REGISTRY,
|
|
10
|
+
PACKAGE_UPDATE_CLI_INFO_SCRIPTS,
|
|
11
|
+
PACKAGE_UPDATE_CLI_VERIFICATION_SCRIPTS
|
|
12
|
+
} from "./constants.js";
|
|
13
|
+
import { sanitizeTopogramLockForPackageUpdate } from "./lockfile.js";
|
|
14
|
+
import { formatPackageUpdateNpmError, latestTopogramCliVersion, runNpmForPackageUpdate } from "./npm.js";
|
|
15
|
+
import { messageFromError } from "./shared.js";
|
|
16
|
+
import { isPackageVersion } from "./versions.js";
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* @typedef {{
|
|
20
|
+
* ok: boolean,
|
|
21
|
+
* packageName: string,
|
|
22
|
+
* requestedVersion: string,
|
|
23
|
+
* requestedLatest: boolean,
|
|
24
|
+
* dependencySpec: string,
|
|
25
|
+
* checkedVersion: string,
|
|
26
|
+
* packageCheckSource: "npm",
|
|
27
|
+
* dependencyUpdatedBy: "npm-install"|"manifest-lockfile"|"version-convention",
|
|
28
|
+
* lockfileSanitized: boolean,
|
|
29
|
+
* versionConventionUpdated: boolean,
|
|
30
|
+
* versionConventionPath: string|null,
|
|
31
|
+
* scriptsRun: string[],
|
|
32
|
+
* skippedScripts: string[],
|
|
33
|
+
* diagnostics: Array<Record<string, any>>,
|
|
34
|
+
* errors: string[]
|
|
35
|
+
* }} PackageUpdateCliPayload
|
|
36
|
+
*/
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* @param {string} requested
|
|
40
|
+
* @param {{ cwd?: string }} [options]
|
|
41
|
+
* @returns {PackageUpdateCliPayload}
|
|
42
|
+
*/
|
|
43
|
+
export function buildPackageUpdateCliPayload(requested, options = {}) {
|
|
44
|
+
const cwd = options.cwd || process.cwd();
|
|
45
|
+
const requestedLatest = requested === "latest" || requested === "--latest";
|
|
46
|
+
/** @type {Array<Record<string, any>>} */
|
|
47
|
+
const diagnostics = [];
|
|
48
|
+
const version = requestedLatest
|
|
49
|
+
? resolveLatestTopogramCliVersionForPackageUpdate(cwd, diagnostics)
|
|
50
|
+
: requested;
|
|
51
|
+
if (!isPackageVersion(version)) {
|
|
52
|
+
throw new Error("topogram package update-cli requires <version> or --latest.");
|
|
53
|
+
}
|
|
54
|
+
const exactSpec = `${CLI_PACKAGE_NAME}@${version}`;
|
|
55
|
+
const dependencySpec = `${CLI_PACKAGE_NAME}@^${version}`;
|
|
56
|
+
assertSafeNpmSpec(exactSpec);
|
|
57
|
+
assertSafeNpmSpec(dependencySpec);
|
|
58
|
+
const view = runNpmForPackageUpdate(["view", `--registry=${NPMJS_REGISTRY}`, "--", exactSpec, "version"], cwd);
|
|
59
|
+
let checkedVersion = null;
|
|
60
|
+
const packageCheckSource = "npm";
|
|
61
|
+
if (view.status !== 0) {
|
|
62
|
+
throw new Error(formatPackageUpdateNpmError(exactSpec, "inspect", view));
|
|
63
|
+
} else {
|
|
64
|
+
checkedVersion = String(view.stdout || "").trim().replace(/^"|"$/g, "");
|
|
65
|
+
if (checkedVersion !== version) {
|
|
66
|
+
throw new Error(`Expected ${exactSpec}, but npm returned version '${checkedVersion || "(empty)"}'.`);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
const lockfileSanitized = sanitizeTopogramLockForPackageUpdate(cwd, version);
|
|
70
|
+
const dependencyUpdatedBy = "npm-install";
|
|
71
|
+
const install = runNpmForPackageUpdate(["install", "--save-dev", `--registry=${NPMJS_REGISTRY}`, "--", dependencySpec], cwd);
|
|
72
|
+
if (install.status !== 0) {
|
|
73
|
+
throw new Error(formatPackageUpdateNpmError(dependencySpec, "install", install));
|
|
74
|
+
}
|
|
75
|
+
const versionConvention = writeTopogramCliVersionConventionIfPresent(cwd, version);
|
|
76
|
+
const packageJson = readPackageJsonForUpdate(cwd);
|
|
77
|
+
const scripts = packageJson.scripts && typeof packageJson.scripts === "object" ? packageJson.scripts : {};
|
|
78
|
+
const scriptsRun = [];
|
|
79
|
+
const skippedScripts = [];
|
|
80
|
+
const scriptsToRun = packageUpdateCliScriptsToRun(scripts);
|
|
81
|
+
for (const scriptName of PACKAGE_UPDATE_CLI_INFO_SCRIPTS) {
|
|
82
|
+
if (!Object.prototype.hasOwnProperty.call(scripts, scriptName)) {
|
|
83
|
+
skippedScripts.push(scriptName);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
for (const scriptName of PACKAGE_UPDATE_CLI_VERIFICATION_SCRIPTS) {
|
|
87
|
+
if (!Object.prototype.hasOwnProperty.call(scripts, scriptName)) {
|
|
88
|
+
skippedScripts.push(scriptName);
|
|
89
|
+
} else if (!scriptsToRun.includes(scriptName)) {
|
|
90
|
+
const coveringScript = scriptsToRun.find((candidate) =>
|
|
91
|
+
PACKAGE_UPDATE_CLI_VERIFICATION_SCRIPTS.includes(candidate)
|
|
92
|
+
);
|
|
93
|
+
skippedScripts.push(`${scriptName} (covered by ${coveringScript})`);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
for (const scriptName of scriptsToRun) {
|
|
97
|
+
const result = runNpmForPackageUpdate(["run", scriptName], cwd);
|
|
98
|
+
if (result.status !== 0) {
|
|
99
|
+
throw new Error(formatPackageUpdateNpmError(`npm run ${scriptName}`, "check", result));
|
|
100
|
+
}
|
|
101
|
+
scriptsRun.push(scriptName);
|
|
102
|
+
}
|
|
103
|
+
return {
|
|
104
|
+
ok: true,
|
|
105
|
+
packageName: CLI_PACKAGE_NAME,
|
|
106
|
+
requestedVersion: version,
|
|
107
|
+
requestedLatest,
|
|
108
|
+
dependencySpec,
|
|
109
|
+
checkedVersion,
|
|
110
|
+
packageCheckSource,
|
|
111
|
+
dependencyUpdatedBy,
|
|
112
|
+
lockfileSanitized,
|
|
113
|
+
versionConventionUpdated: versionConvention.updated,
|
|
114
|
+
versionConventionPath: versionConvention.path,
|
|
115
|
+
scriptsRun,
|
|
116
|
+
skippedScripts,
|
|
117
|
+
diagnostics,
|
|
118
|
+
errors: []
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* @param {Record<string, any>} scripts
|
|
124
|
+
* @returns {string[]}
|
|
125
|
+
*/
|
|
126
|
+
function packageUpdateCliScriptsToRun(scripts) {
|
|
127
|
+
const selected = [];
|
|
128
|
+
for (const scriptName of PACKAGE_UPDATE_CLI_INFO_SCRIPTS) {
|
|
129
|
+
if (Object.prototype.hasOwnProperty.call(scripts, scriptName)) {
|
|
130
|
+
selected.push(scriptName);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
const verificationScript = PACKAGE_UPDATE_CLI_VERIFICATION_SCRIPTS.find((scriptName) =>
|
|
134
|
+
Object.prototype.hasOwnProperty.call(scripts, scriptName)
|
|
135
|
+
);
|
|
136
|
+
if (verificationScript) {
|
|
137
|
+
selected.push(verificationScript);
|
|
138
|
+
}
|
|
139
|
+
return selected;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* @param {string} cwd
|
|
144
|
+
* @param {Array<Record<string, any>>} diagnostics
|
|
145
|
+
* @returns {string}
|
|
146
|
+
*/
|
|
147
|
+
function resolveLatestTopogramCliVersionForPackageUpdate(cwd, diagnostics) {
|
|
148
|
+
try {
|
|
149
|
+
return latestTopogramCliVersion(cwd);
|
|
150
|
+
} catch (error) {
|
|
151
|
+
throw new Error(messageFromError(error));
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* @param {string} cwd
|
|
157
|
+
* @param {string} version
|
|
158
|
+
* @returns {{ updated: boolean, path: string|null }}
|
|
159
|
+
*/
|
|
160
|
+
function writeTopogramCliVersionConventionIfPresent(cwd, version) {
|
|
161
|
+
const versionPath = path.join(cwd, "topogram-cli.version");
|
|
162
|
+
if (!fs.existsSync(versionPath)) {
|
|
163
|
+
return { updated: false, path: null };
|
|
164
|
+
}
|
|
165
|
+
fs.writeFileSync(versionPath, `${version}\n`, "utf8");
|
|
166
|
+
return { updated: true, path: versionPath };
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
/**
|
|
170
|
+
* @param {string} cwd
|
|
171
|
+
* @returns {Record<string, any>}
|
|
172
|
+
*/
|
|
173
|
+
function readPackageJsonForUpdate(cwd) {
|
|
174
|
+
const packagePath = path.join(cwd, "package.json");
|
|
175
|
+
if (!fs.existsSync(packagePath)) {
|
|
176
|
+
throw new Error("topogram package update-cli must be run from a package directory with package.json.");
|
|
177
|
+
}
|
|
178
|
+
return JSON.parse(fs.readFileSync(packagePath, "utf8"));
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
/**
|
|
182
|
+
* @param {string} cwd
|
|
183
|
+
* @param {string} version
|
|
184
|
+
* @param {string} dependencySpec
|
|
185
|
+
* @returns {{ packageJsonUpdated: boolean, lockfileUpdated: boolean }}
|
|
186
|
+
*/
|
|
187
|
+
function updateTopogramCliDependencyFiles(cwd, version, dependencySpec) {
|
|
188
|
+
const packagePath = path.join(cwd, "package.json");
|
|
189
|
+
const packageJson = readPackageJsonForUpdate(cwd);
|
|
190
|
+
const hasDevDependency = packageJson.devDependencies &&
|
|
191
|
+
typeof packageJson.devDependencies === "object" &&
|
|
192
|
+
Object.prototype.hasOwnProperty.call(packageJson.devDependencies, CLI_PACKAGE_NAME);
|
|
193
|
+
const hasDependency = packageJson.dependencies &&
|
|
194
|
+
typeof packageJson.dependencies === "object" &&
|
|
195
|
+
Object.prototype.hasOwnProperty.call(packageJson.dependencies, CLI_PACKAGE_NAME);
|
|
196
|
+
const hasVersionConvention = fs.existsSync(path.join(cwd, "topogram-cli.version"));
|
|
197
|
+
const shouldUpdatePackageJson = hasDevDependency || hasDependency || !hasVersionConvention;
|
|
198
|
+
if (!shouldUpdatePackageJson) {
|
|
199
|
+
return { packageJsonUpdated: false, lockfileUpdated: false };
|
|
200
|
+
}
|
|
201
|
+
if (hasDependency && !hasDevDependency) {
|
|
202
|
+
packageJson.dependencies[CLI_PACKAGE_NAME] = dependencySpec.slice(`${CLI_PACKAGE_NAME}@`.length);
|
|
203
|
+
} else {
|
|
204
|
+
packageJson.devDependencies = packageJson.devDependencies && typeof packageJson.devDependencies === "object"
|
|
205
|
+
? packageJson.devDependencies
|
|
206
|
+
: {};
|
|
207
|
+
packageJson.devDependencies[CLI_PACKAGE_NAME] = dependencySpec.slice(`${CLI_PACKAGE_NAME}@`.length);
|
|
208
|
+
}
|
|
209
|
+
if (hasDevDependency && packageJson.dependencies && typeof packageJson.dependencies === "object") {
|
|
210
|
+
delete packageJson.dependencies[CLI_PACKAGE_NAME];
|
|
211
|
+
}
|
|
212
|
+
fs.writeFileSync(packagePath, `${JSON.stringify(packageJson, null, 2)}\n`, "utf8");
|
|
213
|
+
|
|
214
|
+
const lockPath = path.join(cwd, "package-lock.json");
|
|
215
|
+
if (!fs.existsSync(lockPath)) {
|
|
216
|
+
return { packageJsonUpdated: true, lockfileUpdated: false };
|
|
217
|
+
}
|
|
218
|
+
const lock = JSON.parse(fs.readFileSync(lockPath, "utf8"));
|
|
219
|
+
lock.packages = lock.packages && typeof lock.packages === "object" ? lock.packages : {};
|
|
220
|
+
lock.packages[""] = lock.packages[""] && typeof lock.packages[""] === "object" ? lock.packages[""] : {};
|
|
221
|
+
const rootEntry = lock.packages[""];
|
|
222
|
+
const lockHasDependency = rootEntry.dependencies &&
|
|
223
|
+
typeof rootEntry.dependencies === "object" &&
|
|
224
|
+
Object.prototype.hasOwnProperty.call(rootEntry.dependencies, CLI_PACKAGE_NAME);
|
|
225
|
+
if (lockHasDependency && !hasDevDependency) {
|
|
226
|
+
rootEntry.dependencies[CLI_PACKAGE_NAME] = dependencySpec.slice(`${CLI_PACKAGE_NAME}@`.length);
|
|
227
|
+
} else {
|
|
228
|
+
rootEntry.devDependencies = rootEntry.devDependencies && typeof rootEntry.devDependencies === "object"
|
|
229
|
+
? rootEntry.devDependencies
|
|
230
|
+
: {};
|
|
231
|
+
rootEntry.devDependencies[CLI_PACKAGE_NAME] = dependencySpec.slice(`${CLI_PACKAGE_NAME}@`.length);
|
|
232
|
+
}
|
|
233
|
+
if ((hasDevDependency || !lockHasDependency) && rootEntry.dependencies && typeof rootEntry.dependencies === "object") {
|
|
234
|
+
delete lock.packages[""].dependencies[CLI_PACKAGE_NAME];
|
|
235
|
+
}
|
|
236
|
+
const entryPath = `node_modules/${CLI_PACKAGE_NAME}`;
|
|
237
|
+
const existingEntry = lock.packages[entryPath] && typeof lock.packages[entryPath] === "object"
|
|
238
|
+
? lock.packages[entryPath]
|
|
239
|
+
: {};
|
|
240
|
+
lock.packages[entryPath] = {
|
|
241
|
+
...existingEntry,
|
|
242
|
+
version,
|
|
243
|
+
dev: true,
|
|
244
|
+
license: existingEntry.license || "Apache-2.0",
|
|
245
|
+
bin: existingEntry.bin || { topogram: "src/cli.js" },
|
|
246
|
+
engines: existingEntry.engines || { node: ">=20" }
|
|
247
|
+
};
|
|
248
|
+
delete lock.packages[entryPath].resolved;
|
|
249
|
+
delete lock.packages[entryPath].integrity;
|
|
250
|
+
fs.writeFileSync(lockPath, `${JSON.stringify(lock, null, 2)}\n`, "utf8");
|
|
251
|
+
return { packageJsonUpdated: true, lockfileUpdated: true };
|
|
252
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @param {string} left
|
|
5
|
+
* @param {string} right
|
|
6
|
+
* @returns {number}
|
|
7
|
+
*/
|
|
8
|
+
export function compareSemver(left, right) {
|
|
9
|
+
const leftParts = left.split(/[.-]/).slice(0, 3).map((part) => Number.parseInt(part, 10) || 0);
|
|
10
|
+
const rightParts = right.split(/[.-]/).slice(0, 3).map((part) => Number.parseInt(part, 10) || 0);
|
|
11
|
+
for (let index = 0; index < 3; index += 1) {
|
|
12
|
+
if (leftParts[index] > rightParts[index]) return 1;
|
|
13
|
+
if (leftParts[index] < rightParts[index]) return -1;
|
|
14
|
+
}
|
|
15
|
+
return 0;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* @param {string|null} value
|
|
20
|
+
* @returns {string|null}
|
|
21
|
+
*/
|
|
22
|
+
export function normalizeRegistryUrl(value) {
|
|
23
|
+
if (!value) {
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
return value.trim().replace(/\/+$/, "");
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* @param {string} value
|
|
31
|
+
* @returns {boolean}
|
|
32
|
+
*/
|
|
33
|
+
export function isPackageVersion(value) {
|
|
34
|
+
return /^\d+\.\d+\.\d+(?:[-+][0-9A-Za-z.-]+)?$/.test(value);
|
|
35
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
|
|
3
|
+
export {
|
|
4
|
+
CLI_PACKAGE_NAME,
|
|
5
|
+
NPMJS_REGISTRY
|
|
6
|
+
} from "./package/constants.js";
|
|
7
|
+
export {
|
|
8
|
+
checkDoctorNode,
|
|
9
|
+
checkDoctorNpm,
|
|
10
|
+
checkDoctorPackageAccess,
|
|
11
|
+
checkTemplatePackageStatus,
|
|
12
|
+
isLocalCliDependencySpec,
|
|
13
|
+
localTemplatePackageStatus,
|
|
14
|
+
npmConfigGet,
|
|
15
|
+
readInstalledCliPackageVersion,
|
|
16
|
+
readProjectCliDependencySpec,
|
|
17
|
+
registryPackageNameFromSpec
|
|
18
|
+
} from "./package/doctor.js";
|
|
19
|
+
export { printPackageHelp } from "./package/help.js";
|
|
20
|
+
export { inspectTopogramCliLockfile } from "./package/lockfile.js";
|
|
21
|
+
export {
|
|
22
|
+
latestTopogramCliVersion,
|
|
23
|
+
runNpmForPackageUpdate
|
|
24
|
+
} from "./package/npm.js";
|
|
25
|
+
export { printPackageUpdateCli } from "./package/reporting.js";
|
|
26
|
+
export { runPackageCommand } from "./package/runner.js";
|
|
27
|
+
export { buildPackageUpdateCliPayload } from "./package/update-cli.js";
|
|
28
|
+
export {
|
|
29
|
+
isPackageVersion,
|
|
30
|
+
normalizeRegistryUrl
|
|
31
|
+
} from "./package/versions.js";
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
|
|
3
|
+
import { buildMaintainedRiskSummary, buildChangePlanPayload, summarizeDiffArtifact } from "../../../agent-ops/query-builders.js";
|
|
4
|
+
import { parsePath } from "../../../parser.js";
|
|
5
|
+
import { resolveWorkspace } from "../../../resolver.js";
|
|
6
|
+
import {
|
|
7
|
+
artifactOrNull,
|
|
8
|
+
buildDiff,
|
|
9
|
+
buildMaintainedBundle,
|
|
10
|
+
buildSlice,
|
|
11
|
+
buildTaskMode,
|
|
12
|
+
hasSelectors,
|
|
13
|
+
resultOk,
|
|
14
|
+
selectorOptions
|
|
15
|
+
} from "./workspace.js";
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* @typedef {Record<string, any>} AnyRecord
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* @param {AnyRecord} context
|
|
23
|
+
* @param {string} defaultMode
|
|
24
|
+
* @returns {{ ast: AnyRecord, resolved: AnyRecord, taskModeResult: AnyRecord, sliceResult: AnyRecord|null, diffResult: AnyRecord|null, maintainedBundleResult: AnyRecord|null, changePlan: AnyRecord, diffSummary: AnyRecord|null, maintainedRisk: AnyRecord }}
|
|
25
|
+
*/
|
|
26
|
+
export function buildChangePlanContext(context, defaultMode = "modeling") {
|
|
27
|
+
const ast = parsePath(context.inputPath);
|
|
28
|
+
const resolved = resolveWorkspace(ast);
|
|
29
|
+
if (!resultOk(resolved)) {
|
|
30
|
+
return /** @type {any} */ ({ ast, resolved });
|
|
31
|
+
}
|
|
32
|
+
const selectors = selectorOptions(context);
|
|
33
|
+
const effectiveModeId = context.modeId || defaultMode;
|
|
34
|
+
const taskModeResult = buildTaskMode(ast, selectors, effectiveModeId, context.fromTopogramPath);
|
|
35
|
+
if (!resultOk(taskModeResult)) {
|
|
36
|
+
return /** @type {any} */ ({ ast, resolved, taskModeResult });
|
|
37
|
+
}
|
|
38
|
+
const sliceResult = hasSelectors(context) ? buildSlice(ast, selectors) : null;
|
|
39
|
+
if (sliceResult && !resultOk(sliceResult)) {
|
|
40
|
+
return /** @type {any} */ ({ ast, resolved, taskModeResult, sliceResult });
|
|
41
|
+
}
|
|
42
|
+
const diffResult = buildDiff(ast, context.fromTopogramPath);
|
|
43
|
+
if (diffResult && !resultOk(diffResult)) {
|
|
44
|
+
return /** @type {any} */ ({ ast, resolved, taskModeResult, sliceResult, diffResult });
|
|
45
|
+
}
|
|
46
|
+
const includeMaintainedBoundary =
|
|
47
|
+
effectiveModeId === "maintained-app-edit" ||
|
|
48
|
+
context.surfaceId === "maintained-boundary" ||
|
|
49
|
+
Boolean(diffResult?.artifact?.affected_maintained_surfaces?.ownership_interpretation?.maintained_code_impact);
|
|
50
|
+
const maintainedBundleResult = includeMaintainedBoundary ? buildMaintainedBundle(ast) : null;
|
|
51
|
+
if (maintainedBundleResult && !resultOk(maintainedBundleResult)) {
|
|
52
|
+
return /** @type {any} */ ({ ast, resolved, taskModeResult, sliceResult, diffResult, maintainedBundleResult });
|
|
53
|
+
}
|
|
54
|
+
const changePlan = buildChangePlanPayload({
|
|
55
|
+
graph: resolved.graph,
|
|
56
|
+
taskModeArtifact: taskModeResult.artifact,
|
|
57
|
+
sliceArtifact: artifactOrNull(sliceResult),
|
|
58
|
+
diffArtifact: artifactOrNull(diffResult),
|
|
59
|
+
maintainedBoundaryArtifact: maintainedBundleResult?.artifact?.maintained_boundary || null
|
|
60
|
+
});
|
|
61
|
+
const diffSummary = changePlan.diff_summary || summarizeDiffArtifact(diffResult?.artifact || null);
|
|
62
|
+
const maintainedRisk = buildMaintainedRiskSummary({
|
|
63
|
+
maintainedImpacts: changePlan.maintained_impacts,
|
|
64
|
+
maintainedBoundary: changePlan.maintained_boundary,
|
|
65
|
+
diffSummary
|
|
66
|
+
});
|
|
67
|
+
return { ast, resolved, taskModeResult, sliceResult, diffResult, maintainedBundleResult, changePlan, diffSummary, maintainedRisk };
|
|
68
|
+
}
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @typedef {{
|
|
5
|
+
* name: string,
|
|
6
|
+
* purpose: string,
|
|
7
|
+
* description: string,
|
|
8
|
+
* selectors: string[],
|
|
9
|
+
* args: string[],
|
|
10
|
+
* output: string,
|
|
11
|
+
* example: string
|
|
12
|
+
* }} QueryDefinition
|
|
13
|
+
*
|
|
14
|
+
* @typedef {{
|
|
15
|
+
* type: "query_list",
|
|
16
|
+
* version: 1,
|
|
17
|
+
* queries: QueryDefinition[]
|
|
18
|
+
* }} QueryListPayload
|
|
19
|
+
*
|
|
20
|
+
* @typedef {{
|
|
21
|
+
* type: "query_definition",
|
|
22
|
+
* version: 1,
|
|
23
|
+
* query: QueryDefinition
|
|
24
|
+
* }} QueryDefinitionPayload
|
|
25
|
+
*/
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* @typedef {Record<string, any>} AnyRecord
|
|
29
|
+
*/
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* @returns {QueryDefinition[]}
|
|
33
|
+
*/
|
|
34
|
+
export function queryDefinitions() {
|
|
35
|
+
return [
|
|
36
|
+
{
|
|
37
|
+
name: "slice",
|
|
38
|
+
purpose: "Give an agent the smallest graph slice needed to reason about one selected semantic surface.",
|
|
39
|
+
description: "Return a focused semantic context slice for one selected surface.",
|
|
40
|
+
selectors: ["capability", "workflow", "projection", "widget", "entity", "journey", "domain"],
|
|
41
|
+
args: ["[path]", "[selectors]", "[--json]"],
|
|
42
|
+
output: "context_slice",
|
|
43
|
+
example: "topogram query slice ./topogram --widget widget_data_grid"
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
name: "verification-targets",
|
|
47
|
+
purpose: "Map a selected change or mode to the smallest verification set worth running.",
|
|
48
|
+
description: "Return the smallest verification target set for a mode, selector, or diff.",
|
|
49
|
+
selectors: ["mode", "capability", "workflow", "projection", "widget", "entity", "journey", "from-topogram"],
|
|
50
|
+
args: ["[path]", "[selectors]", "[--from-topogram <path>]", "[--json]"],
|
|
51
|
+
output: "verification_targets",
|
|
52
|
+
example: "topogram query verification-targets ./topogram --widget widget_data_grid"
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
name: "widget-behavior",
|
|
56
|
+
purpose: "Show how reusable widget behavior is realized by projection usage.",
|
|
57
|
+
description: "Return widget behavior realization data grouped by widget, screen, capability, and effect.",
|
|
58
|
+
selectors: ["projection", "widget"],
|
|
59
|
+
args: ["[path]", "[--projection <id>]", "[--widget <id>]", "[--json]"],
|
|
60
|
+
output: "widget_behavior_report",
|
|
61
|
+
example: "topogram query widget-behavior ./topogram --projection proj_web_surface --widget widget_data_grid --json"
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
name: "change-plan",
|
|
65
|
+
purpose: "Summarize what a selected change affects before code or Topogram edits start.",
|
|
66
|
+
description: "Return the semantic change plan, generator targets, risk, and alignment recommendations.",
|
|
67
|
+
selectors: ["mode", "capability", "workflow", "projection", "widget", "entity", "journey", "surface", "from-topogram"],
|
|
68
|
+
args: ["[path]", "[selectors]", "[--from-topogram <path>]", "[--json]"],
|
|
69
|
+
output: "change_plan_query",
|
|
70
|
+
example: "topogram query change-plan ./topogram --widget widget_data_grid"
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
name: "review-packet",
|
|
74
|
+
purpose: "Bundle the context a human or agent needs to review a selected semantic change.",
|
|
75
|
+
description: "Return the review packet for a selected change or diff.",
|
|
76
|
+
selectors: ["mode", "capability", "workflow", "projection", "widget", "entity", "journey", "surface", "from-topogram"],
|
|
77
|
+
args: ["[path]", "[selectors]", "[--from-topogram <path>]", "[--json]"],
|
|
78
|
+
output: "review_packet_query",
|
|
79
|
+
example: "topogram query review-packet ./topogram --widget widget_data_grid"
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
name: "resolved-workflow-context",
|
|
83
|
+
purpose: "Resolve workflow guidance and artifact load order for a selected mode or change.",
|
|
84
|
+
description: "Return resolved workflow guidance, artifact load order, preset policy, and recommended artifact queries.",
|
|
85
|
+
selectors: ["mode", "capability", "workflow", "projection", "widget", "entity", "journey", "surface", "provider", "preset", "from-topogram"],
|
|
86
|
+
args: ["[path]", "[--mode <id>]", "[selectors]", "[--from-topogram <path>]", "[--json]"],
|
|
87
|
+
output: "resolved_workflow_context_query",
|
|
88
|
+
example: "topogram query resolved-workflow-context ./topogram --mode modeling --widget widget_data_grid --json"
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
name: "single-agent-plan",
|
|
92
|
+
purpose: "Give one coding agent a bounded plan, artifact set, and write guidance.",
|
|
93
|
+
description: "Return a single-agent operating plan for a mode and optional selector.",
|
|
94
|
+
selectors: ["mode", "capability", "workflow", "projection", "widget", "entity", "journey", "surface", "from-topogram"],
|
|
95
|
+
args: ["[path]", "[--mode <id>]", "[selectors]", "[--from-topogram <path>]", "[--json]"],
|
|
96
|
+
output: "single_agent_plan_query",
|
|
97
|
+
example: "topogram query single-agent-plan ./topogram --mode modeling --widget widget_data_grid --json"
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
name: "risk-summary",
|
|
101
|
+
purpose: "Surface behavioral, ownership, and verification risks for a selected change.",
|
|
102
|
+
description: "Return the risk summary for a selected change, mode, or diff.",
|
|
103
|
+
selectors: ["mode", "capability", "workflow", "projection", "widget", "entity", "journey", "surface", "from-topogram"],
|
|
104
|
+
args: ["[path]", "[selectors]", "[--from-topogram <path>]", "[--json]"],
|
|
105
|
+
output: "risk_summary_query",
|
|
106
|
+
example: "topogram query risk-summary ./topogram --widget widget_data_grid"
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
name: "proceed-decision",
|
|
110
|
+
purpose: "Tell a human or agent whether enough context and proof exist to proceed.",
|
|
111
|
+
description: "Return a proceed/no-go decision for the current selected work.",
|
|
112
|
+
selectors: ["mode", "capability", "workflow", "projection", "widget", "entity", "journey", "surface", "from-topogram"],
|
|
113
|
+
args: ["[path]", "[--mode <id>]", "[selectors]", "[--from-topogram <path>]", "[--json]"],
|
|
114
|
+
output: "proceed_decision_query",
|
|
115
|
+
example: "topogram query proceed-decision ./topogram --mode verification"
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
name: "write-scope",
|
|
119
|
+
purpose: "Define where an agent may edit for a selected semantic surface.",
|
|
120
|
+
description: "Return safe edit boundaries for a selected mode or semantic surface.",
|
|
121
|
+
selectors: ["mode", "capability", "workflow", "projection", "widget", "entity", "journey", "from-topogram"],
|
|
122
|
+
args: ["[path]", "[selectors]", "[--from-topogram <path>]", "[--json]"],
|
|
123
|
+
output: "write_scope_query",
|
|
124
|
+
example: "topogram query write-scope ./topogram --widget widget_data_grid"
|
|
125
|
+
}
|
|
126
|
+
];
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* @returns {QueryListPayload}
|
|
131
|
+
*/
|
|
132
|
+
export function buildQueryListPayload() {
|
|
133
|
+
return {
|
|
134
|
+
type: "query_list",
|
|
135
|
+
version: 1,
|
|
136
|
+
queries: queryDefinitions()
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* @param {string} name
|
|
142
|
+
* @returns {QueryDefinitionPayload}
|
|
143
|
+
*/
|
|
144
|
+
export function buildQueryShowPayload(name) {
|
|
145
|
+
const query = queryDefinitions().find((entry) => entry.name === name);
|
|
146
|
+
if (!query) {
|
|
147
|
+
const known = queryDefinitions().map((entry) => entry.name).join(", ");
|
|
148
|
+
throw new Error(`Unknown query '${name}'. Run 'topogram query list' to inspect available queries. Known queries: ${known}`);
|
|
149
|
+
}
|
|
150
|
+
return {
|
|
151
|
+
type: "query_definition",
|
|
152
|
+
version: 1,
|
|
153
|
+
query
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* @returns {void}
|
|
159
|
+
*/
|
|
160
|
+
export function printQueryHelp() {
|
|
161
|
+
console.log("Usage: topogram query list [--json]");
|
|
162
|
+
console.log(" or: topogram query show <name> [--json]");
|
|
163
|
+
console.log(" or: topogram query widget-behavior [path] [--projection <id>] [--widget <id>] [--json]");
|
|
164
|
+
console.log(" or: topogram query <name> [path] [selectors] [--json]");
|
|
165
|
+
console.log("");
|
|
166
|
+
console.log("Agent-facing queries return focused JSON packets for context, review, verification, and generation follow-up.");
|
|
167
|
+
console.log("");
|
|
168
|
+
console.log("Common queries:");
|
|
169
|
+
for (const query of queryDefinitions()) {
|
|
170
|
+
console.log(` ${query.name}`);
|
|
171
|
+
console.log(` ${query.description}`);
|
|
172
|
+
console.log(` example: ${query.example}`);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
/**
|
|
177
|
+
* @param {QueryDefinitionPayload} payload
|
|
178
|
+
* @returns {void}
|
|
179
|
+
*/
|
|
180
|
+
export function printQueryDefinition(payload) {
|
|
181
|
+
const query = payload.query;
|
|
182
|
+
console.log(`Query: ${query.name}`);
|
|
183
|
+
console.log(`Purpose: ${query.purpose}`);
|
|
184
|
+
console.log(`Description: ${query.description}`);
|
|
185
|
+
console.log(`Output: ${query.output}`);
|
|
186
|
+
console.log(`Arguments: ${query.args.join(" ")}`);
|
|
187
|
+
console.log(`Selectors: ${query.selectors.join(", ") || "none"}`);
|
|
188
|
+
console.log(`Example: ${query.example}`);
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
/**
|
|
192
|
+
* @param {QueryListPayload} payload
|
|
193
|
+
* @returns {void}
|
|
194
|
+
*/
|
|
195
|
+
export function printQueryList(payload) {
|
|
196
|
+
console.log("Topogram queries:");
|
|
197
|
+
for (const query of payload.queries) {
|
|
198
|
+
console.log(`- ${query.name}: ${query.description}`);
|
|
199
|
+
console.log(` selectors: ${query.selectors.join(", ") || "none"}`);
|
|
200
|
+
console.log(` example: ${query.example}`);
|
|
201
|
+
}
|
|
202
|
+
}
|