@davidahmann/mill 0.1.4

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 (184) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +335 -0
  3. package/dist/audit/repository.d.ts +8 -0
  4. package/dist/audit/repository.d.ts.map +1 -0
  5. package/dist/audit/repository.js +232 -0
  6. package/dist/audit/repository.js.map +1 -0
  7. package/dist/cli-program.d.ts +12 -0
  8. package/dist/cli-program.d.ts.map +1 -0
  9. package/dist/cli-program.js +1020 -0
  10. package/dist/cli-program.js.map +1 -0
  11. package/dist/cli.d.ts +3 -0
  12. package/dist/cli.d.ts.map +1 -0
  13. package/dist/cli.js +7 -0
  14. package/dist/cli.js.map +1 -0
  15. package/dist/config/lock.d.ts +12 -0
  16. package/dist/config/lock.d.ts.map +1 -0
  17. package/dist/config/lock.js +83 -0
  18. package/dist/config/lock.js.map +1 -0
  19. package/dist/contracts/canonical.d.ts +7 -0
  20. package/dist/contracts/canonical.d.ts.map +1 -0
  21. package/dist/contracts/canonical.js +30 -0
  22. package/dist/contracts/canonical.js.map +1 -0
  23. package/dist/contracts/schemas.d.ts +2705 -0
  24. package/dist/contracts/schemas.d.ts.map +1 -0
  25. package/dist/contracts/schemas.js +988 -0
  26. package/dist/contracts/schemas.js.map +1 -0
  27. package/dist/doctor.d.ts +21 -0
  28. package/dist/doctor.d.ts.map +1 -0
  29. package/dist/doctor.js +138 -0
  30. package/dist/doctor.js.map +1 -0
  31. package/dist/errors.d.ts +18 -0
  32. package/dist/errors.d.ts.map +1 -0
  33. package/dist/errors.js +31 -0
  34. package/dist/errors.js.map +1 -0
  35. package/dist/index.d.ts +20 -0
  36. package/dist/index.d.ts.map +1 -0
  37. package/dist/index.js +20 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/intake/prd.d.ts +14 -0
  40. package/dist/intake/prd.d.ts.map +1 -0
  41. package/dist/intake/prd.js +39 -0
  42. package/dist/intake/prd.js.map +1 -0
  43. package/dist/planning/impact.d.ts +59 -0
  44. package/dist/planning/impact.d.ts.map +1 -0
  45. package/dist/planning/impact.js +400 -0
  46. package/dist/planning/impact.js.map +1 -0
  47. package/dist/planning/specification.d.ts +42 -0
  48. package/dist/planning/specification.d.ts.map +1 -0
  49. package/dist/planning/specification.js +235 -0
  50. package/dist/planning/specification.js.map +1 -0
  51. package/dist/qualification/public-alpha.d.ts +16 -0
  52. package/dist/qualification/public-alpha.d.ts.map +1 -0
  53. package/dist/qualification/public-alpha.js +128 -0
  54. package/dist/qualification/public-alpha.js.map +1 -0
  55. package/dist/recipes/node-typescript-next-web.d.ts +19 -0
  56. package/dist/recipes/node-typescript-next-web.d.ts.map +1 -0
  57. package/dist/recipes/node-typescript-next-web.js +136 -0
  58. package/dist/recipes/node-typescript-next-web.js.map +1 -0
  59. package/dist/repository/integration.d.ts +58 -0
  60. package/dist/repository/integration.d.ts.map +1 -0
  61. package/dist/repository/integration.js +1385 -0
  62. package/dist/repository/integration.js.map +1 -0
  63. package/dist/repository/scan.d.ts +27 -0
  64. package/dist/repository/scan.d.ts.map +1 -0
  65. package/dist/repository/scan.js +388 -0
  66. package/dist/repository/scan.js.map +1 -0
  67. package/dist/result.d.ts +23 -0
  68. package/dist/result.d.ts.map +1 -0
  69. package/dist/result.js +24 -0
  70. package/dist/result.js.map +1 -0
  71. package/dist/runtime/codex.d.ts +28 -0
  72. package/dist/runtime/codex.d.ts.map +1 -0
  73. package/dist/runtime/codex.js +439 -0
  74. package/dist/runtime/codex.js.map +1 -0
  75. package/dist/runtime/context.d.ts +10 -0
  76. package/dist/runtime/context.d.ts.map +1 -0
  77. package/dist/runtime/context.js +151 -0
  78. package/dist/runtime/context.js.map +1 -0
  79. package/dist/runtime/delivery.d.ts +58 -0
  80. package/dist/runtime/delivery.d.ts.map +1 -0
  81. package/dist/runtime/delivery.js +1073 -0
  82. package/dist/runtime/delivery.js.map +1 -0
  83. package/dist/runtime/dependencies.d.ts +19 -0
  84. package/dist/runtime/dependencies.d.ts.map +1 -0
  85. package/dist/runtime/dependencies.js +495 -0
  86. package/dist/runtime/dependencies.js.map +1 -0
  87. package/dist/runtime/github.d.ts +112 -0
  88. package/dist/runtime/github.d.ts.map +1 -0
  89. package/dist/runtime/github.js +510 -0
  90. package/dist/runtime/github.js.map +1 -0
  91. package/dist/runtime/inputs.d.ts +24 -0
  92. package/dist/runtime/inputs.d.ts.map +1 -0
  93. package/dist/runtime/inputs.js +237 -0
  94. package/dist/runtime/inputs.js.map +1 -0
  95. package/dist/runtime/lease.d.ts +11 -0
  96. package/dist/runtime/lease.d.ts.map +1 -0
  97. package/dist/runtime/lease.js +52 -0
  98. package/dist/runtime/lease.js.map +1 -0
  99. package/dist/runtime/lifecycle.d.ts +87 -0
  100. package/dist/runtime/lifecycle.d.ts.map +1 -0
  101. package/dist/runtime/lifecycle.js +1024 -0
  102. package/dist/runtime/lifecycle.js.map +1 -0
  103. package/dist/runtime/process.d.ts +39 -0
  104. package/dist/runtime/process.d.ts.map +1 -0
  105. package/dist/runtime/process.js +304 -0
  106. package/dist/runtime/process.js.map +1 -0
  107. package/dist/runtime/repository.d.ts +36 -0
  108. package/dist/runtime/repository.d.ts.map +1 -0
  109. package/dist/runtime/repository.js +458 -0
  110. package/dist/runtime/repository.js.map +1 -0
  111. package/dist/runtime/state.d.ts +121 -0
  112. package/dist/runtime/state.d.ts.map +1 -0
  113. package/dist/runtime/state.js +1017 -0
  114. package/dist/runtime/state.js.map +1 -0
  115. package/dist/runtime/verifier.d.ts +31 -0
  116. package/dist/runtime/verifier.d.ts.map +1 -0
  117. package/dist/runtime/verifier.js +478 -0
  118. package/dist/runtime/verifier.js.map +1 -0
  119. package/dist/runtime/worker.d.ts +67 -0
  120. package/dist/runtime/worker.d.ts.map +1 -0
  121. package/dist/runtime/worker.js +34 -0
  122. package/dist/runtime/worker.js.map +1 -0
  123. package/dist/security/safe-path.d.ts +3 -0
  124. package/dist/security/safe-path.d.ts.map +1 -0
  125. package/dist/security/safe-path.js +102 -0
  126. package/dist/security/safe-path.js.map +1 -0
  127. package/dist/version.d.ts +4 -0
  128. package/dist/version.d.ts.map +1 -0
  129. package/dist/version.js +4 -0
  130. package/dist/version.js.map +1 -0
  131. package/dist/workflows/founder.d.ts +33 -0
  132. package/dist/workflows/founder.d.ts.map +1 -0
  133. package/dist/workflows/founder.js +422 -0
  134. package/dist/workflows/founder.js.map +1 -0
  135. package/package.json +79 -0
  136. package/recipes/node-typescript-next-web/.github/workflows/ci.yml +34 -0
  137. package/recipes/node-typescript-next-web/.node-version +1 -0
  138. package/recipes/node-typescript-next-web/.tool-versions +1 -0
  139. package/recipes/node-typescript-next-web/AGENTS.md +44 -0
  140. package/recipes/node-typescript-next-web/README.md +16 -0
  141. package/recipes/node-typescript-next-web/WORKFLOW.md +6 -0
  142. package/recipes/node-typescript-next-web/app/api/health/route.ts +5 -0
  143. package/recipes/node-typescript-next-web/app/layout.tsx +19 -0
  144. package/recipes/node-typescript-next-web/app/page.tsx +12 -0
  145. package/recipes/node-typescript-next-web/app/styles.css +21 -0
  146. package/recipes/node-typescript-next-web/docs/development.md +16 -0
  147. package/recipes/node-typescript-next-web/eslint.config.mjs +9 -0
  148. package/recipes/node-typescript-next-web/gitignore.template +5 -0
  149. package/recipes/node-typescript-next-web/next-env.d.ts +7 -0
  150. package/recipes/node-typescript-next-web/next.config.ts +11 -0
  151. package/recipes/node-typescript-next-web/package-lock.json +7540 -0
  152. package/recipes/node-typescript-next-web/package.json +39 -0
  153. package/recipes/node-typescript-next-web/playwright.config.ts +23 -0
  154. package/recipes/node-typescript-next-web/recipe.yaml +71 -0
  155. package/recipes/node-typescript-next-web/scripts/check-package.mjs +3 -0
  156. package/recipes/node-typescript-next-web/src/health.ts +3 -0
  157. package/recipes/node-typescript-next-web/test/browser/home.spec.ts +14 -0
  158. package/recipes/node-typescript-next-web/test/integration/health-route.test.ts +11 -0
  159. package/recipes/node-typescript-next-web/test/unit/health.test.ts +9 -0
  160. package/recipes/node-typescript-next-web/tsconfig.json +33 -0
  161. package/schemas/README.md +64 -0
  162. package/schemas/audit-report.schema.json +59 -0
  163. package/schemas/blueprint.schema.json +34 -0
  164. package/schemas/context-manifest.schema.json +88 -0
  165. package/schemas/delivery-record.schema.json +266 -0
  166. package/schemas/impact-manifest.schema.json +146 -0
  167. package/schemas/managed-repository.schema.json +36 -0
  168. package/schemas/mill-config.schema.json +212 -0
  169. package/schemas/mill-lock.schema.json +96 -0
  170. package/schemas/outcome-plan.schema.json +51 -0
  171. package/schemas/product-contract.schema.json +181 -0
  172. package/schemas/public-alpha-qualification.schema.json +391 -0
  173. package/schemas/recipe-manifest.schema.json +187 -0
  174. package/schemas/release-evidence.schema.json +170 -0
  175. package/schemas/repository-integration-plan.schema.json +156 -0
  176. package/schemas/review-result.schema.json +57 -0
  177. package/schemas/scenario-set.schema.json +84 -0
  178. package/schemas/source-manifest.schema.json +96 -0
  179. package/schemas/specification-proposal.schema.json +406 -0
  180. package/schemas/support-tuple.schema.json +107 -0
  181. package/schemas/task-packet.schema.json +395 -0
  182. package/schemas/validation-evidence.schema.json +125 -0
  183. package/schemas/worker-invocation.schema.json +119 -0
  184. package/schemas/worker-profile.schema.json +53 -0
@@ -0,0 +1,235 @@
1
+ import path from "node:path";
2
+ import { parse as parseYaml } from "yaml";
3
+ import { sourceManifestSchema, specificationProposalSchema, } from "../contracts/schemas.js";
4
+ import { canonicalDigest, canonicalJson, } from "../contracts/canonical.js";
5
+ import { ExitCode, MillError } from "../errors.js";
6
+ import { safeReadText } from "../security/safe-path.js";
7
+ import { textDigest } from "../runtime/inputs.js";
8
+ function parseDocument(source, extension, schema, label) {
9
+ let raw;
10
+ try {
11
+ raw = extension === ".json" ? JSON.parse(source) : parseYaml(source);
12
+ }
13
+ catch (error) {
14
+ throw new MillError("INVALID_PLANNING_INPUT", `${label} is not valid YAML or JSON.`, ExitCode.data, { cause: String(error) });
15
+ }
16
+ const parsed = schema.safeParse(raw);
17
+ if (!parsed.success) {
18
+ throw new MillError("INVALID_PLANNING_INPUT", `${label} does not satisfy its schema.`, ExitCode.data, { issues: parsed.error.issues });
19
+ }
20
+ return parsed.data;
21
+ }
22
+ export async function loadPlanningSources(input) {
23
+ const [prd, source] = await Promise.all([
24
+ safeReadText(input.root, input.prdPath, 2 * 1024 * 1024),
25
+ safeReadText(input.root, input.sourceManifestPath, 2 * 1024 * 1024),
26
+ ]);
27
+ const sourceManifest = parseDocument(source, path.extname(input.sourceManifestPath).toLowerCase(), sourceManifestSchema, input.sourceManifestPath);
28
+ return {
29
+ prdPath: input.prdPath,
30
+ prd,
31
+ prdDigest: textDigest(prd),
32
+ sourceManifest,
33
+ sourceManifestDigest: canonicalDigest(sourceManifest),
34
+ };
35
+ }
36
+ export async function loadSpecificationProposal(root, proposalPath) {
37
+ const source = await safeReadText(root, proposalPath, 4 * 1024 * 1024);
38
+ return parseDocument(source, path.extname(proposalPath).toLowerCase(), specificationProposalSchema, proposalPath);
39
+ }
40
+ function duplicates(values) {
41
+ const seen = new Set();
42
+ const duplicate = new Set();
43
+ for (const value of values) {
44
+ if (seen.has(value))
45
+ duplicate.add(value);
46
+ seen.add(value);
47
+ }
48
+ return [...duplicate].sort();
49
+ }
50
+ function normalizedStatement(value) {
51
+ return value
52
+ .normalize("NFKC")
53
+ .toLowerCase()
54
+ .replaceAll(/[^a-z0-9]+/gu, " ")
55
+ .trim();
56
+ }
57
+ export function assessSpecificationProposal(input) {
58
+ const { proposal, sourceManifest } = input;
59
+ const blockers = [];
60
+ const warnings = [];
61
+ const sourceIds = new Set(sourceManifest.sources.map((source) => source.id));
62
+ const invariantIds = new Set(proposal.productContract.invariants.map((invariant) => invariant.id));
63
+ const acceptanceIds = new Set(proposal.productContract.acceptance.map((item) => item.id));
64
+ if (proposal.prd.path !== input.prdPath ||
65
+ proposal.prd.digest !== input.prdDigest) {
66
+ blockers.push("proposal PRD identity does not match the inspected input");
67
+ }
68
+ if (proposal.sourceManifestDigest !== input.sourceManifestDigest) {
69
+ blockers.push("proposal source-manifest identity is stale");
70
+ }
71
+ const normalizedPrdPath = path
72
+ .normalize(input.prdPath)
73
+ .split(path.sep)
74
+ .join("/");
75
+ const prdSources = sourceManifest.sources.filter((source) => {
76
+ const normalizedSourcePath = path
77
+ .normalize(source.uri)
78
+ .split(path.sep)
79
+ .join("/");
80
+ return (normalizedSourcePath === normalizedPrdPath &&
81
+ (source.revision === input.prdDigest || source.digest === input.prdDigest));
82
+ });
83
+ if (prdSources.length !== 1) {
84
+ blockers.push("exactly one source must bind the inspected PRD identity");
85
+ }
86
+ const prdSource = prdSources[0];
87
+ if (prdSources.length === 1 &&
88
+ prdSource !== undefined &&
89
+ !proposal.productContract.sourceRefs.includes(prdSource.id)) {
90
+ blockers.push(`product contract does not bind the inspected PRD source: ${prdSource.id}`);
91
+ }
92
+ for (const duplicate of duplicates(sourceManifest.sources.map((source) => source.id))) {
93
+ blockers.push(`source identity is duplicated: ${duplicate}`);
94
+ }
95
+ if (proposal.productContract.acceptance.length === 0) {
96
+ blockers.push("product contract has no stable acceptance items");
97
+ }
98
+ if (proposal.productContract.invariants.length === 0) {
99
+ blockers.push("product contract has no stable behavioral invariants");
100
+ }
101
+ for (const outcome of proposal.productContract.outcomes) {
102
+ for (const acceptanceRef of outcome.acceptanceIds ?? []) {
103
+ if (!acceptanceIds.has(acceptanceRef)) {
104
+ blockers.push(`outcome acceptance reference is unresolved: ${outcome.id}/${acceptanceRef}`);
105
+ }
106
+ }
107
+ }
108
+ for (const duplicate of duplicates([
109
+ ...proposal.productContract.outcomes.map((item) => item.id),
110
+ ...proposal.productContract.acceptance.map((item) => item.id),
111
+ ...proposal.productContract.invariants.map((item) => item.id),
112
+ ...proposal.productContract.decisions.map((item) => item.id),
113
+ ...proposal.scenarioSet.scenarios.map((item) => item.id),
114
+ ])) {
115
+ blockers.push(`stable ID is reused: ${duplicate}`);
116
+ }
117
+ for (const duplicate of duplicates(proposal.productContract.invariants.map((item) => normalizedStatement(item.statement)))) {
118
+ blockers.push(`invariant semantics are duplicated: ${duplicate}`);
119
+ }
120
+ const referencedSources = [
121
+ ...proposal.productContract.sourceRefs,
122
+ ...proposal.productContract.acceptance.flatMap((item) => item.sourceRefs),
123
+ ...proposal.productContract.invariants.flatMap((item) => item.sourceRefs),
124
+ ...proposal.productContract.decisions.flatMap((item) => item.sourceRefs),
125
+ ...proposal.assumptions.flatMap((item) => item.sourceRefs),
126
+ ...proposal.contradictions.flatMap((item) => item.sourceRefs),
127
+ ];
128
+ for (const sourceRef of new Set(referencedSources)) {
129
+ if (!sourceIds.has(sourceRef)) {
130
+ blockers.push(`source reference is unresolved: ${sourceRef}`);
131
+ }
132
+ }
133
+ for (const decision of proposal.productContract.decisions) {
134
+ if (decision.status !== "approved") {
135
+ blockers.push(`decision is not approved: ${decision.id}`);
136
+ }
137
+ }
138
+ for (const contradiction of proposal.contradictions) {
139
+ if (contradiction.blocking) {
140
+ blockers.push(`blocking contradiction remains: ${contradiction.id}`);
141
+ }
142
+ }
143
+ for (const question of proposal.questions) {
144
+ if (question.blocking)
145
+ blockers.push(`blocking question remains: ${question.id}`);
146
+ }
147
+ const productDigest = canonicalDigest(proposal.productContract);
148
+ for (const blueprint of proposal.blueprints) {
149
+ if (blueprint.productContractDigest !== productDigest) {
150
+ blockers.push(`blueprint is bound to another product contract: ${blueprint.id}`);
151
+ }
152
+ }
153
+ if (proposal.scenarioSet.productContractDigest !== productDigest) {
154
+ blockers.push("scenario set is bound to another product contract");
155
+ }
156
+ for (const scenario of proposal.scenarioSet.scenarios) {
157
+ for (const acceptanceRef of scenario.acceptanceRefs) {
158
+ if (!acceptanceIds.has(acceptanceRef)) {
159
+ blockers.push(`scenario ${scenario.id} has unresolved acceptance ${acceptanceRef}`);
160
+ }
161
+ }
162
+ for (const invariantRef of scenario.invariantRefs) {
163
+ if (!invariantIds.has(invariantRef)) {
164
+ blockers.push(`scenario ${scenario.id} has unresolved invariant ${invariantRef}`);
165
+ }
166
+ }
167
+ if (scenario.acceptanceRefs.length === 0) {
168
+ blockers.push(`scenario has no acceptance reference: ${scenario.id}`);
169
+ }
170
+ if (scenario.invariantRefs.length === 0) {
171
+ blockers.push(`scenario has no invariant reference: ${scenario.id}`);
172
+ }
173
+ }
174
+ for (const source of sourceManifest.sources) {
175
+ if (source.freshness !== "current") {
176
+ warnings.push(`source ${source.id} freshness is ${source.freshness}`);
177
+ }
178
+ }
179
+ return {
180
+ proposalDigest: canonicalDigest(proposal),
181
+ promotable: blockers.length === 0,
182
+ blockers: [...new Set(blockers)].sort(),
183
+ warnings: [...new Set(warnings)].sort(),
184
+ };
185
+ }
186
+ export function promoteSpecificationProposal(input) {
187
+ const proposalDigest = canonicalDigest(input.proposal);
188
+ if (input.approvalDigest !== proposalDigest ||
189
+ input.assessment.proposalDigest !== proposalDigest) {
190
+ throw new MillError("PLANNING_APPROVAL_MISMATCH", "Planning approval does not match the exact canonical proposal.", ExitCode.configuration);
191
+ }
192
+ if (!input.assessment.promotable) {
193
+ throw new MillError("PLANNING_PROMOTION_BLOCKED", "The proposal has unresolved promotion blockers.", ExitCode.configuration, { blockers: input.assessment.blockers });
194
+ }
195
+ return {
196
+ proposalDigest,
197
+ canonicalProposal: canonicalJson(input.proposal),
198
+ productContract: input.proposal.productContract,
199
+ blueprints: input.proposal.blueprints,
200
+ scenarioSet: input.proposal.scenarioSet,
201
+ };
202
+ }
203
+ export function semanticProposalDiff(approved, regenerated) {
204
+ const changed = new Set();
205
+ const walk = (left, right, pointer) => {
206
+ if (Object.is(left, right))
207
+ return;
208
+ if (typeof left !== "object" ||
209
+ left === null ||
210
+ typeof right !== "object" ||
211
+ right === null ||
212
+ Array.isArray(left) !== Array.isArray(right)) {
213
+ changed.add(pointer || "/");
214
+ return;
215
+ }
216
+ if (Array.isArray(left) && Array.isArray(right)) {
217
+ const length = Math.max(left.length, right.length);
218
+ for (let index = 0; index < length; index += 1) {
219
+ walk(left[index], right[index], `${pointer}/${index}`);
220
+ }
221
+ return;
222
+ }
223
+ const leftRecord = left;
224
+ const rightRecord = right;
225
+ for (const key of new Set([
226
+ ...Object.keys(leftRecord),
227
+ ...Object.keys(rightRecord),
228
+ ])) {
229
+ walk(leftRecord[key], rightRecord[key], `${pointer}/${key}`);
230
+ }
231
+ };
232
+ walk(approved, regenerated, "");
233
+ return [...changed].sort();
234
+ }
235
+ //# sourceMappingURL=specification.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"specification.js","sourceRoot":"","sources":["../../src/planning/specification.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { z } from "zod";
2
+ import { publicAlphaQualificationSchema } from "../contracts/schemas.js";
3
+ export type PublicAlphaQualification = z.infer<typeof publicAlphaQualificationSchema>;
4
+ export interface PublicAlphaQualificationAssessment {
5
+ report: PublicAlphaQualification;
6
+ reportDigest: string;
7
+ passed: boolean;
8
+ blockers: string[];
9
+ }
10
+ export declare function assessPublicAlphaQualification(report: PublicAlphaQualification, now?: Date): PublicAlphaQualificationAssessment;
11
+ export declare function loadPublicAlphaQualification(input: {
12
+ root: string;
13
+ file: string;
14
+ now?: Date;
15
+ }): Promise<PublicAlphaQualificationAssessment>;
16
+ //# sourceMappingURL=public-alpha.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"public-alpha.d.ts","sourceRoot":"","sources":["../../src/qualification/public-alpha.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAE7B,OAAO,EAEL,8BAA8B,EAC/B,MAAM,yBAAyB,CAAC;AAKjC,MAAM,MAAM,wBAAwB,GAAG,CAAC,CAAC,KAAK,CAC5C,OAAO,8BAA8B,CACtC,CAAC;AAEF,MAAM,WAAW,kCAAkC;IACjD,MAAM,EAAE,wBAAwB,CAAC;IACjC,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAoCD,wBAAgB,8BAA8B,CAC5C,MAAM,EAAE,wBAAwB,EAChC,GAAG,OAAa,GACf,kCAAkC,CAuHpC;AAED,wBAAsB,4BAA4B,CAAC,KAAK,EAAE;IACxD,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,IAAI,CAAC;CACZ,GAAG,OAAO,CAAC,kCAAkC,CAAC,CAM9C"}
@@ -0,0 +1,128 @@
1
+ import { parse as parseYaml } from "yaml";
2
+ import { auditCategorySchema, publicAlphaQualificationSchema, } from "../contracts/schemas.js";
3
+ import { canonicalDigest } from "../contracts/canonical.js";
4
+ import { ExitCode, MillError } from "../errors.js";
5
+ import { safeReadText } from "../security/safe-path.js";
6
+ const requiredAuditCategories = auditCategorySchema.options;
7
+ function sameMembers(actual, expected) {
8
+ return (actual.length === expected.length &&
9
+ new Set(actual).size === actual.length &&
10
+ actual.every((item) => expected.includes(item)));
11
+ }
12
+ function parseQualification(source) {
13
+ let raw;
14
+ try {
15
+ raw = parseYaml(source);
16
+ }
17
+ catch (error) {
18
+ throw new MillError("INVALID_PUBLIC_ALPHA_QUALIFICATION", "The public-alpha qualification record is not valid YAML or JSON.", ExitCode.data, { cause: String(error) });
19
+ }
20
+ const parsed = publicAlphaQualificationSchema.safeParse(raw);
21
+ if (!parsed.success) {
22
+ throw new MillError("INVALID_PUBLIC_ALPHA_QUALIFICATION", "The public-alpha qualification record does not satisfy its schema.", ExitCode.data, { issues: parsed.error.issues });
23
+ }
24
+ return parsed.data;
25
+ }
26
+ export function assessPublicAlphaQualification(report, now = new Date()) {
27
+ const blockers = [];
28
+ const nowTime = now.getTime();
29
+ const testedAt = Date.parse(report.supportTuple.testedAt);
30
+ const expiresAt = Date.parse(report.supportTuple.expiresAt);
31
+ const generatedAt = Date.parse(report.generatedAt);
32
+ if (report.supportTuple.status !== "qualified") {
33
+ blockers.push("support tuple is not qualified");
34
+ }
35
+ if (testedAt > nowTime || generatedAt > nowTime) {
36
+ blockers.push("qualification evidence is future-dated");
37
+ }
38
+ if (expiresAt <= testedAt || expiresAt <= nowTime) {
39
+ blockers.push("support tuple qualification is expired or has no valid window");
40
+ }
41
+ const steps = report.sequence.steps;
42
+ const stepIds = steps.map((step) => step.id);
43
+ if (new Set(stepIds).size !== stepIds.length) {
44
+ blockers.push("longitudinal step IDs are duplicated");
45
+ }
46
+ const candidateCommits = steps.map((step) => step.candidateCommit);
47
+ if (new Set(candidateCommits).size !== candidateCommits.length) {
48
+ blockers.push("accepted sequence reuses a candidate commit");
49
+ }
50
+ for (const [index, step] of steps.entries()) {
51
+ const previous = steps[index - 1];
52
+ if (index === 0) {
53
+ if (step.dependsOn.length !== 0) {
54
+ blockers.push(`${step.id} must be the dependency-free sequence root`);
55
+ }
56
+ }
57
+ else if (previous === undefined ||
58
+ step.dependsOn.length !== 1 ||
59
+ step.dependsOn[0] !== previous.id ||
60
+ step.baseCommit !== previous.candidateCommit) {
61
+ blockers.push(`${step.id} does not start from the prior accepted output`);
62
+ }
63
+ if (step.baseCommit === step.candidateCommit) {
64
+ blockers.push(`${step.id} did not produce a new candidate identity`);
65
+ }
66
+ if (step.status !== "accepted") {
67
+ blockers.push(`${step.id} is not accepted`);
68
+ }
69
+ if (!sameMembers(step.newBehavior.passedIds, step.newBehavior.requiredIds)) {
70
+ blockers.push(`${step.id} does not close every new-behavior item`);
71
+ }
72
+ if (!sameMembers(step.preservation.passedIds, step.preservation.requiredIds)) {
73
+ blockers.push(`${step.id} does not preserve every required prior item`);
74
+ }
75
+ if (step.usage.source === "unavailable" &&
76
+ (step.usage.inputTokens !== null ||
77
+ step.usage.outputTokens !== null ||
78
+ step.usage.currencyCost !== null)) {
79
+ blockers.push(`${step.id} reports usage while declaring it unavailable`);
80
+ }
81
+ if (step.usage.source === "operator-declared" &&
82
+ step.usage.inputTokens === null &&
83
+ step.usage.outputTokens === null &&
84
+ step.usage.currencyCost === null) {
85
+ blockers.push(`${step.id} has no operator-declared usage value`);
86
+ }
87
+ }
88
+ const acceptedIdentities = new Set([
89
+ steps[0]?.baseCommit,
90
+ ...candidateCommits,
91
+ ]);
92
+ const fault = report.sequence.seededFault;
93
+ if (!acceptedIdentities.has(fault.baseCommit)) {
94
+ blockers.push("seeded fault does not branch from an accepted identity");
95
+ }
96
+ if (fault.baseCommit === fault.candidateCommit ||
97
+ fault.status === "passed" ||
98
+ !fault.rejected ||
99
+ !fault.recovered ||
100
+ fault.enteredAcceptedSequence ||
101
+ candidateCommits.includes(fault.candidateCommit)) {
102
+ blockers.push("seeded fault was not rejected and recovered outside the accepted sequence");
103
+ }
104
+ for (const [name, status] of Object.entries(report.canaries)) {
105
+ if (status !== "passed")
106
+ blockers.push(`required canary did not pass: ${name}`);
107
+ }
108
+ const auditCategories = report.audits.map((audit) => audit.category);
109
+ if (!sameMembers(auditCategories, requiredAuditCategories)) {
110
+ blockers.push("qualification does not contain exactly one result for every audit category");
111
+ }
112
+ for (const audit of report.audits) {
113
+ if (audit.status !== "passed") {
114
+ blockers.push(`required audit did not pass: ${audit.category}`);
115
+ }
116
+ }
117
+ return {
118
+ report,
119
+ reportDigest: canonicalDigest(report),
120
+ passed: blockers.length === 0,
121
+ blockers: [...new Set(blockers)].sort(),
122
+ };
123
+ }
124
+ export async function loadPublicAlphaQualification(input) {
125
+ const source = await safeReadText(input.root, input.file, 2 * 1024 * 1024);
126
+ return assessPublicAlphaQualification(parseQualification(source), input.now ?? new Date());
127
+ }
128
+ //# sourceMappingURL=public-alpha.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"public-alpha.js","sourceRoot":"","sources":["../../src/qualification/public-alpha.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { z } from "zod";
2
+ import { recipeManifestSchema } from "../contracts/schemas.js";
3
+ export type RecipeManifest = z.infer<typeof recipeManifestSchema>;
4
+ export type FileOwnership = "mill_only" | "generated_once" | "managed";
5
+ export interface RecipeFile {
6
+ path: string;
7
+ content: string;
8
+ contentDigest: string;
9
+ ownership: FileOwnership;
10
+ }
11
+ export declare function loadNodeWebRecipe(): Promise<{
12
+ manifest: RecipeManifest;
13
+ digest: string;
14
+ }>;
15
+ export declare function renderNodeWebRecipe(input: {
16
+ projectName: string;
17
+ productTitle: string;
18
+ }): Promise<RecipeFile[]>;
19
+ //# sourceMappingURL=node-typescript-next-web.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-typescript-next-web.d.ts","sourceRoot":"","sources":["../../src/recipes/node-typescript-next-web.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAG7B,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAG/D,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAClE,MAAM,MAAM,aAAa,GAAG,WAAW,GAAG,gBAAgB,GAAG,SAAS,CAAC;AAEvE,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,aAAa,CAAC;CAC1B;AAoGD,wBAAsB,iBAAiB,IAAI,OAAO,CAAC;IACjD,QAAQ,EAAE,cAAc,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC,CAmCD;AAED,wBAAsB,mBAAmB,CAAC,KAAK,EAAE;IAC/C,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;CACtB,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAqCxB"}
@@ -0,0 +1,136 @@
1
+ import { createHash } from "node:crypto";
2
+ import { lstat, opendir, readFile } from "node:fs/promises";
3
+ import { fileURLToPath } from "node:url";
4
+ import path from "node:path";
5
+ import { parse as parseYaml } from "yaml";
6
+ import { canonicalDigest } from "../contracts/canonical.js";
7
+ import { recipeManifestSchema } from "../contracts/schemas.js";
8
+ import { ExitCode, MillError } from "../errors.js";
9
+ const recipeRoot = fileURLToPath(new URL("../../recipes/node-typescript-next-web/", import.meta.url));
10
+ const ignoredDirectories = new Set([
11
+ ".next",
12
+ "coverage",
13
+ "node_modules",
14
+ "playwright-report",
15
+ "test-results",
16
+ ]);
17
+ const ignoredFiles = new Set([".DS_Store"]);
18
+ function digest(content) {
19
+ return `sha256:${createHash("sha256").update(content, "utf8").digest("hex")}`;
20
+ }
21
+ function ownership(relativePath) {
22
+ if (["mill.yaml", "mill.lock"].includes(relativePath))
23
+ return "mill_only";
24
+ if (relativePath === ".github/workflows/ci.yml")
25
+ return "managed";
26
+ return "generated_once";
27
+ }
28
+ function packageName(value) {
29
+ const normalized = value
30
+ .toLowerCase()
31
+ .normalize("NFKD")
32
+ .replaceAll(/[^a-z0-9._-]+/gu, "-")
33
+ .replaceAll(/^-+|-+$/gu, "")
34
+ .slice(0, 214);
35
+ return normalized.length === 0 ? "mill-web-product" : normalized;
36
+ }
37
+ function markdownTitle(value) {
38
+ return value
39
+ .replaceAll(/[\r\n\t]+/gu, " ")
40
+ .replaceAll(/\s+/gu, " ")
41
+ .trim()
42
+ .replaceAll(/[\u0021-\u002F\u003A-\u0040\u005B-\u0060\u007B-\u007E]/gu, "\\$&");
43
+ }
44
+ async function walk(directory, relative = ".") {
45
+ const handle = await opendir(path.join(directory, relative));
46
+ const entries = [];
47
+ for await (const entry of handle)
48
+ entries.push(entry);
49
+ const files = [];
50
+ for (const entry of entries.sort((left, right) => left.name.localeCompare(right.name))) {
51
+ if (ignoredFiles.has(entry.name) ||
52
+ (entry.isDirectory() && ignoredDirectories.has(entry.name))) {
53
+ continue;
54
+ }
55
+ const child = path.join(relative, entry.name);
56
+ const information = await lstat(path.join(directory, child));
57
+ if (information.isSymbolicLink()) {
58
+ throw new MillError("RECIPE_SYMLINK_FORBIDDEN", "Recipe assets cannot contain symbolic links.", ExitCode.data, { path: child });
59
+ }
60
+ if (information.isDirectory())
61
+ files.push(...(await walk(directory, child)));
62
+ else if (information.isFile()) {
63
+ if (information.size > 8 * 1024 * 1024) {
64
+ throw new MillError("RECIPE_ASSET_TOO_LARGE", "A bundled recipe asset exceeds the per-file size limit.", ExitCode.data, { path: child });
65
+ }
66
+ files.push(child);
67
+ }
68
+ else {
69
+ throw new MillError("RECIPE_ASSET_UNSUPPORTED", "A bundled recipe asset has an unsupported filesystem type.", ExitCode.data, { path: child });
70
+ }
71
+ }
72
+ if (files.length > 128) {
73
+ throw new MillError("RECIPE_ASSET_LIMIT_EXCEEDED", "The bundled recipe exceeds its file-count limit.", ExitCode.data);
74
+ }
75
+ return files;
76
+ }
77
+ export async function loadNodeWebRecipe() {
78
+ const source = await readFile(path.join(recipeRoot, "recipe.yaml"), "utf8");
79
+ let raw;
80
+ try {
81
+ raw = parseYaml(source);
82
+ }
83
+ catch (error) {
84
+ throw new MillError("RECIPE_MANIFEST_INVALID", "The bundled recipe manifest is invalid YAML.", ExitCode.data, { cause: String(error) });
85
+ }
86
+ const manifest = recipeManifestSchema.parse(raw);
87
+ if (manifest.status !== "supported") {
88
+ throw new MillError("RECIPE_NOT_SUPPORTED", "The selected recipe is not qualified for apply.", ExitCode.configuration, { status: manifest.status });
89
+ }
90
+ const assets = await walk(recipeRoot);
91
+ const assetDigests = await Promise.all(assets
92
+ .filter((asset) => asset.split(path.sep).join("/") !== "recipe.yaml")
93
+ .map(async (asset) => ({
94
+ path: asset.split(path.sep).join("/").replace(/^\.\//u, ""),
95
+ digest: digest(await readFile(path.join(recipeRoot, asset), "utf8")),
96
+ })));
97
+ return {
98
+ manifest,
99
+ digest: canonicalDigest({ manifest, assets: assetDigests }),
100
+ };
101
+ }
102
+ export async function renderNodeWebRecipe(input) {
103
+ const files = await walk(recipeRoot);
104
+ const rendered = [];
105
+ for (const file of files) {
106
+ const assetPath = file.split(path.sep).join("/").replace(/^\.\//u, "");
107
+ if (assetPath === "recipe.yaml")
108
+ continue;
109
+ const normalized = assetPath === "gitignore.template" ? ".gitignore" : assetPath;
110
+ let content = await readFile(path.join(recipeRoot, file), "utf8");
111
+ if (normalized === "package.json" || normalized === "package-lock.json") {
112
+ const parsed = JSON.parse(content);
113
+ parsed.name = packageName(input.projectName);
114
+ if (normalized === "package-lock.json") {
115
+ const packages = parsed.packages;
116
+ if (packages?.[""] !== undefined) {
117
+ packages[""].name = packageName(input.projectName);
118
+ }
119
+ }
120
+ content = `${JSON.stringify(parsed, undefined, 2)}\n`;
121
+ }
122
+ else {
123
+ content = content.replace(/__MILL_PRODUCT_TITLE_LITERAL__|MILL_PRODUCT_TITLE_MARKDOWN_TOKEN/gu, (token) => token === "__MILL_PRODUCT_TITLE_LITERAL__"
124
+ ? JSON.stringify(input.productTitle)
125
+ : markdownTitle(input.productTitle));
126
+ }
127
+ rendered.push({
128
+ path: normalized,
129
+ content,
130
+ contentDigest: digest(content),
131
+ ownership: ownership(normalized),
132
+ });
133
+ }
134
+ return rendered.sort((left, right) => left.path.localeCompare(right.path));
135
+ }
136
+ //# sourceMappingURL=node-typescript-next-web.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-typescript-next-web.js","sourceRoot":"","sources":["../../src/recipes/node-typescript-next-web.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ import { z } from "zod";
2
+ import { repositoryIntegrationPlanSchema } from "../contracts/schemas.js";
3
+ import { type RecipeFile } from "../recipes/node-typescript-next-web.js";
4
+ export type RepositoryIntegrationPlan = z.infer<typeof repositoryIntegrationPlanSchema>;
5
+ interface IntegrationOptions {
6
+ sourceRoot: string;
7
+ prdPath: string;
8
+ sourceManifestPath: string;
9
+ proposalPath: string;
10
+ productApprovalDigest: string;
11
+ repositoryId: string;
12
+ approvedBy: string;
13
+ approvedAt: string;
14
+ authorName: string;
15
+ authorEmail: string;
16
+ }
17
+ interface PlannedIntegration {
18
+ plan: RepositoryIntegrationPlan;
19
+ approvalDigest: string;
20
+ files: RecipeFile[];
21
+ }
22
+ export declare function planGreenfieldIntegration(input: IntegrationOptions & {
23
+ targetDirectory: string;
24
+ }): Promise<PlannedIntegration>;
25
+ export declare function planAdoptionIntegration(input: IntegrationOptions & {
26
+ repositoryRoot: string;
27
+ }): Promise<PlannedIntegration>;
28
+ export declare function applyGreenfieldIntegration(input: IntegrationOptions & {
29
+ targetDirectory: string;
30
+ planApprovalDigest: string;
31
+ attended: boolean;
32
+ signal?: AbortSignal;
33
+ }): Promise<{
34
+ repository: string;
35
+ commit: string;
36
+ planDigest: string;
37
+ baseline: "unverified";
38
+ }>;
39
+ export declare function applyAdoptionIntegration(input: IntegrationOptions & {
40
+ repositoryRoot: string;
41
+ planApprovalDigest: string;
42
+ attended: boolean;
43
+ signal?: AbortSignal;
44
+ }): Promise<{
45
+ branch: string;
46
+ commit: string;
47
+ planDigest: string;
48
+ baseline: "unverified";
49
+ }>;
50
+ export declare function planDetach(root: string): Promise<{
51
+ mode: "manual";
52
+ remove: string[];
53
+ retain: string[];
54
+ changed: string[];
55
+ stateAction: string;
56
+ }>;
57
+ export {};
58
+ //# sourceMappingURL=integration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"integration.d.ts","sourceRoot":"","sources":["../../src/repository/integration.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAGL,+BAA+B,EAGhC,MAAM,yBAAyB,CAAC;AAUjC,OAAO,EAIL,KAAK,UAAU,EAChB,MAAM,wCAAwC,CAAC;AAchD,MAAM,MAAM,yBAAyB,GAAG,CAAC,CAAC,KAAK,CAC7C,OAAO,+BAA+B,CACvC,CAAC;AAEF,UAAU,kBAAkB;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,UAAU,kBAAkB;IAC1B,IAAI,EAAE,yBAAyB,CAAC;IAChC,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE,UAAU,EAAE,CAAC;CACrB;AA0sCD,wBAAsB,yBAAyB,CAC7C,KAAK,EAAE,kBAAkB,GAAG;IAC1B,eAAe,EAAE,MAAM,CAAC;CACzB,GACA,OAAO,CAAC,kBAAkB,CAAC,CAoE7B;AAED,wBAAsB,uBAAuB,CAC3C,KAAK,EAAE,kBAAkB,GAAG;IAC1B,cAAc,EAAE,MAAM,CAAC;CACxB,GACA,OAAO,CAAC,kBAAkB,CAAC,CAoH7B;AAkaD,wBAAsB,0BAA0B,CAC9C,KAAK,EAAE,kBAAkB,GAAG;IAC1B,eAAe,EAAE,MAAM,CAAC;IACxB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB,GACA,OAAO,CAAC;IACT,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,YAAY,CAAC;CACxB,CAAC,CAUD;AAmGD,wBAAsB,wBAAwB,CAC5C,KAAK,EAAE,kBAAkB,GAAG;IAC1B,cAAc,EAAE,MAAM,CAAC;IACvB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB,GACA,OAAO,CAAC;IACT,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,YAAY,CAAC;CACxB,CAAC,CAUD;AAED,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IACtD,IAAI,EAAE,QAAQ,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC,CA0CD"}