@sdd-method/author-cli 0.2.0 → 0.3.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 (67) hide show
  1. package/dist/lib/api-surface/__fixtures__/serverless-repo/serverless/serverless.yml +4 -4
  2. package/dist/lib/api-surface/analyzers/serverless.js +1 -1
  3. package/dist/lib/api-surface/analyzers/spring.js +1 -1
  4. package/dist/lib/briefing/render.js +1 -2
  5. package/dist/lib/briefing/variables.js +1 -2
  6. package/dist/lib/catalogue/archetype/wireframe.js +1 -1
  7. package/dist/lib/catalogue/build.js +17 -23
  8. package/dist/lib/catalogue/builders/application-conformance-coverage.js +1 -1
  9. package/dist/lib/catalogue/builders/c4-components.js +4 -5
  10. package/dist/lib/catalogue/builders/c4-containers.js +3 -3
  11. package/dist/lib/catalogue/builders/c4-external-systems.js +1 -1
  12. package/dist/lib/catalogue/builders/c4-l1-candidates.js +1 -1
  13. package/dist/lib/catalogue/builders/capabilities.js +2 -2
  14. package/dist/lib/catalogue/builders/capability-edges.js +4 -4
  15. package/dist/lib/catalogue/builders/capability-spec-walker.js +3 -3
  16. package/dist/lib/catalogue/builders/container-dependency.js +18 -19
  17. package/dist/lib/catalogue/builders/contracts.js +5 -6
  18. package/dist/lib/catalogue/builders/data-store-mapping.js +3 -3
  19. package/dist/lib/catalogue/builders/edge-label-merge.js +2 -2
  20. package/dist/lib/catalogue/builders/entities-manifest.js +1 -1
  21. package/dist/lib/catalogue/builders/entities-mermaid.js +3 -3
  22. package/dist/lib/catalogue/builders/entity-slug.js +11 -12
  23. package/dist/lib/catalogue/builders/event-catalog-walker.js +3 -3
  24. package/dist/lib/catalogue/builders/evidence-class.js +2 -2
  25. package/dist/lib/catalogue/builders/external-system-exemption.js +1 -1
  26. package/dist/lib/catalogue/builders/feature-contract.js +1 -3
  27. package/dist/lib/catalogue/builders/feature-grounding.js +1 -2
  28. package/dist/lib/catalogue/builders/feature-groups.js +0 -1
  29. package/dist/lib/catalogue/builders/feature-subscription-channels.js +2 -3
  30. package/dist/lib/catalogue/builders/feature-tree-walker.js +1 -1
  31. package/dist/lib/catalogue/builders/features.js +3 -4
  32. package/dist/lib/catalogue/builders/glossary-xref.js +1 -1
  33. package/dist/lib/catalogue/builders/persona-c4system.js +7 -7
  34. package/dist/lib/catalogue/builders/persona-container.js +14 -14
  35. package/dist/lib/catalogue/builders/personas.js +1 -2
  36. package/dist/lib/catalogue/builders/product-platform-dependencies.js +2 -2
  37. package/dist/lib/catalogue/builders/quality-scores.js +1 -1
  38. package/dist/lib/catalogue/builders/repositories.js +2 -2
  39. package/dist/lib/catalogue/builders/screen-tree.js +1 -1
  40. package/dist/lib/catalogue/builders/screens.js +3 -4
  41. package/dist/lib/catalogue/builders/system-external-dependency.js +7 -7
  42. package/dist/lib/catalogue/canonical-schema.yaml +23 -23
  43. package/dist/lib/catalogue/coverage-predicates.js +4 -4
  44. package/dist/lib/catalogue/coverage-run.js +1 -1
  45. package/dist/lib/catalogue/dedupe-keyed-tables.js +2 -3
  46. package/dist/lib/catalogue/ext-id.js +4 -4
  47. package/dist/lib/catalogue/feature-grounding-aliases-loader.js +1 -1
  48. package/dist/lib/catalogue/finding-identity.js +3 -3
  49. package/dist/lib/catalogue/freshness.js +1 -1
  50. package/dist/lib/catalogue/manifest-loader.js +2 -2
  51. package/dist/lib/catalogue/scaffold-delta.js +1 -1
  52. package/dist/lib/catalogue/schema-compat.js +1 -2
  53. package/dist/lib/catalogue/screen-validation-loader.js +1 -1
  54. package/dist/lib/catalogue/staleness-verdicts.js +2 -2
  55. package/dist/lib/catalogue/traceability-loader.js +2 -3
  56. package/dist/lib/conformance/index.js +29 -8
  57. package/dist/lib/lock-file.js +1 -1
  58. package/dist/lib/package-version.js +1 -1
  59. package/dist/lib/snapshot/manifest.js +1 -1
  60. package/dist/lib/snapshot/targets.js +1 -1
  61. package/dist/lib/validate/index.js +1 -1
  62. package/dist/lib/validate/plan.js +1 -1
  63. package/dist/lib/validate/yaml-parse.js +1 -1
  64. package/dist/maintain-version.json +2 -2
  65. package/dist/verbs/plan.js +3 -3
  66. package/dist/verify-version.json +2 -2
  67. package/package.json +2 -2
@@ -12,12 +12,12 @@
12
12
  // carries (`name`), so the old→new map is a build artefact, not an authored
13
13
  // migration: `sdd-cli catalogue migration-map` emits it, and the exemption
14
14
  // loader consults it during the cut window (an authored exemption keyed by
15
- // a mapped old id is regenerable, NOT drift — the F30 rule at schema scale).
15
+ // a mapped old id is regenerable, NOT drift — the regenerability rule at schema scale).
16
16
  /**
17
17
  * Normalise a declared diagram entry id to slug form. Camel humps split
18
- * BEFORE lowercasing (the F11a rule, matching the aggregator's resolver):
19
- * most SDD ids are hyphenated, and `bvfmGatewayFramework` must derive the
20
- * same identity the adjudicator resolves for it (`bvfm-gateway-framework`).
18
+ * BEFORE lowercasing (matching the aggregator's resolver):
19
+ * most SDD ids are hyphenated, and `posGatewayFramework` must derive the
20
+ * same identity the adjudicator resolves for it (`pos-gateway-framework`).
21
21
  */
22
22
  export function normaliseEntryId(entryId) {
23
23
  return entryId
@@ -14,7 +14,7 @@
14
14
  * AuthHandler: example-service-api
15
15
  * web-ui: example-web-ui
16
16
  * repo_aliases:
17
- * camera-bff: global-camera-bff
17
+ * stock-bff: northwind-stock-bff
18
18
  *
19
19
  * Either block is optional. Empty / missing file = no aliases (every
20
20
  * reference must resolve directly against the canonical id).
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Finding IDENTITY — the stable key a findings baseline is compared on, per
3
- * M-ADR 0132 §4.3 as amended, delivering the ruling recorded at ledger §3p.
3
+ * M-ADR 0132 §4.3 as amended.
4
4
  *
5
5
  * THE PROBLEM THIS EXISTS FOR, measured rather than asserted. A findings
6
6
  * baseline stores whole `[finding]` lines, so improving a message invalidates
@@ -17,7 +17,7 @@
17
17
  * files, 74 non-empty, 1,677 body lines — that works for 1,434 lines (85.5%)
18
18
  * and fails for 243 (14.5%), which embed their subject in prose:
19
19
  *
20
- * [finding] orphan: repo integration-calamp resolves to no capability ...
20
+ * [finding] orphan: repo integration-acme resolves to no capability ...
21
21
  *
22
22
  * One renderer template, all orphan class, spread across 62 repos. Recovering
23
23
  * identity there means teaching the comparator the renderer's message
@@ -30,7 +30,7 @@
30
30
  * baseline is reviewed by people and a side-channel nobody sees is a side
31
31
  * channel nobody maintains:
32
32
  *
33
- * [finding] orphan (repo:integration-calamp): repo integration-calamp ...
33
+ * [finding] orphan (repo:integration-acme): repo integration-acme ...
34
34
  * [finding] divergence (docs/domains/asset/product/x.traceability.yaml): ...
35
35
  *
36
36
  * A finding with no declared subject renders EXACTLY as it does today. That is
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * `catalogue build --check`: are the committed catalogues what the committed specs build to?
3
- * (M-ADR 0218 §5, bead sdm-jts.6.)
3
+ * (M-ADR 0218 §5.)
4
4
  *
5
5
  * Builds into a temporary directory and compares, so it writes nothing into the SDD. Only what
6
6
  * the build PRODUCES is compared: a hand-written file that happens to sit in catalogues/ (a
@@ -123,7 +123,7 @@ const DataPlaneSchema = z.object({
123
123
  bindings: z.array(DataPlaneBindingSchema),
124
124
  deviations: z.array(DataPlaneDeviationSchema).optional(),
125
125
  });
126
- // Conformance coverage (M-ADR 0191 §4.3, second overlay element — WS4). An
126
+ // Conformance coverage (M-ADR 0191 §4.3, second overlay element). An
127
127
  // application-product asserts which of its archetype's conformance expectations
128
128
  // its own conformance suite exercises (`coverage`), and declares a rationale for
129
129
  // any expected tag it deliberately does not cover (`deviations`). The method
@@ -249,7 +249,7 @@ const ManifestSchema = z.object({
249
249
  // optional declared deviations from the archetype default, each carrying a
250
250
  // rationale so the mismatch is sanctioned variance, not silent drift.
251
251
  data_plane: DataPlaneSchema.optional(),
252
- // Conformance coverage declaration (M-ADR 0191 §4.3 WS4, sdd-manifest-schema
252
+ // Conformance coverage declaration (M-ADR 0191 §4.3, sdd-manifest-schema
253
253
  // 1.5.0). Which archetype conformance expectations the product's suite
254
254
  // exercises, plus rationales for any it deliberately does not.
255
255
  conformance: ConformanceSchema.optional(),
@@ -216,7 +216,7 @@ export async function runScaffoldDelta(session, options) {
216
216
  }
217
217
  /**
218
218
  * The delta's DEFECT classes are gate-acting (`divergence`), PROMOTED by a
219
- * recorded governance act after the M-ADR 0207 §4.9 pilot completed with no
219
+ * recorded method act after the M-ADR 0207 §4.9 pilot completed with no
220
220
  * surprise in any gated figure (2026-08-08) — the deliberate later act the
221
221
  * scores-coverage precedent reserves, performed. `scaffold-stale` stays
222
222
  * `coverage` with its staleness family: a stale anchor is a re-declare
@@ -1,8 +1,7 @@
1
1
  /**
2
2
  * Per-schema compatibility ranges declared by this sdd-cli build.
3
3
  *
4
- * Per resolution of adopt-canonical-catalogue-builder.md §7.5, the three
5
- * sdd-method-distributed schemas version independently. The CLI declares
4
+ * The three sdd-method-distributed schemas version independently. The CLI declares
6
5
  * the version range it accepts for each and fails fast at read time on
7
6
  * out-of-range manifests.
8
7
  *
@@ -15,7 +15,7 @@
15
15
  * - Divider
16
16
  * archetype_overlays: # per-platform overlay (ADR 0169 §4.3)
17
17
  * web-generic:
18
- * strip_prefixes: [Mdc, Mde] # render-only: stripped when humanising labels
18
+ * strip_prefixes: [Nwc, Nwe] # render-only: stripped when humanising labels
19
19
  * overrides:
20
20
  * VBespokeGrid: grid
21
21
  * swiftui:
@@ -1,5 +1,5 @@
1
- // Staleness VERDICTS — the second half of M-ADR 0205 §4.5's staleness scope
2
- // (ledger §3o): "staleness meaning corpus_ref older than the target's last
1
+ // Staleness VERDICTS — the second half of M-ADR 0205 §4.5's staleness scope:
2
+ // "staleness meaning corpus_ref older than the target's last
3
3
  // content change". The scores-coverage predicate computes each row's BASIS;
4
4
  // this module computes the VERDICT the basis supports. A stale score is worse
5
5
  // than a missing one, because it reads as coverage — the predicate otherwise
@@ -262,8 +262,7 @@ function extractContracts(raw) {
262
262
  // entries used to raise disappeared — the declarations became invisible
263
263
  // to row emission and to finding emission at once. The builder had been
264
264
  // taught the object form (contracts.ts) while its only feeder had not:
265
- // the F36 shape again, one surface ahead of the pipeline that supplies
266
- // it. `spicedb` was likewise never extracted, so `.zed` declarations
265
+ // a builder one surface ahead of the pipeline that supplies it. `spicedb` was likewise never extracted, so `.zed` declarations
267
266
  // never reached any builder even as bare strings.
268
267
  const arr = (key) => {
269
268
  const v = o[key];
@@ -282,7 +281,7 @@ function extractContracts(raw) {
282
281
  const graphql = arr("graphql");
283
282
  // `provenance` (3.5.0) MUST be extracted here or the builder that reads it
284
283
  // sees nothing — this function reconstructs the block key-by-key rather than
285
- // passing the parsed object through, which is precisely the F36 shape the
284
+ // passing the parsed object through, which is precisely the shape the
286
285
  // comment above records. It was re-committed once during 3.5.0's own
287
286
  // implementation: the builder was taught to read provenance while this feeder
288
287
  // still dropped it, and only an end-to-end catalogue build caught it, because
@@ -19,7 +19,7 @@ const markdownProviderSignals = async (path, spec) => {
19
19
  const out = new Set();
20
20
  // `section` (ADR 0180 delta-pilot extension) scopes the scan to one heading block and accepts a plain
21
21
  // "Field" header, so a check can read ONE entity table inside a multi-table data-model doc (e.g.
22
- // data-model.mermaid.md "### Collection: feature") without duplicating the field list into a bespoke
22
+ // data-model.mermaid.md "### Collection: orders") without duplicating the field list into a bespoke
23
23
  // surface file. With no `section` the behaviour is byte-for-byte the legacy one (whole file, strict
24
24
  // header, no `*` stripping) — existing gateway bindings are unaffected.
25
25
  const section = spec?.section;
@@ -35,7 +35,7 @@ const markdownProviderSignals = async (path, spec) => {
35
35
  for (const raw of (await readFile(path, "utf-8")).split("\n")) {
36
36
  const s = raw.trim();
37
37
  if (section && s.startsWith("#")) {
38
- // strip leading #'s and any markdown code/emphasis in the title (`### Collection: ` + "`feature`")
38
+ // strip leading #'s and any markdown code/emphasis in the title (`### Collection: ` + "`orders`")
39
39
  inSection = s.replace(/^#+\s*/, "").replace(/[`*]/g, "").includes(section);
40
40
  inTable = false;
41
41
  continue;
@@ -61,7 +61,7 @@ const markdownProviderSignals = async (path, spec) => {
61
61
  if (!sig || sig === "—" || sig.startsWith("Computed") || sig.startsWith("MB "))
62
62
  continue;
63
63
  sig = sig.replace(/\([^)]*\)/g, "").replace(/\[\]/g, "").trim(); // drop inline "(...)" notes + array markers
64
- // Range shorthand: `datacoldTemp1..6` / `setpointTemp1..3` -> one declared name per index.
64
+ // Range shorthand: `sensor1..6` / `zone1..3` -> one declared name per index.
65
65
  const range = sig.match(/^(.*?)(\d+)\.\.(\d+)$/);
66
66
  if (range?.[1] !== undefined) {
67
67
  const base = range[1];
@@ -369,7 +369,7 @@ const REGISTRY = {
369
369
  function norm(s, mode) {
370
370
  if (mode === "leaf") {
371
371
  // Match a nested/dotted declared path against a leaf code identifier: take the last dotted
372
- // segment, drop array markers, then lower-nosep. `statusInfo.truStatus` ~ `truStatus`.
372
+ // segment, drop array markers, then lower-nosep. `order.status.code` ~ `code`.
373
373
  const leaf = s.split(".").pop() ?? s;
374
374
  return leaf.replace(/\[\]/g, "").replace(/[-_./ ]/g, "").toLowerCase();
375
375
  }
@@ -474,7 +474,28 @@ function printHuman(r, out) {
474
474
  out(` - ${m}\n`);
475
475
  }
476
476
  }
477
- function printReconcile(chk, r, out) {
477
+ /**
478
+ * Where the regenerated `produces` entries live: the spec's schema_dir, else the directory the binding's own
479
+ * declared entries already use (so a regenerated block keeps the adopter's layout), else `events`.
480
+ */
481
+ async function reconcileSchemaDir(targetRepo, rc) {
482
+ if (rc.schema_dir)
483
+ return rc.schema_dir.replace(/\/+$/, "");
484
+ const path = isAbsolute(rc.binding) ? rc.binding : resolve(targetRepo, rc.binding);
485
+ try {
486
+ const doc = parseYaml(await readFile(path, "utf-8"));
487
+ for (const p of doc?.events?.produces ?? []) {
488
+ const s = p?.schema;
489
+ if (typeof s === "string" && s.includes("/"))
490
+ return s.slice(0, s.lastIndexOf("/"));
491
+ }
492
+ }
493
+ catch {
494
+ /* an unreadable binding falls through to the default */
495
+ }
496
+ return "events";
497
+ }
498
+ function printReconcile(chk, r, schemaDir, out) {
478
499
  if (!chk.reconcile || r.target !== "binding-vs-reality")
479
500
  return;
480
501
  const rc = chk.reconcile;
@@ -486,7 +507,7 @@ function printReconcile(chk, r, out) {
486
507
  out(`${rc.block.split(".")[0]}:\n`);
487
508
  out(` produces: # ${full.length} schemas (was ${r.declared} declared)\n`);
488
509
  for (const name of full)
489
- out(` - schema: party/events/${name}.avsc\n`);
510
+ out(` - schema: ${schemaDir}/${name}.avsc\n`);
490
511
  if (r.declaredNotObserved.length) {
491
512
  out(` # DROP (dangling — no such schema in code/contracts): ${r.declaredNotObserved.join(", ")}\n`);
492
513
  }
@@ -546,8 +567,8 @@ export async function runConformance(opts, stdout = (line) => process.stdout.wri
546
567
  printHuman(r, stdout);
547
568
  if (opts.reconcile) {
548
569
  const chk = reconcileByline.get(r.id);
549
- if (chk)
550
- printReconcile(chk, r, stdout);
570
+ if (chk?.reconcile)
571
+ printReconcile(chk, r, await reconcileSchemaDir(opts.targetRepo, chk.reconcile), stdout);
551
572
  }
552
573
  }
553
574
  for (const id of skipped)
@@ -215,7 +215,7 @@ function parseVersioned(raw) {
215
215
  // a YAML reader parses 113 of 325 entries in one real lock as MAPPINGS
216
216
  // rather than strings — silently, with no error. Quoting on write is the
217
217
  // fix; reading both forms ships first so no lock can be written that an
218
- // older reader cannot parse. See method-open-items §3l.
218
+ // older reader cannot parse.
219
219
  const entry = stripQuotes(line.slice(" - ".length));
220
220
  const withDigest = DIGEST_ENTRY_RE.exec(entry);
221
221
  if (withDigest) {
@@ -83,7 +83,7 @@ export function getVerifyCliVersion() {
83
83
  }
84
84
  /**
85
85
  * The @sdd-method/maintain-cli version released WITH this sdd-cli. The managed CI workflow's
86
- * catalogue freshness step installs exactly this version (M-ADR 0218 §5; ruled 2026-10-15, sdm-jts.6).
86
+ * catalogue freshness step installs exactly this version (M-ADR 0218 §5).
87
87
  * Read the same way as the verify version, for the same reason (dist/ copy, never scripts/ live).
88
88
  */
89
89
  export function getMaintainCliVersion() {
@@ -82,7 +82,7 @@ export async function readManifest(areaRoot, id) {
82
82
  }
83
83
  if (!Array.isArray(raw.members))
84
84
  problems.push("members must be a list");
85
- // A hand-written revision of digits only (`50834756022`) parses as a NUMBER, and
85
+ // A hand-written revision of digits only (`12345678901`) parses as a NUMBER, and
86
86
  // a strict comparison with the folder's string suffix then calls an unchanged
87
87
  // member changed. Identity fields are strings, whatever YAML made of them.
88
88
  for (const m of raw.members ?? []) {
@@ -88,7 +88,7 @@ export function routeFinding(f, artefacts, shared = new Set()) {
88
88
  return [...targets.values()].sort((a, b) => (a.grain === b.grain ? a.artefact.localeCompare(b.artefact) : a.grain === "file" ? -1 : 1));
89
89
  }
90
90
  /**
91
- * Artefacts that mention a changed file by BASENAME only (`CollectorActor.java:49`) —
91
+ * Artefacts that mention a changed file by BASENAME only (`OrderHandler.java:49`) —
92
92
  * too ambiguous to route, too likely to matter to drop silently. Reported, not routed.
93
93
  */
94
94
  export function basenameOnly(f, artefacts, routed) {
@@ -54,7 +54,7 @@ export async function runValidate(opts, stdout = (line) => process.stdout.write(
54
54
  // passed" with none were previously the same line (M-ADR 0200 §4.3). The
55
55
  // exit code is deliberately unchanged — the defect is the claim, not the
56
56
  // gating; whether an unexecutable validator should FAIL is the open design
57
- // question (post-3.0.0-followons.md A2), not this one.
57
+ // question, not this one.
58
58
  function verdict(summary, selected) {
59
59
  if (summary.exitCode !== 0)
60
60
  return fail("One or more validators failed");
@@ -1,5 +1,5 @@
1
1
  /**
2
- * The method-managed validation job, as DATA (bead sdm-dd6.2; Dagger ruling sdm-s48, 2026-10-15).
2
+ * The method-managed validation job, as DATA (M-ADR 0219).
3
3
  *
4
4
  * One ordered plan per profile: every default validator, the platform's script-only checks, then the
5
5
  * advisory catalogue freshness check. Every executor renders or runs THIS: the GitHub workflow
@@ -10,7 +10,7 @@
10
10
  // with it certifies exactly the corruption a line-surgery transformer
11
11
  // produces. `yaml` v2 refuses duplicate keys (DUPLICATE_KEY) and the other
12
12
  // malformations a lenient parse glosses — e.g. a `: ` inside an unquoted
13
- // scalar (`path: (none — tel: URL)`), which no pattern rule catches.
13
+ // scalar (`path: (none — see: docs)`), which no pattern rule catches.
14
14
  //
15
15
  // Scope: the YAML files git TRACKS (`*.yaml`, `*.yml`) — the repo's sources,
16
16
  // not build output or dependencies. Outside a git work tree there is no
@@ -1,4 +1,4 @@
1
1
  {
2
- "version": "0.3.0",
3
- "built_against_sdd_cli": "1.44.0"
2
+ "version": "0.4.0",
3
+ "built_against_sdd_cli": "1.45.0"
4
4
  }
@@ -5,9 +5,9 @@ export function registerPlan(program) {
5
5
  .command("plan")
6
6
  .description("Scaffold a plan markdown file from a method-distributed template. Currently supports --pilot for pilot-kickoff plans; future subcommands may add --initiative / --migration.")
7
7
  .option("--pilot", "scaffold a pilot-kickoff plan (requires --service, --capability, --domain)", false)
8
- .option("--service <name>", "service / pilot name, e.g. customer-management")
9
- .option("--capability <name>", "capability under test, e.g. organization-management")
10
- .option("--domain <name>", "domain the capability belongs to, e.g. party")
8
+ .option("--service <name>", "service / pilot name, e.g. order-service")
9
+ .option("--capability <name>", "capability under test, e.g. order-management")
10
+ .option("--domain <name>", "domain the capability belongs to, e.g. orders")
11
11
  .option("--workspace-root <path>", "SDD root (defaults to cwd)", resolvePathOption)
12
12
  .option("--output <path>", "destination file (defaults to content/product/plans/{service}-pilot-kickoff.md)")
13
13
  .option("--dry-run", "print rendered output to stdout without writing", false)
@@ -1,4 +1,4 @@
1
1
  {
2
- "version": "1.3.0",
3
- "built_against_sdd_cli": "1.44.0"
2
+ "version": "1.4.0",
3
+ "built_against_sdd_cli": "1.45.0"
4
4
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@sdd-method/author-cli",
3
- "version": "0.2.0",
4
- "sddCliVersion": "1.44.0",
3
+ "version": "0.3.0",
4
+ "sddCliVersion": "1.45.0",
5
5
  "description": "Re-author one SDD's content — scaffold, plan, contracts, conformance, api-surface, snapshots, briefings, catalogue check — plus every read-only verify verb. Ships only the code those verbs reach; it cannot sync the baseline or rebuild the catalogues. Maintenance is in @sdd-method/maintain-cli, administration in @sdd-method/sdd-cli.",
6
6
  "license": "Apache-2.0",
7
7
  "type": "module",