@aid-framework/generator-sdk 0.0.0 → 0.1.39

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 (48) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +171 -0
  3. package/dist/.tsbuildinfo +1 -0
  4. package/dist/aid-manifest.d.ts +71 -0
  5. package/dist/aid-manifest.d.ts.map +1 -0
  6. package/dist/aid-manifest.js +233 -0
  7. package/dist/aid-manifest.js.map +1 -0
  8. package/dist/determinism.d.ts +76 -0
  9. package/dist/determinism.d.ts.map +1 -0
  10. package/dist/determinism.js +142 -0
  11. package/dist/determinism.js.map +1 -0
  12. package/dist/diagnostics.d.ts +49 -0
  13. package/dist/diagnostics.d.ts.map +1 -0
  14. package/dist/diagnostics.js +59 -0
  15. package/dist/diagnostics.js.map +1 -0
  16. package/dist/drift.d.ts +114 -0
  17. package/dist/drift.d.ts.map +1 -0
  18. package/dist/drift.js +259 -0
  19. package/dist/drift.js.map +1 -0
  20. package/dist/index.d.ts +29 -0
  21. package/dist/index.d.ts.map +1 -0
  22. package/dist/index.js +21 -0
  23. package/dist/index.js.map +1 -0
  24. package/dist/manifest.d.ts +100 -0
  25. package/dist/manifest.d.ts.map +1 -0
  26. package/dist/manifest.js +357 -0
  27. package/dist/manifest.js.map +1 -0
  28. package/dist/node-sink.d.ts +17 -0
  29. package/dist/node-sink.d.ts.map +1 -0
  30. package/dist/node-sink.js +62 -0
  31. package/dist/node-sink.js.map +1 -0
  32. package/dist/ownership.d.ts +50 -0
  33. package/dist/ownership.d.ts.map +1 -0
  34. package/dist/ownership.js +90 -0
  35. package/dist/ownership.js.map +1 -0
  36. package/dist/plan.d.ts +51 -0
  37. package/dist/plan.d.ts.map +1 -0
  38. package/dist/plan.js +132 -0
  39. package/dist/plan.js.map +1 -0
  40. package/dist/semver.d.ts +46 -0
  41. package/dist/semver.d.ts.map +1 -0
  42. package/dist/semver.js +264 -0
  43. package/dist/semver.js.map +1 -0
  44. package/dist/targets.d.ts +44 -0
  45. package/dist/targets.d.ts.map +1 -0
  46. package/dist/targets.js +88 -0
  47. package/dist/targets.js.map +1 -0
  48. package/package.json +43 -14
package/dist/plan.d.ts ADDED
@@ -0,0 +1,51 @@
1
+ /**
2
+ * The two-phase generator contract (§8.1): `plan` is a pure function of the IR, and
3
+ * `emit` turns a plan into committed bytes.
4
+ *
5
+ * The split is what makes the safety properties checkable before anything touches
6
+ * disk. A plan is data — a set of repo-relative paths with owners — so ownership,
7
+ * path escapes, and duplicates are all decided by `validatePlan` with no filesystem
8
+ * involved. Drift detection then only has to answer one question per file: does the
9
+ * content on disk still match the hash recorded from the last generation?
10
+ */
11
+ import type { IR } from '@aid-framework/ir';
12
+ import { type GeneratorDiagnostic } from './diagnostics.js';
13
+ import { type FileOwner } from './ownership.js';
14
+ export interface GeneratedFile {
15
+ /** Repo-relative POSIX path. */
16
+ path: string;
17
+ content: string;
18
+ owner: FileOwner;
19
+ /** Replaced with `content`; absent means create-only-if-missing. */
20
+ previousHash?: string;
21
+ }
22
+ export interface Plan {
23
+ files: readonly GeneratedFile[];
24
+ }
25
+ export interface GeneratorContext {
26
+ /** Version of the generator producing the output, recorded per file in the manifest. */
27
+ generatorVersion: string;
28
+ /** Repository root the plan's paths are relative to. */
29
+ root: string;
30
+ }
31
+ export interface Generator {
32
+ readonly name: string;
33
+ readonly target: string;
34
+ readonly version: string;
35
+ readonly irRange: string;
36
+ plan(ir: IR, context: GeneratorContext): Plan;
37
+ emit(plan: Plan, context: GeneratorContext): readonly GeneratedFile[];
38
+ }
39
+ export interface PlanValidationOptions {
40
+ generatedDir?: string;
41
+ businessDir?: string;
42
+ /** The manifest is generator bookkeeping, never a planned artifact. */
43
+ manifestFilename?: string;
44
+ }
45
+ /**
46
+ * Checks a plan before any of it is written. Every failure is reported at once —
47
+ * a generator author fixing one path at a time per run is how drift bugs survive.
48
+ */
49
+ export declare function validatePlan(plan: unknown, options?: PlanValidationOptions): GeneratorDiagnostic[];
50
+ export declare function isRecord(value: unknown): value is Record<string, unknown>;
51
+ //# sourceMappingURL=plan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan.d.ts","sourceRoot":"","sources":["../src/plan.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,mBAAmB,CAAC;AAG5C,OAAO,EAEL,KAAK,mBAAmB,EAEzB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAGL,KAAK,SAAS,EAKf,MAAM,gBAAgB,CAAC;AAExB,MAAM,WAAW,aAAa;IAC5B,gCAAgC;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,SAAS,CAAC;IACjB,oEAAoE;IACpE,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,IAAI;IACnB,KAAK,EAAE,SAAS,aAAa,EAAE,CAAC;CACjC;AAED,MAAM,WAAW,gBAAgB;IAC/B,wFAAwF;IACxF,gBAAgB,EAAE,MAAM,CAAC;IACzB,wDAAwD;IACxD,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAC9C,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,gBAAgB,GAAG,SAAS,aAAa,EAAE,CAAC;CACvE;AAED,MAAM,WAAW,qBAAqB;IACpC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,uEAAuE;IACvE,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,OAAO,EACb,OAAO,GAAE,qBAA0B,GAClC,mBAAmB,EAAE,CAkJvB;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEzE"}
package/dist/plan.js ADDED
@@ -0,0 +1,132 @@
1
+ /**
2
+ * The two-phase generator contract (§8.1): `plan` is a pure function of the IR, and
3
+ * `emit` turns a plan into committed bytes.
4
+ *
5
+ * The split is what makes the safety properties checkable before anything touches
6
+ * disk. A plan is data — a set of repo-relative paths with owners — so ownership,
7
+ * path escapes, and duplicates are all decided by `validatePlan` with no filesystem
8
+ * involved. Drift detection then only has to answer one question per file: does the
9
+ * content on disk still match the hash recorded from the last generation?
10
+ */
11
+ import { sortDiagnostics } from '@aid-framework/spec';
12
+ import { GENERATOR_DIAGNOSTIC_CODES, generatorError, } from './diagnostics.js';
13
+ import { DEFAULT_MANIFEST_FILENAME, escapesRoot, isAbsolutePath, isReservedPath, normalizeRelativePath, ownerForPath, } from './ownership.js';
14
+ /**
15
+ * Checks a plan before any of it is written. Every failure is reported at once —
16
+ * a generator author fixing one path at a time per run is how drift bugs survive.
17
+ */
18
+ export function validatePlan(plan, options = {}) {
19
+ const manifestFilename = options.manifestFilename ?? DEFAULT_MANIFEST_FILENAME;
20
+ const diagnostics = [];
21
+ if (!isRecord(plan) || !Array.isArray(plan.files)) {
22
+ return [
23
+ generatorError({
24
+ code: GENERATOR_DIAGNOSTIC_CODES.planNotAMapping,
25
+ message: 'A plan must be an object with a `files` array.',
26
+ path: 'plan.files',
27
+ }),
28
+ ];
29
+ }
30
+ if (plan.files.length === 0) {
31
+ diagnostics.push(generatorError({
32
+ code: GENERATOR_DIAGNOSTIC_CODES.planEmpty,
33
+ message: 'A plan must contain at least one file; an empty plan hides a broken generator.',
34
+ path: 'plan.files',
35
+ }));
36
+ }
37
+ const seen = new Map();
38
+ for (const [index, entry] of plan.files.entries()) {
39
+ const at = `plan.files[${index}]`;
40
+ if (!isRecord(entry)) {
41
+ diagnostics.push(generatorError({
42
+ code: GENERATOR_DIAGNOSTIC_CODES.planInvalidPath,
43
+ message: `${at} must be an object with \`path\`, \`content\`, and \`owner\`.`,
44
+ path: at,
45
+ }));
46
+ continue;
47
+ }
48
+ if (typeof entry.path !== 'string') {
49
+ diagnostics.push(generatorError({
50
+ code: GENERATOR_DIAGNOSTIC_CODES.planInvalidPath,
51
+ message: `${at}.path must be a string.`,
52
+ path: `${at}.path`,
53
+ }));
54
+ continue;
55
+ }
56
+ const raw = entry.path;
57
+ if (isAbsolutePath(raw)) {
58
+ diagnostics.push(generatorError({
59
+ code: GENERATOR_DIAGNOSTIC_CODES.planInvalidPath,
60
+ message: `${at}.path "${raw}" is absolute; plan paths are repo-relative.`,
61
+ path: `${at}.path`,
62
+ }));
63
+ continue;
64
+ }
65
+ if (escapesRoot(raw)) {
66
+ diagnostics.push(generatorError({
67
+ code: GENERATOR_DIAGNOSTIC_CODES.planInvalidPath,
68
+ message: `${at}.path "${raw}" escapes the repository root.`,
69
+ path: `${at}.path`,
70
+ }));
71
+ continue;
72
+ }
73
+ const normalized = normalizeRelativePath(raw);
74
+ if (normalized === undefined) {
75
+ diagnostics.push(generatorError({
76
+ code: GENERATOR_DIAGNOSTIC_CODES.planInvalidPath,
77
+ message: `${at}.path "${raw}" is not a usable relative path.`,
78
+ path: `${at}.path`,
79
+ }));
80
+ continue;
81
+ }
82
+ if (isReservedPath(normalized, manifestFilename)) {
83
+ diagnostics.push(generatorError({
84
+ code: GENERATOR_DIAGNOSTIC_CODES.planInvalidPath,
85
+ message: `${at}.path "${normalized}" is reserved by the generator; it is never planned.`,
86
+ path: `${at}.path`,
87
+ }));
88
+ continue;
89
+ }
90
+ const expectedOwner = ownerForPath(normalized, options);
91
+ if (expectedOwner === undefined) {
92
+ diagnostics.push(generatorError({
93
+ code: GENERATOR_DIAGNOSTIC_CODES.planOwnerMismatch,
94
+ message: `${at}.path "${normalized}" is outside the managed roots, so it has no owner.`,
95
+ path: `${at}.path`,
96
+ hint: 'Generated files belong under the generated root and business files under the business root.',
97
+ }));
98
+ continue;
99
+ }
100
+ if (entry.owner !== expectedOwner) {
101
+ diagnostics.push(generatorError({
102
+ code: GENERATOR_DIAGNOSTIC_CODES.planOwnerMismatch,
103
+ message: `${at}.owner is "${String(entry.owner)}" but "${normalized}" is a ${expectedOwner} path.`,
104
+ path: `${at}.owner`,
105
+ }));
106
+ continue;
107
+ }
108
+ if (typeof entry.content !== 'string') {
109
+ diagnostics.push(generatorError({
110
+ code: GENERATOR_DIAGNOSTIC_CODES.planInvalidPath,
111
+ message: `${at}.content must be a string.`,
112
+ path: `${at}.content`,
113
+ }));
114
+ continue;
115
+ }
116
+ const first = seen.get(normalized);
117
+ if (first !== undefined) {
118
+ diagnostics.push(generatorError({
119
+ code: GENERATOR_DIAGNOSTIC_CODES.planDuplicatePath,
120
+ message: `"${normalized}" is planned twice (at plan.files[${first}]).`,
121
+ path: `${at}.path`,
122
+ }));
123
+ continue;
124
+ }
125
+ seen.set(normalized, index);
126
+ }
127
+ return sortDiagnostics(diagnostics);
128
+ }
129
+ export function isRecord(value) {
130
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
131
+ }
132
+ //# sourceMappingURL=plan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan.js","sourceRoot":"","sources":["../src/plan.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * The minimal semver surface a generator manifest needs: parse a version, parse a
3
+ * range, and decide whether a version satisfies a range.
4
+ *
5
+ * This exists because `Generator.irRange` (§8.1) and `AidManifest.generatorVersion`
6
+ * (§10) are both version contracts, and "does this generator support the IR it was
7
+ * handed" must be answered before codegen, not discovered at runtime. It is
8
+ * deliberately not a full semver library: no build metadata in comparisons, and
9
+ * prereleases follow the npm rule that a prerelease only matches a comparator whose
10
+ * bound version carries a prerelease at the same `major.minor.patch`. That rule is
11
+ * what stops `1.2.3-rc.1` silently satisfying `^1.2.3`.
12
+ */
13
+ export interface Version {
14
+ major: number;
15
+ minor: number;
16
+ patch: number;
17
+ prerelease: readonly (string | number)[];
18
+ }
19
+ export declare function parseVersion(text: string): Version | undefined;
20
+ export declare function formatVersion(version: Version): string;
21
+ export declare function isValidVersion(text: string): boolean;
22
+ /** Semver precedence. Build metadata is not part of precedence and is not parsed. */
23
+ export declare function compareVersions(left: Version, right: Version): -1 | 0 | 1;
24
+ interface Bound {
25
+ operator: '>' | '>=' | '<' | '<=' | '=';
26
+ version: Version;
27
+ }
28
+ /** One whitespace-separated conjunct, already expanded into `>`, `>=`, `<`, `<=`, `=` bounds. */
29
+ type Conjunct = Bound[];
30
+ interface Range {
31
+ /** One entry per `||` alternative; a version satisfies the range if any satisfies. */
32
+ alternatives: Conjunct[];
33
+ /** True when the range is a bare wildcard, which no version can fail. */
34
+ any: boolean;
35
+ }
36
+ export declare function isValidRange(text: string): boolean;
37
+ /**
38
+ * Parses the range grammar the repo's manifests use: `||` alternatives, and each
39
+ * alternative a whitespace-separated list of comparators. A comparator is an
40
+ * operator plus a version that may be partial or wildcarded (`1.2.x`, `1`, `*`).
41
+ * Anything outside the grammar is `undefined`, never a permissive default.
42
+ */
43
+ export declare function parseRange(text: string): Range | undefined;
44
+ export declare function satisfies(versionText: string, rangeText: string): boolean;
45
+ export {};
46
+ //# sourceMappingURL=semver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"semver.d.ts","sourceRoot":"","sources":["../src/semver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,MAAM,WAAW,OAAO;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,SAAS,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC;CAC1C;AAOD,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAa9D;AAOD,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAItD;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEpD;AAED,qFAAqF;AACrF,wBAAgB,eAAe,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAKzE;AAkCD,UAAU,KAAK;IACb,QAAQ,EAAE,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,CAAC;IACxC,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,iGAAiG;AACjG,KAAK,QAAQ,GAAG,KAAK,EAAE,CAAC;AAExB,UAAU,KAAK;IACb,sFAAsF;IACtF,YAAY,EAAE,QAAQ,EAAE,CAAC;IACzB,yEAAyE;IACzE,GAAG,EAAE,OAAO,CAAC;CACd;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAElD;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,KAAK,GAAG,SAAS,CAoB1D;AAqID,wBAAgB,SAAS,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAOzE"}
package/dist/semver.js ADDED
@@ -0,0 +1,264 @@
1
+ /**
2
+ * The minimal semver surface a generator manifest needs: parse a version, parse a
3
+ * range, and decide whether a version satisfies a range.
4
+ *
5
+ * This exists because `Generator.irRange` (§8.1) and `AidManifest.generatorVersion`
6
+ * (§10) are both version contracts, and "does this generator support the IR it was
7
+ * handed" must be answered before codegen, not discovered at runtime. It is
8
+ * deliberately not a full semver library: no build metadata in comparisons, and
9
+ * prereleases follow the npm rule that a prerelease only matches a comparator whose
10
+ * bound version carries a prerelease at the same `major.minor.patch`. That rule is
11
+ * what stops `1.2.3-rc.1` silently satisfying `^1.2.3`.
12
+ */
13
+ const VERSION_PATTERN = /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+[0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*)?$/;
14
+ const IDENTIFIER_PATTERN = /^\d+$/;
15
+ export function parseVersion(text) {
16
+ const match = VERSION_PATTERN.exec(text.trim());
17
+ if (match === null)
18
+ return undefined;
19
+ const [, major, minor, patch, prerelease] = match;
20
+ if (major === undefined || minor === undefined || patch === undefined)
21
+ return undefined;
22
+ return {
23
+ major: Number(major),
24
+ minor: Number(minor),
25
+ patch: Number(patch),
26
+ prerelease: parsePrerelease(prerelease),
27
+ };
28
+ }
29
+ function parsePrerelease(text) {
30
+ if (text === undefined || text === '')
31
+ return [];
32
+ return text.split('.').map((part) => (IDENTIFIER_PATTERN.test(part) ? Number(part) : part));
33
+ }
34
+ export function formatVersion(version) {
35
+ const base = `${version.major}.${version.minor}.${version.patch}`;
36
+ if (version.prerelease.length === 0)
37
+ return base;
38
+ return `${base}-${version.prerelease.join('.')}`;
39
+ }
40
+ export function isValidVersion(text) {
41
+ return parseVersion(text) !== undefined;
42
+ }
43
+ /** Semver precedence. Build metadata is not part of precedence and is not parsed. */
44
+ export function compareVersions(left, right) {
45
+ for (const key of ['major', 'minor', 'patch']) {
46
+ if (left[key] !== right[key])
47
+ return left[key] < right[key] ? -1 : 1;
48
+ }
49
+ return comparePrerelease(left.prerelease, right.prerelease);
50
+ }
51
+ function comparePrerelease(left, right) {
52
+ // An empty prerelease outranks any prerelease: 1.0.0 > 1.0.0-rc.1.
53
+ if (left.length === 0 && right.length === 0)
54
+ return 0;
55
+ if (left.length === 0)
56
+ return 1;
57
+ if (right.length === 0)
58
+ return -1;
59
+ const length = Math.max(left.length, right.length);
60
+ for (let index = 0; index < length; index += 1) {
61
+ const a = left[index];
62
+ const b = right[index];
63
+ // A shorter prerelease is lower when its identifiers are exhausted.
64
+ if (a === undefined)
65
+ return -1;
66
+ if (b === undefined)
67
+ return 1;
68
+ if (a === b)
69
+ continue;
70
+ const aNumeric = typeof a === 'number';
71
+ const bNumeric = typeof b === 'number';
72
+ if (aNumeric && bNumeric)
73
+ return a < b ? -1 : 1;
74
+ // Numeric identifiers always rank below alphanumeric ones.
75
+ if (aNumeric !== bNumeric)
76
+ return aNumeric ? -1 : 1;
77
+ return a < b ? -1 : 1;
78
+ }
79
+ return 0;
80
+ }
81
+ const OPERATORS = ['>=', '<=', '^', '~', '>', '<', '='];
82
+ export function isValidRange(text) {
83
+ return parseRange(text) !== undefined;
84
+ }
85
+ /**
86
+ * Parses the range grammar the repo's manifests use: `||` alternatives, and each
87
+ * alternative a whitespace-separated list of comparators. A comparator is an
88
+ * operator plus a version that may be partial or wildcarded (`1.2.x`, `1`, `*`).
89
+ * Anything outside the grammar is `undefined`, never a permissive default.
90
+ */
91
+ export function parseRange(text) {
92
+ const source = text.trim();
93
+ if (source === '')
94
+ return undefined;
95
+ const alternatives = [];
96
+ for (const alternative of source.split('||')) {
97
+ const trimmed = alternative.trim();
98
+ if (trimmed === '')
99
+ return undefined;
100
+ // `-` ranges are deliberately unsupported: a range we cannot expand exactly
101
+ // must fail validation rather than match approximately.
102
+ if (/\s-\s/.test(trimmed))
103
+ return undefined;
104
+ const conjunct = expandConjunct(trimmed);
105
+ if (conjunct === undefined)
106
+ return undefined;
107
+ alternatives.push(conjunct);
108
+ }
109
+ if (alternatives.length === 0)
110
+ return undefined;
111
+ return { alternatives, any: alternatives.some((conjunct) => conjunct.length === 0) };
112
+ }
113
+ function expandConjunct(text) {
114
+ if (text === '*' || text === 'x' || text === 'X')
115
+ return [];
116
+ const bounds = [];
117
+ for (const token of text.split(/\s+/)) {
118
+ if (token === '')
119
+ continue;
120
+ const expanded = expandComparator(token);
121
+ if (expanded === undefined)
122
+ return undefined;
123
+ bounds.push(...expanded);
124
+ }
125
+ return bounds.length === 0 ? [] : bounds;
126
+ }
127
+ function splitOperator(token) {
128
+ for (const operator of OPERATORS) {
129
+ if (token.startsWith(operator))
130
+ return { operator, rest: token.slice(operator.length) };
131
+ }
132
+ return { operator: '=', rest: token };
133
+ }
134
+ function parsePartial(text) {
135
+ const [core, ...rest] = text.split('-');
136
+ if (core === undefined)
137
+ return undefined;
138
+ const prerelease = rest.length === 0 ? [] : parsePrerelease(rest.join('-'));
139
+ const parts = core.split('.');
140
+ const numbers = [];
141
+ let wildcards = 0;
142
+ for (const part of parts) {
143
+ if (/(?:x|X|\*)/.test(part)) {
144
+ wildcards += 1;
145
+ continue;
146
+ }
147
+ if (!/^\d+$/.test(part))
148
+ return undefined;
149
+ numbers.push(Number(part));
150
+ }
151
+ if (parts.length > 3)
152
+ return undefined;
153
+ if (wildcards > 0 && numbers.length + wildcards !== parts.length)
154
+ return undefined;
155
+ const [major = 0, minor = 0, patch = 0] = numbers;
156
+ return {
157
+ major,
158
+ minor,
159
+ patch,
160
+ prerelease,
161
+ specified: Math.min(numbers.length, 3),
162
+ };
163
+ }
164
+ function makeVersion(major, minor, patch, prerelease = []) {
165
+ return { major, minor, patch, prerelease };
166
+ }
167
+ function expandComparator(token) {
168
+ const { operator, rest } = splitOperator(token);
169
+ // A bare operator (`>=`) names nothing and is a typo; an operator in front of a
170
+ // wildcard (`^x`) names no version at all, so it constrains nothing.
171
+ if (rest === '')
172
+ return undefined;
173
+ if (rest === '*' || rest === 'x' || rest === 'X')
174
+ return [];
175
+ const partial = parsePartial(rest);
176
+ if (partial === undefined)
177
+ return undefined;
178
+ const { major, minor, patch, prerelease, specified } = partial;
179
+ if (specified === 3) {
180
+ const exact = makeVersion(major, minor, patch, prerelease);
181
+ switch (operator) {
182
+ case '=':
183
+ case '>':
184
+ case '>=':
185
+ case '<':
186
+ case '<=':
187
+ return [{ operator, version: exact }];
188
+ case '~':
189
+ return [
190
+ { operator: '>=', version: exact },
191
+ { operator: '<', version: makeVersion(major, minor + 1, 0) },
192
+ ];
193
+ case '^': {
194
+ const upper = major > 0
195
+ ? makeVersion(major + 1, 0, 0)
196
+ : minor > 0
197
+ ? makeVersion(0, minor + 1, 0)
198
+ : makeVersion(0, 0, patch + 1);
199
+ return [
200
+ { operator: '>=', version: exact },
201
+ { operator: '<', version: upper },
202
+ ];
203
+ }
204
+ default:
205
+ return undefined;
206
+ }
207
+ }
208
+ if (operator === '>' || operator === '<' || operator === '>=' || operator === '<=') {
209
+ return [{ operator, version: makeVersion(major, minor, patch, prerelease) }];
210
+ }
211
+ // `^`/`~`/`=` with a partial version: partial versions lower-bound at zero and
212
+ // upper-bound at the last position that was actually written.
213
+ return partialBounds(major, minor, patch, specified);
214
+ }
215
+ /** A partial version (`1`, `1.2`, `1.2.x`) has a zero lower bound and a bumped upper bound. */
216
+ function partialBounds(major, minor, patch, specified) {
217
+ // `^x.y` names no version at all, so it constrains nothing rather than guessing.
218
+ if (specified === 0)
219
+ return [];
220
+ const lower = { operator: '>=', version: makeVersion(major, minor, patch) };
221
+ const upper = specified === 1
222
+ ? { operator: '<', version: makeVersion(major + 1, 0, 0) }
223
+ : { operator: '<', version: makeVersion(major, minor + 1, 0) };
224
+ return [lower, upper];
225
+ }
226
+ export function satisfies(versionText, rangeText) {
227
+ const parsedVersion = parseVersion(versionText);
228
+ const range = parseRange(rangeText);
229
+ if (parsedVersion === undefined || range === undefined)
230
+ return false;
231
+ if (range.any)
232
+ return true;
233
+ return range.alternatives.some((conjunct) => satisfiesConjunct(parsedVersion, conjunct));
234
+ }
235
+ function satisfiesConjunct(candidate, conjunct) {
236
+ if (conjunct.length === 0)
237
+ return true;
238
+ if (candidate.prerelease.length > 0) {
239
+ const anchored = conjunct.some((bound) => bound.version.prerelease.length > 0 &&
240
+ bound.version.major === candidate.major &&
241
+ bound.version.minor === candidate.minor &&
242
+ bound.version.patch === candidate.patch);
243
+ if (!anchored)
244
+ return false;
245
+ }
246
+ return conjunct.every((bound) => satisfiesBound(candidate, bound));
247
+ }
248
+ /** No `default`: a new operator must be handled here, not silently pass. */
249
+ function satisfiesBound(candidate, bound) {
250
+ const order = compareVersions(candidate, bound.version);
251
+ switch (bound.operator) {
252
+ case '>':
253
+ return order > 0;
254
+ case '>=':
255
+ return order >= 0;
256
+ case '<':
257
+ return order < 0;
258
+ case '<=':
259
+ return order <= 0;
260
+ case '=':
261
+ return order === 0;
262
+ }
263
+ }
264
+ //# sourceMappingURL=semver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"semver.js","sourceRoot":"","sources":["../src/semver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * The Phase 0 target declarations, in the shape `@aid-framework/ir`'s capability gate consumes.
3
+ *
4
+ * `@aid-framework/ir` ships a placeholder (`PHASE_0_TARGET_CAPABILITIES`) precisely so the gate
5
+ * can exist before a real generator does; this module is the replacement. It matters
6
+ * that these are *declarations*, not aspirations: a target that claims `streaming`
7
+ * makes every spec requiring streaming pass the capability gate, so the list is the
8
+ * honest answer to "what does the code this generator emits actually do".
9
+ *
10
+ * Two facts are recorded here rather than hidden in prose:
11
+ *
12
+ * - `streaming` is declared since layer P7a. It was absent while both gateways raised
13
+ * `FeatureDeferredError`; the Python runtime now streams and the generator emits a
14
+ * route that negotiates `Accept: text/event-stream`, so the declaration is backed by
15
+ * an emitter, a runtime and a committed example. The TypeScript runtime still defers
16
+ * streaming (ratified to L6), which is why `@aid-framework/ir`'s derivation and this list are
17
+ * kept separate concerns.
18
+ * - `agents` and `cursor-memory` are declared since layer P7b, and they are two
19
+ * declarations rather than one because the IR derives two: `agents` from an `agents`
20
+ * collection, `cursor-memory` from a `memory` collection (there is no `memory`
21
+ * capability to declare). Both are backed by emitted code -- `generated/agents.py`
22
+ * builds the runtime over this app's own gateway and tools and serves the routes --
23
+ * and by the example's `tests/test_agents.py`, which pauses a run and resumes it. The
24
+ * TypeScript target declares neither, so `@aid-framework/ir` will route a spec that needs them
25
+ * to the Python target or refuse it.
26
+ * - the absence of `emitsAgainst.orchestration` — Phase 0 control flow is plain async,
27
+ * and orchestration frameworks are deferred to Phase 2. An agent loop is not an
28
+ * orchestration framework: the emitted `build_runtime` calls `AgentRuntime.from_ir`
29
+ * from the repo's own runtime and depends on nothing outside it.
30
+ */
31
+ import { type TargetCapabilityDeclarations } from '@aid-framework/ir';
32
+ import { type GeneratorManifest, type GeneratorManifestInput } from './manifest.js';
33
+ export declare const PY_FASTAPI_TARGET = "py-fastapi";
34
+ /**
35
+ * The FastAPI + Pydantic target. `emitsAgainst` says the emitted code binds to
36
+ * Pydantic for structured output and OpenTelemetry GenAI for tracing, and to no
37
+ * orchestration framework at all.
38
+ */
39
+ export declare const PY_FASTAPI_MANIFEST_INPUT: GeneratorManifestInput;
40
+ export declare const PY_FASTAPI_MANIFEST: GeneratorManifest;
41
+ export declare function phase0Generators(): GeneratorManifest[];
42
+ /** Drop-in replacement for `@aid-framework/ir`'s `phase0TargetCapabilities()`. */
43
+ export declare function phase0TargetCapabilities(): TargetCapabilityDeclarations;
44
+ //# sourceMappingURL=targets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"targets.d.ts","sourceRoot":"","sources":["../src/targets.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,OAAO,EAAc,KAAK,4BAA4B,EAAE,MAAM,mBAAmB,CAAC;AAGlF,OAAO,EACL,KAAK,iBAAiB,EACtB,KAAK,sBAAsB,EAG5B,MAAM,eAAe,CAAC;AAEvB,eAAO,MAAM,iBAAiB,eAAe,CAAC;AAE9C;;;;GAIG;AACH,eAAO,MAAM,yBAAyB,EAAE,sBA2BvC,CAAC;AAiBF,eAAO,MAAM,mBAAmB,EAAE,iBAGjC,CAAC;AAEF,wBAAgB,gBAAgB,IAAI,iBAAiB,EAAE,CAEtD;AAED,kFAAkF;AAClF,wBAAgB,wBAAwB,IAAI,4BAA4B,CAEvE"}