@codetreker/daynight 0.2.4 → 0.6.1
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.d.ts +3 -0
- package/dist/cli/application.js +31 -0
- package/dist/cli/application.js.map +1 -0
- package/dist/cli/commands.d.ts +7 -0
- package/dist/cli/commands.js +38 -0
- package/dist/cli/commands.js.map +1 -0
- package/dist/cli/context.d.ts +17 -0
- package/dist/cli/context.js +19 -0
- package/dist/cli/context.js.map +1 -0
- package/dist/cli/schema.d.ts +52 -0
- package/dist/cli/schema.js +108 -0
- package/dist/cli/schema.js.map +1 -0
- package/dist/commands/completion/bash.d.ts +2 -0
- package/dist/commands/completion/bash.js +272 -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 +136 -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 +34 -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/{copilot.d.ts → commands/review/adapters/copilot.d.ts} +20 -12
- package/dist/commands/review/adapters/copilot.js +360 -0
- package/dist/commands/review/adapters/copilot.js.map +1 -0
- package/dist/{github.d.ts → commands/review/adapters/github.d.ts} +2 -19
- package/dist/{github.js → commands/review/adapters/github.js} +0 -43
- package/dist/commands/review/adapters/github.js.map +1 -0
- package/dist/{git.d.ts → commands/review/adapters/worktrees.d.ts} +3 -2
- package/dist/{git.js → commands/review/adapters/worktrees.js} +3 -3
- package/dist/commands/review/adapters/worktrees.js.map +1 -0
- package/dist/commands/review/command.d.ts +11 -0
- package/dist/commands/review/command.js +42 -0
- package/dist/commands/review/command.js.map +1 -0
- package/dist/{config.d.ts → commands/review/config.d.ts} +8 -8
- package/dist/{config.js → commands/review/config.js} +25 -44
- package/dist/commands/review/config.js.map +1 -0
- package/dist/{coordinator.d.ts → commands/review/coordinator.d.ts} +8 -7
- package/dist/{coordinator.js → commands/review/coordinator.js} +8 -3
- package/dist/commands/review/coordinator.js.map +1 -0
- 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/instance-lock.js.map +1 -0
- package/dist/commands/review/listing.d.ts +5 -0
- package/dist/{review-list.js → commands/review/listing.js} +3 -9
- package/dist/commands/review/listing.js.map +1 -0
- package/dist/commands/review/model.d.ts +79 -0
- package/dist/commands/review/model.js +2 -0
- package/dist/commands/review/model.js.map +1 -0
- package/dist/commands/review/paths.d.ts +11 -0
- package/dist/commands/review/paths.js +16 -0
- package/dist/commands/review/paths.js.map +1 -0
- package/dist/commands/review/polling.d.ts +21 -0
- package/dist/commands/review/polling.js +44 -0
- package/dist/commands/review/polling.js.map +1 -0
- package/dist/{processes.d.ts → commands/review/processes.d.ts} +3 -3
- package/dist/commands/review/processes.js.map +1 -0
- package/dist/{repositories.d.ts → commands/review/repositories.d.ts} +2 -2
- package/dist/commands/review/repositories.js +70 -0
- package/dist/commands/review/repositories.js.map +1 -0
- package/dist/{runtime.d.ts → commands/review/runtime.d.ts} +9 -6
- package/dist/{runtime.js → commands/review/runtime.js} +11 -8
- package/dist/commands/review/runtime.js.map +1 -0
- 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/{store.d.ts → commands/review/store.d.ts} +5 -79
- package/dist/{store.js → commands/review/store.js} +8 -0
- package/dist/commands/review/store.js.map +1 -0
- 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.d.ts +6 -0
- package/dist/commands/update/command.js +23 -0
- package/dist/commands/update/command.js.map +1 -0
- 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/{update.d.ts → commands/update/updater.d.ts} +2 -2
- package/dist/{update.js → commands/update/updater.js} +3 -3
- package/dist/commands/update/updater.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/main.js +6 -2
- package/dist/main.js.map +1 -1
- package/dist/platform/diagnostics.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/{paths.d.ts → platform/filesystem.d.ts} +0 -11
- package/dist/{paths.js → platform/filesystem.js} +1 -17
- package/dist/platform/filesystem.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 +6 -5
- package/dist/cli.d.ts +0 -19
- package/dist/cli.js +0 -202
- package/dist/cli.js.map +0 -1
- package/dist/config.js.map +0 -1
- package/dist/coordinator.js.map +0 -1
- package/dist/copilot.js +0 -263
- package/dist/copilot.js.map +0 -1
- package/dist/diagnostics.js.map +0 -1
- package/dist/git.js.map +0 -1
- package/dist/github.js.map +0 -1
- package/dist/instance-lock.js.map +0 -1
- package/dist/paths.js.map +0 -1
- package/dist/processes.js.map +0 -1
- package/dist/repositories.js +0 -159
- package/dist/repositories.js.map +0 -1
- package/dist/review-list.d.ts +0 -5
- package/dist/review-list.js.map +0 -1
- package/dist/runtime.js.map +0 -1
- package/dist/store.js.map +0 -1
- package/dist/update.js.map +0 -1
- /package/dist/{instance-lock.d.ts → commands/review/instance-lock.d.ts} +0 -0
- /package/dist/{instance-lock.js → commands/review/instance-lock.js} +0 -0
- /package/dist/{processes.js → commands/review/processes.js} +0 -0
- /package/dist/{diagnostics.d.ts → platform/diagnostics.d.ts} +0 -0
- /package/dist/{diagnostics.js → platform/diagnostics.js} +0 -0
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
import { execFileSync, spawn } from "node:child_process";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { repositoryIdentity } from "./identity.js";
|
|
4
|
+
const maxOutputBytes = 1_048_576;
|
|
5
|
+
const maxGitMs = 30_000;
|
|
6
|
+
const cleanupMs = 1_000;
|
|
7
|
+
const repositorySelectors = new Set([
|
|
8
|
+
"GIT_DIR", "GIT_WORK_TREE", "GIT_COMMON_DIR", "GIT_INDEX_FILE", "GIT_OBJECT_DIRECTORY",
|
|
9
|
+
"GIT_ALTERNATE_OBJECT_DIRECTORIES", "GIT_GRAFT_FILE", "GIT_NAMESPACE", "GIT_PREFIX",
|
|
10
|
+
"GIT_SUPER_PREFIX", "GIT_INTERNAL_SUPER_PREFIX", "GIT_CEILING_DIRECTORIES",
|
|
11
|
+
"GIT_DISCOVERY_ACROSS_FILESYSTEM", "GIT_SHALLOW_FILE", "GIT_REPLACE_REF_BASE",
|
|
12
|
+
"GIT_IMPLICIT_WORK_TREE", "GIT_QUARANTINE_PATH",
|
|
13
|
+
]);
|
|
14
|
+
const gitEnvironment = () => ({
|
|
15
|
+
...Object.fromEntries(Object.entries(process.env).filter(([name]) => {
|
|
16
|
+
const key = name.toUpperCase();
|
|
17
|
+
return !repositorySelectors.has(key) && !key.startsWith("GIT_TRACE");
|
|
18
|
+
})),
|
|
19
|
+
GIT_OPTIONAL_LOCKS: "0",
|
|
20
|
+
GIT_TERMINAL_PROMPT: "0",
|
|
21
|
+
});
|
|
22
|
+
const diagnostic = (value) => value
|
|
23
|
+
.replace(/\b[a-z][a-z\d+.-]*:\/\/[^\s"'<>]+/gi, "[redacted URL]")
|
|
24
|
+
.replace(/[^\s"'<>]+@[^\s"'<>]+:[^\s"'<>]+/g, "[redacted repository address]")
|
|
25
|
+
.replace(/[\u0000-\u0008\u000b\u000c\u000e-\u001f\u007f]/g, "")
|
|
26
|
+
.slice(0, 8192);
|
|
27
|
+
export class RepositoryGitError extends Error {
|
|
28
|
+
exitCode;
|
|
29
|
+
signal;
|
|
30
|
+
stderr;
|
|
31
|
+
constructor(message, exitCode, signal, stderr, options) {
|
|
32
|
+
super(`${message}${exitCode === null ? "" : ` (exit ${exitCode})`}${signal === null ? "" : ` (${signal})`}${stderr === "" ? "" : `: ${stderr}`}`, options);
|
|
33
|
+
this.exitCode = exitCode;
|
|
34
|
+
this.signal = signal;
|
|
35
|
+
this.stderr = stderr;
|
|
36
|
+
this.name = "RepositoryGitError";
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
export const runRepositoryGit = async (cwd, args, operation, options = {}) => {
|
|
40
|
+
operation.check();
|
|
41
|
+
const timeoutMs = Math.max(1, Math.ceil(Math.min(maxGitMs, operation.remainingMs())));
|
|
42
|
+
return new Promise((resolve, reject) => {
|
|
43
|
+
// Index reads do not need an external fsmonitor; its inherited pipes can outlive Git.
|
|
44
|
+
const child = spawn("git", ["--no-pager", "-c", "core.fsmonitor=false", ...args], {
|
|
45
|
+
cwd, env: gitEnvironment(), windowsHide: true, detached: process.platform !== "win32", stdio: ["ignore", "pipe", "pipe"],
|
|
46
|
+
});
|
|
47
|
+
const stdout = [];
|
|
48
|
+
const stderr = [];
|
|
49
|
+
let stdoutBytes = 0;
|
|
50
|
+
let stderrBytes = 0;
|
|
51
|
+
let failure;
|
|
52
|
+
let failureMessage;
|
|
53
|
+
const cleanupErrors = [];
|
|
54
|
+
let stopped = false;
|
|
55
|
+
let settled = false;
|
|
56
|
+
let cleanupTimer;
|
|
57
|
+
const complete = (exitCode, signal) => {
|
|
58
|
+
if (settled)
|
|
59
|
+
return;
|
|
60
|
+
settled = true;
|
|
61
|
+
clearTimeout(timer);
|
|
62
|
+
clearTimeout(cleanupTimer);
|
|
63
|
+
operation.signal.removeEventListener("abort", abort);
|
|
64
|
+
let operationFailure;
|
|
65
|
+
try {
|
|
66
|
+
operation.check();
|
|
67
|
+
}
|
|
68
|
+
catch (error) {
|
|
69
|
+
operationFailure = error;
|
|
70
|
+
}
|
|
71
|
+
const errorOutput = diagnostic(Buffer.concat(stderr).toString("utf8"));
|
|
72
|
+
const primary = operationFailure ?? (failure !== undefined || failureMessage !== undefined
|
|
73
|
+
? new RepositoryGitError(failureMessage ?? "Cannot execute repository Git command", exitCode, signal, errorOutput, failure === undefined ? undefined : { cause: failure })
|
|
74
|
+
: undefined);
|
|
75
|
+
if (cleanupErrors.length !== 0) {
|
|
76
|
+
reject(new AggregateError(cleanupErrors, "Repository Git process-tree cleanup failed; process termination is unconfirmed.", primary === undefined ? undefined : { cause: primary }));
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
if (primary !== undefined) {
|
|
80
|
+
reject(primary);
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
if (exitCode !== 0 && !(exitCode === 1 && options.allowExitOne === true)) {
|
|
84
|
+
reject(new RepositoryGitError("Repository Git command failed", exitCode, signal, errorOutput));
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
if (exitCode === null) {
|
|
88
|
+
reject(new RepositoryGitError("Repository Git command did not return an exit status", exitCode, signal, errorOutput));
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
resolve({ stdout: Buffer.concat(stdout).toString("utf8"), stderr: errorOutput, exitCode });
|
|
92
|
+
};
|
|
93
|
+
const stop = () => {
|
|
94
|
+
if (stopped || child.pid === undefined)
|
|
95
|
+
return;
|
|
96
|
+
stopped = true;
|
|
97
|
+
try {
|
|
98
|
+
if (process.platform === "win32") {
|
|
99
|
+
const systemRoot = process.env.SystemRoot;
|
|
100
|
+
if (systemRoot === undefined || !path.win32.isAbsolute(systemRoot))
|
|
101
|
+
throw new Error("SystemRoot must identify an absolute Windows directory to terminate the owned Git process tree.");
|
|
102
|
+
execFileSync(path.win32.join(systemRoot, "System32", "taskkill.exe"), ["/PID", String(child.pid), "/T", "/F"], {
|
|
103
|
+
windowsHide: true, timeout: cleanupMs, maxBuffer: 64 * 1024, stdio: "pipe",
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
else
|
|
107
|
+
process.kill(-child.pid, "SIGKILL");
|
|
108
|
+
}
|
|
109
|
+
catch (error) {
|
|
110
|
+
if (!(process.platform !== "win32" && error instanceof Error && "code" in error && error.code === "ESRCH"))
|
|
111
|
+
cleanupErrors.push(error);
|
|
112
|
+
child.kill("SIGKILL");
|
|
113
|
+
}
|
|
114
|
+
cleanupTimer = setTimeout(() => {
|
|
115
|
+
cleanupErrors.push(new Error("The owned Git process and inherited output handles did not close within the cleanup deadline."));
|
|
116
|
+
child.stdout.destroy();
|
|
117
|
+
child.stderr.destroy();
|
|
118
|
+
child.unref();
|
|
119
|
+
complete(child.exitCode, child.signalCode);
|
|
120
|
+
}, cleanupMs);
|
|
121
|
+
cleanupTimer.unref();
|
|
122
|
+
};
|
|
123
|
+
const abort = () => {
|
|
124
|
+
try {
|
|
125
|
+
operation.check();
|
|
126
|
+
}
|
|
127
|
+
catch (error) {
|
|
128
|
+
failure = error;
|
|
129
|
+
}
|
|
130
|
+
stop();
|
|
131
|
+
};
|
|
132
|
+
const collect = (stream, chunk) => {
|
|
133
|
+
if (failure !== undefined || failureMessage !== undefined)
|
|
134
|
+
return;
|
|
135
|
+
const size = stream === "stdout" ? stdoutBytes : stderrBytes;
|
|
136
|
+
if (size + chunk.length > maxOutputBytes) {
|
|
137
|
+
failureMessage = `Repository Git ${stream} exceeded its ${maxOutputBytes}-byte limit`;
|
|
138
|
+
stop();
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
if (stream === "stdout") {
|
|
142
|
+
stdoutBytes += chunk.length;
|
|
143
|
+
stdout.push(chunk);
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
stderrBytes += chunk.length;
|
|
147
|
+
stderr.push(chunk);
|
|
148
|
+
}
|
|
149
|
+
};
|
|
150
|
+
child.stdout.on("data", (chunk) => { collect("stdout", chunk); });
|
|
151
|
+
child.stderr.on("data", (chunk) => { collect("stderr", chunk); });
|
|
152
|
+
const streamError = (error) => { failure = error; stop(); };
|
|
153
|
+
child.stdout.once("error", streamError);
|
|
154
|
+
child.stderr.once("error", streamError);
|
|
155
|
+
child.once("spawn", () => {
|
|
156
|
+
if (failure !== undefined || failureMessage !== undefined || operation.signal.aborted)
|
|
157
|
+
stop();
|
|
158
|
+
});
|
|
159
|
+
child.once("error", (error) => { failure = error; });
|
|
160
|
+
operation.signal.addEventListener("abort", abort, { once: true });
|
|
161
|
+
const timer = setTimeout(() => {
|
|
162
|
+
try {
|
|
163
|
+
operation.check();
|
|
164
|
+
}
|
|
165
|
+
catch (error) {
|
|
166
|
+
failure = error;
|
|
167
|
+
}
|
|
168
|
+
if (failure === undefined)
|
|
169
|
+
failureMessage = "Repository Git command deadline exceeded";
|
|
170
|
+
stop();
|
|
171
|
+
}, timeoutMs);
|
|
172
|
+
timer.unref();
|
|
173
|
+
child.once("close", complete);
|
|
174
|
+
if (operation.signal.aborted)
|
|
175
|
+
abort();
|
|
176
|
+
});
|
|
177
|
+
};
|
|
178
|
+
const finalLine = (value) => value.replace(/\r?\n$/, "");
|
|
179
|
+
export const discoverRepository = async (cwd, operation) => {
|
|
180
|
+
let bare;
|
|
181
|
+
try {
|
|
182
|
+
bare = await runRepositoryGit(cwd, ["rev-parse", "--is-bare-repository"], operation);
|
|
183
|
+
}
|
|
184
|
+
catch (cause) {
|
|
185
|
+
if (cause === operation.signal.reason)
|
|
186
|
+
throw cause;
|
|
187
|
+
throw new Error("Cannot locate a Git repository from the current working directory.", { cause });
|
|
188
|
+
}
|
|
189
|
+
if (finalLine(bare.stdout) === "true")
|
|
190
|
+
throw new Error("Automatic project discovery requires a Git worktree; the current repository is bare.");
|
|
191
|
+
if (finalLine(bare.stdout) !== "false")
|
|
192
|
+
throw new Error("Git returned an invalid bare-repository result.");
|
|
193
|
+
const gitRoot = finalLine((await runRepositoryGit(cwd, ["rev-parse", "--show-toplevel"], operation)).stdout);
|
|
194
|
+
if (gitRoot === "")
|
|
195
|
+
throw new Error("Git returned an empty worktree root.");
|
|
196
|
+
if (!path.isAbsolute(gitRoot))
|
|
197
|
+
throw new Error("Git returned a worktree root that is not an absolute path.");
|
|
198
|
+
const root = path.normalize(gitRoot);
|
|
199
|
+
let remote;
|
|
200
|
+
try {
|
|
201
|
+
remote = finalLine((await runRepositoryGit(root, ["remote", "get-url", "origin"], operation)).stdout);
|
|
202
|
+
}
|
|
203
|
+
catch (cause) {
|
|
204
|
+
if (cause === operation.signal.reason)
|
|
205
|
+
throw cause;
|
|
206
|
+
throw new Error("Cannot read the current Git repository's origin fetch address.", { cause });
|
|
207
|
+
}
|
|
208
|
+
operation.check();
|
|
209
|
+
const identity = repositoryIdentity(remote);
|
|
210
|
+
operation.check();
|
|
211
|
+
return { root, remote, identity };
|
|
212
|
+
};
|
|
213
|
+
//# sourceMappingURL=git.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/repository/git.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import { isIP, SocketAddress } from "node:net";
|
|
2
|
+
export class RepositoryIdentityError extends Error {
|
|
3
|
+
reason;
|
|
4
|
+
constructor(reason, options) {
|
|
5
|
+
super(`Invalid repository address: ${reason}. Expected an HTTPS, SSH, or SCP repository address.`, options);
|
|
6
|
+
this.reason = reason;
|
|
7
|
+
this.name = "RepositoryIdentityError";
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
const invalid = (reason) => { throw new RepositoryIdentityError(reason); };
|
|
11
|
+
const control = /\p{Cc}/u;
|
|
12
|
+
const forbiddenText = /[\p{White_Space}\p{Cc}]/u;
|
|
13
|
+
const hostCharacters = /^[\p{L}\p{N}\-._~!$&'()*+,;=]+$/u;
|
|
14
|
+
const unescape = (value) => {
|
|
15
|
+
try {
|
|
16
|
+
return decodeURIComponent(value);
|
|
17
|
+
}
|
|
18
|
+
catch (cause) {
|
|
19
|
+
throw new RepositoryIdentityError("invalid UTF-8 or percent encoding", { cause });
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
const hostIdentity = (host, bracketed) => {
|
|
23
|
+
const ip = host.includes("%") ? 0 : isIP(host);
|
|
24
|
+
if (bracketed && ip === 0)
|
|
25
|
+
return invalid("brackets require an IP address");
|
|
26
|
+
if (ip === 6)
|
|
27
|
+
return `[${new SocketAddress({ address: host, port: 0, family: "ipv6" }).address}]`;
|
|
28
|
+
if (!hostCharacters.test(host))
|
|
29
|
+
return invalid("invalid host");
|
|
30
|
+
return host.toLowerCase();
|
|
31
|
+
};
|
|
32
|
+
const pathIdentity = (path) => {
|
|
33
|
+
const trimmed = path.replace(/\/+$/, "");
|
|
34
|
+
const withoutSuffix = trimmed.endsWith(".git") ? trimmed.slice(0, -4) : trimmed;
|
|
35
|
+
return withoutSuffix.replaceAll("/", "") === "" ? trimmed : withoutSuffix;
|
|
36
|
+
};
|
|
37
|
+
const ordinaryPath = (path) => !path.startsWith("~") && path.split("/").every((segment) => segment !== "" && segment !== "." && segment !== "..");
|
|
38
|
+
const urlIdentity = (input) => {
|
|
39
|
+
const match = /^(https|ssh):\/\/([^/]*)(\/.*)$/i.exec(input);
|
|
40
|
+
if (match === null)
|
|
41
|
+
return invalid("invalid URL scheme, authority, or repository path");
|
|
42
|
+
const scheme = match[1].toLowerCase();
|
|
43
|
+
let authority = match[2];
|
|
44
|
+
const rawPath = match[3];
|
|
45
|
+
if (unescape(rawPath).replaceAll("/", "") === "")
|
|
46
|
+
return invalid("repository path is empty");
|
|
47
|
+
let user;
|
|
48
|
+
const at = authority.lastIndexOf("@");
|
|
49
|
+
if (at >= 0) {
|
|
50
|
+
user = authority.slice(0, at);
|
|
51
|
+
authority = authority.slice(at + 1);
|
|
52
|
+
if (scheme === "https" || user === "" || user.includes(":"))
|
|
53
|
+
return invalid("credentials or an empty SSH user are forbidden");
|
|
54
|
+
if (!/^[A-Za-z0-9\-._~!$&'()*+,;=%@]+$/.test(user))
|
|
55
|
+
return invalid("invalid SSH user");
|
|
56
|
+
if (unescape(user) === "")
|
|
57
|
+
return invalid("SSH user is empty");
|
|
58
|
+
}
|
|
59
|
+
let rawHost;
|
|
60
|
+
let portText;
|
|
61
|
+
let bracketed = false;
|
|
62
|
+
if (authority.startsWith("[")) {
|
|
63
|
+
bracketed = true;
|
|
64
|
+
const end = authority.indexOf("]");
|
|
65
|
+
if (end < 0)
|
|
66
|
+
return invalid("invalid bracketed host");
|
|
67
|
+
rawHost = authority.slice(1, end);
|
|
68
|
+
const suffix = authority.slice(end + 1);
|
|
69
|
+
if (suffix !== "") {
|
|
70
|
+
if (!suffix.startsWith(":"))
|
|
71
|
+
return invalid("invalid host suffix");
|
|
72
|
+
portText = suffix.slice(1);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
const colon = authority.lastIndexOf(":");
|
|
77
|
+
rawHost = colon < 0 ? authority : authority.slice(0, colon);
|
|
78
|
+
if (colon >= 0)
|
|
79
|
+
portText = authority.slice(colon + 1);
|
|
80
|
+
if (scheme === "https" && rawHost.includes(":"))
|
|
81
|
+
return invalid("IPv6 HTTPS hosts require brackets");
|
|
82
|
+
}
|
|
83
|
+
if (rawHost.includes("%") && /%(?:[0-7][0-9a-f])/i.test(rawHost.replaceAll(/%25/gi, "")))
|
|
84
|
+
return invalid("ASCII host escapes are forbidden");
|
|
85
|
+
const host = unescape(rawHost);
|
|
86
|
+
// Go URL authorities permit bracketed IPv6; SCP additionally permits bracketed IPv4.
|
|
87
|
+
if (bracketed && isIP(host) !== 6)
|
|
88
|
+
return invalid("URL brackets require IPv6");
|
|
89
|
+
const normalizedHost = hostIdentity(host, bracketed);
|
|
90
|
+
let port;
|
|
91
|
+
if (portText !== undefined) {
|
|
92
|
+
if (!/^[0-9]+$/.test(portText))
|
|
93
|
+
return invalid("invalid port");
|
|
94
|
+
port = Number(portText);
|
|
95
|
+
if (!Number.isInteger(port) || port < 1 || port > 65_535)
|
|
96
|
+
return invalid("port must be from 1 to 65535");
|
|
97
|
+
}
|
|
98
|
+
const defaultPort = scheme === "https" ? 443 : 22;
|
|
99
|
+
const normalizedPort = port === undefined || port === defaultPort ? "" : `:${port}`;
|
|
100
|
+
const path = pathIdentity(rawPath);
|
|
101
|
+
const relativePath = path.slice(1);
|
|
102
|
+
if (normalizedPort === "" && (scheme === "https" || user === "git") && ordinaryPath(relativePath))
|
|
103
|
+
return `${normalizedHost}/${relativePath}`;
|
|
104
|
+
return `${scheme}://${user === undefined ? "" : `${user}@`}${normalizedHost}${normalizedPort}${path}`;
|
|
105
|
+
};
|
|
106
|
+
const scpIdentity = (input) => {
|
|
107
|
+
let delimiter = input.indexOf(":");
|
|
108
|
+
const opening = input.indexOf("[");
|
|
109
|
+
if (opening >= 0 && opening < delimiter) {
|
|
110
|
+
const end = input.indexOf("]:");
|
|
111
|
+
if (end < 0)
|
|
112
|
+
return invalid("invalid bracketed SCP host");
|
|
113
|
+
delimiter = end + 1;
|
|
114
|
+
}
|
|
115
|
+
if (delimiter < 0)
|
|
116
|
+
return invalid("SCP address requires a host and path");
|
|
117
|
+
const authority = input.slice(0, delimiter);
|
|
118
|
+
const rawPath = input.slice(delimiter + 1);
|
|
119
|
+
if (rawPath.replaceAll("/", "") === "")
|
|
120
|
+
return invalid("repository path is empty");
|
|
121
|
+
const at = authority.indexOf("@");
|
|
122
|
+
let user;
|
|
123
|
+
let host;
|
|
124
|
+
if (at >= 0) {
|
|
125
|
+
user = authority.slice(0, at);
|
|
126
|
+
host = authority.slice(at + 1);
|
|
127
|
+
if (user === "" || /[:/\[\]]/.test(user))
|
|
128
|
+
return invalid("invalid SCP user");
|
|
129
|
+
}
|
|
130
|
+
else {
|
|
131
|
+
host = authority;
|
|
132
|
+
const firstPathComponent = rawPath.split("/", 1)[0];
|
|
133
|
+
const pathAt = firstPathComponent.indexOf("@");
|
|
134
|
+
if (pathAt >= 0 && firstPathComponent.slice(pathAt + 1).includes(":"))
|
|
135
|
+
return invalid("ambiguous SCP credentials");
|
|
136
|
+
}
|
|
137
|
+
const bracketed = host.startsWith("[") && host.endsWith("]");
|
|
138
|
+
const normalizedHost = hostIdentity(bracketed ? host.slice(1, -1) : host, bracketed);
|
|
139
|
+
const path = pathIdentity(rawPath);
|
|
140
|
+
if (user === "git" && ordinaryPath(path))
|
|
141
|
+
return `${normalizedHost}/${path}`;
|
|
142
|
+
return `scp://${user === undefined ? "" : `${user}@`}${normalizedHost}:${path}`;
|
|
143
|
+
};
|
|
144
|
+
export const repositoryIdentity = (input) => {
|
|
145
|
+
if (input === "" || !input.isWellFormed() || forbiddenText.test(input))
|
|
146
|
+
return invalid("empty or invalid repository text");
|
|
147
|
+
const decoded = unescape(input);
|
|
148
|
+
if (control.test(decoded))
|
|
149
|
+
return invalid("encoded control characters are forbidden");
|
|
150
|
+
if (/[?#]/.test(input))
|
|
151
|
+
return invalid("query and fragment are forbidden");
|
|
152
|
+
return input.includes("://") ? urlIdentity(input) : scpIdentity(input);
|
|
153
|
+
};
|
|
154
|
+
//# sourceMappingURL=identity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"identity.js","sourceRoot":"","sources":["../../src/repository/identity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAE/C,MAAM,OAAO,uBAAwB,SAAQ,KAAK;IAC3B,MAAM;IAA3B,YAAqB,MAAc,EAAE,OAAsB;QACzD,KAAK,CAAC,+BAA+B,MAAM,sDAAsD,EAAE,OAAO,CAAC,CAAC;sBADzF,MAAM;QAEzB,IAAI,CAAC,IAAI,GAAG,yBAAyB,CAAC;IACxC,CAAC;CACF;AAED,MAAM,OAAO,GAAG,CAAC,MAAc,EAAS,EAAE,GAAG,MAAM,IAAI,uBAAuB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;AAC1F,MAAM,OAAO,GAAG,SAAS,CAAC;AAC1B,MAAM,aAAa,GAAG,0BAA0B,CAAC;AACjD,MAAM,cAAc,GAAG,kCAAkC,CAAC;AAE1D,MAAM,QAAQ,GAAG,CAAC,KAAa,EAAU,EAAE;IACzC,IAAI,CAAC;QAAC,OAAO,kBAAkB,CAAC,KAAK,CAAC,CAAC;IAAC,CAAC;IACzC,OAAO,KAAK,EAAE,CAAC;QAAC,MAAM,IAAI,uBAAuB,CAAC,mCAAmC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;IAAC,CAAC;AACtG,CAAC,CAAC;AAEF,MAAM,YAAY,GAAG,CAAC,IAAY,EAAE,SAAkB,EAAU,EAAE;IAChE,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/C,IAAI,SAAS,IAAI,EAAE,KAAK,CAAC;QAAE,OAAO,OAAO,CAAC,gCAAgC,CAAC,CAAC;IAC5E,IAAI,EAAE,KAAK,CAAC;QAAE,OAAO,IAAI,IAAI,aAAa,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,OAAO,GAAG,CAAC;IAClG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,OAAO,CAAC,cAAc,CAAC,CAAC;IAC/D,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC;AAC5B,CAAC,CAAC;AAEF,MAAM,YAAY,GAAG,CAAC,IAAY,EAAU,EAAE;IAC5C,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACzC,MAAM,aAAa,GAAG,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;IAChF,OAAO,aAAa,CAAC,UAAU,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC;AAC5E,CAAC,CAAC;AAEF,MAAM,YAAY,GAAG,CAAC,IAAY,EAAW,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,KAAK,EAAE,IAAI,OAAO,KAAK,GAAG,IAAI,OAAO,KAAK,IAAI,CAAC,CAAC;AAEnK,MAAM,WAAW,GAAG,CAAC,KAAa,EAAU,EAAE;IAC5C,MAAM,KAAK,GAAG,kCAAkC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC7D,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,OAAO,CAAC,mDAAmD,CAAC,CAAC;IACxF,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC,WAAW,EAAE,CAAC;IACvC,IAAI,SAAS,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC;IAC1B,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC;IAC1B,IAAI,QAAQ,CAAC,OAAO,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,EAAE;QAAE,OAAO,OAAO,CAAC,0BAA0B,CAAC,CAAC;IAC7F,IAAI,IAAwB,CAAC;IAC7B,MAAM,EAAE,GAAG,SAAS,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACtC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;QACZ,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC9B,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;QACpC,IAAI,MAAM,KAAK,OAAO,IAAI,IAAI,KAAK,EAAE,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,OAAO,OAAO,CAAC,gDAAgD,CAAC,CAAC;QAC9H,IAAI,CAAC,kCAAkC,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,OAAO,OAAO,CAAC,kBAAkB,CAAC,CAAC;QACvF,IAAI,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE;YAAE,OAAO,OAAO,CAAC,mBAAmB,CAAC,CAAC;IACjE,CAAC;IACD,IAAI,OAAe,CAAC;IACpB,IAAI,QAA4B,CAAC;IACjC,IAAI,SAAS,GAAG,KAAK,CAAC;IACtB,IAAI,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC9B,SAAS,GAAG,IAAI,CAAC;QACjB,MAAM,GAAG,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACnC,IAAI,GAAG,GAAG,CAAC;YAAE,OAAO,OAAO,CAAC,wBAAwB,CAAC,CAAC;QACtD,OAAO,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAClC,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;QACxC,IAAI,MAAM,KAAK,EAAE,EAAE,CAAC;YAClB,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC;gBAAE,OAAO,OAAO,CAAC,qBAAqB,CAAC,CAAC;YACnE,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;SAAM,CAAC;QACN,MAAM,KAAK,GAAG,SAAS,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QACzC,OAAO,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QAC5D,IAAI,KAAK,IAAI,CAAC;YAAE,QAAQ,GAAG,SAAS,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;QACtD,IAAI,MAAM,KAAK,OAAO,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,OAAO,OAAO,CAAC,mCAAmC,CAAC,CAAC;IACvG,CAAC;IACD,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,qBAAqB,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QAAE,OAAO,OAAO,CAAC,kCAAkC,CAAC,CAAC;IAC7I,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC/B,qFAAqF;IACrF,IAAI,SAAS,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,OAAO,CAAC,2BAA2B,CAAC,CAAC;IAC/E,MAAM,cAAc,GAAG,YAAY,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IACrD,IAAI,IAAwB,CAAC;IAC7B,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC;YAAE,OAAO,OAAO,CAAC,cAAc,CAAC,CAAC;QAC/D,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;QACxB,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,MAAM;YAAE,OAAO,OAAO,CAAC,8BAA8B,CAAC,CAAC;IAC3G,CAAC;IACD,MAAM,WAAW,GAAG,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IAClD,MAAM,cAAc,GAAG,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;IACpF,MAAM,IAAI,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IACnC,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACnC,IAAI,cAAc,KAAK,EAAE,IAAI,CAAC,MAAM,KAAK,OAAO,IAAI,IAAI,KAAK,KAAK,CAAC,IAAI,YAAY,CAAC,YAAY,CAAC;QAAE,OAAO,GAAG,cAAc,IAAI,YAAY,EAAE,CAAC;IAC9I,OAAO,GAAG,MAAM,MAAM,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,GAAG,cAAc,GAAG,cAAc,GAAG,IAAI,EAAE,CAAC;AACxG,CAAC,CAAC;AAEF,MAAM,WAAW,GAAG,CAAC,KAAa,EAAU,EAAE;IAC5C,IAAI,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACnC,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACnC,IAAI,OAAO,IAAI,CAAC,IAAI,OAAO,GAAG,SAAS,EAAE,CAAC;QACxC,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAChC,IAAI,GAAG,GAAG,CAAC;YAAE,OAAO,OAAO,CAAC,4BAA4B,CAAC,CAAC;QAC1D,SAAS,GAAG,GAAG,GAAG,CAAC,CAAC;IACtB,CAAC;IACD,IAAI,SAAS,GAAG,CAAC;QAAE,OAAO,OAAO,CAAC,sCAAsC,CAAC,CAAC;IAC1E,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;IAC5C,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;IAC3C,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,EAAE;QAAE,OAAO,OAAO,CAAC,0BAA0B,CAAC,CAAC;IACnF,MAAM,EAAE,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAClC,IAAI,IAAwB,CAAC;IAC7B,IAAI,IAAY,CAAC;IACjB,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;QACZ,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC9B,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;QAC/B,IAAI,IAAI,KAAK,EAAE,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,OAAO,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAC/E,CAAC;SAAM,CAAC;QACN,IAAI,GAAG,SAAS,CAAC;QACjB,MAAM,kBAAkB,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC;QACrD,MAAM,MAAM,GAAG,kBAAkB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC/C,IAAI,MAAM,IAAI,CAAC,IAAI,kBAAkB,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,OAAO,OAAO,CAAC,2BAA2B,CAAC,CAAC;IACrH,CAAC;IACD,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IAC7D,MAAM,cAAc,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IACrF,MAAM,IAAI,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IACnC,IAAI,IAAI,KAAK,KAAK,IAAI,YAAY,CAAC,IAAI,CAAC;QAAE,OAAO,GAAG,cAAc,IAAI,IAAI,EAAE,CAAC;IAC7E,OAAO,SAAS,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,GAAG,cAAc,IAAI,IAAI,EAAE,CAAC;AAClF,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,KAAa,EAAU,EAAE;IAC1D,IAAI,KAAK,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,IAAI,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,OAAO,CAAC,kCAAkC,CAAC,CAAC;IAC3H,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAChC,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,OAAO,CAAC,0CAA0C,CAAC,CAAC;IACtF,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,OAAO,CAAC,kCAAkC,CAAC,CAAC;IAC3E,OAAO,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;AACzE,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/repository/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE9C,OAAO,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@codetreker/daynight",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "A
|
|
3
|
+
"version": "0.6.1",
|
|
4
|
+
"description": "A client command toolkit for development workflows",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
7
7
|
"url": "git+https://github.com/codetreker/daynight.git",
|
|
@@ -18,10 +18,11 @@
|
|
|
18
18
|
"node": ">=24.0.0 <25"
|
|
19
19
|
},
|
|
20
20
|
"scripts": {
|
|
21
|
-
"build": "tsc -p tsconfig.build.json",
|
|
21
|
+
"build": "node scripts/clean-dist.ts && tsc -p tsconfig.build.json && node scripts/copy-skills.ts",
|
|
22
22
|
"typecheck": "tsc --noEmit",
|
|
23
23
|
"test": "pnpm run build && vitest run",
|
|
24
|
-
"acceptance": "pnpm run build && vitest run --config vitest.acceptance.config.ts"
|
|
24
|
+
"acceptance": "pnpm run build && vitest run --config vitest.acceptance.config.ts",
|
|
25
|
+
"completion:acceptance": "pnpm run build && python3 -u test/acceptance/shell-completion.py"
|
|
25
26
|
},
|
|
26
27
|
"dependencies": {
|
|
27
28
|
"better-sqlite3": "13.0.3",
|
|
@@ -39,5 +40,5 @@
|
|
|
39
40
|
"vite": "8.3.4",
|
|
40
41
|
"vitest": "5.0.5"
|
|
41
42
|
},
|
|
42
|
-
"gitHead": "
|
|
43
|
+
"gitHead": "64b69a3ab864f99f6914b9217dbfbebde60345aa"
|
|
43
44
|
}
|
package/dist/cli.d.ts
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
export { formatError } from "./diagnostics.js";
|
|
2
|
-
import type { Configuration } from "./config.js";
|
|
3
|
-
import type { RuntimePaths } from "./paths.js";
|
|
4
|
-
import type { AddRepositoryInput, AddRepositoryOptions, AddRepositoryResult } from "./repositories.js";
|
|
5
|
-
import type { UpdateResult } from "./update.js";
|
|
6
|
-
export type CliDependencies = {
|
|
7
|
-
version: string;
|
|
8
|
-
update: () => Promise<UpdateResult>;
|
|
9
|
-
homeDirectory: () => string;
|
|
10
|
-
workingDirectory: () => string;
|
|
11
|
-
addRepository: (input: AddRepositoryInput, paths: RuntimePaths, options: AddRepositoryOptions) => Promise<AddRepositoryResult>;
|
|
12
|
-
listReviews: (paths: RuntimePaths) => Promise<string>;
|
|
13
|
-
loadConfiguration: (paths: RuntimePaths) => Promise<Configuration>;
|
|
14
|
-
runReview: (configuration: Configuration, paths: RuntimePaths) => Promise<void>;
|
|
15
|
-
stdout: (text: string) => void;
|
|
16
|
-
stderr: (text: string) => void;
|
|
17
|
-
};
|
|
18
|
-
export declare const runCli: (args: readonly string[], dependencies: CliDependencies) => Promise<number>;
|
|
19
|
-
export declare const defaultCliDependencies: (version: string) => CliDependencies;
|