@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.
- package/LICENSE +201 -0
- package/README.md +171 -0
- package/dist/.tsbuildinfo +1 -0
- package/dist/aid-manifest.d.ts +71 -0
- package/dist/aid-manifest.d.ts.map +1 -0
- package/dist/aid-manifest.js +233 -0
- package/dist/aid-manifest.js.map +1 -0
- package/dist/determinism.d.ts +76 -0
- package/dist/determinism.d.ts.map +1 -0
- package/dist/determinism.js +142 -0
- package/dist/determinism.js.map +1 -0
- package/dist/diagnostics.d.ts +49 -0
- package/dist/diagnostics.d.ts.map +1 -0
- package/dist/diagnostics.js +59 -0
- package/dist/diagnostics.js.map +1 -0
- package/dist/drift.d.ts +114 -0
- package/dist/drift.d.ts.map +1 -0
- package/dist/drift.js +259 -0
- package/dist/drift.js.map +1 -0
- package/dist/index.d.ts +29 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +21 -0
- package/dist/index.js.map +1 -0
- package/dist/manifest.d.ts +100 -0
- package/dist/manifest.d.ts.map +1 -0
- package/dist/manifest.js +357 -0
- package/dist/manifest.js.map +1 -0
- package/dist/node-sink.d.ts +17 -0
- package/dist/node-sink.d.ts.map +1 -0
- package/dist/node-sink.js +62 -0
- package/dist/node-sink.js.map +1 -0
- package/dist/ownership.d.ts +50 -0
- package/dist/ownership.d.ts.map +1 -0
- package/dist/ownership.js +90 -0
- package/dist/ownership.js.map +1 -0
- package/dist/plan.d.ts +51 -0
- package/dist/plan.d.ts.map +1 -0
- package/dist/plan.js +132 -0
- package/dist/plan.js.map +1 -0
- package/dist/semver.d.ts +46 -0
- package/dist/semver.d.ts.map +1 -0
- package/dist/semver.js +264 -0
- package/dist/semver.js.map +1 -0
- package/dist/targets.d.ts +44 -0
- package/dist/targets.d.ts.map +1 -0
- package/dist/targets.js +88 -0
- package/dist/targets.js.map +1 -0
- package/package.json +43 -14
package/dist/drift.js
ADDED
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Regeneration and drift (§10). This is the algorithm the whole ownership model exists
|
|
3
|
+
* to support, so it is stated once, here, in terms of a plan, the previous manifest, and
|
|
4
|
+
* a byte-level view of the tree:
|
|
5
|
+
*
|
|
6
|
+
* 1. Plan the new file set (already done; see {@link Plan}).
|
|
7
|
+
* 2. For each planned `generated/` file: if it exists on disk and its hash is not the
|
|
8
|
+
* one recorded in the manifest, a human edited generated code. Do not overwrite it.
|
|
9
|
+
* Write the new content to `<path>.aid-rej` and fail with guidance.
|
|
10
|
+
* 3. For each planned `business/` file: create only if missing. Never overwrite.
|
|
11
|
+
* 4. Write atomically; update the manifest.
|
|
12
|
+
* 5. Report created / updated / unchanged / conflicts.
|
|
13
|
+
*
|
|
14
|
+
* The rule that makes this worth having is step 2. A generator that overwrites
|
|
15
|
+
* `generated/` unconditionally destroys the one signal it has that a human disagreed
|
|
16
|
+
* with it, and the loss is silent. Refusing, keeping the rejected bytes alongside the
|
|
17
|
+
* file, and naming the two escapes (`aid eject <path>` to take ownership, `--force` to
|
|
18
|
+
* discard the edits) turns a silent data loss into a decision.
|
|
19
|
+
*
|
|
20
|
+
* Two limits are deliberate. A planned file that is *newer* than the manifest but has no
|
|
21
|
+
* record at all is treated as drift, not as a file to adopt — an unrecorded file under
|
|
22
|
+
* `generated/` cannot be proven unmodified. And stale generated files (recorded, but no
|
|
23
|
+
* longer planned) are reported but not deleted unless `prune` is requested explicitly,
|
|
24
|
+
* because deletion is the one operation with no recovery.
|
|
25
|
+
*/
|
|
26
|
+
import { sortDiagnostics } from '@aid-framework/spec';
|
|
27
|
+
import { AID_MANIFEST_VERSION, manifestRecordFor, } from './aid-manifest.js';
|
|
28
|
+
import { sha256Hex, sortByPath } from './determinism.js';
|
|
29
|
+
import { GENERATOR_DIAGNOSTIC_CODES, generatorError, generatorWarning, } from './diagnostics.js';
|
|
30
|
+
import { rejectionPath } from './ownership.js';
|
|
31
|
+
export function planRegeneration(plan, options) {
|
|
32
|
+
const force = options.force ?? false;
|
|
33
|
+
const manifest = options.manifest;
|
|
34
|
+
const diagnostics = [];
|
|
35
|
+
const created = [];
|
|
36
|
+
const updated = [];
|
|
37
|
+
const unchanged = [];
|
|
38
|
+
const kept = [];
|
|
39
|
+
const drifted = [];
|
|
40
|
+
const actions = [];
|
|
41
|
+
for (const file of sortByPath(plan.files)) {
|
|
42
|
+
const actual = options.sink.read(file.path);
|
|
43
|
+
if (file.owner === 'business') {
|
|
44
|
+
if (actual === undefined) {
|
|
45
|
+
created.push(file.path);
|
|
46
|
+
actions.push({ kind: 'create', path: file.path, owner: 'business' });
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
// Step 3: developer-owned content is created once and never overwritten. This is
|
|
50
|
+
// not a conflict — it is the intended steady state.
|
|
51
|
+
kept.push(file.path);
|
|
52
|
+
actions.push({ kind: 'keep-business', path: file.path });
|
|
53
|
+
}
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
const recorded = manifestRecordFor(manifest, file.path);
|
|
57
|
+
if (actual === undefined) {
|
|
58
|
+
created.push(file.path);
|
|
59
|
+
actions.push({ kind: 'create', path: file.path, owner: 'generated' });
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
const actualSha256 = sha256Hex(actual);
|
|
63
|
+
if (recorded === undefined || recorded.sha256 !== actualSha256) {
|
|
64
|
+
const drift = {
|
|
65
|
+
path: file.path,
|
|
66
|
+
...(recorded === undefined ? {} : { recordedSha256: recorded.sha256 }),
|
|
67
|
+
actualSha256,
|
|
68
|
+
};
|
|
69
|
+
drifted.push(drift);
|
|
70
|
+
actions.push({ kind: 'drift', ...drift });
|
|
71
|
+
const init = {
|
|
72
|
+
code: GENERATOR_DIAGNOSTIC_CODES.generatedDrift,
|
|
73
|
+
message: recorded === undefined
|
|
74
|
+
? `"${file.path}" exists under the generated root but is not recorded in the manifest, so it cannot be safely regenerated.`
|
|
75
|
+
: `"${file.path}" was modified after generation (recorded ${recorded.sha256}, found ${actualSha256}).`,
|
|
76
|
+
path: file.path,
|
|
77
|
+
hint: force
|
|
78
|
+
? `--force discards the local edits and rewrites "${file.path}" from the plan.`
|
|
79
|
+
: `Run \`aid eject ${file.path}\` to own the file, or regenerate with --force to discard the edits. The new content is written to ${rejectionPath(file.path)}.`,
|
|
80
|
+
};
|
|
81
|
+
// Refusing is an error the caller must resolve; --force is the caller resolving it.
|
|
82
|
+
diagnostics.push(force ? generatorWarning(init) : generatorError(init));
|
|
83
|
+
continue;
|
|
84
|
+
}
|
|
85
|
+
if (actualSha256 === sha256Hex(file.content)) {
|
|
86
|
+
unchanged.push(file.path);
|
|
87
|
+
actions.push({ kind: 'unchanged', path: file.path, owner: 'generated' });
|
|
88
|
+
continue;
|
|
89
|
+
}
|
|
90
|
+
updated.push(file.path);
|
|
91
|
+
actions.push({ kind: 'update', path: file.path, owner: 'generated' });
|
|
92
|
+
}
|
|
93
|
+
const stale = staleGeneratedFiles(plan, manifest);
|
|
94
|
+
for (const path of stale) {
|
|
95
|
+
diagnostics.push(generatorWarning({
|
|
96
|
+
code: GENERATOR_DIAGNOSTIC_CODES.generatedDrift,
|
|
97
|
+
message: `"${path}" was generated by "${manifest?.generatedBy.generator ?? 'a previous generator'}" but is no longer planned.`,
|
|
98
|
+
path,
|
|
99
|
+
hint: force
|
|
100
|
+
? 'Pass --prune to delete stale generated files.'
|
|
101
|
+
: 'Stale files under the generated root break the invariant that the manifest lists exactly what the generator owns.',
|
|
102
|
+
}));
|
|
103
|
+
}
|
|
104
|
+
return {
|
|
105
|
+
actions,
|
|
106
|
+
created,
|
|
107
|
+
updated,
|
|
108
|
+
unchanged,
|
|
109
|
+
kept,
|
|
110
|
+
drifted,
|
|
111
|
+
stale,
|
|
112
|
+
pruned: [],
|
|
113
|
+
diagnostics: sortDiagnostics(diagnostics),
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Generated files the manifest records that the plan no longer contains. Business files
|
|
118
|
+
* are excluded: a generator is expected to stop planning one once a developer takes it
|
|
119
|
+
* over, and flagging that would punish the intended path.
|
|
120
|
+
*/
|
|
121
|
+
export function staleGeneratedFiles(plan, manifest) {
|
|
122
|
+
if (manifest === undefined)
|
|
123
|
+
return [];
|
|
124
|
+
const planned = new Set(plan.files.map((file) => file.path));
|
|
125
|
+
return sortByPath(manifest.files.filter((file) => file.owner === 'generated' && !planned.has(file.path))).map((file) => file.path);
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Plans, then applies. Drifted generated files are never written unless `force` is set;
|
|
129
|
+
* their newly generated content goes to `<path>.aid-rej` instead, and an error-severity
|
|
130
|
+
* diagnostic is returned so a caller cannot mistake the run for a success.
|
|
131
|
+
*/
|
|
132
|
+
export function regenerate(plan, options) {
|
|
133
|
+
const force = options.force ?? false;
|
|
134
|
+
const prune = options.prune ?? false;
|
|
135
|
+
const report = planRegeneration(plan, options);
|
|
136
|
+
const byPath = new Map(sortByPath(plan.files).map((file) => [file.path, file]));
|
|
137
|
+
const driftedPaths = new Set(report.drifted.map((drift) => drift.path));
|
|
138
|
+
for (const action of report.actions) {
|
|
139
|
+
if (action.kind === 'create' || action.kind === 'update') {
|
|
140
|
+
const file = byPath.get(action.path);
|
|
141
|
+
if (file !== undefined)
|
|
142
|
+
options.sink.write(file.path, file.content);
|
|
143
|
+
continue;
|
|
144
|
+
}
|
|
145
|
+
if (action.kind === 'drift') {
|
|
146
|
+
const file = byPath.get(action.path);
|
|
147
|
+
if (file === undefined)
|
|
148
|
+
continue;
|
|
149
|
+
if (force) {
|
|
150
|
+
options.sink.write(file.path, file.content);
|
|
151
|
+
options.sink.remove(rejectionPath(file.path));
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
options.sink.write(rejectionPath(file.path), file.content);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
const pruned = [];
|
|
159
|
+
if (prune) {
|
|
160
|
+
for (const path of report.stale) {
|
|
161
|
+
options.sink.remove(path);
|
|
162
|
+
pruned.push(path);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
const finalReport = {
|
|
166
|
+
...report,
|
|
167
|
+
pruned: sortByPath(pruned.map((path) => ({ path }))).map((entry) => entry.path),
|
|
168
|
+
};
|
|
169
|
+
return {
|
|
170
|
+
report: finalReport,
|
|
171
|
+
manifest: nextManifest({
|
|
172
|
+
plan,
|
|
173
|
+
previous: options.manifest,
|
|
174
|
+
provenance: options.provenance,
|
|
175
|
+
driftedPaths,
|
|
176
|
+
force,
|
|
177
|
+
prunedPaths: new Set(finalReport.pruned),
|
|
178
|
+
sink: options.sink,
|
|
179
|
+
}),
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* The manifest after a run. Two deliberate asymmetries:
|
|
184
|
+
*
|
|
185
|
+
* - A drifted file keeps its previous record, because the bytes on disk are still the
|
|
186
|
+
* developer's edits and claiming the generated hash would erase the drift on the next
|
|
187
|
+
* run — silently, which is the exact failure this module exists to prevent.
|
|
188
|
+
* - A business file's hash is read from disk rather than from the plan. The dev owns the
|
|
189
|
+
* content, so recording what is actually there is the only honest answer; recording the
|
|
190
|
+
* plan's hash would make the manifest disagree with the tree from the moment it is
|
|
191
|
+
* written.
|
|
192
|
+
*/
|
|
193
|
+
function nextManifest(input) {
|
|
194
|
+
const records = [];
|
|
195
|
+
for (const file of sortByPath(input.plan.files)) {
|
|
196
|
+
if (input.prunedPaths.has(file.path))
|
|
197
|
+
continue;
|
|
198
|
+
const previous = manifestRecordFor(input.previous, file.path);
|
|
199
|
+
if (file.owner === 'business') {
|
|
200
|
+
const onDisk = input.sink.read(file.path);
|
|
201
|
+
records.push(previous !== undefined
|
|
202
|
+
? previous
|
|
203
|
+
: {
|
|
204
|
+
path: file.path,
|
|
205
|
+
owner: 'business',
|
|
206
|
+
sha256: sha256Hex(onDisk ?? file.content),
|
|
207
|
+
generator: input.provenance.generator,
|
|
208
|
+
generatorVersion: input.provenance.generatorVersion,
|
|
209
|
+
});
|
|
210
|
+
continue;
|
|
211
|
+
}
|
|
212
|
+
if (input.driftedPaths.has(file.path) && !input.force) {
|
|
213
|
+
if (previous !== undefined)
|
|
214
|
+
records.push(previous);
|
|
215
|
+
continue;
|
|
216
|
+
}
|
|
217
|
+
records.push({
|
|
218
|
+
path: file.path,
|
|
219
|
+
owner: 'generated',
|
|
220
|
+
sha256: sha256Hex(file.content),
|
|
221
|
+
generator: input.provenance.generator,
|
|
222
|
+
generatorVersion: input.provenance.generatorVersion,
|
|
223
|
+
});
|
|
224
|
+
}
|
|
225
|
+
return {
|
|
226
|
+
manifestVersion: AID_MANIFEST_VERSION,
|
|
227
|
+
generatedBy: input.provenance,
|
|
228
|
+
files: sortByPath(records),
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Drift check without writing anything: the shape a CI gate or `aid gen --check` wants.
|
|
233
|
+
* `regenerate` reports the same diagnostics; this exists so a caller cannot accidentally
|
|
234
|
+
* write while only trying to verify.
|
|
235
|
+
*/
|
|
236
|
+
export function checkDrift(plan, options) {
|
|
237
|
+
return planRegeneration(plan, options).diagnostics;
|
|
238
|
+
}
|
|
239
|
+
/** Human-readable one-line summary of what a run did, in reporting order. */
|
|
240
|
+
export function formatRegenerationSummary(report) {
|
|
241
|
+
const parts = [
|
|
242
|
+
`${report.created.length} created`,
|
|
243
|
+
`${report.updated.length} updated`,
|
|
244
|
+
`${report.unchanged.length} unchanged`,
|
|
245
|
+
`${report.kept.length} kept`,
|
|
246
|
+
];
|
|
247
|
+
if (report.drifted.length > 0)
|
|
248
|
+
parts.push(`${report.drifted.length} conflicts`);
|
|
249
|
+
if (report.stale.length > 0)
|
|
250
|
+
parts.push(`${report.stale.length} stale`);
|
|
251
|
+
return parts.join(', ');
|
|
252
|
+
}
|
|
253
|
+
export function hasDrift(report) {
|
|
254
|
+
return report.drifted.length > 0;
|
|
255
|
+
}
|
|
256
|
+
export function generatedFiles(files) {
|
|
257
|
+
return sortByPath(files.filter((file) => file.owner === 'generated'));
|
|
258
|
+
}
|
|
259
|
+
//# sourceMappingURL=drift.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drift.js","sourceRoot":"","sources":["../src/drift.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `@aid-framework/generator-sdk` — the generator plugin contract, the `generated/` vs `business/`
|
|
3
|
+
* ownership model with its drift algorithm, and the determinism primitives that make
|
|
4
|
+
* regeneration reproducible.
|
|
5
|
+
*
|
|
6
|
+
* Layering is one-directional: `spec ← ir ← generator-sdk ← generators ← cli`. This
|
|
7
|
+
* package may import `@aid-framework/ir` and `@aid-framework/spec`, and neither of them may import this.
|
|
8
|
+
* That is why a generator's capability declarations travel as data (see `targets.ts`
|
|
9
|
+
* and `targetCapabilityDeclarations`) instead of the IR gate reaching in here.
|
|
10
|
+
*/
|
|
11
|
+
export type { AidManifest, AidManifestFile, AidManifestParseResult, AidManifestProvenance, Sha256Hex, } from './aid-manifest.js';
|
|
12
|
+
export { AID_MANIFEST_VERSION, emptyAidManifest, manifestFor, manifestRecordFor, parseAidManifest, parseAidManifestJson, serializeAidManifest, } from './aid-manifest.js';
|
|
13
|
+
export type { BannerOptions, DeterminismPattern, DeterminismViolation } from './determinism.js';
|
|
14
|
+
export { checkDeterminism, compareIds, DETERMINISM_PATTERNS, ensureTrailingNewline, GENERATED_BANNER_MARKER, generatedBanner, normalizeNewlines, normalizeText, scanForNonDeterminism, sha256Hex, sortById, sortByPath, stableId, stableSortBy, } from './determinism.js';
|
|
15
|
+
export type { GeneratorDiagnostic, GeneratorDiagnosticCode } from './diagnostics.js';
|
|
16
|
+
export { GENERATOR_DIAGNOSTIC_CODES, generatorError, generatorWarning, withFile, } from './diagnostics.js';
|
|
17
|
+
export type { DriftedFile, RegenerationAction, RegenerationOptions, RegenerationReport, RegenerationResult, RegenerationSink, } from './drift.js';
|
|
18
|
+
export { checkDrift, formatRegenerationSummary, generatedFiles, hasDrift, planRegeneration, regenerate, staleGeneratedFiles, } from './drift.js';
|
|
19
|
+
export type { EmitsAgainst, GeneratorManifest, GeneratorManifestInput, GeneratorOutput, ManifestParseResult, Orchestration, StructuredOutput, TracingBackend, } from './manifest.js';
|
|
20
|
+
export { checkIRSupport, GENERATOR_MANIFEST_VERSION, managedRoots, ORCHESTRATIONS, parseManifest, parseManifestJson, STRUCTURED_OUTPUTS, supportsIR, TRACING_BACKENDS, targetCapabilityDeclarations, validateGeneratorSet, validateManifest, } from './manifest.js';
|
|
21
|
+
export { createMemorySink, createNodeSink } from './node-sink.js';
|
|
22
|
+
export type { FileOwner } from './ownership.js';
|
|
23
|
+
export { DEFAULT_BUSINESS_DIR, DEFAULT_GENERATED_DIR, DEFAULT_MANIFEST_FILENAME, escapesRoot, isAbsolutePath, isBusinessPath, isGeneratedPath, isRelativePath, isReservedPath, normalizeRelativePath, ownerForPath, REJECTION_SUFFIX, rejectionPath, } from './ownership.js';
|
|
24
|
+
export type { GeneratedFile, Generator, GeneratorContext, Plan, PlanValidationOptions, } from './plan.js';
|
|
25
|
+
export { isRecord, validatePlan } from './plan.js';
|
|
26
|
+
export type { Version } from './semver.js';
|
|
27
|
+
export { compareVersions, formatVersion, isValidRange, isValidVersion, parseRange, parseVersion, satisfies, } from './semver.js';
|
|
28
|
+
export { PY_FASTAPI_MANIFEST, PY_FASTAPI_MANIFEST_INPUT, PY_FASTAPI_TARGET, phase0Generators, phase0TargetCapabilities, } from './targets.js';
|
|
29
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,YAAY,EACV,WAAW,EACX,eAAe,EACf,sBAAsB,EACtB,qBAAqB,EACrB,SAAS,GACV,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,oBAAoB,EACpB,gBAAgB,EAChB,WAAW,EACX,iBAAiB,EACjB,gBAAgB,EAChB,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EAAE,aAAa,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAChG,OAAO,EACL,gBAAgB,EAChB,UAAU,EACV,oBAAoB,EACpB,qBAAqB,EACrB,uBAAuB,EACvB,eAAe,EACf,iBAAiB,EACjB,aAAa,EACb,qBAAqB,EACrB,SAAS,EACT,QAAQ,EACR,UAAU,EACV,QAAQ,EACR,YAAY,GACb,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AACrF,OAAO,EACL,0BAA0B,EAC1B,cAAc,EACd,gBAAgB,EAChB,QAAQ,GACT,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EACV,WAAW,EACX,kBAAkB,EAClB,mBAAmB,EACnB,kBAAkB,EAClB,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,UAAU,EACV,yBAAyB,EACzB,cAAc,EACd,QAAQ,EACR,gBAAgB,EAChB,UAAU,EACV,mBAAmB,GACpB,MAAM,YAAY,CAAC;AACpB,YAAY,EACV,YAAY,EACZ,iBAAiB,EACjB,sBAAsB,EACtB,eAAe,EACf,mBAAmB,EACnB,aAAa,EACb,gBAAgB,EAChB,cAAc,GACf,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,cAAc,EACd,0BAA0B,EAC1B,YAAY,EACZ,cAAc,EACd,aAAa,EACb,iBAAiB,EACjB,kBAAkB,EAClB,UAAU,EACV,gBAAgB,EAChB,4BAA4B,EAC5B,oBAAoB,EACpB,gBAAgB,GACjB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAClE,YAAY,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EACL,oBAAoB,EACpB,qBAAqB,EACrB,yBAAyB,EACzB,WAAW,EACX,cAAc,EACd,cAAc,EACd,eAAe,EACf,cAAc,EACd,cAAc,EACd,qBAAqB,EACrB,YAAY,EACZ,gBAAgB,EAChB,aAAa,GACd,MAAM,gBAAgB,CAAC;AACxB,YAAY,EACV,aAAa,EACb,SAAS,EACT,gBAAgB,EAChB,IAAI,EACJ,qBAAqB,GACtB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACnD,YAAY,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EACL,eAAe,EACf,aAAa,EACb,YAAY,EACZ,cAAc,EACd,UAAU,EACV,YAAY,EACZ,SAAS,GACV,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,mBAAmB,EACnB,yBAAyB,EACzB,iBAAiB,EACjB,gBAAgB,EAChB,wBAAwB,GACzB,MAAM,cAAc,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `@aid-framework/generator-sdk` — the generator plugin contract, the `generated/` vs `business/`
|
|
3
|
+
* ownership model with its drift algorithm, and the determinism primitives that make
|
|
4
|
+
* regeneration reproducible.
|
|
5
|
+
*
|
|
6
|
+
* Layering is one-directional: `spec ← ir ← generator-sdk ← generators ← cli`. This
|
|
7
|
+
* package may import `@aid-framework/ir` and `@aid-framework/spec`, and neither of them may import this.
|
|
8
|
+
* That is why a generator's capability declarations travel as data (see `targets.ts`
|
|
9
|
+
* and `targetCapabilityDeclarations`) instead of the IR gate reaching in here.
|
|
10
|
+
*/
|
|
11
|
+
export { AID_MANIFEST_VERSION, emptyAidManifest, manifestFor, manifestRecordFor, parseAidManifest, parseAidManifestJson, serializeAidManifest, } from './aid-manifest.js';
|
|
12
|
+
export { checkDeterminism, compareIds, DETERMINISM_PATTERNS, ensureTrailingNewline, GENERATED_BANNER_MARKER, generatedBanner, normalizeNewlines, normalizeText, scanForNonDeterminism, sha256Hex, sortById, sortByPath, stableId, stableSortBy, } from './determinism.js';
|
|
13
|
+
export { GENERATOR_DIAGNOSTIC_CODES, generatorError, generatorWarning, withFile, } from './diagnostics.js';
|
|
14
|
+
export { checkDrift, formatRegenerationSummary, generatedFiles, hasDrift, planRegeneration, regenerate, staleGeneratedFiles, } from './drift.js';
|
|
15
|
+
export { checkIRSupport, GENERATOR_MANIFEST_VERSION, managedRoots, ORCHESTRATIONS, parseManifest, parseManifestJson, STRUCTURED_OUTPUTS, supportsIR, TRACING_BACKENDS, targetCapabilityDeclarations, validateGeneratorSet, validateManifest, } from './manifest.js';
|
|
16
|
+
export { createMemorySink, createNodeSink } from './node-sink.js';
|
|
17
|
+
export { DEFAULT_BUSINESS_DIR, DEFAULT_GENERATED_DIR, DEFAULT_MANIFEST_FILENAME, escapesRoot, isAbsolutePath, isBusinessPath, isGeneratedPath, isRelativePath, isReservedPath, normalizeRelativePath, ownerForPath, REJECTION_SUFFIX, rejectionPath, } from './ownership.js';
|
|
18
|
+
export { isRecord, validatePlan } from './plan.js';
|
|
19
|
+
export { compareVersions, formatVersion, isValidRange, isValidVersion, parseRange, parseVersion, satisfies, } from './semver.js';
|
|
20
|
+
export { PY_FASTAPI_MANIFEST, PY_FASTAPI_MANIFEST_INPUT, PY_FASTAPI_TARGET, phase0Generators, phase0TargetCapabilities, } from './targets.js';
|
|
21
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AASH,OAAO,EACL,oBAAoB,EACpB,gBAAgB,EAChB,WAAW,EACX,iBAAiB,EACjB,gBAAgB,EAChB,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,gBAAgB,EAChB,UAAU,EACV,oBAAoB,EACpB,qBAAqB,EACrB,uBAAuB,EACvB,eAAe,EACf,iBAAiB,EACjB,aAAa,EACb,qBAAqB,EACrB,SAAS,EACT,QAAQ,EACR,UAAU,EACV,QAAQ,EACR,YAAY,GACb,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,0BAA0B,EAC1B,cAAc,EACd,gBAAgB,EAChB,QAAQ,GACT,MAAM,kBAAkB,CAAC;AAS1B,OAAO,EACL,UAAU,EACV,yBAAyB,EACzB,cAAc,EACd,QAAQ,EACR,gBAAgB,EAChB,UAAU,EACV,mBAAmB,GACpB,MAAM,YAAY,CAAC;AAWpB,OAAO,EACL,cAAc,EACd,0BAA0B,EAC1B,YAAY,EACZ,cAAc,EACd,aAAa,EACb,iBAAiB,EACjB,kBAAkB,EAClB,UAAU,EACV,gBAAgB,EAChB,4BAA4B,EAC5B,oBAAoB,EACpB,gBAAgB,GACjB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAElE,OAAO,EACL,oBAAoB,EACpB,qBAAqB,EACrB,yBAAyB,EACzB,WAAW,EACX,cAAc,EACd,cAAc,EACd,eAAe,EACf,cAAc,EACd,cAAc,EACd,qBAAqB,EACrB,YAAY,EACZ,gBAAgB,EAChB,aAAa,GACd,MAAM,gBAAgB,CAAC;AAQxB,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAEnD,OAAO,EACL,eAAe,EACf,aAAa,EACb,YAAY,EACZ,cAAc,EACd,UAAU,EACV,YAAY,EACZ,SAAS,GACV,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,mBAAmB,EACnB,yBAAyB,EACzB,iBAAiB,EACjB,gBAAgB,EAChB,wBAAwB,GACzB,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The generator plugin manifest (§8.1) and its validation.
|
|
3
|
+
*
|
|
4
|
+
* A manifest is the complete contract between a target generator and everything
|
|
5
|
+
* that consumes it: which target id it serves, which IR versions it can compile,
|
|
6
|
+
* which capabilities the code it emits actually *has*, and what runtime
|
|
7
|
+
* technology that code is built against. That last field, `emitsAgainst`, is the
|
|
8
|
+
* one that makes composition honest — a target that emits Pydantic models and an
|
|
9
|
+
* OpenTelemetry tracer is not interchangeable with one that emits Zod and
|
|
10
|
+
* Langfuse, and nothing else in the IR records that.
|
|
11
|
+
*
|
|
12
|
+
* Validation is total: an unknown key is an error, capabilities are resolved
|
|
13
|
+
* through the IR's alias table before being stored, and `irRange` is a real range
|
|
14
|
+
* so "does this generator support the IR it was handed" is answered by
|
|
15
|
+
* {@link checkIRSupport} instead of at codegen time.
|
|
16
|
+
*/
|
|
17
|
+
import { type RequiredCapability } from '@aid-framework/ir';
|
|
18
|
+
import { type GeneratorDiagnostic } from './diagnostics.js';
|
|
19
|
+
import type { PlanValidationOptions } from './plan.js';
|
|
20
|
+
/** Current on-disk manifest format. Bumped only for a breaking reshape. */
|
|
21
|
+
export declare const GENERATOR_MANIFEST_VERSION = 1;
|
|
22
|
+
/** §8.1: what the emitted code is built against. Closed vocabularies, one value each. */
|
|
23
|
+
export declare const ORCHESTRATIONS: readonly ['langgraph', 'llamaindex', 'dspy', 'vercel-ai', 'semantic-kernel'];
|
|
24
|
+
export type Orchestration = (typeof ORCHESTRATIONS)[number];
|
|
25
|
+
export declare const STRUCTURED_OUTPUTS: readonly ['pydantic', 'instructor', 'zod'];
|
|
26
|
+
export type StructuredOutput = (typeof STRUCTURED_OUTPUTS)[number];
|
|
27
|
+
export declare const TRACING_BACKENDS: readonly ['otel-genai', 'langfuse', 'langsmith'];
|
|
28
|
+
export type TracingBackend = (typeof TRACING_BACKENDS)[number];
|
|
29
|
+
export interface EmitsAgainst {
|
|
30
|
+
/**
|
|
31
|
+
* Absent means the emitted code has no orchestration framework, which is the
|
|
32
|
+
* Phase 0 default: control flow is plain async and orchestration is deferred.
|
|
33
|
+
*/
|
|
34
|
+
orchestration?: Orchestration;
|
|
35
|
+
structuredOutput?: StructuredOutput;
|
|
36
|
+
tracing?: TracingBackend;
|
|
37
|
+
}
|
|
38
|
+
export interface GeneratorOutput {
|
|
39
|
+
/** Repo-relative app root, e.g. `app`. */
|
|
40
|
+
root: string;
|
|
41
|
+
/** Generator-owned directory, relative to `root`. */
|
|
42
|
+
generatedDir?: string;
|
|
43
|
+
/** Developer-owned directory, relative to `root`. */
|
|
44
|
+
businessDir?: string;
|
|
45
|
+
}
|
|
46
|
+
/** The shape as authored. Everything optional is filled in by {@link parseManifest}. */
|
|
47
|
+
export interface GeneratorManifestInput {
|
|
48
|
+
manifestVersion?: number;
|
|
49
|
+
name: string;
|
|
50
|
+
target: string;
|
|
51
|
+
version: string;
|
|
52
|
+
irRange: string;
|
|
53
|
+
capabilities: readonly string[];
|
|
54
|
+
emitsAgainst?: EmitsAgainst;
|
|
55
|
+
output: GeneratorOutput;
|
|
56
|
+
optionsSchema?: unknown;
|
|
57
|
+
}
|
|
58
|
+
/** The validated manifest, with aliases resolved and defaults applied. */
|
|
59
|
+
export interface GeneratorManifest {
|
|
60
|
+
manifestVersion: number;
|
|
61
|
+
name: string;
|
|
62
|
+
target: string;
|
|
63
|
+
version: string;
|
|
64
|
+
irRange: string;
|
|
65
|
+
/** Resolved through `TARGET_CAPABILITY_ALIASES`, deduplicated, in canonical order. */
|
|
66
|
+
capabilities: readonly RequiredCapability[];
|
|
67
|
+
emitsAgainst: EmitsAgainst;
|
|
68
|
+
output: {
|
|
69
|
+
root: string;
|
|
70
|
+
generatedDir: string;
|
|
71
|
+
businessDir: string;
|
|
72
|
+
};
|
|
73
|
+
optionsSchema?: unknown;
|
|
74
|
+
}
|
|
75
|
+
export interface ManifestParseResult {
|
|
76
|
+
/** Present only when parsing produced no error-severity diagnostic. */
|
|
77
|
+
manifest?: GeneratorManifest;
|
|
78
|
+
diagnostics: GeneratorDiagnostic[];
|
|
79
|
+
}
|
|
80
|
+
/** Parses and validates an authored manifest value. Never throws. */
|
|
81
|
+
export declare function parseManifest(value: unknown): ManifestParseResult;
|
|
82
|
+
export declare function validateManifest(value: unknown): GeneratorDiagnostic[];
|
|
83
|
+
export declare function parseManifestJson(text: string): ManifestParseResult;
|
|
84
|
+
/**
|
|
85
|
+
* The repo-relative prefixes the plan validator needs. `output.root` is repo-relative,
|
|
86
|
+
* and the managed directories are relative to it, so this is the single place that
|
|
87
|
+
* turns a manifest's output layout into the two roots ownership is decided from.
|
|
88
|
+
*/
|
|
89
|
+
export declare function managedRoots(manifest: GeneratorManifest): Required<PlanValidationOptions>;
|
|
90
|
+
export declare function supportsIR(manifest: GeneratorManifest, irVersion?: string): boolean;
|
|
91
|
+
/** Reports the manifest's `irRange` against the IR version it will actually be given. */
|
|
92
|
+
export declare function checkIRSupport(manifest: GeneratorManifest, irVersion?: string): GeneratorDiagnostic[];
|
|
93
|
+
/**
|
|
94
|
+
* Generator ids and target ids must each be unique across the set a build loads;
|
|
95
|
+
* two generators claiming one target is a silent last-wins otherwise.
|
|
96
|
+
*/
|
|
97
|
+
export declare function validateGeneratorSet(manifests: readonly GeneratorManifest[]): GeneratorDiagnostic[];
|
|
98
|
+
/** The capability declarations a set of manifests contributes, in the IR gate's shape. */
|
|
99
|
+
export declare function targetCapabilityDeclarations(manifests: readonly GeneratorManifest[]): Record<string, readonly string[]>;
|
|
100
|
+
//# sourceMappingURL=manifest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"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"}
|