@sdd-method/maintain-cli 0.0.0-stage → 0.1.0-rc.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.
Files changed (206) hide show
  1. package/LICENSE +201 -0
  2. package/NOTICE +17 -0
  3. package/README.md +6 -2
  4. package/dist/lib/adr-origin.js +59 -0
  5. package/dist/lib/agent-harness.js +28 -0
  6. package/dist/lib/briefing/index.js +13 -0
  7. package/dist/lib/briefing/render.js +123 -0
  8. package/dist/lib/briefing/variables.js +92 -0
  9. package/dist/lib/bundle.js +123 -0
  10. package/dist/lib/catalogue/aggregate.js +2404 -0
  11. package/dist/lib/catalogue/aggregation-manifest-loader.js +173 -0
  12. package/dist/lib/catalogue/application-archetype/expectations.js +119 -0
  13. package/dist/lib/catalogue/application-archetype/vocabulary.js +177 -0
  14. package/dist/lib/catalogue/archetype/maps/android.yaml +66 -0
  15. package/dist/lib/catalogue/archetype/maps/swiftui.yaml +58 -0
  16. package/dist/lib/catalogue/archetype/maps/uikit.yaml +48 -0
  17. package/dist/lib/catalogue/archetype/maps/web-generic.yaml +86 -0
  18. package/dist/lib/catalogue/archetype/openui-archetype-vocabulary.yaml +46 -0
  19. package/dist/lib/catalogue/archetype/resolver.js +103 -0
  20. package/dist/lib/catalogue/archetype/wireframe.js +418 -0
  21. package/dist/lib/catalogue/baseline-check.js +151 -0
  22. package/dist/lib/catalogue/build.js +1502 -0
  23. package/dist/lib/catalogue/builders/adr-supersedes.js +103 -0
  24. package/dist/lib/catalogue/builders/adrs.js +222 -0
  25. package/dist/lib/catalogue/builders/application-conformance-coverage.js +47 -0
  26. package/dist/lib/catalogue/builders/application-data-plane-bindings.js +115 -0
  27. package/dist/lib/catalogue/builders/c4-components.js +229 -0
  28. package/dist/lib/catalogue/builders/c4-containers.js +240 -0
  29. package/dist/lib/catalogue/builders/c4-entity-rollups.js +87 -0
  30. package/dist/lib/catalogue/builders/c4-external-systems.js +194 -0
  31. package/dist/lib/catalogue/builders/c4-l1-candidates.js +107 -0
  32. package/dist/lib/catalogue/builders/c4-systems.js +98 -0
  33. package/dist/lib/catalogue/builders/capabilities.js +488 -0
  34. package/dist/lib/catalogue/builders/capability-domain-model.js +74 -0
  35. package/dist/lib/catalogue/builders/capability-edges.js +256 -0
  36. package/dist/lib/catalogue/builders/capability-spec-walker.js +99 -0
  37. package/dist/lib/catalogue/builders/capability-spec.js +348 -0
  38. package/dist/lib/catalogue/builders/container-dependency.js +183 -0
  39. package/dist/lib/catalogue/builders/contracts.js +402 -0
  40. package/dist/lib/catalogue/builders/data-items.js +344 -0
  41. package/dist/lib/catalogue/builders/data-store-mapping.js +113 -0
  42. package/dist/lib/catalogue/builders/domain-models.js +175 -0
  43. package/dist/lib/catalogue/builders/domains.js +119 -0
  44. package/dist/lib/catalogue/builders/edge-label-merge.js +19 -0
  45. package/dist/lib/catalogue/builders/entities-manifest.js +160 -0
  46. package/dist/lib/catalogue/builders/entities-mermaid.js +189 -0
  47. package/dist/lib/catalogue/builders/entity-persistence.js +102 -0
  48. package/dist/lib/catalogue/builders/entity-slug.js +47 -0
  49. package/dist/lib/catalogue/builders/event-catalog-walker.js +186 -0
  50. package/dist/lib/catalogue/builders/event-edges.js +327 -0
  51. package/dist/lib/catalogue/builders/events.js +168 -0
  52. package/dist/lib/catalogue/builders/evidence-class.js +43 -0
  53. package/dist/lib/catalogue/builders/evidence-target-repo.js +67 -0
  54. package/dist/lib/catalogue/builders/external-system-exemption.js +120 -0
  55. package/dist/lib/catalogue/builders/feature-contract.js +77 -0
  56. package/dist/lib/catalogue/builders/feature-domain-model.js +50 -0
  57. package/dist/lib/catalogue/builders/feature-grounding-walker.js +254 -0
  58. package/dist/lib/catalogue/builders/feature-grounding.js +391 -0
  59. package/dist/lib/catalogue/builders/feature-groups.js +63 -0
  60. package/dist/lib/catalogue/builders/feature-subscription-channels.js +228 -0
  61. package/dist/lib/catalogue/builders/feature-tree-walker.js +295 -0
  62. package/dist/lib/catalogue/builders/features.js +300 -0
  63. package/dist/lib/catalogue/builders/glossary-xref.js +378 -0
  64. package/dist/lib/catalogue/builders/glossary.js +204 -0
  65. package/dist/lib/catalogue/builders/implementations.js +214 -0
  66. package/dist/lib/catalogue/builders/index.js +64 -0
  67. package/dist/lib/catalogue/builders/integration-components.js +344 -0
  68. package/dist/lib/catalogue/builders/integrations.js +181 -0
  69. package/dist/lib/catalogue/builders/persona-c4system.js +149 -0
  70. package/dist/lib/catalogue/builders/persona-container.js +133 -0
  71. package/dist/lib/catalogue/builders/persona-journey-edges.js +133 -0
  72. package/dist/lib/catalogue/builders/personas.js +152 -0
  73. package/dist/lib/catalogue/builders/product-edges.js +106 -0
  74. package/dist/lib/catalogue/builders/product-platform-dependencies.js +405 -0
  75. package/dist/lib/catalogue/builders/products.js +162 -0
  76. package/dist/lib/catalogue/builders/quality-scores.js +635 -0
  77. package/dist/lib/catalogue/builders/repo-capability-exemption.js +61 -0
  78. package/dist/lib/catalogue/builders/repo-dependency.js +127 -0
  79. package/dist/lib/catalogue/builders/repo-edges.js +340 -0
  80. package/dist/lib/catalogue/builders/repositories.js +458 -0
  81. package/dist/lib/catalogue/builders/scaffolds.js +197 -0
  82. package/dist/lib/catalogue/builders/screen-tree.js +222 -0
  83. package/dist/lib/catalogue/builders/screens.js +396 -0
  84. package/dist/lib/catalogue/builders/service-capability-exemption.js +63 -0
  85. package/dist/lib/catalogue/builders/service-contract-consumes.js +186 -0
  86. package/dist/lib/catalogue/builders/service-contract.js +74 -0
  87. package/dist/lib/catalogue/builders/service-entity-tables.js +187 -0
  88. package/dist/lib/catalogue/builders/services.js +232 -0
  89. package/dist/lib/catalogue/builders/system-external-dependency.js +115 -0
  90. package/dist/lib/catalogue/builders/user-journeys.js +253 -0
  91. package/dist/lib/catalogue/canonical-schema.yaml +4117 -0
  92. package/dist/lib/catalogue/cli-version.js +10 -0
  93. package/dist/lib/catalogue/contract-id.js +49 -0
  94. package/dist/lib/catalogue/contract-path-resolution.js +149 -0
  95. package/dist/lib/catalogue/coverage-predicates.js +603 -0
  96. package/dist/lib/catalogue/coverage-render.js +552 -0
  97. package/dist/lib/catalogue/coverage-run.js +115 -0
  98. package/dist/lib/catalogue/csv-reader.js +97 -0
  99. package/dist/lib/catalogue/csv-writer.js +96 -0
  100. package/dist/lib/catalogue/data-item-coverage.js +142 -0
  101. package/dist/lib/catalogue/data-plane-coherence.js +77 -0
  102. package/dist/lib/catalogue/ddl-generator.js +233 -0
  103. package/dist/lib/catalogue/dedupe-keyed-tables.js +0 -0
  104. package/dist/lib/catalogue/engine-validator.js +239 -0
  105. package/dist/lib/catalogue/ext-id.js +76 -0
  106. package/dist/lib/catalogue/feature-grounding-aliases-loader.js +65 -0
  107. package/dist/lib/catalogue/feature-repo-zero-resolution-summary.js +31 -0
  108. package/dist/lib/catalogue/finding-identity.js +183 -0
  109. package/dist/lib/catalogue/findings.js +46 -0
  110. package/dist/lib/catalogue/fk-validator.js +136 -0
  111. package/dist/lib/catalogue/freshness.js +69 -0
  112. package/dist/lib/catalogue/gate-checks.js +338 -0
  113. package/dist/lib/catalogue/graph-projection.js +346 -0
  114. package/dist/lib/catalogue/graph-run.js +64 -0
  115. package/dist/lib/catalogue/impact-run.js +228 -0
  116. package/dist/lib/catalogue/manifest-loader.js +435 -0
  117. package/dist/lib/catalogue/platform-scope.js +7 -0
  118. package/dist/lib/catalogue/population-checks.js +87 -0
  119. package/dist/lib/catalogue/relationship-semantics.js +66 -0
  120. package/dist/lib/catalogue/reverse-product-quality.js +99 -0
  121. package/dist/lib/catalogue/rubric-coverage-map.yaml +871 -0
  122. package/dist/lib/catalogue/runway-vocabulary-loader.js +56 -0
  123. package/dist/lib/catalogue/scaffold-delta.js +261 -0
  124. package/dist/lib/catalogue/schema-compat.js +52 -0
  125. package/dist/lib/catalogue/schema-loader.js +87 -0
  126. package/dist/lib/catalogue/scores-coverage.js +573 -0
  127. package/dist/lib/catalogue/screen-validation-loader.js +89 -0
  128. package/dist/lib/catalogue/service-architecture-parser.js +193 -0
  129. package/dist/lib/catalogue/service-contract-aliases-loader.js +109 -0
  130. package/dist/lib/catalogue/staleness-verdicts.js +345 -0
  131. package/dist/lib/catalogue/traceability-loader.js +350 -0
  132. package/dist/lib/catalogue/validate.js +200 -0
  133. package/dist/lib/catalogue/version.js +18 -0
  134. package/dist/lib/ci-binding/index.js +209 -0
  135. package/dist/lib/ci-binding/module.js +204 -0
  136. package/dist/lib/conformance/binding.js +70 -0
  137. package/dist/lib/context-pull/index.js +151 -0
  138. package/dist/lib/context-pull/resolve.js +70 -0
  139. package/dist/lib/generate-briefing/index.js +77 -0
  140. package/dist/lib/hooks-seed/copilot.js +167 -0
  141. package/dist/lib/hooks-seed/entries.js +47 -0
  142. package/dist/lib/hooks-seed/index.js +17 -0
  143. package/dist/lib/hooks-seed/lifecycle-mapping.js +28 -0
  144. package/dist/lib/hooks-seed/merge.js +128 -0
  145. package/dist/lib/hooks-seed/types.js +20 -0
  146. package/dist/lib/init/ci-workflow.js +89 -0
  147. package/dist/lib/list/discover.js +100 -0
  148. package/dist/lib/list/format.js +84 -0
  149. package/dist/lib/list/index.js +16 -0
  150. package/dist/lib/lock-file.js +432 -0
  151. package/dist/lib/mcp-seed/entries.js +14 -0
  152. package/dist/lib/mcp-seed/index.js +28 -0
  153. package/dist/lib/mcp-seed/merge.js +99 -0
  154. package/dist/lib/mcp-seed/types.js +13 -0
  155. package/dist/lib/pack/builder.js +303 -0
  156. package/dist/lib/pack/index.js +87 -0
  157. package/dist/lib/pack/leakage.js +144 -0
  158. package/dist/lib/pack/log.js +18 -0
  159. package/dist/lib/pack/publish-transform.js +233 -0
  160. package/dist/lib/pack/reference-closure.js +125 -0
  161. package/dist/lib/pack/schema.js +121 -0
  162. package/dist/lib/pack/seed.js +182 -0
  163. package/dist/lib/pack/validate.js +49 -0
  164. package/dist/lib/package-version.js +92 -0
  165. package/dist/lib/repo-kind.js +129 -0
  166. package/dist/lib/scripts.js +7 -0
  167. package/dist/lib/snapshot/catalogue-diff.js +219 -0
  168. package/dist/lib/snapshot/manifest.js +206 -0
  169. package/dist/lib/sync/adr-transitions.js +250 -0
  170. package/dist/lib/sync/apply.js +91 -0
  171. package/dist/lib/sync/briefing-merge.js +90 -0
  172. package/dist/lib/sync/bundle-cache.js +109 -0
  173. package/dist/lib/sync/bundle-source.js +61 -0
  174. package/dist/lib/sync/config.js +72 -0
  175. package/dist/lib/sync/copilot-hooks-merge.js +108 -0
  176. package/dist/lib/sync/diff.js +251 -0
  177. package/dist/lib/sync/index.js +809 -0
  178. package/dist/lib/sync/settings-merge.js +216 -0
  179. package/dist/lib/sync/yaml-block-merge.js +120 -0
  180. package/dist/lib/validate/aggregate.js +51 -0
  181. package/dist/lib/validate/bundle-coherence.js +74 -0
  182. package/dist/lib/validate/dispatch.js +243 -0
  183. package/dist/lib/validate/index.js +110 -0
  184. package/dist/lib/validate/plan.js +54 -0
  185. package/dist/lib/validate/runner.js +85 -0
  186. package/dist/lib/validate/yaml-parse.js +112 -0
  187. package/dist/maintain-bin.js +8 -0
  188. package/dist/maintain-program.js +91 -0
  189. package/dist/maintain-version.json +4 -0
  190. package/dist/verbs/catalogue-maintain.js +110 -0
  191. package/dist/verbs/catalogue-verify.js +114 -0
  192. package/dist/verbs/context.js +39 -0
  193. package/dist/verbs/generate-briefing.js +29 -0
  194. package/dist/verbs/list.js +45 -0
  195. package/dist/verbs/pack-build.js +31 -0
  196. package/dist/verbs/pack-validate.js +17 -0
  197. package/dist/verbs/path-option.js +25 -0
  198. package/dist/verbs/render.js +87 -0
  199. package/dist/verbs/sync.js +98 -0
  200. package/dist/verbs/validate.js +48 -0
  201. package/dist/verify-program.js +122 -0
  202. package/dist/verify-version.json +4 -0
  203. package/package.json +32 -4
  204. package/scripts/validate-app-dependencies.sh +664 -0
  205. package/scripts/validate-app-docs.sh +199 -0
  206. package/scripts/validate-integration-docs.sh +505 -0
@@ -0,0 +1,98 @@
1
+ import { AGENT_HARNESSES, resolveAgentHarness, } from "../lib/agent-harness.js";
2
+ import { loadSyncConfig } from "../lib/sync/config.js";
3
+ import { materialiseBundle } from "../lib/sync/bundle-source.js";
4
+ import { runSync } from "../lib/sync/index.js";
5
+ import { CI_BINDINGS, isCiBinding } from "../lib/ci-binding/index.js";
6
+ import { resolvePathOption } from "./path-option.js";
7
+ export function registerSync(program) {
8
+ program
9
+ .command("sync")
10
+ .description("Pull upstream method baselines + adopter packs into this SDD repository")
11
+ .option("--bundle <path>", "path to a single bundle tarball (mutually exclusive with --config)")
12
+ .option("--config <path>", "path to a multi-bundle sync config (iterates bundles in declared order; runs each through the single-bundle sync engine)")
13
+ .option("--target-repo <dir>", "target SDD repo", resolvePathOption, process.cwd())
14
+ .option("--dry-run", "report planned actions without writing")
15
+ .option("--replace-bundle <name>", "migrate: drop the named bundle's lock block and release its paths to the incoming bundle (single --bundle mode only; prints the shared/arriving/orphaned split; requires --yes outside --dry-run)")
16
+ .option("--yes", "confirm a --replace-bundle migration outside --dry-run")
17
+ .option("--allow-overwrite", "accept overwrites of locally-modified method content")
18
+ .option("--no-delete", "preserve files removed upstream")
19
+ .option("--agent-harness <name>", `target agent harness for hooks + briefing. Default: claude-code. Supported: ${AGENT_HARNESSES.join(", ")}`)
20
+ .option("--ci-binding <host>", `CI host whose wrapper calls the Method Validation module (M-ADR 0219): ${CI_BINDINGS.join(", ")}. Default: the binding the lock records, else github; a new choice is recorded in the lock`)
21
+ .action(async (opts) => {
22
+ if (opts.ciBinding !== undefined && !isCiBinding(opts.ciBinding)) {
23
+ process.stderr.write(`[FAIL] --ci-binding must be one of ${CI_BINDINGS.join(", ")}; got '${opts.ciBinding}'\n`);
24
+ process.exit(1);
25
+ }
26
+ const ciBinding = opts.ciBinding;
27
+ let agentHarness;
28
+ try {
29
+ agentHarness = resolveAgentHarness(opts.agentHarness);
30
+ }
31
+ catch (err) {
32
+ process.stderr.write(`[FAIL] ${err.message}\n`);
33
+ process.exit(1);
34
+ }
35
+ if (opts.bundle && opts.config) {
36
+ process.stderr.write("[FAIL] --bundle and --config are mutually exclusive\n");
37
+ process.exit(1);
38
+ }
39
+ if (opts.replaceBundle && !opts.bundle) {
40
+ process.stderr.write("[FAIL] --replace-bundle requires single-bundle mode (--bundle <tarball>) — a migration is one deliberate act, not a config iteration\n");
41
+ process.exit(1);
42
+ }
43
+ // Single-bundle path (legacy and explicit).
44
+ if (opts.bundle) {
45
+ const { exitCode } = await runSync({
46
+ bundle: opts.bundle,
47
+ targetRepo: opts.targetRepo,
48
+ dryRun: opts.dryRun === true,
49
+ allowOverwrite: opts.allowOverwrite === true,
50
+ delete: opts.delete,
51
+ agentHarness,
52
+ ...(ciBinding ? { ciBinding } : {}),
53
+ ...(opts.replaceBundle ? { replaceBundle: opts.replaceBundle } : {}),
54
+ ...(opts.yes === true ? { yes: true } : {}),
55
+ });
56
+ if (exitCode !== 0)
57
+ process.exit(exitCode);
58
+ return;
59
+ }
60
+ // Multi-bundle path via --config.
61
+ if (!opts.config) {
62
+ process.stderr.write("[FAIL] one of --bundle or --config is required\n");
63
+ process.exit(1);
64
+ }
65
+ try {
66
+ const config = await loadSyncConfig(opts.config);
67
+ for (const entry of config.bundles) {
68
+ // Resolve the entry to a verified local tarball (local path used
69
+ // in place; an internal-HTTPS source fetched to a temp file; the
70
+ // sha256 pin checked when present), then apply + release.
71
+ const resolved = await materialiseBundle(entry);
72
+ try {
73
+ const { exitCode } = await runSync({
74
+ bundle: resolved.localPath,
75
+ targetRepo: opts.targetRepo,
76
+ dryRun: opts.dryRun === true,
77
+ allowOverwrite: opts.allowOverwrite === true,
78
+ delete: opts.delete,
79
+ agentHarness,
80
+ ...(ciBinding ? { ciBinding } : {}),
81
+ });
82
+ if (exitCode !== 0) {
83
+ await resolved.cleanup();
84
+ process.exit(exitCode);
85
+ }
86
+ }
87
+ finally {
88
+ await resolved.cleanup();
89
+ }
90
+ }
91
+ }
92
+ catch (err) {
93
+ process.stderr.write(`[FAIL] ${err.message}\n`);
94
+ process.exit(1);
95
+ }
96
+ });
97
+ }
98
+ //# sourceMappingURL=sync.js.map
@@ -0,0 +1,48 @@
1
+ import { runValidate } from "../lib/validate/index.js";
2
+ import { methodValidationPlan } from "../lib/validate/plan.js";
3
+ import { profileFromRepoKind, readRepoKind } from "../lib/repo-kind.js";
4
+ const LISTABLE = ["platform", "application", "integration"];
5
+ const isListable = (p) => LISTABLE.includes(p);
6
+ import { resolvePathOption } from "./path-option.js";
7
+ export function registerValidate(program) {
8
+ program
9
+ .command("validate")
10
+ .description("Run the method-level validation suite for this SDD repository")
11
+ .option("--target-repo <dir>", "target SDD repo", resolvePathOption, process.cwd())
12
+ .option("--platform-root <dir>", "path to the sdd-method (or platform) repo, required for app-dependencies", resolvePathOption)
13
+ .option("--validator <name>", "run only the named validator")
14
+ .option("--strict", "treat warnings as failures")
15
+ .option("--list", "print the method-managed validation job for this repo's profile as JSON (the plan every CI executor runs, the Dagger module included) and run nothing")
16
+ .option("--profile <profile>", "with --list: the profile to list, instead of reading .sdd-repo-kind (platform | application | integration)")
17
+ .action(async (opts) => {
18
+ if (opts.list === true) {
19
+ let profile;
20
+ if (opts.profile !== undefined) {
21
+ if (!isListable(opts.profile)) {
22
+ process.stderr.write(`--profile must be platform, application or integration (got: ${opts.profile})\n`);
23
+ process.exit(2);
24
+ }
25
+ profile = opts.profile;
26
+ }
27
+ else {
28
+ const kind = await readRepoKind(opts.targetRepo);
29
+ if (kind === null) {
30
+ process.stderr.write(`Not an SDD repo (no .sdd-repo-kind in ${opts.targetRepo}); pass --profile\n`);
31
+ process.exit(1);
32
+ }
33
+ profile = profileFromRepoKind(kind);
34
+ }
35
+ process.stdout.write(JSON.stringify({ profile, steps: methodValidationPlan(profile) }, null, 2) + "\n");
36
+ return;
37
+ }
38
+ const { exitCode } = await runValidate({
39
+ targetRepo: opts.targetRepo,
40
+ ...(opts.platformRoot ? { platformRoot: opts.platformRoot } : {}),
41
+ ...(opts.validator ? { validator: opts.validator } : {}),
42
+ strict: opts.strict === true,
43
+ });
44
+ if (exitCode !== 0)
45
+ process.exit(exitCode);
46
+ });
47
+ }
48
+ //# sourceMappingURL=validate.js.map
@@ -0,0 +1,122 @@
1
+ // Third entrypoint: the VERIFY surface — M-ADR 0212 §4.3b.
2
+ //
3
+ // A binary that CANNOT WRITE to the repository it is pointed at. That is the
4
+ // whole property, and it is the one a pipeline can rely on: whatever runs
5
+ // `sdd-verify` in CI can judge a repository and cannot change it.
6
+ //
7
+ // Two criteria admit a verb here, and both are required:
8
+ // 1. it does not write to the target repository — TESTED, not read from a
9
+ // description: the package acceptance check runs every verb in every mode
10
+ // against a clean checkout and requires `git status --porcelain` to be
11
+ // empty. Reading help text misfiled four verbs before that test existed
12
+ // (`sync`, `render`, `catalogue graph`, `metamodel roundtrip`).
13
+ // 2. it has something to act on in an adopter repository today. A read-only
14
+ // verb can fail this and pass (1): `metamodel roundtrip` is producer-only,
15
+ // `catalogue migration-map` serves a finished migration. Neither is here.
16
+ //
17
+ // ⚠ The boundary is ABSENCE, not a menu. The package ships only the import
18
+ // closure of this file, so an excluded verb's code is not present to be reached
19
+ // by any path — including `mcp serve`, which exposes the SDD as tools and would
20
+ // hand authoring back through a second door. That is why registration imports
21
+ // per-subcommand registrars (`catalogue-verify.ts`, `pack-validate.ts`) and never
22
+ // a barrel that re-exports a build path.
23
+ //
24
+ // Verbs are the SAME registrars the full CLI uses: one implementation, two
25
+ // surfaces, so behaviour cannot drift between them.
26
+ import { Command, CommanderError } from "commander";
27
+ import { getPackageVersion } from "./lib/package-version.js";
28
+ import { registerCatalogueBaselineCheck, registerCatalogueImpact, registerCatalogueValidate, registerCatalogueVersion, } from "./verbs/catalogue-verify.js";
29
+ import { registerList } from "./verbs/list.js";
30
+ import { registerPackValidate } from "./verbs/pack-validate.js";
31
+ import { registerValidate } from "./verbs/validate.js";
32
+ const SPEC_URL = "https://github.com/tomfosteruk/sdd-method/blob/main/docs/method/cli/sdd-cli-specification.md";
33
+ /** The full surface, as `<verb>` or `<verb> <subcommand>`. Asserted by test. */
34
+ export const VERIFY_SURFACE = [
35
+ "validate",
36
+ "list",
37
+ "pack validate",
38
+ "catalogue validate",
39
+ "catalogue impact",
40
+ "catalogue baseline-check",
41
+ "catalogue version",
42
+ ];
43
+ const OUTSIDE = "is not part of sdd-verify, which cannot write to the repository it is pointed at. " +
44
+ "Authoring and maintenance verbs are in @sdd-method/sdd-cli.";
45
+ /**
46
+ * Refuse anything outside the surface BEFORE commander parses it. Left to
47
+ * commander, `sdd-verify sync --help` prints top-level usage and exits 0 — in a
48
+ * pipeline that is a step that runs nothing and passes, which is the failure
49
+ * this binary exists to prevent. So an excluded verb fails, loudly, whatever
50
+ * flags accompany it.
51
+ */
52
+ export function rejectOutsideSurface(program, argv, outside = OUTSIDE) {
53
+ const words = argv.filter((a) => !a.startsWith("-"));
54
+ if (words.length === 0)
55
+ return;
56
+ const [verb, sub] = words;
57
+ if (verb === "help")
58
+ return;
59
+ const cmd = program.commands.find((c) => c.name() === verb);
60
+ if (!cmd)
61
+ throw new Error(`'${verb}' ${outside}`);
62
+ const subs = cmd.commands.map((c) => c.name()).filter((n) => n !== "help");
63
+ if (subs.length > 0 && sub !== undefined && sub !== "help" && !subs.includes(sub)) {
64
+ throw new Error(`'${verb} ${sub}' ${outside}`);
65
+ }
66
+ }
67
+ export async function runVerify(argv) {
68
+ const program = buildVerifyProgram();
69
+ if (argv.length === 0) {
70
+ program.outputHelp();
71
+ return;
72
+ }
73
+ rejectOutsideSurface(program, argv);
74
+ try {
75
+ await program.parseAsync([...argv], { from: "user" });
76
+ }
77
+ catch (err) {
78
+ if (err instanceof CommanderError) {
79
+ if (err.code === "commander.help" ||
80
+ err.code === "commander.helpDisplayed" ||
81
+ err.code === "commander.version") {
82
+ return;
83
+ }
84
+ }
85
+ throw err;
86
+ }
87
+ }
88
+ export function buildVerifyProgram() {
89
+ const program = new Command();
90
+ program
91
+ .name("sdd-verify")
92
+ .description("Verify an SDD repository without changing it — validate, list, and read-only catalogue and pack checks. Cannot write to the repository it is pointed at.")
93
+ .version(getPackageVersion(), "-v, --version")
94
+ .addHelpText("after", `\nSpec: ${SPEC_URL}\nAuthoring and maintenance verbs (sync, catalogue build, init, scaffold, mcp, …) are in @sdd-method/sdd-cli.`)
95
+ .exitOverride()
96
+ .configureOutput({
97
+ writeOut: (str) => process.stdout.write(str),
98
+ writeErr: (str) => process.stderr.write(str),
99
+ });
100
+ registerVerifySurface(program);
101
+ return program;
102
+ }
103
+ /**
104
+ * The verify verbs, registered onto any program. sdd-verify calls it; sdd-maintain calls it too,
105
+ * which is what makes the personas nest structurally: whatever verify ships, maintain ships.
106
+ */
107
+ export function registerVerifySurface(program) {
108
+ registerValidate(program);
109
+ registerList(program);
110
+ const pack = program
111
+ .command("pack")
112
+ .description("Validate adopter-shipped context-pack seeds (ADR 0151) — read-only");
113
+ registerPackValidate(pack);
114
+ const catalogue = program
115
+ .command("catalogue")
116
+ .description("Validate and query per-SDD catalogues (ADR 0134) — read-only, never rebuilds");
117
+ registerCatalogueValidate(catalogue);
118
+ registerCatalogueImpact(catalogue);
119
+ registerCatalogueBaselineCheck(catalogue);
120
+ registerCatalogueVersion(catalogue);
121
+ }
122
+ //# sourceMappingURL=verify-program.js.map
@@ -0,0 +1,4 @@
1
+ {
2
+ "version": "1.1.0-rc.0",
3
+ "built_against_sdd_cli": "1.42.0"
4
+ }
package/package.json CHANGED
@@ -1,6 +1,34 @@
1
1
  {
2
2
  "name": "@sdd-method/maintain-cli",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "0.1.0-rc.0",
4
+ "sddCliVersion": "1.42.0",
5
+ "description": "Bring an SDD repository current and rebuild its derived model \u2014 sync, briefing, catalogue build and aggregate, pack build, context pull \u2014 plus every read-only verify verb. Ships only the code those verbs reach; it cannot author specification content. Authoring is in @sdd-method/sdd-cli.",
6
+ "license": "Apache-2.0",
7
+ "type": "module",
8
+ "bin": {
9
+ "sdd-maintain": "dist/maintain-bin.js"
10
+ },
11
+ "engines": {
12
+ "node": ">=20.0.0"
13
+ },
14
+ "dependencies": {
15
+ "commander": "^12.1.0",
16
+ "yaml": "^2.5.0",
17
+ "zod": "^4.3.6",
18
+ "@duckdb/node-api": "^1.5.5-r.3"
19
+ },
20
+ "repository": {
21
+ "type": "git",
22
+ "url": "git+https://github.com/tomfosteruk/sdd-cli.git"
23
+ },
24
+ "publishConfig": {
25
+ "access": "public"
26
+ },
27
+ "files": [
28
+ "dist",
29
+ "scripts",
30
+ "README.md",
31
+ "LICENSE",
32
+ "NOTICE"
33
+ ]
34
+ }