@sdd-method/sdd-cli 0.22.0 → 0.23.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 (70) hide show
  1. package/dist/index.d.ts.map +1 -1
  2. package/dist/index.js +2 -0
  3. package/dist/index.js.map +1 -1
  4. package/dist/lib/bundle.d.ts +57 -2
  5. package/dist/lib/bundle.d.ts.map +1 -1
  6. package/dist/lib/bundle.js +53 -19
  7. package/dist/lib/bundle.js.map +1 -1
  8. package/dist/lib/list/discover.d.ts +28 -0
  9. package/dist/lib/list/discover.d.ts.map +1 -1
  10. package/dist/lib/list/discover.js +27 -11
  11. package/dist/lib/list/discover.js.map +1 -1
  12. package/dist/lib/list/format.d.ts +2 -0
  13. package/dist/lib/list/format.d.ts.map +1 -1
  14. package/dist/lib/list/format.js +44 -4
  15. package/dist/lib/list/format.js.map +1 -1
  16. package/dist/lib/list/index.d.ts +1 -0
  17. package/dist/lib/list/index.d.ts.map +1 -1
  18. package/dist/lib/list/index.js +1 -0
  19. package/dist/lib/list/index.js.map +1 -1
  20. package/dist/lib/lock-file.d.ts +23 -5
  21. package/dist/lib/lock-file.d.ts.map +1 -1
  22. package/dist/lib/lock-file.js +86 -9
  23. package/dist/lib/lock-file.js.map +1 -1
  24. package/dist/lib/pack/builder.d.ts +55 -0
  25. package/dist/lib/pack/builder.d.ts.map +1 -0
  26. package/dist/lib/pack/builder.js +226 -0
  27. package/dist/lib/pack/builder.js.map +1 -0
  28. package/dist/lib/pack/index.d.ts +26 -0
  29. package/dist/lib/pack/index.d.ts.map +1 -0
  30. package/dist/lib/pack/index.js +85 -0
  31. package/dist/lib/pack/index.js.map +1 -0
  32. package/dist/lib/pack/leakage.d.ts +55 -0
  33. package/dist/lib/pack/leakage.d.ts.map +1 -0
  34. package/dist/lib/pack/leakage.js +133 -0
  35. package/dist/lib/pack/leakage.js.map +1 -0
  36. package/dist/lib/pack/schema.d.ts +36 -0
  37. package/dist/lib/pack/schema.d.ts.map +1 -0
  38. package/dist/lib/pack/schema.js +63 -0
  39. package/dist/lib/pack/schema.js.map +1 -0
  40. package/dist/lib/pack/seed.d.ts +46 -0
  41. package/dist/lib/pack/seed.d.ts.map +1 -0
  42. package/dist/lib/pack/seed.js +107 -0
  43. package/dist/lib/pack/seed.js.map +1 -0
  44. package/dist/lib/repo-kind.d.ts +8 -4
  45. package/dist/lib/repo-kind.d.ts.map +1 -1
  46. package/dist/lib/repo-kind.js +10 -2
  47. package/dist/lib/repo-kind.js.map +1 -1
  48. package/dist/lib/sync/config.d.ts +33 -0
  49. package/dist/lib/sync/config.d.ts.map +1 -0
  50. package/dist/lib/sync/config.js +40 -0
  51. package/dist/lib/sync/config.js.map +1 -0
  52. package/dist/lib/sync/index.d.ts +32 -0
  53. package/dist/lib/sync/index.d.ts.map +1 -1
  54. package/dist/lib/sync/index.js +123 -3
  55. package/dist/lib/sync/index.js.map +1 -1
  56. package/dist/lib/sync/source-tag.d.ts +5 -0
  57. package/dist/lib/sync/source-tag.d.ts.map +1 -0
  58. package/dist/lib/sync/source-tag.js +34 -0
  59. package/dist/lib/sync/source-tag.js.map +1 -0
  60. package/dist/verbs/list.d.ts.map +1 -1
  61. package/dist/verbs/list.js +3 -1
  62. package/dist/verbs/list.js.map +1 -1
  63. package/dist/verbs/pack.d.ts +3 -0
  64. package/dist/verbs/pack.d.ts.map +1 -0
  65. package/dist/verbs/pack.js +35 -0
  66. package/dist/verbs/pack.js.map +1 -0
  67. package/dist/verbs/sync.d.ts.map +1 -1
  68. package/dist/verbs/sync.js +46 -12
  69. package/dist/verbs/sync.js.map +1 -1
  70. package/package.json +2 -2
@@ -0,0 +1,55 @@
1
+ import type { PackSeed } from "./seed.js";
2
+ /**
3
+ * Producer-side leakage check. Asserts the pack's managed_paths are
4
+ * disjoint from the declared forward base's managed_paths, AND that
5
+ * no managed_paths entry matches any forbidden_paths glob.
6
+ *
7
+ * Per ADR 0151 §4.1 + adopter-bundle-leakage-guide.md.
8
+ *
9
+ * Resolves the forward base's MANAGED_PATHS.txt from the producer's
10
+ * local method-baseline.lock (the producer is itself an sdd-method
11
+ * adopter and has the forward base synced into its docs/ tree).
12
+ *
13
+ * Fallback: if the producer has not synced the declared forward base,
14
+ * accept a path to the forward base's MANAGED_PATHS.txt directly via
15
+ * `forwardBaseManagedPathsFile` for offline / test scenarios.
16
+ */
17
+ export interface LeakageCheckOptions {
18
+ seed: PackSeed;
19
+ /**
20
+ * Path to MANAGED_PATHS.txt of the forward base bundle the pack
21
+ * declares it layers over. Required when the producer hasn't
22
+ * synced the forward base into the current repo.
23
+ */
24
+ forwardBaseManagedPathsFile?: string;
25
+ /**
26
+ * Producer's repo root. The check tries to discover the forward
27
+ * base's managed paths from `<targetRepo>/method-baseline.lock` if
28
+ * the explicit file isn't provided.
29
+ */
30
+ producerRepo?: string;
31
+ }
32
+ export interface LeakageViolation {
33
+ path: string;
34
+ /** "forward-base" or "forbidden-pattern" */
35
+ conflictWith: string;
36
+ /** human-readable identifier of the conflicting source */
37
+ conflictSource: string;
38
+ }
39
+ export interface LeakageResult {
40
+ ok: boolean;
41
+ violations: LeakageViolation[];
42
+ }
43
+ export declare function checkLeakage(opts: LeakageCheckOptions): Promise<LeakageResult>;
44
+ /**
45
+ * Extract managed_paths for the named bundle from a method-baseline.lock
46
+ * file. Minimal parser — the lock file is line-oriented YAML and we
47
+ * only need a single nested list per named bundle.
48
+ */
49
+ export declare function extractManagedPathsForBundle(lockYaml: string, bundleName: string): string[];
50
+ /**
51
+ * Simple glob matcher supporting `*` (any non-slash chars) and `**`
52
+ * (any chars including slashes). Used for forbidden_paths.
53
+ */
54
+ export declare function matchesGlob(path: string, pattern: string): boolean;
55
+ //# sourceMappingURL=leakage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"leakage.d.ts","sourceRoot":"","sources":["../../../src/lib/pack/leakage.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAE1C;;;;;;;;;;;;;;GAcG;AACH,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,QAAQ,CAAC;IACf;;;;OAIG;IACH,2BAA2B,CAAC,EAAE,MAAM,CAAC;IACrC;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,4CAA4C;IAC5C,YAAY,EAAE,MAAM,CAAC;IACrB,0DAA0D;IAC1D,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,OAAO,CAAC;IACZ,UAAU,EAAE,gBAAgB,EAAE,CAAC;CAChC;AAED,wBAAsB,YAAY,CAChC,IAAI,EAAE,mBAAmB,GACxB,OAAO,CAAC,aAAa,CAAC,CAgCxB;AAkCD;;;;GAIG;AACH,wBAAgB,4BAA4B,CAC1C,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,GACjB,MAAM,EAAE,CAsCV;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAGlE"}
@@ -0,0 +1,133 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ export async function checkLeakage(opts) {
4
+ const violations = [];
5
+ // 1. Disjointness with declared forward base.
6
+ const forwardBasePaths = await loadForwardBaseManagedPaths(opts);
7
+ const forwardBaseSet = new Set(forwardBasePaths);
8
+ for (const p of opts.seed.managedPaths) {
9
+ if (forwardBaseSet.has(p)) {
10
+ violations.push({
11
+ path: p,
12
+ conflictWith: "forward-base",
13
+ conflictSource: opts.seed.forwardBase.bundle,
14
+ });
15
+ }
16
+ }
17
+ // 2. Disjointness with declared forbidden_paths globs (seed self-contract).
18
+ if (opts.seed.forbiddenPaths) {
19
+ for (const p of opts.seed.managedPaths) {
20
+ for (const pattern of opts.seed.forbiddenPaths) {
21
+ if (matchesGlob(p, pattern)) {
22
+ violations.push({
23
+ path: p,
24
+ conflictWith: "forbidden-pattern",
25
+ conflictSource: pattern,
26
+ });
27
+ }
28
+ }
29
+ }
30
+ }
31
+ return { ok: violations.length === 0, violations };
32
+ }
33
+ async function loadForwardBaseManagedPaths(opts) {
34
+ if (opts.forwardBaseManagedPathsFile) {
35
+ const raw = await readFile(opts.forwardBaseManagedPathsFile, "utf8");
36
+ return raw
37
+ .split("\n")
38
+ .map((l) => l.trim())
39
+ .filter((l) => l.length > 0 && !l.startsWith("#"));
40
+ }
41
+ if (opts.producerRepo) {
42
+ const lockPath = join(opts.producerRepo, "method-baseline.lock");
43
+ try {
44
+ const raw = await readFile(lockPath, "utf8");
45
+ return extractManagedPathsForBundle(raw, opts.seed.forwardBase.bundle);
46
+ }
47
+ catch (err) {
48
+ throw new Error(`Cannot read forward-base managed_paths: ${lockPath} unreadable ` +
49
+ `(${err.message}). Pass --forward-base-managed-paths ` +
50
+ `to provide MANAGED_PATHS.txt directly.`);
51
+ }
52
+ }
53
+ throw new Error("Cannot resolve forward-base managed_paths: provide either " +
54
+ "--producer-repo (with method-baseline.lock present) or " +
55
+ "--forward-base-managed-paths (path to MANAGED_PATHS.txt).");
56
+ }
57
+ /**
58
+ * Extract managed_paths for the named bundle from a method-baseline.lock
59
+ * file. Minimal parser — the lock file is line-oriented YAML and we
60
+ * only need a single nested list per named bundle.
61
+ */
62
+ export function extractManagedPathsForBundle(lockYaml, bundleName) {
63
+ const lines = lockYaml.split("\n");
64
+ let inBundles = false;
65
+ let inTargetBundle = false;
66
+ let inManagedPaths = false;
67
+ const paths = [];
68
+ for (const line of lines) {
69
+ if (line.startsWith("bundles:")) {
70
+ inBundles = true;
71
+ continue;
72
+ }
73
+ if (!inBundles)
74
+ continue;
75
+ if (/^\s*-\s*name:\s*(.+)$/.test(line)) {
76
+ const m = /^\s*-\s*name:\s*(.+)$/.exec(line);
77
+ inTargetBundle = m !== null && m[1]?.trim() === bundleName;
78
+ inManagedPaths = false;
79
+ continue;
80
+ }
81
+ if (inTargetBundle && /^\s+managed_paths:\s*$/.test(line)) {
82
+ inManagedPaths = true;
83
+ continue;
84
+ }
85
+ if (inManagedPaths) {
86
+ const m = /^\s+-\s+(.+)$/.exec(line);
87
+ if (m && m[1]) {
88
+ paths.push(m[1].trim());
89
+ }
90
+ else if (/^\s+\w+:/.test(line) || /^\s*-\s*name:/.test(line)) {
91
+ // End of managed_paths list (either next field or next bundle)
92
+ inManagedPaths = false;
93
+ }
94
+ }
95
+ }
96
+ return paths;
97
+ }
98
+ /**
99
+ * Simple glob matcher supporting `*` (any non-slash chars) and `**`
100
+ * (any chars including slashes). Used for forbidden_paths.
101
+ */
102
+ export function matchesGlob(path, pattern) {
103
+ const re = globToRegex(pattern);
104
+ return re.test(path);
105
+ }
106
+ function globToRegex(pattern) {
107
+ // Escape regex metachars except *, then translate * and **.
108
+ let regex = "";
109
+ let i = 0;
110
+ while (i < pattern.length) {
111
+ const ch = pattern[i];
112
+ if (ch === "*") {
113
+ if (pattern[i + 1] === "*") {
114
+ regex += ".*";
115
+ i += 2;
116
+ }
117
+ else {
118
+ regex += "[^/]*";
119
+ i += 1;
120
+ }
121
+ }
122
+ else if (/[.+?^${}()|[\]\\]/.test(ch)) {
123
+ regex += `\\${ch}`;
124
+ i += 1;
125
+ }
126
+ else {
127
+ regex += ch;
128
+ i += 1;
129
+ }
130
+ }
131
+ return new RegExp(`^${regex}$`);
132
+ }
133
+ //# sourceMappingURL=leakage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"leakage.js","sourceRoot":"","sources":["../../../src/lib/pack/leakage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ import { z } from "zod";
2
+ import type { PackSeed } from "./seed.js";
3
+ export declare const PackSeedSchema: z.ZodObject<{
4
+ version: z.ZodString;
5
+ scope: z.ZodString;
6
+ forwardBase: z.ZodObject<{
7
+ bundle: z.ZodEnum<{
8
+ "platform-baseline": "platform-baseline";
9
+ "app-baseline": "app-baseline";
10
+ "integration-baseline": "integration-baseline";
11
+ "reverse-baseline": "reverse-baseline";
12
+ }>;
13
+ minimumVersion: z.ZodString;
14
+ sourceRepo: z.ZodString;
15
+ }, z.core.$strip>;
16
+ minimumSddCliVersion: z.ZodString;
17
+ description: z.ZodString;
18
+ include: z.ZodOptional<z.ZodArray<z.ZodString>>;
19
+ managedPaths: z.ZodArray<z.ZodString>;
20
+ forbiddenPaths: z.ZodOptional<z.ZodArray<z.ZodString>>;
21
+ requiresPack: z.ZodOptional<z.ZodObject<{
22
+ name: z.ZodString;
23
+ version: z.ZodString;
24
+ }, z.core.$strip>>;
25
+ sourcePath: z.ZodString;
26
+ }, z.core.$strip>;
27
+ export interface ValidationError {
28
+ field: string;
29
+ message: string;
30
+ }
31
+ export interface ValidationResult {
32
+ ok: boolean;
33
+ errors: ValidationError[];
34
+ }
35
+ export declare function validateSeed(seed: PackSeed): ValidationResult;
36
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../src/lib/pack/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAsB1C,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;iBAmCzB,CAAC;AAEH,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,eAAe,EAAE,CAAC;CAC3B;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,QAAQ,GAAG,gBAAgB,CAU7D"}
@@ -0,0 +1,63 @@
1
+ import { z } from "zod";
2
+ /**
3
+ * Zod schema for adopter pack seeds. Mirrors
4
+ * docs/method/foundations/schemas/context-pack-seed-schema.yaml.
5
+ *
6
+ * Used by `sdd-cli pack validate` for fast feedback during authoring.
7
+ * The structural parse in seed.ts already enforces presence of required
8
+ * fields; this schema layer adds value-shape checks (semver patterns,
9
+ * known forward-base bundle names, non-empty managed_paths).
10
+ */
11
+ const SEMVER_PATTERN = /^\d+\.\d+\.\d+$/;
12
+ const VERSIONED_RANGE_PATTERN = /^(\^|~|>=)?v?\d+\.\d+\.\d+$/;
13
+ const KNOWN_FORWARD_BASES = [
14
+ "app-baseline",
15
+ "integration-baseline",
16
+ "platform-baseline",
17
+ "reverse-baseline",
18
+ ];
19
+ export const PackSeedSchema = z.object({
20
+ version: z
21
+ .string()
22
+ .regex(SEMVER_PATTERN, "version must be semver (X.Y.Z)"),
23
+ scope: z
24
+ .string()
25
+ .regex(/^[a-z0-9-]+$/, "scope must be lower-kebab-case slug"),
26
+ forwardBase: z.object({
27
+ bundle: z.enum(KNOWN_FORWARD_BASES),
28
+ minimumVersion: z
29
+ .string()
30
+ .regex(/^v\d+\.\d+\.\d+$/, "forward_base.minimum_version must be vX.Y.Z"),
31
+ sourceRepo: z.string().min(1),
32
+ }),
33
+ minimumSddCliVersion: z
34
+ .string()
35
+ .regex(SEMVER_PATTERN, "minimum_sdd_cli_version must be semver (X.Y.Z)"),
36
+ description: z.string().min(1),
37
+ include: z.array(z.string()).optional(),
38
+ managedPaths: z
39
+ .array(z.string().min(1))
40
+ .min(1, "managed_paths must have at least one entry"),
41
+ forbiddenPaths: z.array(z.string()).optional(),
42
+ requiresPack: z
43
+ .object({
44
+ name: z.string().min(1),
45
+ version: z
46
+ .string()
47
+ .regex(VERSIONED_RANGE_PATTERN, "requires_pack.version must be a semver range (e.g. ^v1.2.0)"),
48
+ })
49
+ .optional(),
50
+ sourcePath: z.string(),
51
+ });
52
+ export function validateSeed(seed) {
53
+ const result = PackSeedSchema.safeParse(seed);
54
+ if (result.success) {
55
+ return { ok: true, errors: [] };
56
+ }
57
+ const errors = result.error.issues.map((issue) => ({
58
+ field: issue.path.join("."),
59
+ message: issue.message,
60
+ }));
61
+ return { ok: false, errors };
62
+ }
63
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/lib/pack/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB;;;;;;;;GAQG;AAEH,MAAM,cAAc,GAAG,iBAAiB,CAAC;AACzC,MAAM,uBAAuB,GAAG,6BAA6B,CAAC;AAE9D,MAAM,mBAAmB,GAAG;IAC1B,cAAc;IACd,sBAAsB;IACtB,mBAAmB;IACnB,kBAAkB;CACV,CAAC;AAEX,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,CAAC;IACrC,OAAO,EAAE,CAAC;SACP,MAAM,EAAE;SACR,KAAK,CAAC,cAAc,EAAE,gCAAgC,CAAC;IAC1D,KAAK,EAAE,CAAC;SACL,MAAM,EAAE;SACR,KAAK,CAAC,cAAc,EAAE,qCAAqC,CAAC;IAC/D,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;QACpB,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC;QACnC,cAAc,EAAE,CAAC;aACd,MAAM,EAAE;aACR,KAAK,CAAC,kBAAkB,EAAE,6CAA6C,CAAC;QAC3E,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;KAC9B,CAAC;IACF,oBAAoB,EAAE,CAAC;SACpB,MAAM,EAAE;SACR,KAAK,CAAC,cAAc,EAAE,gDAAgD,CAAC;IAC1E,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9B,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IACvC,YAAY,EAAE,CAAC;SACZ,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;SACxB,GAAG,CAAC,CAAC,EAAE,4CAA4C,CAAC;IACvD,cAAc,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IAC9C,YAAY,EAAE,CAAC;SACZ,MAAM,CAAC;QACN,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QACvB,OAAO,EAAE,CAAC;aACP,MAAM,EAAE;aACR,KAAK,CACJ,uBAAuB,EACvB,6DAA6D,CAC9D;KACJ,CAAC;SACD,QAAQ,EAAE;IACb,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE;CACvB,CAAC,CAAC;AAYH,MAAM,UAAU,YAAY,CAAC,IAAc;IACzC,MAAM,MAAM,GAAG,cAAc,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAC9C,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IAClC,CAAC;IACD,MAAM,MAAM,GAAsB,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACpE,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;QAC3B,OAAO,EAAE,KAAK,CAAC,OAAO;KACvB,CAAC,CAAC,CAAC;IACJ,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;AAC/B,CAAC"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Adopter pack seed file. Per ADR 0151 + context-pack-seed-schema.yaml.
3
+ *
4
+ * Loaded by `sdd-cli pack build` and `sdd-cli pack validate` from
5
+ * `orchestration/distribution/{pack-name}-seed.yaml` in adopter repos.
6
+ *
7
+ * Includes are resolved before validation: the merged seed presents
8
+ * all `include`'d managed_paths + forbidden_paths concatenated with
9
+ * the host seed's own.
10
+ */
11
+ export interface PackSeed {
12
+ version: string;
13
+ scope: string;
14
+ forwardBase: ForwardBaseRef;
15
+ minimumSddCliVersion: string;
16
+ description: string;
17
+ include?: string[];
18
+ managedPaths: string[];
19
+ forbiddenPaths?: string[];
20
+ requiresPack?: PackRef;
21
+ /**
22
+ * Absolute path to the seed file this was loaded from. Used by the
23
+ * builder to anchor relative payload-source paths.
24
+ */
25
+ sourcePath: string;
26
+ }
27
+ export interface ForwardBaseRef {
28
+ bundle: string;
29
+ minimumVersion: string;
30
+ sourceRepo: string;
31
+ }
32
+ export interface PackRef {
33
+ name: string;
34
+ version: string;
35
+ }
36
+ /**
37
+ * Load a seed file from disk, resolve its `include:` directives,
38
+ * and return a merged PackSeed. Throws if any include cannot be read
39
+ * or if circular includes are detected.
40
+ *
41
+ * NOTE: This does not validate the seed structure — only parses YAML
42
+ * and assembles the typed shape. Use `validateSeed` (separate module)
43
+ * for schema enforcement.
44
+ */
45
+ export declare function loadSeed(seedPath: string): Promise<PackSeed>;
46
+ //# sourceMappingURL=seed.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seed.d.ts","sourceRoot":"","sources":["../../../src/lib/pack/seed.ts"],"names":[],"mappings":"AAIA;;;;;;;;;GASG;AACH,MAAM,WAAW,QAAQ;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,cAAc,CAAC;IAC5B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB;;;OAGG;IACH,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAqBD;;;;;;;;GAQG;AACH,wBAAsB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAIlE"}
@@ -0,0 +1,107 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { dirname, isAbsolute, resolve } from "node:path";
3
+ import { parse as parseYaml } from "yaml";
4
+ /**
5
+ * Load a seed file from disk, resolve its `include:` directives,
6
+ * and return a merged PackSeed. Throws if any include cannot be read
7
+ * or if circular includes are detected.
8
+ *
9
+ * NOTE: This does not validate the seed structure — only parses YAML
10
+ * and assembles the typed shape. Use `validateSeed` (separate module)
11
+ * for schema enforcement.
12
+ */
13
+ export async function loadSeed(seedPath) {
14
+ const absPath = isAbsolute(seedPath) ? seedPath : resolve(seedPath);
15
+ const visited = new Set();
16
+ return loadSeedRecursive(absPath, visited);
17
+ }
18
+ async function loadSeedRecursive(absPath, visited) {
19
+ if (visited.has(absPath)) {
20
+ throw new Error(`Circular include detected at ${absPath}`);
21
+ }
22
+ visited.add(absPath);
23
+ let raw;
24
+ try {
25
+ raw = await readFile(absPath, "utf8");
26
+ }
27
+ catch (err) {
28
+ throw new Error(`Cannot read seed file ${absPath}: ${err.message}`);
29
+ }
30
+ const parsed = parseYaml(raw);
31
+ if (parsed === null || typeof parsed !== "object") {
32
+ throw new Error(`Seed file ${absPath} is not a YAML object`);
33
+ }
34
+ const baseDir = dirname(absPath);
35
+ const includes = Array.isArray(parsed.include) ? parsed.include : [];
36
+ const includedManaged = [];
37
+ const includedForbidden = [];
38
+ for (const inc of includes) {
39
+ if (typeof inc !== "string") {
40
+ throw new Error(`Non-string include entry in ${absPath}: ${String(inc)}`);
41
+ }
42
+ const incPath = isAbsolute(inc) ? inc : resolve(baseDir, inc);
43
+ const includedSeed = await loadSeedRecursive(incPath, visited);
44
+ includedManaged.push(...includedSeed.managedPaths);
45
+ if (includedSeed.forbiddenPaths) {
46
+ includedForbidden.push(...includedSeed.forbiddenPaths);
47
+ }
48
+ }
49
+ const own = parsed;
50
+ const managedPaths = [
51
+ ...includedManaged,
52
+ ...asStringArray(own.managed_paths, "managed_paths", absPath),
53
+ ];
54
+ const forbiddenPaths = includedForbidden.length > 0 || Array.isArray(own.forbidden_paths)
55
+ ? [
56
+ ...includedForbidden,
57
+ ...asStringArray(own.forbidden_paths, "forbidden_paths", absPath, true),
58
+ ]
59
+ : undefined;
60
+ const seed = {
61
+ version: asString(own.version, "version", absPath),
62
+ scope: asString(own.scope, "scope", absPath),
63
+ forwardBase: {
64
+ bundle: asString(own.forward_base?.bundle, "forward_base.bundle", absPath),
65
+ minimumVersion: asString(own.forward_base?.minimum_version, "forward_base.minimum_version", absPath),
66
+ sourceRepo: own.forward_base?.source_repo
67
+ ? asString(own.forward_base.source_repo, "forward_base.source_repo", absPath)
68
+ : "sdd-method",
69
+ },
70
+ minimumSddCliVersion: asString(own.minimum_sdd_cli_version, "minimum_sdd_cli_version", absPath),
71
+ description: asString(own.description, "description", absPath),
72
+ managedPaths,
73
+ sourcePath: absPath,
74
+ ...(includes.length > 0 && { include: includes }),
75
+ ...(forbiddenPaths && { forbiddenPaths }),
76
+ ...(own.requires_pack && {
77
+ requiresPack: {
78
+ name: asString(own.requires_pack.name, "requires_pack.name", absPath),
79
+ version: asString(own.requires_pack.version, "requires_pack.version", absPath),
80
+ },
81
+ }),
82
+ };
83
+ return seed;
84
+ }
85
+ function asString(value, field, file) {
86
+ if (typeof value !== "string" || value.length === 0) {
87
+ throw new Error(`Seed field "${field}" must be a non-empty string in ${file}`);
88
+ }
89
+ return value;
90
+ }
91
+ function asStringArray(value, field, file, allowEmpty = false) {
92
+ if (value === undefined || value === null) {
93
+ if (allowEmpty)
94
+ return [];
95
+ throw new Error(`Seed field "${field}" is required in ${file}`);
96
+ }
97
+ if (!Array.isArray(value)) {
98
+ throw new Error(`Seed field "${field}" must be a list in ${file}`);
99
+ }
100
+ for (const entry of value) {
101
+ if (typeof entry !== "string") {
102
+ throw new Error(`Seed field "${field}" entries must be strings in ${file}`);
103
+ }
104
+ }
105
+ return value;
106
+ }
107
+ //# sourceMappingURL=seed.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seed.js","sourceRoot":"","sources":["../../../src/lib/pack/seed.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzD,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,MAAM,CAAC;AA2D1C;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,QAAgB;IAC7C,MAAM,OAAO,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACpE,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAClC,OAAO,iBAAiB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AAC7C,CAAC;AAED,KAAK,UAAU,iBAAiB,CAC9B,OAAe,EACf,OAAoB;IAEpB,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,gCAAgC,OAAO,EAAE,CAAC,CAAC;IAC7D,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAErB,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IACxC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CACb,yBAAyB,OAAO,KAAM,GAAa,CAAC,OAAO,EAAE,CAC9D,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,CAAY,CAAC;IACzC,IAAI,MAAM,KAAK,IAAI,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAClD,MAAM,IAAI,KAAK,CAAC,aAAa,OAAO,uBAAuB,CAAC,CAAC;IAC/D,CAAC;IAED,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACjC,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;IAErE,MAAM,eAAe,GAAa,EAAE,CAAC;IACrC,MAAM,iBAAiB,GAAa,EAAE,CAAC;IACvC,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CAAC,+BAA+B,OAAO,KAAK,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC5E,CAAC;QACD,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QAC9D,MAAM,YAAY,GAAG,MAAM,iBAAiB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC/D,eAAe,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,YAAY,CAAC,CAAC;QACnD,IAAI,YAAY,CAAC,cAAc,EAAE,CAAC;YAChC,iBAAiB,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,cAAc,CAAC,CAAC;QACzD,CAAC;IACH,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,CAAC;IACnB,MAAM,YAAY,GAAG;QACnB,GAAG,eAAe;QAClB,GAAG,aAAa,CAAC,GAAG,CAAC,aAAa,EAAE,eAAe,EAAE,OAAO,CAAC;KAC9D,CAAC;IACF,MAAM,cAAc,GAClB,iBAAiB,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;QAChE,CAAC,CAAC;YACE,GAAG,iBAAiB;YACpB,GAAG,aAAa,CAAC,GAAG,CAAC,eAAe,EAAE,iBAAiB,EAAE,OAAO,EAAE,IAAI,CAAC;SACxE;QACH,CAAC,CAAC,SAAS,CAAC;IAEhB,MAAM,IAAI,GAAa;QACrB,OAAO,EAAE,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC;QAClD,KAAK,EAAE,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC;QAC5C,WAAW,EAAE;YACX,MAAM,EAAE,QAAQ,CAAC,GAAG,CAAC,YAAY,EAAE,MAAM,EAAE,qBAAqB,EAAE,OAAO,CAAC;YAC1E,cAAc,EAAE,QAAQ,CACtB,GAAG,CAAC,YAAY,EAAE,eAAe,EACjC,8BAA8B,EAC9B,OAAO,CACR;YACD,UAAU,EAAE,GAAG,CAAC,YAAY,EAAE,WAAW;gBACvC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,YAAY,CAAC,WAAW,EAAE,0BAA0B,EAAE,OAAO,CAAC;gBAC7E,CAAC,CAAC,YAAY;SACjB;QACD,oBAAoB,EAAE,QAAQ,CAC5B,GAAG,CAAC,uBAAuB,EAC3B,yBAAyB,EACzB,OAAO,CACR;QACD,WAAW,EAAE,QAAQ,CAAC,GAAG,CAAC,WAAW,EAAE,aAAa,EAAE,OAAO,CAAC;QAC9D,YAAY;QACZ,UAAU,EAAE,OAAO;QACnB,GAAG,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,QAAoB,EAAE,CAAC;QAC7D,GAAG,CAAC,cAAc,IAAI,EAAE,cAAc,EAAE,CAAC;QACzC,GAAG,CAAC,GAAG,CAAC,aAAa,IAAI;YACvB,YAAY,EAAE;gBACZ,IAAI,EAAE,QAAQ,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,EAAE,oBAAoB,EAAE,OAAO,CAAC;gBACrE,OAAO,EAAE,QAAQ,CACf,GAAG,CAAC,aAAa,CAAC,OAAO,EACzB,uBAAuB,EACvB,OAAO,CACR;aACF;SACF,CAAC;KACH,CAAC;IAEF,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc,EAAE,KAAa,EAAE,IAAY;IAC3D,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACpD,MAAM,IAAI,KAAK,CAAC,eAAe,KAAK,mCAAmC,IAAI,EAAE,CAAC,CAAC;IACjF,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,aAAa,CACpB,KAAc,EACd,KAAa,EACb,IAAY,EACZ,UAAU,GAAG,KAAK;IAElB,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAC1C,IAAI,UAAU;YAAE,OAAO,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,eAAe,KAAK,oBAAoB,IAAI,EAAE,CAAC,CAAC;IAClE,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,eAAe,KAAK,uBAAuB,IAAI,EAAE,CAAC,CAAC;IACrE,CAAC;IACD,KAAK,MAAM,KAAK,IAAI,KAAK,EAAE,CAAC;QAC1B,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CACb,eAAe,KAAK,gCAAgC,IAAI,EAAE,CAC3D,CAAC;QACJ,CAAC;IACH,CAAC;IACD,OAAO,KAAiB,CAAC;AAC3B,CAAC"}
@@ -13,16 +13,20 @@ export declare function profileFromRepoKind(kind: RepoKind): Profile;
13
13
  export declare function repoKindFromProfile(profile: Profile): RepoKind;
14
14
  /**
15
15
  * Returns the profile a bundle authoritatively claims, or null for
16
- * additive bundles that don't claim a profile of their own.
16
+ * additive bundles that don't claim a profile of their own. Accepts
17
+ * arbitrary strings (adopter pack names per ADR 0151) and returns null
18
+ * for any name not in the closed sdd-method bundle set.
17
19
  */
18
- export declare function profileFromBundleName(name: BundleName): Profile | null;
20
+ export declare function profileFromBundleName(name: string): Profile | null;
19
21
  export declare function bundleNameFromProfile(profile: Profile): BundleName;
20
22
  /**
21
23
  * Forward-base bundles set `.sdd-repo-kind` and qualify as the base
22
24
  * layer that additive extensions compose on top of. Additive bundles
23
- * (e.g. `reverse-extension-baseline`) return false.
25
+ * (sdd-method's `reverse-extension-baseline` and ADR 0151 adopter
26
+ * packs) return false. Accepts arbitrary strings; unknown names return
27
+ * false.
24
28
  */
25
- export declare function isForwardBase(name: BundleName): boolean;
29
+ export declare function isForwardBase(name: string): boolean;
26
30
  /**
27
31
  * Maps repo-kind → forward-base bundle name. Used when migrating a
28
32
  * legacy v1 lock file (which doesn't record bundle name) to v2.
@@ -1 +1 @@
1
- {"version":3,"file":"repo-kind.d.ts","sourceRoot":"","sources":["../../src/lib/repo-kind.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,OAAO,GAAG,UAAU,GAAG,aAAa,GAAG,aAAa,GAAG,SAAS,CAAC;AAE7E,MAAM,MAAM,QAAQ,GAChB,kBAAkB,GAClB,qBAAqB,GACrB,qBAAqB,GACrB,gBAAgB,CAAC;AAErB,MAAM,MAAM,UAAU,GAClB,mBAAmB,GACnB,cAAc,GACd,sBAAsB,GACtB,kBAAkB,GAClB,4BAA4B,CAAC;AAgBjC,eAAO,MAAM,cAAc,mBAAmB,CAAC;AAC/C;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB,0BAA0B,CAAC;AAmC7D,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAE3D;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,QAAQ,CAE9D;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,GAAG,IAAI,CAEtE;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,UAAU,CAElE;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAEvD;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,QAAQ,GAAG,UAAU,CAEjE;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,QAAQ,CAE3D;AAUD,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,UAAU,CAE/D;AAED,wBAAsB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAoB7E;AAED,wBAAsB,aAAa,CACjC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,QAAQ,GACb,OAAO,CAAC,IAAI,CAAC,CAEf"}
1
+ {"version":3,"file":"repo-kind.d.ts","sourceRoot":"","sources":["../../src/lib/repo-kind.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,OAAO,GAAG,UAAU,GAAG,aAAa,GAAG,aAAa,GAAG,SAAS,CAAC;AAE7E,MAAM,MAAM,QAAQ,GAChB,kBAAkB,GAClB,qBAAqB,GACrB,qBAAqB,GACrB,gBAAgB,CAAC;AAErB,MAAM,MAAM,UAAU,GAClB,mBAAmB,GACnB,cAAc,GACd,sBAAsB,GACtB,kBAAkB,GAClB,4BAA4B,CAAC;AAgBjC,eAAO,MAAM,cAAc,mBAAmB,CAAC;AAC/C;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB,0BAA0B,CAAC;AAmC7D,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAE3D;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,QAAQ,CAE9D;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI,CAGlE;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,UAAU,CAElE;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAGnD;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,QAAQ,GAAG,UAAU,CAEjE;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,QAAQ,CAE3D;AAUD,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,UAAU,CAE/D;AAED,wBAAsB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAoB7E;AAED,wBAAsB,aAAa,CACjC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,QAAQ,GACb,OAAO,CAAC,IAAI,CAAC,CAEf"}
@@ -58,9 +58,13 @@ export function repoKindFromProfile(profile) {
58
58
  }
59
59
  /**
60
60
  * Returns the profile a bundle authoritatively claims, or null for
61
- * additive bundles that don't claim a profile of their own.
61
+ * additive bundles that don't claim a profile of their own. Accepts
62
+ * arbitrary strings (adopter pack names per ADR 0151) and returns null
63
+ * for any name not in the closed sdd-method bundle set.
62
64
  */
63
65
  export function profileFromBundleName(name) {
66
+ if (!isBundleName(name))
67
+ return null;
64
68
  return PROFILE_BY_BUNDLE_NAME[name] ?? null;
65
69
  }
66
70
  export function bundleNameFromProfile(profile) {
@@ -69,9 +73,13 @@ export function bundleNameFromProfile(profile) {
69
73
  /**
70
74
  * Forward-base bundles set `.sdd-repo-kind` and qualify as the base
71
75
  * layer that additive extensions compose on top of. Additive bundles
72
- * (e.g. `reverse-extension-baseline`) return false.
76
+ * (sdd-method's `reverse-extension-baseline` and ADR 0151 adopter
77
+ * packs) return false. Accepts arbitrary strings; unknown names return
78
+ * false.
73
79
  */
74
80
  export function isForwardBase(name) {
81
+ if (!isBundleName(name))
82
+ return false;
75
83
  return FORWARD_BASE_BUNDLES.has(name);
76
84
  }
77
85
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"repo-kind.js","sourceRoot":"","sources":["../../src/lib/repo-kind.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"repo-kind.js","sourceRoot":"","sources":["../../src/lib/repo-kind.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Multi-bundle sync config file. Per ADR 0151 + companion plan Phase 3b.
3
+ *
4
+ * Lives at `method-baseline.config.yaml` (or any path passed via
5
+ * `sdd-cli sync --config <path>`). Declares an ordered list of bundle
6
+ * sources to sync in sequence.
7
+ *
8
+ * Shape:
9
+ *
10
+ * ```yaml
11
+ * version: "1.0"
12
+ * bundles:
13
+ * - source: "./dist/method-baseline/method-baseline-v0.9.0.tar.gz"
14
+ * - source: "./dist/contextua-app-context-pack/contextua-app-context-pack-v0.1.0.tar.gz"
15
+ * ```
16
+ *
17
+ * `source` may be:
18
+ * - Absolute path
19
+ * - Path relative to the config file's directory
20
+ *
21
+ * Remote URL support is reserved for a future minor (consumers fetch
22
+ * to a temp file and pass the local path on for now).
23
+ */
24
+ export interface SyncConfig {
25
+ version: string;
26
+ bundles: SyncConfigBundle[];
27
+ }
28
+ export interface SyncConfigBundle {
29
+ /** Resolved absolute path to the tarball. */
30
+ source: string;
31
+ }
32
+ export declare function loadSyncConfig(configPath: string): Promise<SyncConfig>;
33
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/lib/sync/config.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,gBAAgB,EAAE,CAAC;CAC7B;AAED,MAAM,WAAW,gBAAgB;IAC/B,6CAA6C;IAC7C,MAAM,EAAE,MAAM,CAAC;CAChB;AAWD,wBAAsB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CA2C5E"}
@@ -0,0 +1,40 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { dirname, isAbsolute, resolve } from "node:path";
3
+ import { parse as parseYaml } from "yaml";
4
+ export async function loadSyncConfig(configPath) {
5
+ const absPath = isAbsolute(configPath) ? configPath : resolve(configPath);
6
+ let raw;
7
+ try {
8
+ raw = await readFile(absPath, "utf8");
9
+ }
10
+ catch (err) {
11
+ throw new Error(`Cannot read sync config ${absPath}: ${err.message}`);
12
+ }
13
+ const parsed = parseYaml(raw);
14
+ if (parsed === null || typeof parsed !== "object") {
15
+ throw new Error(`Sync config ${absPath} is not a YAML object`);
16
+ }
17
+ const version = typeof parsed.version === "string" ? parsed.version : undefined;
18
+ if (!version) {
19
+ throw new Error(`Sync config ${absPath} missing required field: version`);
20
+ }
21
+ if (!Array.isArray(parsed.bundles)) {
22
+ throw new Error(`Sync config ${absPath} field "bundles" must be a list`);
23
+ }
24
+ if (parsed.bundles.length === 0) {
25
+ throw new Error(`Sync config ${absPath} field "bundles" must not be empty`);
26
+ }
27
+ const configDir = dirname(absPath);
28
+ const bundles = [];
29
+ for (const [i, entry] of parsed.bundles.entries()) {
30
+ const raw = entry;
31
+ const src = typeof raw.source === "string" ? raw.source : undefined;
32
+ if (!src) {
33
+ throw new Error(`Sync config ${absPath} bundles[${i}] missing required field: source`);
34
+ }
35
+ const resolved = isAbsolute(src) ? src : resolve(configDir, src);
36
+ bundles.push({ source: resolved });
37
+ }
38
+ return { version, bundles };
39
+ }
40
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/lib/sync/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzD,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,MAAM,CAAC;AA4C1C,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,UAAkB;IACrD,MAAM,OAAO,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC1E,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IACxC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CACb,2BAA2B,OAAO,KAAM,GAAa,CAAC,OAAO,EAAE,CAChE,CAAC;IACJ,CAAC;IACD,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,CAAc,CAAC;IAC3C,IAAI,MAAM,KAAK,IAAI,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAClD,MAAM,IAAI,KAAK,CAAC,eAAe,OAAO,uBAAuB,CAAC,CAAC;IACjE,CAAC;IAED,MAAM,OAAO,GACX,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;IAClE,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,eAAe,OAAO,kCAAkC,CAAC,CAAC;IAC5E,CAAC;IAED,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CAAC,eAAe,OAAO,iCAAiC,CAAC,CAAC;IAC3E,CAAC;IACD,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CAAC,eAAe,OAAO,oCAAoC,CAAC,CAAC;IAC9E,CAAC;IAED,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACnC,MAAM,OAAO,GAAuB,EAAE,CAAC;IACvC,KAAK,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;QAClD,MAAM,GAAG,GAAG,KAAkB,CAAC;QAC/B,MAAM,GAAG,GAAG,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;QACpE,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,MAAM,IAAI,KAAK,CACb,eAAe,OAAO,YAAY,CAAC,kCAAkC,CACtE,CAAC;QACJ,CAAC;QACD,MAAM,QAAQ,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;QACjE,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;IACrC,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;AAC9B,CAAC"}