@codetreker/daynight 0.3.0 → 0.6.2
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/dist/api/client.d.ts +43 -0
- package/dist/api/client.js +285 -0
- package/dist/api/client.js.map +1 -0
- package/dist/api/index.d.ts +7 -0
- package/dist/api/index.js +5 -0
- package/dist/api/index.js.map +1 -0
- package/dist/api/json.d.ts +3 -0
- package/dist/api/json.js +25 -0
- package/dist/api/json.js.map +1 -0
- package/dist/api/operation.d.ts +23 -0
- package/dist/api/operation.js +78 -0
- package/dist/api/operation.js.map +1 -0
- package/dist/api/parse.d.ts +12 -0
- package/dist/api/parse.js +160 -0
- package/dist/api/parse.js.map +1 -0
- package/dist/api/types.d.ts +75 -0
- package/dist/api/types.js +2 -0
- package/dist/api/types.js.map +1 -0
- package/dist/cli/application.js +10 -20
- package/dist/cli/application.js.map +1 -1
- package/dist/cli/commands.d.ts +3 -3
- package/dist/cli/commands.js +29 -4
- package/dist/cli/commands.js.map +1 -1
- package/dist/cli/schema.d.ts +53 -0
- package/dist/cli/schema.js +113 -0
- package/dist/cli/schema.js.map +1 -0
- package/dist/commands/completion/bash.d.ts +2 -0
- package/dist/commands/completion/bash.js +279 -0
- package/dist/commands/completion/bash.js.map +1 -0
- package/dist/commands/completion/command.d.ts +2 -0
- package/dist/commands/completion/command.js +20 -0
- package/dist/commands/completion/command.js.map +1 -0
- package/dist/commands/completion/definition.d.ts +2 -0
- package/dist/commands/completion/definition.js +8 -0
- package/dist/commands/completion/definition.js.map +1 -0
- package/dist/commands/completion/zsh.d.ts +2 -0
- package/dist/commands/completion/zsh.js +165 -0
- package/dist/commands/completion/zsh.js.map +1 -0
- package/dist/commands/project/command.d.ts +6 -0
- package/dist/commands/project/command.js +39 -0
- package/dist/commands/project/command.js.map +1 -0
- package/dist/commands/project/definition.d.ts +2 -0
- package/dist/commands/project/definition.js +35 -0
- package/dist/commands/project/definition.js.map +1 -0
- package/dist/commands/project/rendering.d.ts +4 -0
- package/dist/commands/project/rendering.js +17 -0
- package/dist/commands/project/rendering.js.map +1 -0
- package/dist/commands/review/adapters/copilot.d.ts +16 -9
- package/dist/commands/review/adapters/copilot.js +196 -99
- package/dist/commands/review/adapters/copilot.js.map +1 -1
- package/dist/commands/review/command.js +16 -98
- package/dist/commands/review/command.js.map +1 -1
- package/dist/commands/review/config.d.ts +1 -2
- package/dist/commands/review/config.js +24 -43
- package/dist/commands/review/config.js.map +1 -1
- package/dist/commands/review/coordinator.d.ts +2 -2
- package/dist/commands/review/coordinator.js +5 -1
- package/dist/commands/review/coordinator.js.map +1 -1
- package/dist/commands/review/definition.d.ts +2 -0
- package/dist/commands/review/definition.js +33 -0
- package/dist/commands/review/definition.js.map +1 -0
- package/dist/commands/review/listing.js +2 -8
- package/dist/commands/review/listing.js.map +1 -1
- package/dist/commands/review/paths.d.ts +2 -3
- package/dist/commands/review/paths.js +4 -6
- package/dist/commands/review/paths.js.map +1 -1
- package/dist/commands/review/processes.d.ts +2 -2
- package/dist/commands/review/repositories.js +13 -102
- package/dist/commands/review/repositories.js.map +1 -1
- package/dist/commands/review/runtime.d.ts +4 -1
- package/dist/commands/review/runtime.js +7 -4
- package/dist/commands/review/runtime.js.map +1 -1
- package/dist/commands/review/skill.d.ts +11 -0
- package/dist/commands/review/skill.js +242 -0
- package/dist/commands/review/skill.js.map +1 -0
- package/dist/commands/review/skills/daynight-review/SKILL.md +63 -0
- package/dist/commands/review/store.d.ts +4 -0
- package/dist/commands/review/store.js +8 -0
- package/dist/commands/review/store.js.map +1 -1
- package/dist/commands/server/runtime.d.ts +16 -0
- package/dist/commands/server/runtime.js +52 -0
- package/dist/commands/server/runtime.js.map +1 -0
- package/dist/commands/task/command.d.ts +8 -0
- package/dist/commands/task/command.js +106 -0
- package/dist/commands/task/command.js.map +1 -0
- package/dist/commands/task/definition.d.ts +2 -0
- package/dist/commands/task/definition.js +50 -0
- package/dist/commands/task/definition.js.map +1 -0
- package/dist/commands/task/rendering.d.ts +5 -0
- package/dist/commands/task/rendering.js +49 -0
- package/dist/commands/task/rendering.js.map +1 -0
- package/dist/commands/update/command.js +5 -15
- package/dist/commands/update/command.js.map +1 -1
- package/dist/commands/update/definition.d.ts +2 -0
- package/dist/commands/update/definition.js +7 -0
- package/dist/commands/update/definition.js.map +1 -0
- package/dist/config/document.d.ts +9 -0
- package/dist/config/document.js +45 -0
- package/dist/config/document.js.map +1 -0
- package/dist/config/files.d.ts +7 -0
- package/dist/config/files.js +69 -0
- package/dist/config/files.js.map +1 -0
- package/dist/config/paths.d.ts +6 -0
- package/dist/config/paths.js +9 -0
- package/dist/config/paths.js.map +1 -0
- package/dist/config/server.d.ts +7 -0
- package/dist/config/server.js +34 -0
- package/dist/config/server.js.map +1 -0
- package/dist/platform/files.d.ts +1 -0
- package/dist/platform/files.js +48 -0
- package/dist/platform/files.js.map +1 -0
- package/dist/platform/terminal.d.ts +1 -0
- package/dist/platform/terminal.js +10 -0
- package/dist/platform/terminal.js.map +1 -0
- package/dist/platform/text.d.ts +2 -0
- package/dist/platform/text.js +3 -0
- package/dist/platform/text.js.map +1 -0
- package/dist/repository/binding.d.ts +21 -0
- package/dist/repository/binding.js +242 -0
- package/dist/repository/binding.js.map +1 -0
- package/dist/repository/context.d.ts +10 -0
- package/dist/repository/context.js +32 -0
- package/dist/repository/context.js.map +1 -0
- package/dist/repository/git.d.ts +20 -0
- package/dist/repository/git.js +213 -0
- package/dist/repository/git.js.map +1 -0
- package/dist/repository/identity.d.ts +5 -0
- package/dist/repository/identity.js +154 -0
- package/dist/repository/identity.js.map +1 -0
- package/dist/repository/index.d.ts +4 -0
- package/dist/repository/index.js +3 -0
- package/dist/repository/index.js.map +1 -0
- package/package.json +5 -4
|
@@ -1,12 +1,10 @@
|
|
|
1
1
|
import path from "node:path";
|
|
2
|
+
import { resolveConfigurationPaths } from "../../config/paths.js";
|
|
2
3
|
export const resolveReviewPaths = (homeDirectory, pathApi = path) => {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
}
|
|
6
|
-
const stateDirectory = pathApi.resolve(homeDirectory, ".daynight");
|
|
4
|
+
const configurationPaths = resolveConfigurationPaths(homeDirectory, pathApi);
|
|
5
|
+
const { stateDirectory } = configurationPaths;
|
|
7
6
|
return {
|
|
8
|
-
|
|
9
|
-
configFile: pathApi.join(stateDirectory, "config.yml"),
|
|
7
|
+
...configurationPaths,
|
|
10
8
|
databaseFile: pathApi.join(stateDirectory, "state.sqlite"),
|
|
11
9
|
lockFile: pathApi.join(stateDirectory, "instance.lock"),
|
|
12
10
|
copilotDirectory: pathApi.join(stateDirectory, "copilot"),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../../src/commands/review/paths.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../../src/commands/review/paths.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AAalE,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAChC,aAAqB,EACrB,OAAO,GAAY,IAAI,EACV,EAAE;IACf,MAAM,kBAAkB,GAAG,yBAAyB,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;IAC7E,MAAM,EAAE,cAAc,EAAE,GAAG,kBAAkB,CAAC;IAC9C,OAAO;QACL,GAAG,kBAAkB;QACrB,YAAY,EAAE,OAAO,CAAC,IAAI,CAAC,cAAc,EAAE,cAAc,CAAC;QAC1D,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,cAAc,EAAE,eAAe,CAAC;QACvD,gBAAgB,EAAE,OAAO,CAAC,IAAI,CAAC,cAAc,EAAE,SAAS,CAAC;QACzD,cAAc,EAAE,OAAO,CAAC,IAAI,CAAC,cAAc,EAAE,OAAO,CAAC;QACrD,kBAAkB,EAAE,OAAO,CAAC,IAAI,CAAC,cAAc,EAAE,KAAK,CAAC;QACvD,aAAa,EAAE,OAAO,CAAC,IAAI,CAAC,cAAc,EAAE,MAAM,CAAC;KACpD,CAAC;AACJ,CAAC,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { ChildProcess } from "node:child_process";
|
|
2
|
-
import type {
|
|
2
|
+
import type { CopilotProcessOutcome } from "./adapters/copilot.js";
|
|
3
3
|
import type { AttemptIdentity, ReviewState } from "./model.js";
|
|
4
4
|
export declare const processGroupIsExecuting: (pid: number, operations: {
|
|
5
5
|
probe: (pid: number) => void;
|
|
@@ -12,7 +12,7 @@ export declare const createProcessSupervisor: (options?: {
|
|
|
12
12
|
}) => {
|
|
13
13
|
onProcess: (child: ChildProcess, attempt: AttemptIdentity) => void;
|
|
14
14
|
stop: (child: ChildProcess, attempt: AttemptIdentity) => Promise<void>;
|
|
15
|
-
exclude: (review: ReviewState, outcome?:
|
|
15
|
+
exclude: (review: ReviewState, outcome?: CopilotProcessOutcome) => Promise<{
|
|
16
16
|
processesExcluded: true;
|
|
17
17
|
}>;
|
|
18
18
|
recover: (_review?: ReviewState) => Promise<{
|
|
@@ -1,10 +1,9 @@
|
|
|
1
|
-
import { randomUUID } from "node:crypto";
|
|
2
|
-
import { lstat, mkdir, open, readFile, rename, unlink } from "node:fs/promises";
|
|
3
1
|
import path from "node:path";
|
|
4
2
|
import { Document } from "yaml";
|
|
5
|
-
import {
|
|
3
|
+
import { parseConfigurationDocument } from "../../config/document.js";
|
|
4
|
+
import { updateConfigurationFile } from "../../config/files.js";
|
|
5
|
+
import { defaultRepositoryRoot, remoteIdentity, resolveRepositoryRoot, validateConfigurationSource, validateRegistrationConfigurationSource } from "./config.js";
|
|
6
6
|
import { missingPathsReferToSameDirectory, resolvePhysicalDirectory } from "../../platform/filesystem.js";
|
|
7
|
-
const hasCode = (error, code) => error instanceof Error && "code" in error && error.code === code;
|
|
8
7
|
const repositoryPathComponent = (component) => {
|
|
9
8
|
let escaped = component.replace(/[<>:"/\\|?*]/g, (character) => `%${character.charCodeAt(0).toString(16).toUpperCase()}`)
|
|
10
9
|
.replace(/\.+$/, (dots) => "%2E".repeat(dots.length));
|
|
@@ -21,28 +20,15 @@ const sameDirectory = async (first, second) => {
|
|
|
21
20
|
return left.missingComponents.every((component, index) => component === right.missingComponents[index]) ||
|
|
22
21
|
missingPathsReferToSameDirectory(left.ancestorPath, left.missingComponents, right.missingComponents);
|
|
23
22
|
};
|
|
24
|
-
const updateConfiguration = async (input, runtimePaths, options) => {
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
existingEntry = await lstat(runtimePaths.configFile);
|
|
28
|
-
}
|
|
29
|
-
catch (cause) {
|
|
30
|
-
if (!hasCode(cause, "ENOENT")) {
|
|
31
|
-
throw new Error(`Cannot inspect configuration file ${runtimePaths.configFile}.`, { cause });
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
if (existingEntry !== undefined && !existingEntry.isFile()) {
|
|
35
|
-
throw new Error(`Configuration file ${runtimePaths.configFile} must be a regular file; symbolic-link writes are not supported.`);
|
|
36
|
-
}
|
|
37
|
-
const source = existingEntry === undefined ? undefined : await readFile(runtimePaths.configFile, "utf8");
|
|
38
|
-
const existing = source === undefined ? undefined : await validateConfigurationSource(source, runtimePaths);
|
|
39
|
-
const document = source === undefined ? new Document({ repositoryRoot: defaultRepositoryRoot, repositories: [] }) : parseConfigurationDocument(source, runtimePaths);
|
|
23
|
+
const updateConfiguration = async (source, input, runtimePaths, options) => {
|
|
24
|
+
const existing = source === undefined ? undefined : await validateRegistrationConfigurationSource(source, runtimePaths);
|
|
25
|
+
const document = source === undefined ? new Document({ repositoryRoot: defaultRepositoryRoot, repositories: [] }) : parseConfigurationDocument(source, runtimePaths).document;
|
|
40
26
|
const decoded = document.toJS();
|
|
41
27
|
const root = document.has("repositoryRoot") ? decoded.repositoryRoot : defaultRepositoryRoot;
|
|
42
28
|
const identity = remoteIdentity(input.remote, "remote");
|
|
43
29
|
const previous = existing?.repositories.find((repository) => repository.coordinate === identity.coordinate);
|
|
44
30
|
if (previous !== undefined && input.path === undefined) {
|
|
45
|
-
return { repository: previous, added: false };
|
|
31
|
+
return { result: { repository: previous, added: false } };
|
|
46
32
|
}
|
|
47
33
|
let repositoryPath;
|
|
48
34
|
if (input.path === undefined) {
|
|
@@ -59,101 +45,26 @@ const updateConfiguration = async (input, runtimePaths, options) => {
|
|
|
59
45
|
}
|
|
60
46
|
if (previous !== undefined) {
|
|
61
47
|
if (await sameDirectory(previous.path, repositoryPath)) {
|
|
62
|
-
return { repository: previous, added: false };
|
|
48
|
+
return { result: { repository: previous, added: false } };
|
|
63
49
|
}
|
|
64
50
|
throw new Error(`Repository ${identity.coordinate} is already configured at ${previous.path}; the requested path ${repositoryPath} differs.`);
|
|
65
51
|
}
|
|
66
52
|
if (!document.has("repositoryRoot")) {
|
|
67
53
|
document.set("repositoryRoot", defaultRepositoryRoot);
|
|
68
54
|
}
|
|
55
|
+
if (!document.has("repositories")) {
|
|
56
|
+
document.set("repositories", document.createNode([]));
|
|
57
|
+
}
|
|
69
58
|
document.addIn(["repositories"], { remote: input.remote, path: repositoryPath });
|
|
70
59
|
const updatedSource = document.toString();
|
|
71
60
|
const configuration = await validateConfigurationSource(updatedSource, runtimePaths);
|
|
72
61
|
const repository = configuration.repositories.at(-1);
|
|
73
|
-
|
|
74
|
-
const handle = await open(temporaryFile, "wx", 0o600);
|
|
75
|
-
let failure;
|
|
76
|
-
let renamed = false;
|
|
77
|
-
let closed = false;
|
|
78
|
-
try {
|
|
79
|
-
await handle.writeFile(updatedSource, "utf8");
|
|
80
|
-
if (existingEntry !== undefined) {
|
|
81
|
-
await handle.chmod(existingEntry.mode & 0o777);
|
|
82
|
-
}
|
|
83
|
-
await handle.sync();
|
|
84
|
-
await handle.close();
|
|
85
|
-
closed = true;
|
|
86
|
-
await rename(temporaryFile, runtimePaths.configFile);
|
|
87
|
-
renamed = true;
|
|
88
|
-
return { repository, added: true };
|
|
89
|
-
}
|
|
90
|
-
catch (cause) {
|
|
91
|
-
failure = cause;
|
|
92
|
-
throw cause;
|
|
93
|
-
}
|
|
94
|
-
finally {
|
|
95
|
-
const cleanup = [];
|
|
96
|
-
if (!closed) {
|
|
97
|
-
try {
|
|
98
|
-
await handle.close();
|
|
99
|
-
}
|
|
100
|
-
catch (cause) {
|
|
101
|
-
cleanup.push(cause);
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
if (!renamed) {
|
|
105
|
-
try {
|
|
106
|
-
await unlink(temporaryFile);
|
|
107
|
-
}
|
|
108
|
-
catch (cause) {
|
|
109
|
-
cleanup.push(cause);
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
if (cleanup.length !== 0) {
|
|
113
|
-
throw new AggregateError(failure === undefined ? cleanup : [failure, ...cleanup], "Configuration write or temporary-file cleanup failed.");
|
|
114
|
-
}
|
|
115
|
-
}
|
|
62
|
+
return { result: { repository, added: true }, source: updatedSource };
|
|
116
63
|
};
|
|
117
64
|
export const addRepository = async (input, runtimePaths, options) => {
|
|
118
65
|
if (!path.isAbsolute(options.workingDirectory) || !path.isAbsolute(options.homeDirectory)) {
|
|
119
66
|
throw new Error("The working directory and home directory must be absolute paths.");
|
|
120
67
|
}
|
|
121
|
-
|
|
122
|
-
const lockFile = `${runtimePaths.configFile}.lock`;
|
|
123
|
-
let lock;
|
|
124
|
-
try {
|
|
125
|
-
lock = await open(lockFile, "wx", 0o600);
|
|
126
|
-
}
|
|
127
|
-
catch (cause) {
|
|
128
|
-
throw new Error(hasCode(cause, "EEXIST")
|
|
129
|
-
? `Configuration is locked by another writer at ${lockFile}; retry when that writer exits. Remove the lock only after confirming no writer is running.`
|
|
130
|
-
: `Cannot acquire configuration lock ${lockFile}.`, { cause });
|
|
131
|
-
}
|
|
132
|
-
let failure;
|
|
133
|
-
try {
|
|
134
|
-
return await updateConfiguration(input, runtimePaths, options);
|
|
135
|
-
}
|
|
136
|
-
catch (cause) {
|
|
137
|
-
failure = cause;
|
|
138
|
-
throw cause;
|
|
139
|
-
}
|
|
140
|
-
finally {
|
|
141
|
-
const cleanup = [];
|
|
142
|
-
try {
|
|
143
|
-
await lock.close();
|
|
144
|
-
}
|
|
145
|
-
catch (cause) {
|
|
146
|
-
cleanup.push(cause);
|
|
147
|
-
}
|
|
148
|
-
try {
|
|
149
|
-
await unlink(lockFile);
|
|
150
|
-
}
|
|
151
|
-
catch (cause) {
|
|
152
|
-
cleanup.push(cause);
|
|
153
|
-
}
|
|
154
|
-
if (cleanup.length !== 0) {
|
|
155
|
-
throw new AggregateError(failure === undefined ? cleanup : [failure, ...cleanup], "Configuration update or lock cleanup failed.");
|
|
156
|
-
}
|
|
157
|
-
}
|
|
68
|
+
return updateConfigurationFile(runtimePaths, (source) => updateConfiguration(source, input, runtimePaths, options));
|
|
158
69
|
};
|
|
159
70
|
//# sourceMappingURL=repositories.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repositories.js","sourceRoot":"","sources":["../../../src/commands/review/repositories.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"repositories.js","sourceRoot":"","sources":["../../../src/commands/review/repositories.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,11 +4,13 @@ import { createGitManager } from "./adapters/worktrees.js";
|
|
|
4
4
|
import { createGitHubClient } from "./adapters/github.js";
|
|
5
5
|
import { createProcessSupervisor } from "./processes.js";
|
|
6
6
|
import { openStore } from "./store.js";
|
|
7
|
+
import { prepareReviewSkill } from "./skill.js";
|
|
7
8
|
import type { ReviewConfiguration } from "./config.js";
|
|
8
9
|
import type { CoordinatorEvent } from "./coordinator.js";
|
|
9
10
|
import type { ReviewPaths } from "./paths.js";
|
|
10
11
|
export { acquireInstanceLock } from "./instance-lock.js";
|
|
11
12
|
export type RuntimeDependencies = {
|
|
13
|
+
prepareSkill: typeof prepareReviewSkill;
|
|
12
14
|
openStore: typeof openStore;
|
|
13
15
|
createClient: typeof createGitHubClient;
|
|
14
16
|
createGit: typeof createGitManager;
|
|
@@ -17,7 +19,8 @@ export type RuntimeDependencies = {
|
|
|
17
19
|
coordinate: typeof runCoordinator;
|
|
18
20
|
};
|
|
19
21
|
export declare const formatCoordinatorEvent: (event: CoordinatorEvent) => string;
|
|
20
|
-
export declare const runForegroundReview: (configuration: ReviewConfiguration, paths: ReviewPaths, options
|
|
22
|
+
export declare const runForegroundReview: (configuration: ReviewConfiguration, paths: ReviewPaths, options: {
|
|
23
|
+
packageDirectory: string;
|
|
21
24
|
signal?: AbortSignal;
|
|
22
25
|
log?: (event: CoordinatorEvent) => void;
|
|
23
26
|
dependencies?: RuntimeDependencies;
|
|
@@ -7,9 +7,10 @@ import { createGitHubClient } from "./adapters/github.js";
|
|
|
7
7
|
import { acquireInstanceLock } from "./instance-lock.js";
|
|
8
8
|
import { createProcessSupervisor } from "./processes.js";
|
|
9
9
|
import { openStore } from "./store.js";
|
|
10
|
+
import { prepareReviewSkill } from "./skill.js";
|
|
10
11
|
export { acquireInstanceLock } from "./instance-lock.js";
|
|
11
12
|
const defaultDependencies = {
|
|
12
|
-
openStore, createClient: createGitHubClient, createGit: createGitManager,
|
|
13
|
+
prepareSkill: prepareReviewSkill, openStore, createClient: createGitHubClient, createGit: createGitManager,
|
|
13
14
|
createRunner: createCopilotRunner, createProcesses: createProcessSupervisor, coordinate: runCoordinator,
|
|
14
15
|
};
|
|
15
16
|
export const formatCoordinatorEvent = (event) => {
|
|
@@ -19,7 +20,7 @@ export const formatCoordinatorEvent = (event) => {
|
|
|
19
20
|
event.attempt === undefined ? undefined : `attempt=${event.attempt}`].filter((value) => value !== undefined).join(" ");
|
|
20
21
|
return `${identity === "" ? "" : `${identity} `}${event.phase}: ${event.message}${event.retryAt === undefined ? "" : ` retryAt=${new Date(event.retryAt).toISOString()}`}${event.error === undefined ? "" : `\n${formatError(event.error)}`}`;
|
|
21
22
|
};
|
|
22
|
-
export const runForegroundReview = async (configuration, paths, options
|
|
23
|
+
export const runForegroundReview = async (configuration, paths, options) => {
|
|
23
24
|
const dependencies = options.dependencies === undefined ? defaultDependencies : options.dependencies;
|
|
24
25
|
const log = options.log === undefined ? (event) => { process.stderr.write(`${formatCoordinatorEvent(event)}\n`); } : options.log;
|
|
25
26
|
const controller = new AbortController();
|
|
@@ -38,12 +39,14 @@ export const runForegroundReview = async (configuration, paths, options = {}) =>
|
|
|
38
39
|
lock = await acquireInstanceLock(paths.lockFile);
|
|
39
40
|
safe = lock.previousProcessesExcluded;
|
|
40
41
|
signal.throwIfAborted();
|
|
42
|
+
const skill = await dependencies.prepareSkill(options.packageDirectory, paths.cacheDirectory);
|
|
43
|
+
signal.throwIfAborted();
|
|
41
44
|
store = dependencies.openStore(paths.databaseFile);
|
|
42
45
|
const client = dependencies.createClient();
|
|
43
46
|
const git = dependencies.createGit({ temporaryDirectory: paths.temporaryDirectory, client });
|
|
44
47
|
const processes = dependencies.createProcesses(lock.previousProcessesExcluded ? { previousProcessesExcluded: true } : {});
|
|
45
|
-
const runner = dependencies.createRunner({ paths, processOwner: lock.owner, timeoutMs: configuration.agentTimeoutMs });
|
|
46
|
-
log({ level: "info", phase: "startup", message: `Foreground review started; state=${paths.stateDirectory}.` });
|
|
48
|
+
const runner = dependencies.createRunner({ paths, skill, processOwner: lock.owner, timeoutMs: configuration.agentTimeoutMs });
|
|
49
|
+
log({ level: "info", phase: "startup", message: `Foreground review started; state=${paths.stateDirectory}; skill=${skill.name} digest=${skill.digest}.` });
|
|
47
50
|
safe = false;
|
|
48
51
|
const result = await dependencies.coordinate({ configuration, store, client, git, runner, processes, signal, log });
|
|
49
52
|
safe = result.safeToReleaseLock && processes.safeToReleaseLock;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../../src/commands/review/runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../../src/commands/review/runtime.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
declare const skillName = "daynight-review";
|
|
2
|
+
export type PreparedReviewSkill = {
|
|
3
|
+
name: typeof skillName;
|
|
4
|
+
digest: string;
|
|
5
|
+
rootDirectory: string;
|
|
6
|
+
directory: string;
|
|
7
|
+
entrypoint: string;
|
|
8
|
+
};
|
|
9
|
+
export declare const prepareReviewSkill: (packageDirectory: string, cacheDirectory: string) => Promise<PreparedReviewSkill>;
|
|
10
|
+
export declare const validateReviewSkillDiscovery: (output: string, skill: PreparedReviewSkill) => Promise<void>;
|
|
11
|
+
export {};
|
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { lstat, mkdir, mkdtemp, readFile, readdir, realpath, rename, rm, writeFile } from "node:fs/promises";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { parseDocument } from "yaml";
|
|
5
|
+
const skillName = "daynight-review";
|
|
6
|
+
const pluginManifest = Buffer.from(`${JSON.stringify({
|
|
7
|
+
$schema: "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json",
|
|
8
|
+
name: "daynight-review-bundle",
|
|
9
|
+
version: "1.0.0",
|
|
10
|
+
})}\n`, "utf8");
|
|
11
|
+
const hasCode = (error, code) => error instanceof Error && "code" in error && error.code === code;
|
|
12
|
+
const captureBundle = async (directory) => {
|
|
13
|
+
const root = await lstat(directory);
|
|
14
|
+
if (!root.isDirectory() || root.isSymbolicLink()) {
|
|
15
|
+
throw new Error(`Review skill bundle must be a directory without symbolic links: ${directory}.`);
|
|
16
|
+
}
|
|
17
|
+
const entries = [];
|
|
18
|
+
const visit = async (relativeDirectory) => {
|
|
19
|
+
const names = await readdir(path.join(directory, relativeDirectory));
|
|
20
|
+
for (const name of names) {
|
|
21
|
+
if (name === "" || name === "." || name === ".." || /[/\\\0]/u.test(name)) {
|
|
22
|
+
throw new Error(`Review skill bundle contains an invalid path segment: ${JSON.stringify(name)}.`);
|
|
23
|
+
}
|
|
24
|
+
const relativePath = relativeDirectory === "" ? name : `${relativeDirectory}/${name}`;
|
|
25
|
+
const filename = path.join(directory, ...relativePath.split("/"));
|
|
26
|
+
const entry = await lstat(filename);
|
|
27
|
+
if (entry.isSymbolicLink()) {
|
|
28
|
+
throw new Error(`Review skill bundle must not contain symbolic links: ${filename}.`);
|
|
29
|
+
}
|
|
30
|
+
if (entry.isDirectory()) {
|
|
31
|
+
entries.push({ relativePath, type: "directory" });
|
|
32
|
+
await visit(relativePath);
|
|
33
|
+
}
|
|
34
|
+
else if (entry.isFile()) {
|
|
35
|
+
entries.push({ relativePath, type: "file", contents: await readFile(filename) });
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
throw new Error(`Review skill bundle must contain only regular files and directories: ${filename}.`);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
await visit("");
|
|
43
|
+
return entries.sort((left, right) => left.relativePath < right.relativePath ? -1 : left.relativePath > right.relativePath ? 1 : 0);
|
|
44
|
+
};
|
|
45
|
+
const validateEntrypoint = (entries) => {
|
|
46
|
+
const entrypoint = entries.find((entry) => entry.relativePath === "SKILL.md");
|
|
47
|
+
if (entrypoint?.type !== "file") {
|
|
48
|
+
throw new Error("Review skill bundle must contain a regular SKILL.md file.");
|
|
49
|
+
}
|
|
50
|
+
let source;
|
|
51
|
+
try {
|
|
52
|
+
source = new TextDecoder("utf-8", { fatal: true }).decode(entrypoint.contents);
|
|
53
|
+
}
|
|
54
|
+
catch (cause) {
|
|
55
|
+
throw new Error("Review skill SKILL.md must be valid UTF-8.", { cause });
|
|
56
|
+
}
|
|
57
|
+
const frontmatter = /^---\r?\n([\s\S]*?)\r?\n---(?:\r?\n|$)/u.exec(source);
|
|
58
|
+
if (frontmatter === null) {
|
|
59
|
+
throw new Error("Review skill SKILL.md must begin with YAML frontmatter.");
|
|
60
|
+
}
|
|
61
|
+
const document = parseDocument(frontmatter[1], {
|
|
62
|
+
strict: true,
|
|
63
|
+
uniqueKeys: true,
|
|
64
|
+
stringKeys: true,
|
|
65
|
+
prettyErrors: false,
|
|
66
|
+
});
|
|
67
|
+
const problems = [...document.errors, ...document.warnings];
|
|
68
|
+
if (problems.length !== 0) {
|
|
69
|
+
throw new Error("Review skill SKILL.md has invalid YAML frontmatter.", {
|
|
70
|
+
cause: new AggregateError(problems, "Review skill frontmatter was rejected."),
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
let metadata;
|
|
74
|
+
try {
|
|
75
|
+
metadata = document.toJS();
|
|
76
|
+
}
|
|
77
|
+
catch (cause) {
|
|
78
|
+
throw new Error("Cannot decode review skill frontmatter.", { cause });
|
|
79
|
+
}
|
|
80
|
+
if (typeof metadata !== "object" || metadata === null || Array.isArray(metadata)) {
|
|
81
|
+
throw new Error("Review skill frontmatter must be a mapping.");
|
|
82
|
+
}
|
|
83
|
+
if (!("name" in metadata) || metadata.name !== skillName) {
|
|
84
|
+
throw new Error(`Review skill frontmatter name must be ${skillName}.`);
|
|
85
|
+
}
|
|
86
|
+
if (!("description" in metadata) || typeof metadata.description !== "string" || metadata.description.trim() === "" || metadata.description.includes("\0")) {
|
|
87
|
+
throw new Error("Review skill frontmatter description must be a nonempty string without NUL characters.");
|
|
88
|
+
}
|
|
89
|
+
};
|
|
90
|
+
const bundleDigest = (entries) => {
|
|
91
|
+
const hash = createHash("sha256").update("daynight-review-plugin-bundle-v1\0");
|
|
92
|
+
const append = (bytes) => {
|
|
93
|
+
const size = Buffer.alloc(8);
|
|
94
|
+
size.writeBigUInt64BE(BigInt(bytes.length));
|
|
95
|
+
hash.update(size).update(bytes);
|
|
96
|
+
};
|
|
97
|
+
for (const entry of entries) {
|
|
98
|
+
hash.update(entry.type === "file" ? "f" : "d");
|
|
99
|
+
append(Buffer.from(entry.relativePath, "utf8"));
|
|
100
|
+
if (entry.type === "file") {
|
|
101
|
+
append(entry.contents);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
return hash.digest("hex");
|
|
105
|
+
};
|
|
106
|
+
const pluginBundle = (entries) => [
|
|
107
|
+
{ relativePath: "plugin.json", type: "file", contents: pluginManifest },
|
|
108
|
+
{ relativePath: "skills", type: "directory" },
|
|
109
|
+
{ relativePath: `skills/${skillName}`, type: "directory" },
|
|
110
|
+
...entries.map((entry) => ({ ...entry, relativePath: `skills/${skillName}/${entry.relativePath}` })),
|
|
111
|
+
];
|
|
112
|
+
const verifySnapshot = async (directory, expected) => {
|
|
113
|
+
const actual = await captureBundle(directory);
|
|
114
|
+
if (actual.length !== expected.length || actual.some((entry, index) => {
|
|
115
|
+
const wanted = expected[index];
|
|
116
|
+
return entry.relativePath !== wanted.relativePath || entry.type !== wanted.type ||
|
|
117
|
+
(entry.type === "file" && wanted.type === "file" && !entry.contents.equals(wanted.contents));
|
|
118
|
+
})) {
|
|
119
|
+
throw new Error(`Review skill snapshot does not match its captured bundle: ${directory}.`);
|
|
120
|
+
}
|
|
121
|
+
};
|
|
122
|
+
export const prepareReviewSkill = async (packageDirectory, cacheDirectory) => {
|
|
123
|
+
const sourceDirectory = path.join(packageDirectory, "dist", "commands", "review", "skills", skillName);
|
|
124
|
+
let entries;
|
|
125
|
+
try {
|
|
126
|
+
entries = await captureBundle(sourceDirectory);
|
|
127
|
+
validateEntrypoint(entries);
|
|
128
|
+
}
|
|
129
|
+
catch (cause) {
|
|
130
|
+
throw new Error(`Cannot capture installed review skill bundle ${sourceDirectory}.`, { cause });
|
|
131
|
+
}
|
|
132
|
+
const snapshot = pluginBundle(entries);
|
|
133
|
+
const digest = bundleDigest(snapshot);
|
|
134
|
+
const snapshotsDirectory = path.resolve(cacheDirectory, "review-skills");
|
|
135
|
+
const rootDirectory = path.join(snapshotsDirectory, digest);
|
|
136
|
+
const directory = path.join(rootDirectory, "skills", skillName);
|
|
137
|
+
const prepared = { name: skillName, digest, rootDirectory, directory, entrypoint: path.join(directory, "SKILL.md") };
|
|
138
|
+
let temporaryDirectory;
|
|
139
|
+
let preparationError;
|
|
140
|
+
let publicationError;
|
|
141
|
+
try {
|
|
142
|
+
await mkdir(snapshotsDirectory, { recursive: true });
|
|
143
|
+
let existing = false;
|
|
144
|
+
try {
|
|
145
|
+
await lstat(rootDirectory);
|
|
146
|
+
existing = true;
|
|
147
|
+
}
|
|
148
|
+
catch (cause) {
|
|
149
|
+
if (!hasCode(cause, "ENOENT")) {
|
|
150
|
+
throw cause;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
if (!existing) {
|
|
154
|
+
temporaryDirectory = await mkdtemp(path.join(snapshotsDirectory, ".prepare-"));
|
|
155
|
+
for (const entry of snapshot) {
|
|
156
|
+
const destination = path.join(temporaryDirectory, ...entry.relativePath.split("/"));
|
|
157
|
+
if (entry.type === "directory") {
|
|
158
|
+
await mkdir(destination);
|
|
159
|
+
}
|
|
160
|
+
else {
|
|
161
|
+
await writeFile(destination, entry.contents, { flag: "wx" });
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
try {
|
|
165
|
+
await rename(temporaryDirectory, rootDirectory);
|
|
166
|
+
temporaryDirectory = undefined;
|
|
167
|
+
}
|
|
168
|
+
catch (cause) {
|
|
169
|
+
// A concurrent publication is accepted only after verifying the complete winning snapshot.
|
|
170
|
+
publicationError = cause;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
try {
|
|
174
|
+
await verifySnapshot(rootDirectory, snapshot);
|
|
175
|
+
}
|
|
176
|
+
catch (cause) {
|
|
177
|
+
if (publicationError !== undefined) {
|
|
178
|
+
throw new AggregateError([publicationError, cause], "Cannot publish or reuse the review skill snapshot.");
|
|
179
|
+
}
|
|
180
|
+
throw cause;
|
|
181
|
+
}
|
|
182
|
+
return prepared;
|
|
183
|
+
}
|
|
184
|
+
catch (cause) {
|
|
185
|
+
preparationError = new Error(`Cannot prepare review skill snapshot ${rootDirectory}.`, { cause });
|
|
186
|
+
throw preparationError;
|
|
187
|
+
}
|
|
188
|
+
finally {
|
|
189
|
+
if (temporaryDirectory !== undefined) {
|
|
190
|
+
try {
|
|
191
|
+
await rm(temporaryDirectory, { recursive: true, force: true });
|
|
192
|
+
}
|
|
193
|
+
catch (cause) {
|
|
194
|
+
const cleanupError = new Error(`Cannot remove review skill preparation directory ${temporaryDirectory}.`, { cause });
|
|
195
|
+
if (preparationError !== undefined) {
|
|
196
|
+
throw new AggregateError([preparationError, cleanupError], "Review skill preparation and cleanup failed.");
|
|
197
|
+
}
|
|
198
|
+
throw cleanupError;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
};
|
|
203
|
+
export const validateReviewSkillDiscovery = async (output, skill) => {
|
|
204
|
+
let entries;
|
|
205
|
+
try {
|
|
206
|
+
entries = JSON.parse(output);
|
|
207
|
+
}
|
|
208
|
+
catch (cause) {
|
|
209
|
+
throw new Error("Copilot skill discovery did not return valid JSON.", { cause });
|
|
210
|
+
}
|
|
211
|
+
if (!Array.isArray(entries)) {
|
|
212
|
+
throw new Error("Copilot skill discovery must return a JSON array.");
|
|
213
|
+
}
|
|
214
|
+
for (const entry of entries) {
|
|
215
|
+
if (typeof entry !== "object" || entry === null || Array.isArray(entry) || !("name" in entry) || typeof entry.name !== "string" || entry.name.trim() === "" || entry.name.includes("\0")) {
|
|
216
|
+
throw new Error("Copilot skill discovery contains a malformed skill entry.");
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
const matching = entries.filter((entry) => entry.name === skill.name);
|
|
220
|
+
if (matching.length !== 1) {
|
|
221
|
+
throw new Error(`Copilot skill discovery must select exactly one ${skill.name} skill; found ${matching.length}.`);
|
|
222
|
+
}
|
|
223
|
+
const match = matching[0];
|
|
224
|
+
if (match.enabled !== true) {
|
|
225
|
+
throw new Error(`Copilot skill ${skill.name} must be enabled.`);
|
|
226
|
+
}
|
|
227
|
+
if (typeof match.path !== "string" || match.path.trim() === "" || match.path.includes("\0") || !path.isAbsolute(match.path)) {
|
|
228
|
+
throw new Error(`Copilot skill ${skill.name} must have an absolute directory path.`);
|
|
229
|
+
}
|
|
230
|
+
let actualDirectory;
|
|
231
|
+
let expectedDirectory;
|
|
232
|
+
try {
|
|
233
|
+
[actualDirectory, expectedDirectory] = await Promise.all([realpath(match.path), realpath(skill.directory)]);
|
|
234
|
+
}
|
|
235
|
+
catch (cause) {
|
|
236
|
+
throw new Error(`Cannot resolve discovered ${skill.name} skill directory.`, { cause });
|
|
237
|
+
}
|
|
238
|
+
if (actualDirectory !== expectedDirectory) {
|
|
239
|
+
throw new Error(`Copilot skill ${skill.name} resolves to ${actualDirectory}; expected ${expectedDirectory}.`);
|
|
240
|
+
}
|
|
241
|
+
};
|
|
242
|
+
//# sourceMappingURL=skill.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill.js","sourceRoot":"","sources":["../../../src/commands/review/skill.ts"],"names":[],"mappings":"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"}
|