@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.
- package/LICENSE +202 -0
- package/README.md +335 -0
- package/dist/audit/repository.d.ts +8 -0
- package/dist/audit/repository.d.ts.map +1 -0
- package/dist/audit/repository.js +232 -0
- package/dist/audit/repository.js.map +1 -0
- package/dist/cli-program.d.ts +12 -0
- package/dist/cli-program.d.ts.map +1 -0
- package/dist/cli-program.js +1020 -0
- package/dist/cli-program.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +7 -0
- package/dist/cli.js.map +1 -0
- package/dist/config/lock.d.ts +12 -0
- package/dist/config/lock.d.ts.map +1 -0
- package/dist/config/lock.js +83 -0
- package/dist/config/lock.js.map +1 -0
- package/dist/contracts/canonical.d.ts +7 -0
- package/dist/contracts/canonical.d.ts.map +1 -0
- package/dist/contracts/canonical.js +30 -0
- package/dist/contracts/canonical.js.map +1 -0
- package/dist/contracts/schemas.d.ts +2705 -0
- package/dist/contracts/schemas.d.ts.map +1 -0
- package/dist/contracts/schemas.js +988 -0
- package/dist/contracts/schemas.js.map +1 -0
- package/dist/doctor.d.ts +21 -0
- package/dist/doctor.d.ts.map +1 -0
- package/dist/doctor.js +138 -0
- package/dist/doctor.js.map +1 -0
- package/dist/errors.d.ts +18 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +31 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -0
- package/dist/intake/prd.d.ts +14 -0
- package/dist/intake/prd.d.ts.map +1 -0
- package/dist/intake/prd.js +39 -0
- package/dist/intake/prd.js.map +1 -0
- package/dist/planning/impact.d.ts +59 -0
- package/dist/planning/impact.d.ts.map +1 -0
- package/dist/planning/impact.js +400 -0
- package/dist/planning/impact.js.map +1 -0
- package/dist/planning/specification.d.ts +42 -0
- package/dist/planning/specification.d.ts.map +1 -0
- package/dist/planning/specification.js +235 -0
- package/dist/planning/specification.js.map +1 -0
- package/dist/qualification/public-alpha.d.ts +16 -0
- package/dist/qualification/public-alpha.d.ts.map +1 -0
- package/dist/qualification/public-alpha.js +128 -0
- package/dist/qualification/public-alpha.js.map +1 -0
- package/dist/recipes/node-typescript-next-web.d.ts +19 -0
- package/dist/recipes/node-typescript-next-web.d.ts.map +1 -0
- package/dist/recipes/node-typescript-next-web.js +136 -0
- package/dist/recipes/node-typescript-next-web.js.map +1 -0
- package/dist/repository/integration.d.ts +58 -0
- package/dist/repository/integration.d.ts.map +1 -0
- package/dist/repository/integration.js +1385 -0
- package/dist/repository/integration.js.map +1 -0
- package/dist/repository/scan.d.ts +27 -0
- package/dist/repository/scan.d.ts.map +1 -0
- package/dist/repository/scan.js +388 -0
- package/dist/repository/scan.js.map +1 -0
- package/dist/result.d.ts +23 -0
- package/dist/result.d.ts.map +1 -0
- package/dist/result.js +24 -0
- package/dist/result.js.map +1 -0
- package/dist/runtime/codex.d.ts +28 -0
- package/dist/runtime/codex.d.ts.map +1 -0
- package/dist/runtime/codex.js +439 -0
- package/dist/runtime/codex.js.map +1 -0
- package/dist/runtime/context.d.ts +10 -0
- package/dist/runtime/context.d.ts.map +1 -0
- package/dist/runtime/context.js +151 -0
- package/dist/runtime/context.js.map +1 -0
- package/dist/runtime/delivery.d.ts +58 -0
- package/dist/runtime/delivery.d.ts.map +1 -0
- package/dist/runtime/delivery.js +1073 -0
- package/dist/runtime/delivery.js.map +1 -0
- package/dist/runtime/dependencies.d.ts +19 -0
- package/dist/runtime/dependencies.d.ts.map +1 -0
- package/dist/runtime/dependencies.js +495 -0
- package/dist/runtime/dependencies.js.map +1 -0
- package/dist/runtime/github.d.ts +112 -0
- package/dist/runtime/github.d.ts.map +1 -0
- package/dist/runtime/github.js +510 -0
- package/dist/runtime/github.js.map +1 -0
- package/dist/runtime/inputs.d.ts +24 -0
- package/dist/runtime/inputs.d.ts.map +1 -0
- package/dist/runtime/inputs.js +237 -0
- package/dist/runtime/inputs.js.map +1 -0
- package/dist/runtime/lease.d.ts +11 -0
- package/dist/runtime/lease.d.ts.map +1 -0
- package/dist/runtime/lease.js +52 -0
- package/dist/runtime/lease.js.map +1 -0
- package/dist/runtime/lifecycle.d.ts +87 -0
- package/dist/runtime/lifecycle.d.ts.map +1 -0
- package/dist/runtime/lifecycle.js +1024 -0
- package/dist/runtime/lifecycle.js.map +1 -0
- package/dist/runtime/process.d.ts +39 -0
- package/dist/runtime/process.d.ts.map +1 -0
- package/dist/runtime/process.js +304 -0
- package/dist/runtime/process.js.map +1 -0
- package/dist/runtime/repository.d.ts +36 -0
- package/dist/runtime/repository.d.ts.map +1 -0
- package/dist/runtime/repository.js +458 -0
- package/dist/runtime/repository.js.map +1 -0
- package/dist/runtime/state.d.ts +121 -0
- package/dist/runtime/state.d.ts.map +1 -0
- package/dist/runtime/state.js +1017 -0
- package/dist/runtime/state.js.map +1 -0
- package/dist/runtime/verifier.d.ts +31 -0
- package/dist/runtime/verifier.d.ts.map +1 -0
- package/dist/runtime/verifier.js +478 -0
- package/dist/runtime/verifier.js.map +1 -0
- package/dist/runtime/worker.d.ts +67 -0
- package/dist/runtime/worker.d.ts.map +1 -0
- package/dist/runtime/worker.js +34 -0
- package/dist/runtime/worker.js.map +1 -0
- package/dist/security/safe-path.d.ts +3 -0
- package/dist/security/safe-path.d.ts.map +1 -0
- package/dist/security/safe-path.js +102 -0
- package/dist/security/safe-path.js.map +1 -0
- package/dist/version.d.ts +4 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +4 -0
- package/dist/version.js.map +1 -0
- package/dist/workflows/founder.d.ts +33 -0
- package/dist/workflows/founder.d.ts.map +1 -0
- package/dist/workflows/founder.js +422 -0
- package/dist/workflows/founder.js.map +1 -0
- package/package.json +79 -0
- package/recipes/node-typescript-next-web/.github/workflows/ci.yml +34 -0
- package/recipes/node-typescript-next-web/.node-version +1 -0
- package/recipes/node-typescript-next-web/.tool-versions +1 -0
- package/recipes/node-typescript-next-web/AGENTS.md +44 -0
- package/recipes/node-typescript-next-web/README.md +16 -0
- package/recipes/node-typescript-next-web/WORKFLOW.md +6 -0
- package/recipes/node-typescript-next-web/app/api/health/route.ts +5 -0
- package/recipes/node-typescript-next-web/app/layout.tsx +19 -0
- package/recipes/node-typescript-next-web/app/page.tsx +12 -0
- package/recipes/node-typescript-next-web/app/styles.css +21 -0
- package/recipes/node-typescript-next-web/docs/development.md +16 -0
- package/recipes/node-typescript-next-web/eslint.config.mjs +9 -0
- package/recipes/node-typescript-next-web/gitignore.template +5 -0
- package/recipes/node-typescript-next-web/next-env.d.ts +7 -0
- package/recipes/node-typescript-next-web/next.config.ts +11 -0
- package/recipes/node-typescript-next-web/package-lock.json +7540 -0
- package/recipes/node-typescript-next-web/package.json +39 -0
- package/recipes/node-typescript-next-web/playwright.config.ts +23 -0
- package/recipes/node-typescript-next-web/recipe.yaml +71 -0
- package/recipes/node-typescript-next-web/scripts/check-package.mjs +3 -0
- package/recipes/node-typescript-next-web/src/health.ts +3 -0
- package/recipes/node-typescript-next-web/test/browser/home.spec.ts +14 -0
- package/recipes/node-typescript-next-web/test/integration/health-route.test.ts +11 -0
- package/recipes/node-typescript-next-web/test/unit/health.test.ts +9 -0
- package/recipes/node-typescript-next-web/tsconfig.json +33 -0
- package/schemas/README.md +64 -0
- package/schemas/audit-report.schema.json +59 -0
- package/schemas/blueprint.schema.json +34 -0
- package/schemas/context-manifest.schema.json +88 -0
- package/schemas/delivery-record.schema.json +266 -0
- package/schemas/impact-manifest.schema.json +146 -0
- package/schemas/managed-repository.schema.json +36 -0
- package/schemas/mill-config.schema.json +212 -0
- package/schemas/mill-lock.schema.json +96 -0
- package/schemas/outcome-plan.schema.json +51 -0
- package/schemas/product-contract.schema.json +181 -0
- package/schemas/public-alpha-qualification.schema.json +391 -0
- package/schemas/recipe-manifest.schema.json +187 -0
- package/schemas/release-evidence.schema.json +170 -0
- package/schemas/repository-integration-plan.schema.json +156 -0
- package/schemas/review-result.schema.json +57 -0
- package/schemas/scenario-set.schema.json +84 -0
- package/schemas/source-manifest.schema.json +96 -0
- package/schemas/specification-proposal.schema.json +406 -0
- package/schemas/support-tuple.schema.json +107 -0
- package/schemas/task-packet.schema.json +395 -0
- package/schemas/validation-evidence.schema.json +125 -0
- package/schemas/worker-invocation.schema.json +119 -0
- package/schemas/worker-profile.schema.json +53 -0
|
@@ -0,0 +1,458 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { lstat, readFile, realpath, stat } from "node:fs/promises";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { findTrustedExecutable } from "../doctor.js";
|
|
5
|
+
import { ExitCode, MillError } from "../errors.js";
|
|
6
|
+
import { scanRepository } from "../repository/scan.js";
|
|
7
|
+
import { isWithin } from "../security/safe-path.js";
|
|
8
|
+
import { runProcess } from "./process.js";
|
|
9
|
+
const gitEnvironment = {
|
|
10
|
+
HOME: "/var/empty",
|
|
11
|
+
LANG: "C",
|
|
12
|
+
LC_ALL: "C",
|
|
13
|
+
PATH: "/usr/bin:/bin:/usr/sbin:/sbin",
|
|
14
|
+
GIT_CONFIG_GLOBAL: "/dev/null",
|
|
15
|
+
GIT_CONFIG_NOSYSTEM: "1",
|
|
16
|
+
GIT_NO_REPLACE_OBJECTS: "1",
|
|
17
|
+
GIT_OPTIONAL_LOCKS: "0",
|
|
18
|
+
GIT_PAGER: "cat",
|
|
19
|
+
PAGER: "cat",
|
|
20
|
+
};
|
|
21
|
+
async function controlFileDigest(file) {
|
|
22
|
+
try {
|
|
23
|
+
const information = await lstat(file);
|
|
24
|
+
if (!information.isFile() ||
|
|
25
|
+
information.isSymbolicLink() ||
|
|
26
|
+
information.size > 2 * 1024 * 1024) {
|
|
27
|
+
throw new MillError("UNSAFE_GIT_CONTROL_FILE", "A Git control file is not a bounded regular file.", ExitCode.configuration);
|
|
28
|
+
}
|
|
29
|
+
return `sha256:${createHash("sha256")
|
|
30
|
+
.update(await readFile(file))
|
|
31
|
+
.digest("hex")}`;
|
|
32
|
+
}
|
|
33
|
+
catch (error) {
|
|
34
|
+
if (error instanceof Error && "code" in error && error.code === "ENOENT") {
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
throw error;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
export async function captureGitControlState(worktree) {
|
|
41
|
+
const commonDirectory = await commonGitDirectory(worktree);
|
|
42
|
+
const gitDirectoryValue = (await git(worktree, ["rev-parse", "--git-dir"])).trim();
|
|
43
|
+
const gitDirectory = await realpath(path.isAbsolute(gitDirectoryValue)
|
|
44
|
+
? gitDirectoryValue
|
|
45
|
+
: path.resolve(worktree, gitDirectoryValue));
|
|
46
|
+
const currentRef = (await git(worktree, ["symbolic-ref", "--quiet", "HEAD"])).trim();
|
|
47
|
+
const otherRefs = (await git(worktree, ["for-each-ref", "--format=%(refname)%09%(objectname)"]))
|
|
48
|
+
.split("\n")
|
|
49
|
+
.filter((line) => line.length > 0 && !line.startsWith(`${currentRef}\t`))
|
|
50
|
+
.sort()
|
|
51
|
+
.join("\n");
|
|
52
|
+
return {
|
|
53
|
+
schemaVersion: "1",
|
|
54
|
+
currentRef,
|
|
55
|
+
commonConfig: await controlFileDigest(path.join(commonDirectory, "config")),
|
|
56
|
+
worktreeConfig: await controlFileDigest(path.join(gitDirectory, "config.worktree")),
|
|
57
|
+
infoAttributes: await controlFileDigest(path.join(commonDirectory, "info", "attributes")),
|
|
58
|
+
otherRefs: `sha256:${createHash("sha256").update(otherRefs, "utf8").digest("hex")}`,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
export async function assertGitControlState(worktree, expected) {
|
|
62
|
+
const actual = await captureGitControlState(worktree);
|
|
63
|
+
if (JSON.stringify(actual) !== JSON.stringify(expected)) {
|
|
64
|
+
throw new MillError("GIT_CONTROL_DRIFT", "Git configuration, attributes, branch identity, or unrelated refs changed during execution.", ExitCode.configuration, { expected, actual });
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
async function git(root, args, maxOutputBytes = 4 * 1024 * 1024) {
|
|
68
|
+
const executable = await findTrustedExecutable("git", root);
|
|
69
|
+
if (executable === undefined) {
|
|
70
|
+
throw new MillError("GIT_UNAVAILABLE", "A trusted Git executable is required.", ExitCode.unavailable);
|
|
71
|
+
}
|
|
72
|
+
const result = await runProcess({
|
|
73
|
+
executable,
|
|
74
|
+
args: [
|
|
75
|
+
"-c",
|
|
76
|
+
"core.hooksPath=/dev/null",
|
|
77
|
+
"-c",
|
|
78
|
+
"core.fsmonitor=false",
|
|
79
|
+
"-c",
|
|
80
|
+
"diff.external=",
|
|
81
|
+
...args,
|
|
82
|
+
],
|
|
83
|
+
cwd: root,
|
|
84
|
+
env: gitEnvironment,
|
|
85
|
+
deadlineMs: Date.now() + 30_000,
|
|
86
|
+
maxOutputBytes,
|
|
87
|
+
});
|
|
88
|
+
if (result.timedOut || result.outputExceeded || result.exitCode !== 0) {
|
|
89
|
+
throw new MillError("GIT_COMMAND_FAILED", `Git command failed: git ${args[0] ?? ""}`, ExitCode.io, {
|
|
90
|
+
exitCode: result.exitCode,
|
|
91
|
+
timedOut: result.timedOut,
|
|
92
|
+
outputExceeded: result.outputExceeded,
|
|
93
|
+
stderr: result.stderr.slice(0, 2_000),
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
return result.stdout;
|
|
97
|
+
}
|
|
98
|
+
export async function commonGitDirectory(root) {
|
|
99
|
+
const value = (await git(root, ["rev-parse", "--git-common-dir"])).trim();
|
|
100
|
+
const candidate = path.isAbsolute(value) ? value : path.resolve(root, value);
|
|
101
|
+
const canonical = await realpath(candidate);
|
|
102
|
+
if (!(await stat(canonical)).isDirectory()) {
|
|
103
|
+
throw new MillError("INVALID_GIT_COMMON_DIRECTORY", "Git common directory is not a directory.", ExitCode.configuration);
|
|
104
|
+
}
|
|
105
|
+
return canonical;
|
|
106
|
+
}
|
|
107
|
+
export async function resolveCommit(root, reference) {
|
|
108
|
+
const value = (await git(root, ["rev-parse", "--verify", `${reference}^{commit}`])).trim();
|
|
109
|
+
if (!/^[a-f0-9]{40}$/u.test(value)) {
|
|
110
|
+
throw new MillError("INVALID_GIT_IDENTITY", "Git did not return a full commit identity.", ExitCode.configuration);
|
|
111
|
+
}
|
|
112
|
+
return value;
|
|
113
|
+
}
|
|
114
|
+
export async function readCandidateIdentity(root, reference = "HEAD") {
|
|
115
|
+
const commit = await resolveCommit(root, reference);
|
|
116
|
+
const tree = (await git(root, ["rev-parse", `${commit}^{tree}`])).trim();
|
|
117
|
+
if (!/^[a-f0-9]{40}$/u.test(tree)) {
|
|
118
|
+
throw new MillError("INVALID_CANDIDATE_TREE", "Git did not return a full candidate tree identity.", ExitCode.configuration);
|
|
119
|
+
}
|
|
120
|
+
return { commit, tree };
|
|
121
|
+
}
|
|
122
|
+
export async function assertRepositoryWorktreeClean(root) {
|
|
123
|
+
await assertVisibleIndexState(root);
|
|
124
|
+
const status = await git(root, [
|
|
125
|
+
"status",
|
|
126
|
+
"--porcelain=v1",
|
|
127
|
+
"-z",
|
|
128
|
+
"--untracked-files=all",
|
|
129
|
+
]);
|
|
130
|
+
if (status.length > 0) {
|
|
131
|
+
throw new MillError("DIRTY_CHECKOUT", "Repository audit requires a clean exact candidate checkout.", ExitCode.configuration);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
export async function repositoryRemoteUrl(root, remoteName) {
|
|
135
|
+
if (!/^[A-Za-z0-9._-]+$/u.test(remoteName)) {
|
|
136
|
+
throw new MillError("INVALID_REMOTE_NAME", "The configured Git remote name is invalid.", ExitCode.configuration);
|
|
137
|
+
}
|
|
138
|
+
const values = (await git(root, ["remote", "get-url", "--all", remoteName]))
|
|
139
|
+
.split("\n")
|
|
140
|
+
.map((value) => value.trim())
|
|
141
|
+
.filter((value) => value.length > 0);
|
|
142
|
+
if (values.length !== 1) {
|
|
143
|
+
throw new MillError("AMBIGUOUS_REMOTE_URL", "The configured Git remote must resolve to exactly one URL.", ExitCode.configuration, { remoteName, count: values.length });
|
|
144
|
+
}
|
|
145
|
+
const remoteUrl = values[0];
|
|
146
|
+
if (remoteUrl === undefined) {
|
|
147
|
+
throw new MillError("AMBIGUOUS_REMOTE_URL", "The configured Git remote did not resolve to a URL.", ExitCode.configuration);
|
|
148
|
+
}
|
|
149
|
+
return remoteUrl;
|
|
150
|
+
}
|
|
151
|
+
async function assertNoDangerousAttributes(root, baseCommit, commonDirectory) {
|
|
152
|
+
const listing = await git(root, [
|
|
153
|
+
"ls-tree",
|
|
154
|
+
"-rz",
|
|
155
|
+
"--format=%(objectname)%x09%(path)",
|
|
156
|
+
baseCommit,
|
|
157
|
+
]);
|
|
158
|
+
for (const record of listing.split("\0")) {
|
|
159
|
+
if (record.length === 0)
|
|
160
|
+
continue;
|
|
161
|
+
const separator = record.indexOf("\t");
|
|
162
|
+
if (separator !== 40) {
|
|
163
|
+
throw new MillError("INVALID_GIT_TREE_RECORD", "Git tree output could not be classified safely.", ExitCode.configuration);
|
|
164
|
+
}
|
|
165
|
+
const objectId = record.slice(0, separator);
|
|
166
|
+
const file = record.slice(separator + 1);
|
|
167
|
+
if (path.basename(file) !== ".gitattributes")
|
|
168
|
+
continue;
|
|
169
|
+
const source = await git(root, ["cat-file", "blob", objectId], 512 * 1024);
|
|
170
|
+
for (const line of source.split(/\r?\n/u)) {
|
|
171
|
+
const content = line.trim();
|
|
172
|
+
if (content.length === 0 || content.startsWith("#"))
|
|
173
|
+
continue;
|
|
174
|
+
if (/(?:^|\s)-?filter(?:=|\s|$)/iu.test(content) ||
|
|
175
|
+
/(?:^|\s)working-tree-encoding(?:=|\s|$)/iu.test(content)) {
|
|
176
|
+
throw new MillError("UNSAFE_GIT_ATTRIBUTES", `Executable or transforming Git attributes are not supported: ${file}`, ExitCode.configuration);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
const informationAttributes = path.join(commonDirectory, "info", "attributes");
|
|
181
|
+
try {
|
|
182
|
+
const information = await lstat(informationAttributes);
|
|
183
|
+
if (!information.isFile() || information.isSymbolicLink()) {
|
|
184
|
+
throw new Error("not a regular file");
|
|
185
|
+
}
|
|
186
|
+
if (information.size > 0) {
|
|
187
|
+
const source = await readFile(informationAttributes, "utf8");
|
|
188
|
+
if (source
|
|
189
|
+
.split(/\r?\n/u)
|
|
190
|
+
.some((line) => line.trim().length > 0 && !line.trim().startsWith("#"))) {
|
|
191
|
+
throw new Error("non-empty info attributes");
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
catch (error) {
|
|
196
|
+
if (error instanceof Error && "code" in error && error.code === "ENOENT")
|
|
197
|
+
return;
|
|
198
|
+
throw new MillError("UNSAFE_GIT_ATTRIBUTES", "Git info attributes are present or cannot be classified safely.", ExitCode.configuration, { cause: String(error) });
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
function matchesPathPattern(candidate, patterns) {
|
|
202
|
+
return patterns.some((pattern) => {
|
|
203
|
+
if (pattern.endsWith("/**")) {
|
|
204
|
+
const prefix = pattern.slice(0, -3).replace(/\/$/u, "");
|
|
205
|
+
return candidate === prefix || candidate.startsWith(`${prefix}/`);
|
|
206
|
+
}
|
|
207
|
+
return candidate === pattern;
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
async function assertSafeTrackedTree(root, baseCommit, sensitivePatterns) {
|
|
211
|
+
validateAllowedPatterns(sensitivePatterns);
|
|
212
|
+
const listing = await git(root, [
|
|
213
|
+
"ls-tree",
|
|
214
|
+
"-rz",
|
|
215
|
+
"--full-tree",
|
|
216
|
+
"--format=%(objectmode)%x09%(path)",
|
|
217
|
+
baseCommit,
|
|
218
|
+
]);
|
|
219
|
+
for (const record of listing.split("\0")) {
|
|
220
|
+
if (record.length === 0)
|
|
221
|
+
continue;
|
|
222
|
+
const separator = record.indexOf("\t");
|
|
223
|
+
if (separator <= 0) {
|
|
224
|
+
throw new MillError("INVALID_GIT_TREE_RECORD", "Git tree output could not be classified safely.", ExitCode.configuration);
|
|
225
|
+
}
|
|
226
|
+
const mode = record.slice(0, separator);
|
|
227
|
+
const file = record.slice(separator + 1);
|
|
228
|
+
if (mode === "120000") {
|
|
229
|
+
throw new MillError("TRACKED_SYMLINK_FORBIDDEN", `Tracked symlinks are not supported for build execution: ${file}`, ExitCode.configuration);
|
|
230
|
+
}
|
|
231
|
+
if (matchesPathPattern(file, sensitivePatterns)) {
|
|
232
|
+
throw new MillError("TRACKED_SENSITIVE_PATH_FORBIDDEN", `A configured sensitive path is tracked and would be visible to the builder: ${file}`, ExitCode.configuration);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
async function assertNoHistorySubstitution(root, commonDirectory) {
|
|
237
|
+
const replacementRefs = (await git(root, ["for-each-ref", "--format=%(refname)", "refs/replace/"]))
|
|
238
|
+
.split("\n")
|
|
239
|
+
.filter((reference) => reference.length > 0);
|
|
240
|
+
if (replacementRefs.length > 0) {
|
|
241
|
+
throw new MillError("HISTORY_SUBSTITUTION_FORBIDDEN", "Git replacement refs are not supported for exact-base delivery.", ExitCode.configuration, { replacementRefs });
|
|
242
|
+
}
|
|
243
|
+
const grafts = path.join(commonDirectory, "info", "grafts");
|
|
244
|
+
try {
|
|
245
|
+
const information = await lstat(grafts);
|
|
246
|
+
if (!information.isFile() ||
|
|
247
|
+
information.isSymbolicLink() ||
|
|
248
|
+
information.size > 0) {
|
|
249
|
+
throw new MillError("HISTORY_SUBSTITUTION_FORBIDDEN", "Git graft metadata is not supported for exact-base delivery.", ExitCode.configuration);
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
catch (error) {
|
|
253
|
+
if (error instanceof MillError)
|
|
254
|
+
throw error;
|
|
255
|
+
if (error instanceof Error && "code" in error && error.code === "ENOENT") {
|
|
256
|
+
return;
|
|
257
|
+
}
|
|
258
|
+
throw new MillError("HISTORY_SUBSTITUTION_FORBIDDEN", "Git graft metadata could not be classified safely.", ExitCode.configuration, { cause: String(error) });
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
export async function qualifyRepositoryForBuild(root, baseRef, sensitivePatterns = []) {
|
|
262
|
+
await assertVisibleIndexState(root);
|
|
263
|
+
const scan = await scanRepository(root);
|
|
264
|
+
if (scan.gitConfigHazards.length > 0 ||
|
|
265
|
+
scan.truncatedDirectories.length > 0) {
|
|
266
|
+
throw new MillError("UNSAFE_REPOSITORY_FOR_BUILD", "Static repository qualification found Git hazards or an incomplete scan.", ExitCode.configuration, {
|
|
267
|
+
gitConfigHazards: scan.gitConfigHazards,
|
|
268
|
+
truncatedDirectories: scan.truncatedDirectories,
|
|
269
|
+
});
|
|
270
|
+
}
|
|
271
|
+
const commonDirectory = await commonGitDirectory(root);
|
|
272
|
+
await assertNoHistorySubstitution(root, commonDirectory);
|
|
273
|
+
const baseCommit = await resolveCommit(root, baseRef);
|
|
274
|
+
await assertNoDangerousAttributes(root, baseCommit, commonDirectory);
|
|
275
|
+
await assertSafeTrackedTree(root, baseCommit, sensitivePatterns);
|
|
276
|
+
const status = await git(root, [
|
|
277
|
+
"status",
|
|
278
|
+
"--porcelain=v1",
|
|
279
|
+
"-z",
|
|
280
|
+
"--untracked-files=all",
|
|
281
|
+
]);
|
|
282
|
+
if (status.length > 0) {
|
|
283
|
+
throw new MillError("DIRTY_CHECKOUT", "The operator checkout must be clean before local delivery begins.", ExitCode.configuration);
|
|
284
|
+
}
|
|
285
|
+
return { baseCommit, commonDirectory };
|
|
286
|
+
}
|
|
287
|
+
export async function createCandidateWorktree(root, destination, baseCommit, taskId, runId) {
|
|
288
|
+
await createDetachedWorktree(root, destination, baseCommit);
|
|
289
|
+
const branch = `mill/${taskId.slice(0, 32)}-${runId.slice(0, 8)}`;
|
|
290
|
+
try {
|
|
291
|
+
await git(destination, ["switch", "-c", branch]);
|
|
292
|
+
}
|
|
293
|
+
catch (error) {
|
|
294
|
+
await removeCandidateWorktree(root, destination);
|
|
295
|
+
await deleteCandidateBranch(root, branch, baseCommit);
|
|
296
|
+
throw error;
|
|
297
|
+
}
|
|
298
|
+
return branch;
|
|
299
|
+
}
|
|
300
|
+
export async function deleteCandidateBranch(root, branch, expectedCommit) {
|
|
301
|
+
if (!/^mill\/[a-zA-Z0-9._-]+$/u.test(branch)) {
|
|
302
|
+
throw new MillError("UNSAFE_CANDIDATE_BRANCH", "Only a validated Mill-owned candidate branch may be removed.", ExitCode.configuration);
|
|
303
|
+
}
|
|
304
|
+
await git(root, ["update-ref", "-d", `refs/heads/${branch}`, expectedCommit]);
|
|
305
|
+
}
|
|
306
|
+
export async function createDetachedWorktree(root, destination, baseCommit) {
|
|
307
|
+
const stateRoot = path.dirname(path.dirname(destination));
|
|
308
|
+
if (!isWithin(stateRoot, destination)) {
|
|
309
|
+
throw new MillError("UNSAFE_WORKTREE_PATH", "Candidate worktree escaped the Mill state namespace.", ExitCode.configuration);
|
|
310
|
+
}
|
|
311
|
+
await git(root, ["worktree", "add", "--detach", destination, baseCommit]);
|
|
312
|
+
}
|
|
313
|
+
export async function removeCandidateWorktree(root, destination) {
|
|
314
|
+
try {
|
|
315
|
+
await lstat(destination);
|
|
316
|
+
}
|
|
317
|
+
catch (error) {
|
|
318
|
+
if (error instanceof Error && "code" in error && error.code === "ENOENT") {
|
|
319
|
+
await git(root, ["worktree", "prune", "--expire", "now"]);
|
|
320
|
+
return;
|
|
321
|
+
}
|
|
322
|
+
throw error;
|
|
323
|
+
}
|
|
324
|
+
await git(root, ["worktree", "remove", "--force", destination]);
|
|
325
|
+
}
|
|
326
|
+
export async function resetCandidateWorktree(worktree, commit) {
|
|
327
|
+
await git(worktree, ["reset", "--hard", commit]);
|
|
328
|
+
await git(worktree, ["clean", "-dffx"]);
|
|
329
|
+
}
|
|
330
|
+
async function candidateStatus(worktree) {
|
|
331
|
+
await assertVisibleIndexState(worktree);
|
|
332
|
+
const [status, ignored] = await Promise.all([
|
|
333
|
+
git(worktree, ["status", "--porcelain=v1", "-z", "--untracked-files=all"]),
|
|
334
|
+
git(worktree, [
|
|
335
|
+
"ls-files",
|
|
336
|
+
"--others",
|
|
337
|
+
"--ignored",
|
|
338
|
+
"--exclude-standard",
|
|
339
|
+
"-z",
|
|
340
|
+
]),
|
|
341
|
+
]);
|
|
342
|
+
return `${status}${ignored}`;
|
|
343
|
+
}
|
|
344
|
+
export async function assertVisibleIndexState(worktree) {
|
|
345
|
+
const entries = (await git(worktree, ["ls-files", "-v", "-z"]))
|
|
346
|
+
.split("\0")
|
|
347
|
+
.filter((entry) => entry.length > 0);
|
|
348
|
+
const hidden = entries.filter((entry) => !entry.startsWith("H "));
|
|
349
|
+
if (hidden.length > 0) {
|
|
350
|
+
throw new MillError("HIDDEN_GIT_INDEX_STATE", "Candidate promotion forbids index flags or non-normal tracked entries that can hide working-tree changes.", ExitCode.configuration, { entries: hidden.slice(0, 20) });
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
function allowed(pathname, patterns) {
|
|
354
|
+
return patterns.some((pattern) => {
|
|
355
|
+
if (pattern.endsWith("/**")) {
|
|
356
|
+
const prefix = pattern.slice(0, -3).replace(/\/$/u, "");
|
|
357
|
+
return pathname === prefix || pathname.startsWith(`${prefix}/`);
|
|
358
|
+
}
|
|
359
|
+
return pathname === pattern;
|
|
360
|
+
});
|
|
361
|
+
}
|
|
362
|
+
export function validateAllowedPatterns(patterns) {
|
|
363
|
+
for (const pattern of patterns) {
|
|
364
|
+
const remaining = pattern.endsWith("/**") ? pattern.slice(0, -3) : pattern;
|
|
365
|
+
if (/[*?[\]]/u.test(remaining)) {
|
|
366
|
+
throw new MillError("UNSUPPORTED_PATH_PATTERN", `Allowed path pattern is not exact or a directory prefix: ${pattern}`, ExitCode.configuration);
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
export async function changedPaths(worktree, baseCommit) {
|
|
371
|
+
const [tracked, untracked] = await Promise.all([
|
|
372
|
+
git(worktree, ["diff", "--name-only", "--no-renames", "-z", baseCommit]),
|
|
373
|
+
git(worktree, ["ls-files", "--others", "--exclude-standard", "-z"]),
|
|
374
|
+
]);
|
|
375
|
+
return [...new Set([...tracked.split("\0"), ...untracked.split("\0")])]
|
|
376
|
+
.filter((item) => item.length > 0)
|
|
377
|
+
.sort();
|
|
378
|
+
}
|
|
379
|
+
export async function assertCandidateScope(worktree, baseCommit, allowedPatterns, protectedPaths = []) {
|
|
380
|
+
validateAllowedPatterns(allowedPatterns);
|
|
381
|
+
validateAllowedPatterns(protectedPaths);
|
|
382
|
+
if ((await resolveCommit(worktree, "HEAD")) !== baseCommit) {
|
|
383
|
+
throw new MillError("BUILDER_COMMIT_FORBIDDEN", "The builder changed Git history; only the lifecycle may create the candidate commit.", ExitCode.configuration);
|
|
384
|
+
}
|
|
385
|
+
await assertVisibleIndexState(worktree);
|
|
386
|
+
const paths = await changedPaths(worktree, baseCommit);
|
|
387
|
+
if (paths.length === 0) {
|
|
388
|
+
throw new MillError("EMPTY_CANDIDATE", "The builder produced no candidate changes.", ExitCode.data);
|
|
389
|
+
}
|
|
390
|
+
for (const changed of paths) {
|
|
391
|
+
const basename = path.posix.basename(changed.replaceAll("\\", "/"));
|
|
392
|
+
if (protectedPaths.some((protectedPath) => allowed(changed, [protectedPath])) ||
|
|
393
|
+
["AGENTS.md", ".gitattributes", ".gitmodules"].includes(basename)) {
|
|
394
|
+
throw new MillError("BOUND_INPUT_MUTATION", `Candidate changed a bound runtime input: ${changed}`, ExitCode.configuration);
|
|
395
|
+
}
|
|
396
|
+
if (!allowed(changed, allowedPatterns)) {
|
|
397
|
+
throw new MillError("CANDIDATE_SCOPE_VIOLATION", `Candidate changed an unauthorized path: ${changed}`, ExitCode.configuration);
|
|
398
|
+
}
|
|
399
|
+
const absolute = path.resolve(worktree, changed);
|
|
400
|
+
if (!isWithin(worktree, absolute)) {
|
|
401
|
+
throw new MillError("CANDIDATE_PATH_ESCAPE", "Candidate path escaped the worktree.", ExitCode.configuration);
|
|
402
|
+
}
|
|
403
|
+
try {
|
|
404
|
+
if ((await lstat(absolute)).isSymbolicLink()) {
|
|
405
|
+
throw new MillError("CANDIDATE_SYMLINK_FORBIDDEN", `Candidate symlink is not supported: ${changed}`, ExitCode.configuration);
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
catch (error) {
|
|
409
|
+
if (error instanceof MillError)
|
|
410
|
+
throw error;
|
|
411
|
+
if (!(error instanceof Error &&
|
|
412
|
+
"code" in error &&
|
|
413
|
+
error.code === "ENOENT")) {
|
|
414
|
+
throw error;
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
return paths;
|
|
419
|
+
}
|
|
420
|
+
export async function commitCandidate(worktree, baseCommit, task, protectedPaths) {
|
|
421
|
+
const paths = await assertCandidateScope(worktree, baseCommit, task.allowedPaths, protectedPaths);
|
|
422
|
+
await git(worktree, ["add", "--", ...paths]);
|
|
423
|
+
await git(worktree, [
|
|
424
|
+
"-c",
|
|
425
|
+
`user.name=${task.commit.authorName}`,
|
|
426
|
+
"-c",
|
|
427
|
+
`user.email=${task.commit.authorEmail}`,
|
|
428
|
+
"-c",
|
|
429
|
+
"commit.gpgsign=false",
|
|
430
|
+
"commit",
|
|
431
|
+
"--no-verify",
|
|
432
|
+
"--no-gpg-sign",
|
|
433
|
+
"-m",
|
|
434
|
+
task.commit.message,
|
|
435
|
+
]);
|
|
436
|
+
const commit = await resolveCommit(worktree, "HEAD");
|
|
437
|
+
const tree = (await git(worktree, ["rev-parse", `${commit}^{tree}`])).trim();
|
|
438
|
+
if (!/^[a-f0-9]{40}$/u.test(tree)) {
|
|
439
|
+
throw new MillError("INVALID_CANDIDATE_TREE", "Git did not return a full candidate tree identity.", ExitCode.configuration);
|
|
440
|
+
}
|
|
441
|
+
await git(worktree, ["clean", "-dffx"]);
|
|
442
|
+
const status = await candidateStatus(worktree);
|
|
443
|
+
if (status.length > 0) {
|
|
444
|
+
throw new MillError("CANDIDATE_NOT_CLEAN", "Candidate worktree is not clean after the lifecycle commit.", ExitCode.configuration);
|
|
445
|
+
}
|
|
446
|
+
return { commit, tree };
|
|
447
|
+
}
|
|
448
|
+
export async function assertCandidateIdentity(worktree, expected) {
|
|
449
|
+
const commit = await resolveCommit(worktree, "HEAD");
|
|
450
|
+
const tree = (await git(worktree, ["rev-parse", `${commit}^{tree}`])).trim();
|
|
451
|
+
const status = await candidateStatus(worktree);
|
|
452
|
+
if (commit !== expected.commit ||
|
|
453
|
+
tree !== expected.tree ||
|
|
454
|
+
status.length > 0) {
|
|
455
|
+
throw new MillError("CANDIDATE_DRIFT", "Candidate identity or clean-worktree state changed after commitment.", ExitCode.configuration, { expectedCommit: expected.commit, actualCommit: commit });
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
//# sourceMappingURL=repository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repository.js","sourceRoot":"","sources":["../../src/runtime/repository.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { type ExclusiveLease } from "./lease.js";
|
|
2
|
+
export type RunStatus = "approved" | "ready" | "running" | "committed" | "verified" | "reviewed" | "proposing" | "effect_unknown" | "awaiting_ci" | "awaiting_human" | "merged" | "post_merge_verified" | "closed" | "blocked" | "cancelled" | "failed" | "stale";
|
|
3
|
+
export interface RunRecord {
|
|
4
|
+
id: string;
|
|
5
|
+
repositoryId: string;
|
|
6
|
+
taskId: string;
|
|
7
|
+
taskDigest: string;
|
|
8
|
+
configDigest: string;
|
|
9
|
+
status: RunStatus;
|
|
10
|
+
baseCommit: string;
|
|
11
|
+
worktreePath?: string;
|
|
12
|
+
contextDigest?: string;
|
|
13
|
+
contextJson?: string;
|
|
14
|
+
controlJson?: string;
|
|
15
|
+
candidateCommit?: string;
|
|
16
|
+
candidateTree?: string;
|
|
17
|
+
deadlineAt: string;
|
|
18
|
+
activeProcessId?: string;
|
|
19
|
+
activePid?: number;
|
|
20
|
+
activeProcessGroup?: number;
|
|
21
|
+
activeProcessIdentity?: string;
|
|
22
|
+
cancelRequested: boolean;
|
|
23
|
+
repairCount: number;
|
|
24
|
+
attemptCount: number;
|
|
25
|
+
blockCode?: string;
|
|
26
|
+
validationJson?: string;
|
|
27
|
+
reviewJson?: string;
|
|
28
|
+
deliveryJson?: string;
|
|
29
|
+
remoteFeedbackJson?: string;
|
|
30
|
+
createdAt: string;
|
|
31
|
+
updatedAt: string;
|
|
32
|
+
}
|
|
33
|
+
export type PublicRunRecord = Omit<RunRecord, "worktreePath" | "contextJson" | "controlJson" | "activeProcessId" | "activeProcessGroup" | "activeProcessIdentity" | "deliveryJson" | "remoteFeedbackJson">;
|
|
34
|
+
export declare function publicRunRecord(run: RunRecord): PublicRunRecord;
|
|
35
|
+
export declare function isTerminalRun(status: RunStatus): boolean;
|
|
36
|
+
export declare function isPurgeSafeRun(status: RunStatus): boolean;
|
|
37
|
+
export declare function repositoryStateDirectory(repositoryId: string, commonDirectory: string): string;
|
|
38
|
+
export declare class StateStore {
|
|
39
|
+
#private;
|
|
40
|
+
readonly directory: string;
|
|
41
|
+
readonly databasePath: string;
|
|
42
|
+
readonly worktreesDirectory: string;
|
|
43
|
+
private constructor();
|
|
44
|
+
static open(repositoryId: string, commonDirectory: string): Promise<StateStore>;
|
|
45
|
+
close(): void;
|
|
46
|
+
createRun(input: {
|
|
47
|
+
repositoryId: string;
|
|
48
|
+
taskId: string;
|
|
49
|
+
taskDigest: string;
|
|
50
|
+
configDigest: string;
|
|
51
|
+
baseCommit: string;
|
|
52
|
+
deadlineAt: string;
|
|
53
|
+
}): RunRecord;
|
|
54
|
+
getRun(id: string): RunRecord;
|
|
55
|
+
latestRun(): RunRecord | undefined;
|
|
56
|
+
runs(): readonly RunRecord[];
|
|
57
|
+
transition(id: string, to: RunStatus, eventType: string, details?: Record<string, string | number | boolean | null>): RunRecord;
|
|
58
|
+
setWorkspace(id: string, worktreePath: string, contextDigest: string, contextJson: string, controlJson: string): void;
|
|
59
|
+
commitCandidate(id: string, commit: string, tree: string, invocationId?: string): RunRecord;
|
|
60
|
+
completeValidation(id: string, value: string, passed: boolean): RunRecord;
|
|
61
|
+
completeReview(id: string, value: string, findings: number, nonConverged: boolean, invocationId: string, completionDetails?: Record<string, string | number | boolean | null>): RunRecord;
|
|
62
|
+
setDelivery(id: string, deliveryJson: string, eventType: string, details?: Record<string, string | number | boolean | null>): RunRecord;
|
|
63
|
+
setRemoteFeedback(id: string, feedbackJson: string): RunRecord;
|
|
64
|
+
replaceBlocker(id: string, code: string, eventType: string, details?: Record<string, string | number | boolean | null>): RunRecord;
|
|
65
|
+
beginRepair(id: string): RunRecord;
|
|
66
|
+
beginReviewAttempt(id: string, maximum: number): number;
|
|
67
|
+
recordBaselineQualification(input: {
|
|
68
|
+
approvalDigest: string;
|
|
69
|
+
repositoryId: string;
|
|
70
|
+
taskDigest: string;
|
|
71
|
+
configDigest: string;
|
|
72
|
+
baseCommit: string;
|
|
73
|
+
evidenceDigest: string;
|
|
74
|
+
}): void;
|
|
75
|
+
hasBaselineQualification(input: {
|
|
76
|
+
approvalDigest: string;
|
|
77
|
+
repositoryId: string;
|
|
78
|
+
taskDigest: string;
|
|
79
|
+
configDigest: string;
|
|
80
|
+
baseCommit: string;
|
|
81
|
+
}): boolean;
|
|
82
|
+
beginBuilderAttempt(id: string, maximum: number): void;
|
|
83
|
+
setActiveProcess(id: string, process: {
|
|
84
|
+
id: string;
|
|
85
|
+
pid: number;
|
|
86
|
+
processGroup: number;
|
|
87
|
+
identity: string;
|
|
88
|
+
} | null): void;
|
|
89
|
+
clearActiveProcess(id: string, processId: string): void;
|
|
90
|
+
requestCancellation(id: string): RunRecord;
|
|
91
|
+
backup(): Promise<string>;
|
|
92
|
+
events(id: string): readonly Record<string, unknown>[];
|
|
93
|
+
recordEvent(id: string, type: string, data: Record<string, string | number | boolean | null>): void;
|
|
94
|
+
admitWorkerInvocation(input: {
|
|
95
|
+
runId: string;
|
|
96
|
+
invocationId: string;
|
|
97
|
+
phase: string;
|
|
98
|
+
envelopeDigest: string;
|
|
99
|
+
envelopeJson: string;
|
|
100
|
+
}): "created" | "existing";
|
|
101
|
+
workerInvocationStatus(invocationId: string): "admitted" | "launch_started" | "settled" | "uncertain" | "reconciled";
|
|
102
|
+
markWorkerLaunchStarted(invocationId: string): void;
|
|
103
|
+
settleWorkerInvocation(invocationId: string, outcome: "completed" | "failed" | "uncertain", details?: Record<string, string | number | boolean | null>): void;
|
|
104
|
+
recordWorkerProcessExit(runId: string, invocationId: string, processId?: string): void;
|
|
105
|
+
unresolvedMutatingWorkerInvocations(runId: string): readonly {
|
|
106
|
+
invocationId: string;
|
|
107
|
+
phase: "build" | "repair";
|
|
108
|
+
status: "launch_started" | "uncertain";
|
|
109
|
+
processExited: boolean;
|
|
110
|
+
}[];
|
|
111
|
+
reconcileWorkerInvocation(runId: string, invocationId: string, reason: "process_exit_observed" | "recorded_process_absent"): void;
|
|
112
|
+
}
|
|
113
|
+
export type WriterLease = ExclusiveLease;
|
|
114
|
+
export declare function acquireWriterLease(store: StateStore): Promise<WriterLease>;
|
|
115
|
+
export declare function restoreStateBackup(repositoryId: string, commonDirectory: string, backupPath: string): Promise<StateRestoreReport>;
|
|
116
|
+
export interface StateRestoreReport {
|
|
117
|
+
quarantinedCount: number;
|
|
118
|
+
quarantineManifest?: string;
|
|
119
|
+
}
|
|
120
|
+
export declare function purgeRepositoryState(repositoryId: string, commonDirectory: string): Promise<void>;
|
|
121
|
+
//# sourceMappingURL=state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../src/runtime/state.ts"],"names":[],"mappings":"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"}
|