@cleanslop/cli 0.0.0-stage → 0.1.0-beta.1.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/README.md +86 -2
- package/assets/skill-core.md +62 -0
- package/dist/action.d.ts +5 -0
- package/dist/action.js +22 -0
- package/dist/action.js.map +1 -0
- package/dist/args.d.ts +4 -0
- package/dist/args.js +243 -0
- package/dist/args.js.map +1 -0
- package/dist/commands/credits.d.ts +29 -0
- package/dist/commands/credits.js +267 -0
- package/dist/commands/credits.js.map +1 -0
- package/dist/commands/email.d.ts +3 -0
- package/dist/commands/email.js +51 -0
- package/dist/commands/email.js.map +1 -0
- package/dist/commands/link-identity.d.ts +3 -0
- package/dist/commands/link-identity.js +37 -0
- package/dist/commands/link-identity.js.map +1 -0
- package/dist/commands/link-login.d.ts +3 -0
- package/dist/commands/link-login.js +63 -0
- package/dist/commands/link-login.js.map +1 -0
- package/dist/commands/login.d.ts +6 -0
- package/dist/commands/login.js +198 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/logout.d.ts +2 -0
- package/dist/commands/logout.js +40 -0
- package/dist/commands/logout.js.map +1 -0
- package/dist/commands/report.d.ts +8 -0
- package/dist/commands/report.js +55 -0
- package/dist/commands/report.js.map +1 -0
- package/dist/commands/scan-upload.d.ts +3 -0
- package/dist/commands/scan-upload.js +85 -0
- package/dist/commands/scan-upload.js.map +1 -0
- package/dist/commands/scan.d.ts +3 -0
- package/dist/commands/scan.js +81 -0
- package/dist/commands/scan.js.map +1 -0
- package/dist/commands/setup.d.ts +19 -0
- package/dist/commands/setup.js +154 -0
- package/dist/commands/setup.js.map +1 -0
- package/dist/commands/status.d.ts +3 -0
- package/dist/commands/status.js +29 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/whoami.d.ts +3 -0
- package/dist/commands/whoami.js +44 -0
- package/dist/commands/whoami.js.map +1 -0
- package/dist/config.d.ts +26 -0
- package/dist/config.js +46 -0
- package/dist/config.js.map +1 -0
- package/dist/credentials.d.ts +64 -0
- package/dist/credentials.js +220 -0
- package/dist/credentials.js.map +1 -0
- package/dist/deps.d.ts +58 -0
- package/dist/deps.js +148 -0
- package/dist/deps.js.map +1 -0
- package/dist/exit.d.ts +24 -0
- package/dist/exit.js +29 -0
- package/dist/exit.js.map +1 -0
- package/dist/git.d.ts +14 -0
- package/dist/git.js +161 -0
- package/dist/git.js.map +1 -0
- package/dist/http.d.ts +16 -0
- package/dist/http.js +210 -0
- package/dist/http.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/link.d.ts +106 -0
- package/dist/link.js +650 -0
- package/dist/link.js.map +1 -0
- package/dist/main.d.ts +6 -0
- package/dist/main.js +75 -0
- package/dist/main.js.map +1 -0
- package/dist/mcp-config.d.ts +13 -0
- package/dist/mcp-config.js +65 -0
- package/dist/mcp-config.js.map +1 -0
- package/dist/output.d.ts +9 -0
- package/dist/output.js +65 -0
- package/dist/output.js.map +1 -0
- package/dist/pack.d.ts +30 -0
- package/dist/pack.js +283 -0
- package/dist/pack.js.map +1 -0
- package/dist/redact.d.ts +2 -0
- package/dist/redact.js +17 -0
- package/dist/redact.js.map +1 -0
- package/dist/skill.d.ts +10 -0
- package/dist/skill.js +110 -0
- package/dist/skill.js.map +1 -0
- package/dist/types.d.ts +144 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/ustar.d.ts +7 -0
- package/dist/ustar.js +128 -0
- package/dist/ustar.js.map +1 -0
- package/dist/wait.d.ts +11 -0
- package/dist/wait.js +80 -0
- package/dist/wait.js.map +1 -0
- package/package.json +30 -4
package/dist/main.d.ts
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { type CliDeps } from "./deps.js";
|
|
2
|
+
import type { ParsedArgs } from "./types.js";
|
|
3
|
+
export declare function printHelp(deps: CliDeps): number;
|
|
4
|
+
export declare function printVersion(deps: CliDeps): number;
|
|
5
|
+
export declare function dispatch(deps: CliDeps, args: ParsedArgs): Promise<number>;
|
|
6
|
+
export declare function runCli(argv: string[], overrides?: Partial<CliDeps>): Promise<number>;
|
package/dist/main.js
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { writeAction } from "./action.js";
|
|
2
|
+
import { HELP_TEXT, parseArgs } from "./args.js";
|
|
3
|
+
import { runCredits } from "./commands/credits.js";
|
|
4
|
+
import { runLinkIdentity } from "./commands/link-identity.js";
|
|
5
|
+
import { runLogin } from "./commands/login.js";
|
|
6
|
+
import { runLogout } from "./commands/logout.js";
|
|
7
|
+
import { runEmail } from "./commands/email.js";
|
|
8
|
+
import { runReport } from "./commands/report.js";
|
|
9
|
+
import { runScan } from "./commands/scan.js";
|
|
10
|
+
import { runSetup } from "./commands/setup.js";
|
|
11
|
+
import { runStatus } from "./commands/status.js";
|
|
12
|
+
import { runWhoami } from "./commands/whoami.js";
|
|
13
|
+
import { PACKAGE_NAME, PACKAGE_VERSION } from "./config.js";
|
|
14
|
+
import { mergeDeps } from "./deps.js";
|
|
15
|
+
import { CliError, EXIT_OK, EXIT_UNEXPECTED } from "./exit.js";
|
|
16
|
+
export function printHelp(deps) {
|
|
17
|
+
deps.io.stdout(HELP_TEXT);
|
|
18
|
+
return EXIT_OK;
|
|
19
|
+
}
|
|
20
|
+
export function printVersion(deps) {
|
|
21
|
+
deps.io.stdout(`${PACKAGE_NAME} ${PACKAGE_VERSION}\n`);
|
|
22
|
+
return EXIT_OK;
|
|
23
|
+
}
|
|
24
|
+
export async function dispatch(deps, args) {
|
|
25
|
+
if (args.help)
|
|
26
|
+
return printHelp(deps);
|
|
27
|
+
if (args.version)
|
|
28
|
+
return printVersion(deps);
|
|
29
|
+
switch (args.command) {
|
|
30
|
+
case "login":
|
|
31
|
+
return runLogin(deps, args);
|
|
32
|
+
case "logout":
|
|
33
|
+
return runLogout(deps);
|
|
34
|
+
case "whoami":
|
|
35
|
+
return runWhoami(deps, args);
|
|
36
|
+
case "scan":
|
|
37
|
+
return runScan(deps, args);
|
|
38
|
+
case "status":
|
|
39
|
+
return runStatus(deps, args);
|
|
40
|
+
case "report":
|
|
41
|
+
return runReport(deps, args);
|
|
42
|
+
case "setup":
|
|
43
|
+
return runSetup(deps, args);
|
|
44
|
+
case "email":
|
|
45
|
+
return runEmail(deps, args);
|
|
46
|
+
case "link-identity":
|
|
47
|
+
return runLinkIdentity(deps, args);
|
|
48
|
+
case "credits":
|
|
49
|
+
return runCredits(deps, args);
|
|
50
|
+
default: {
|
|
51
|
+
const _exhaustive = args.command;
|
|
52
|
+
return _exhaustive;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
export async function runCli(argv, overrides = {}) {
|
|
57
|
+
const deps = mergeDeps(overrides);
|
|
58
|
+
try {
|
|
59
|
+
const args = parseArgs(argv, deps.defaultWaitMs);
|
|
60
|
+
return await dispatch(deps, args);
|
|
61
|
+
}
|
|
62
|
+
catch (err) {
|
|
63
|
+
if (err instanceof CliError) {
|
|
64
|
+
if (err.action)
|
|
65
|
+
writeAction(deps, err.action);
|
|
66
|
+
if (err.message)
|
|
67
|
+
deps.io.stderr(`${err.message}\n`);
|
|
68
|
+
return err.exitCode;
|
|
69
|
+
}
|
|
70
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
71
|
+
deps.io.stderr(`${message}\n`);
|
|
72
|
+
return EXIT_UNEXPECTED;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=main.js.map
|
package/dist/main.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { CliDeps } from "./deps.js";
|
|
2
|
+
export type McpHttpServer = {
|
|
3
|
+
type?: "http";
|
|
4
|
+
url: string;
|
|
5
|
+
};
|
|
6
|
+
export declare function mcpEndpoint(origin: string): string;
|
|
7
|
+
export declare function parseJsonObject(raw: string): Record<string, unknown> | null;
|
|
8
|
+
export declare function mergeMcpServers(existing: Record<string, unknown>, name: string, server: McpHttpServer): Record<string, unknown>;
|
|
9
|
+
export declare function removeMcpServer(existing: Record<string, unknown>, name: string): Record<string, unknown>;
|
|
10
|
+
export declare function writeMcpJson(deps: CliDeps, path: string, mutate: (current: Record<string, unknown>) => Record<string, unknown>): void;
|
|
11
|
+
export declare function claudeMcpAddCommand(origin: string): string;
|
|
12
|
+
export declare function codexMcpAddCommand(origin: string): string;
|
|
13
|
+
export declare function codexMcpLoginCommand(): string;
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { dirname } from "node:path";
|
|
2
|
+
import { CliError, EXIT_USAGE } from "./exit.js";
|
|
3
|
+
export function mcpEndpoint(origin) {
|
|
4
|
+
return `${origin.replace(/\/$/, "")}/mcp`;
|
|
5
|
+
}
|
|
6
|
+
export function parseJsonObject(raw) {
|
|
7
|
+
try {
|
|
8
|
+
const parsed = JSON.parse(raw);
|
|
9
|
+
if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) {
|
|
10
|
+
return parsed;
|
|
11
|
+
}
|
|
12
|
+
return null;
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
return null;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
export function mergeMcpServers(existing, name, server) {
|
|
19
|
+
const current = existing.mcpServers;
|
|
20
|
+
const map = current && typeof current === "object" && !Array.isArray(current)
|
|
21
|
+
? { ...current }
|
|
22
|
+
: {};
|
|
23
|
+
map[name] = { type: "http", url: server.url };
|
|
24
|
+
return { ...existing, mcpServers: map };
|
|
25
|
+
}
|
|
26
|
+
export function removeMcpServer(existing, name) {
|
|
27
|
+
const current = existing.mcpServers;
|
|
28
|
+
if (!current || typeof current !== "object" || Array.isArray(current)) {
|
|
29
|
+
return existing;
|
|
30
|
+
}
|
|
31
|
+
const map = { ...current };
|
|
32
|
+
delete map[name];
|
|
33
|
+
const next = { ...existing };
|
|
34
|
+
if (Object.keys(map).length === 0) {
|
|
35
|
+
delete next.mcpServers;
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
next.mcpServers = map;
|
|
39
|
+
}
|
|
40
|
+
return next;
|
|
41
|
+
}
|
|
42
|
+
export function writeMcpJson(deps, path, mutate) {
|
|
43
|
+
let current = {};
|
|
44
|
+
if (deps.fs.exists(path)) {
|
|
45
|
+
const parsed = parseJsonObject(deps.fs.read(path));
|
|
46
|
+
if (!parsed) {
|
|
47
|
+
throw new CliError(`Refusing to overwrite invalid JSON at ${path}. Fix or remove that file and re-run setup.`, EXIT_USAGE);
|
|
48
|
+
}
|
|
49
|
+
current = parsed;
|
|
50
|
+
}
|
|
51
|
+
const next = mutate(current);
|
|
52
|
+
const mode = deps.fs.exists(path) ? deps.fs.statMode(path) : 0o644;
|
|
53
|
+
deps.fs.mkdir(dirname(path), 0o755);
|
|
54
|
+
deps.fs.write(path, `${JSON.stringify(next, null, 2)}\n`, mode);
|
|
55
|
+
}
|
|
56
|
+
export function claudeMcpAddCommand(origin) {
|
|
57
|
+
return `claude mcp add --transport http --scope user cleanslop ${mcpEndpoint(origin)}`;
|
|
58
|
+
}
|
|
59
|
+
export function codexMcpAddCommand(origin) {
|
|
60
|
+
return `codex mcp add cleanslop --url ${mcpEndpoint(origin)}`;
|
|
61
|
+
}
|
|
62
|
+
export function codexMcpLoginCommand() {
|
|
63
|
+
return "codex mcp login cleanslop";
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=mcp-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-config.js","sourceRoot":"","sources":["../src/mcp-config.ts"],"names":[],"mappings":"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"}
|
package/dist/output.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { CliDeps } from "./deps.js";
|
|
2
|
+
import type { AgentScan } from "./types.js";
|
|
3
|
+
export declare function writeJson(deps: CliDeps, value: unknown): void;
|
|
4
|
+
export declare function writeMarkdownReport(deps: CliDeps, markdown: string): void;
|
|
5
|
+
export declare function scanLine(scan: AgentScan): string;
|
|
6
|
+
export declare function formatEtaLine(scan: Pick<AgentScan, "eta" | "elapsedSec">): string | null;
|
|
7
|
+
export declare function writeScanNext(deps: CliDeps, scan: Pick<AgentScan, "id" | "next">): void;
|
|
8
|
+
export declare function resetAskEmailPrintedForTests(): void;
|
|
9
|
+
export declare function writeScanProgress(deps: CliDeps, scan: AgentScan): void;
|
package/dist/output.js
ADDED
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
export function writeJson(deps, value) {
|
|
2
|
+
deps.io.stdout(`${JSON.stringify(value)}\n`);
|
|
3
|
+
}
|
|
4
|
+
export function writeMarkdownReport(deps, markdown) {
|
|
5
|
+
const text = markdown.endsWith("\n") ? markdown : `${markdown}\n`;
|
|
6
|
+
deps.io.stdout(text);
|
|
7
|
+
}
|
|
8
|
+
export function scanLine(scan) {
|
|
9
|
+
const bits = [
|
|
10
|
+
`id=${scan.id}`,
|
|
11
|
+
`status=${scan.status}`,
|
|
12
|
+
`final=${scan.final ? "true" : "false"}`,
|
|
13
|
+
];
|
|
14
|
+
if (scan.commitSha)
|
|
15
|
+
bits.push(`commit=${scan.commitSha.slice(0, 7)}`);
|
|
16
|
+
if (typeof scan.findingCount === "number") {
|
|
17
|
+
bits.push(`findings=${scan.findingCount}`);
|
|
18
|
+
}
|
|
19
|
+
return bits.join(" ");
|
|
20
|
+
}
|
|
21
|
+
export function formatEtaLine(scan) {
|
|
22
|
+
if (!scan.eta)
|
|
23
|
+
return null;
|
|
24
|
+
const minMin = Math.max(1, Math.round(scan.eta.minSec / 60));
|
|
25
|
+
const maxMin = Math.max(minMin, Math.round(scan.eta.maxSec / 60));
|
|
26
|
+
const range = minMin === maxMin ? `${minMin} min` : `${minMin}–${maxMin} min`;
|
|
27
|
+
const elapsed = scan.elapsedSec != null
|
|
28
|
+
? scan.elapsedSec < 90
|
|
29
|
+
? `${scan.elapsedSec}s elapsed`
|
|
30
|
+
: `${Math.round(scan.elapsedSec / 60)} min elapsed`
|
|
31
|
+
: null;
|
|
32
|
+
return elapsed ? `ETA ${range} (${elapsed})` : `ETA ${range}`;
|
|
33
|
+
}
|
|
34
|
+
const printedAskEmailScanIds = new Set();
|
|
35
|
+
export function writeScanNext(deps, scan) {
|
|
36
|
+
if (scan.next?.action !== "ask_email")
|
|
37
|
+
return;
|
|
38
|
+
if (printedAskEmailScanIds.has(scan.id))
|
|
39
|
+
return;
|
|
40
|
+
printedAskEmailScanIds.add(scan.id);
|
|
41
|
+
deps.io.stderr([
|
|
42
|
+
"CLEANSLOP_ACTION_REQUIRED: ask_email",
|
|
43
|
+
"",
|
|
44
|
+
`This scan may take a while. Run \`cleanslop email ${scan.id}\` to get the exact masked-recipient question, ask the human, and if they agree rerun with \`--consent "<that exact question>"\`. Never open, approve, or pay yourself.`,
|
|
45
|
+
"",
|
|
46
|
+
].join("\n"));
|
|
47
|
+
}
|
|
48
|
+
export function resetAskEmailPrintedForTests() {
|
|
49
|
+
printedAskEmailScanIds.clear();
|
|
50
|
+
}
|
|
51
|
+
export function writeScanProgress(deps, scan) {
|
|
52
|
+
deps.io.stderr(`${scanLine(scan)}\n`);
|
|
53
|
+
if (scan.progress) {
|
|
54
|
+
deps.io.stderr(`${scan.progress.label}\n`);
|
|
55
|
+
}
|
|
56
|
+
const eta = formatEtaLine(scan);
|
|
57
|
+
if (eta) {
|
|
58
|
+
deps.io.stderr(`${eta}\n`);
|
|
59
|
+
}
|
|
60
|
+
if (scan.error) {
|
|
61
|
+
deps.io.stderr(`${scan.error.message}\n`);
|
|
62
|
+
}
|
|
63
|
+
writeScanNext(deps, scan);
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=output.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output.js","sourceRoot":"","sources":["../src/output.ts"],"names":[],"mappings":"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"}
|
package/dist/pack.d.ts
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { CliDeps } from "./deps.js";
|
|
2
|
+
export type PackExclusion = {
|
|
3
|
+
path: string;
|
|
4
|
+
reason: string;
|
|
5
|
+
};
|
|
6
|
+
export type PackFile = {
|
|
7
|
+
relativePath: string;
|
|
8
|
+
bytes: number;
|
|
9
|
+
};
|
|
10
|
+
export type PackPlan = {
|
|
11
|
+
root: string;
|
|
12
|
+
files: PackFile[];
|
|
13
|
+
excluded: PackExclusion[];
|
|
14
|
+
fileCount: number;
|
|
15
|
+
bytes: number;
|
|
16
|
+
dirty: boolean;
|
|
17
|
+
remote?: string;
|
|
18
|
+
commitSha?: string;
|
|
19
|
+
directoryName: string;
|
|
20
|
+
pathHash: string;
|
|
21
|
+
};
|
|
22
|
+
export declare function isSecretDeniedPath(relativePath: string): string | null;
|
|
23
|
+
export declare function planPack(deps: CliDeps, cwd?: string): Promise<PackPlan>;
|
|
24
|
+
export declare function formatPackSummary(plan: PackPlan, dryRun: boolean): string;
|
|
25
|
+
export declare function assertPackedArchiveFitsUpload(bytes: number): void;
|
|
26
|
+
export declare function writePackArchive(plan: PackPlan): Promise<{
|
|
27
|
+
bytes: Buffer;
|
|
28
|
+
sha256: string;
|
|
29
|
+
}>;
|
|
30
|
+
export declare function packManifest(plan: PackPlan, contentSha256: string): Record<string, unknown>;
|
package/dist/pack.js
ADDED
|
@@ -0,0 +1,283 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { lstat, readdir, readFile } from "node:fs/promises";
|
|
3
|
+
import { basename, join, relative, resolve, sep } from "node:path";
|
|
4
|
+
import { PACK_MAX_ARCHIVE_BYTES, PACK_MAX_FILE_BYTES } from "./config.js";
|
|
5
|
+
import { sourceError } from "./exit.js";
|
|
6
|
+
import { gitToplevel } from "./git.js";
|
|
7
|
+
import { createUstar, gzipDeterministic } from "./ustar.js";
|
|
8
|
+
const WALK_SKIP_DIRS = new Set([
|
|
9
|
+
".git",
|
|
10
|
+
".hg",
|
|
11
|
+
".svn",
|
|
12
|
+
"node_modules",
|
|
13
|
+
"dist",
|
|
14
|
+
"build",
|
|
15
|
+
"coverage",
|
|
16
|
+
".next",
|
|
17
|
+
".turbo",
|
|
18
|
+
".cache",
|
|
19
|
+
".vercel",
|
|
20
|
+
".output",
|
|
21
|
+
"vendor",
|
|
22
|
+
"__pycache__",
|
|
23
|
+
".venv",
|
|
24
|
+
"venv",
|
|
25
|
+
"target",
|
|
26
|
+
"out",
|
|
27
|
+
]);
|
|
28
|
+
const BINARY_EXT = new Set([
|
|
29
|
+
".png",
|
|
30
|
+
".jpg",
|
|
31
|
+
".jpeg",
|
|
32
|
+
".gif",
|
|
33
|
+
".webp",
|
|
34
|
+
".ico",
|
|
35
|
+
".bmp",
|
|
36
|
+
".pdf",
|
|
37
|
+
".zip",
|
|
38
|
+
".gz",
|
|
39
|
+
".tgz",
|
|
40
|
+
".bz2",
|
|
41
|
+
".xz",
|
|
42
|
+
".7z",
|
|
43
|
+
".rar",
|
|
44
|
+
".wasm",
|
|
45
|
+
".so",
|
|
46
|
+
".dylib",
|
|
47
|
+
".dll",
|
|
48
|
+
".exe",
|
|
49
|
+
".bin",
|
|
50
|
+
".class",
|
|
51
|
+
".jar",
|
|
52
|
+
".woff",
|
|
53
|
+
".woff2",
|
|
54
|
+
".ttf",
|
|
55
|
+
".otf",
|
|
56
|
+
".eot",
|
|
57
|
+
".mp3",
|
|
58
|
+
".mp4",
|
|
59
|
+
".mov",
|
|
60
|
+
".avi",
|
|
61
|
+
".wav",
|
|
62
|
+
".webm",
|
|
63
|
+
]);
|
|
64
|
+
function posixPath(relativePath) {
|
|
65
|
+
return relativePath.split(sep).join("/");
|
|
66
|
+
}
|
|
67
|
+
function comparePosix(a, b) {
|
|
68
|
+
return a < b ? -1 : a > b ? 1 : 0;
|
|
69
|
+
}
|
|
70
|
+
export function isSecretDeniedPath(relativePath) {
|
|
71
|
+
const posix = posixPath(relativePath);
|
|
72
|
+
const base = posix.split("/").pop() ?? posix;
|
|
73
|
+
if (posix === ".git" || posix.startsWith(".git/"))
|
|
74
|
+
return "git metadata";
|
|
75
|
+
if (posix.split("/").includes(".ssh") || posix.startsWith(".ssh/")) {
|
|
76
|
+
return "secret path";
|
|
77
|
+
}
|
|
78
|
+
if (posix.split("/").includes(".aws") || posix.startsWith(".aws/")) {
|
|
79
|
+
return "secret path";
|
|
80
|
+
}
|
|
81
|
+
if (posix === ".docker/config.json" || posix.endsWith("/.docker/config.json")) {
|
|
82
|
+
return "secret config";
|
|
83
|
+
}
|
|
84
|
+
if (/^\.env(?!\.example$)/i.test(base))
|
|
85
|
+
return "secret env file";
|
|
86
|
+
if (base === ".dev.vars" || base === ".netrc")
|
|
87
|
+
return "secret config";
|
|
88
|
+
if (base === ".npmrc" || base === ".pypirc")
|
|
89
|
+
return "secret config";
|
|
90
|
+
if (/\.pem$/i.test(base) || /\.key$/i.test(base) || /\.p12$/i.test(base)) {
|
|
91
|
+
return "secret key";
|
|
92
|
+
}
|
|
93
|
+
if (/\.jks$/i.test(base) || /\.keystore$/i.test(base))
|
|
94
|
+
return "secret key";
|
|
95
|
+
if (/^id_(rsa|ed25519|ecdsa|dsa)(-[a-z0-9]+)?$/i.test(base)) {
|
|
96
|
+
return "secret key";
|
|
97
|
+
}
|
|
98
|
+
if (/\.tfstate/i.test(base))
|
|
99
|
+
return "secret terraform";
|
|
100
|
+
if (/service-account.*\.json$/i.test(base))
|
|
101
|
+
return "secret credentials";
|
|
102
|
+
if (/firebase-adminsdk.*\.json$/i.test(base))
|
|
103
|
+
return "secret credentials";
|
|
104
|
+
if (/^credentials.*\.json$/i.test(base))
|
|
105
|
+
return "secret credentials";
|
|
106
|
+
return null;
|
|
107
|
+
}
|
|
108
|
+
function isBinaryPath(relativePath) {
|
|
109
|
+
const base = relativePath.split(sep).pop() ?? relativePath;
|
|
110
|
+
const dot = base.lastIndexOf(".");
|
|
111
|
+
if (dot < 0)
|
|
112
|
+
return false;
|
|
113
|
+
return BINARY_EXT.has(base.slice(dot).toLowerCase());
|
|
114
|
+
}
|
|
115
|
+
async function listGitFiles(deps, root) {
|
|
116
|
+
const listed = await deps.git(["ls-files", "-co", "--exclude-standard"], root);
|
|
117
|
+
if (!listed.ok)
|
|
118
|
+
return null;
|
|
119
|
+
return listed.stdout
|
|
120
|
+
.split("\n")
|
|
121
|
+
.map((line) => line.trim())
|
|
122
|
+
.filter(Boolean);
|
|
123
|
+
}
|
|
124
|
+
async function walkFiles(root) {
|
|
125
|
+
const out = [];
|
|
126
|
+
async function walk(dir) {
|
|
127
|
+
const entries = await readdir(dir, { withFileTypes: true });
|
|
128
|
+
for (const entry of entries) {
|
|
129
|
+
if (WALK_SKIP_DIRS.has(entry.name))
|
|
130
|
+
continue;
|
|
131
|
+
const abs = join(dir, entry.name);
|
|
132
|
+
const rel = relative(root, abs);
|
|
133
|
+
if (entry.isSymbolicLink())
|
|
134
|
+
continue;
|
|
135
|
+
if (entry.isDirectory()) {
|
|
136
|
+
await walk(abs);
|
|
137
|
+
continue;
|
|
138
|
+
}
|
|
139
|
+
if (entry.isFile())
|
|
140
|
+
out.push(rel);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
await walk(root);
|
|
144
|
+
return out;
|
|
145
|
+
}
|
|
146
|
+
function isSkippedDirPath(relativePath) {
|
|
147
|
+
return relativePath.split(/[\\/]/).some((part) => WALK_SKIP_DIRS.has(part));
|
|
148
|
+
}
|
|
149
|
+
async function classifyFile(root, relativePath) {
|
|
150
|
+
if (isSkippedDirPath(relativePath)) {
|
|
151
|
+
return { path: relativePath, reason: "ignored directory" };
|
|
152
|
+
}
|
|
153
|
+
const secret = isSecretDeniedPath(relativePath);
|
|
154
|
+
if (secret)
|
|
155
|
+
return { path: relativePath, reason: secret };
|
|
156
|
+
if (isBinaryPath(relativePath)) {
|
|
157
|
+
return { path: relativePath, reason: "binary" };
|
|
158
|
+
}
|
|
159
|
+
const abs = join(root, relativePath);
|
|
160
|
+
let info;
|
|
161
|
+
try {
|
|
162
|
+
info = await lstat(abs);
|
|
163
|
+
}
|
|
164
|
+
catch {
|
|
165
|
+
return { path: relativePath, reason: "missing" };
|
|
166
|
+
}
|
|
167
|
+
if (info.isSymbolicLink())
|
|
168
|
+
return { path: relativePath, reason: "symlink" };
|
|
169
|
+
if (!info.isFile())
|
|
170
|
+
return { path: relativePath, reason: "not a file" };
|
|
171
|
+
if (info.size > PACK_MAX_FILE_BYTES) {
|
|
172
|
+
return { path: relativePath, reason: "over 2 MB" };
|
|
173
|
+
}
|
|
174
|
+
return { relativePath, bytes: info.size };
|
|
175
|
+
}
|
|
176
|
+
export async function planPack(deps, cwd = deps.env.cwd()) {
|
|
177
|
+
const top = await gitToplevel(deps, cwd);
|
|
178
|
+
const root = resolve(top ?? cwd);
|
|
179
|
+
const gitFiles = top ? await listGitFiles(deps, root) : null;
|
|
180
|
+
const listed = gitFiles ?? (await walkFiles(root));
|
|
181
|
+
const files = [];
|
|
182
|
+
const excluded = [];
|
|
183
|
+
for (const rel of listed) {
|
|
184
|
+
const classified = await classifyFile(root, rel);
|
|
185
|
+
if ("reason" in classified)
|
|
186
|
+
excluded.push(classified);
|
|
187
|
+
else
|
|
188
|
+
files.push(classified);
|
|
189
|
+
}
|
|
190
|
+
files.sort((a, b) => comparePosix(posixPath(a.relativePath), posixPath(b.relativePath)));
|
|
191
|
+
excluded.sort((a, b) => comparePosix(a.path, b.path));
|
|
192
|
+
const bytes = files.reduce((sum, file) => sum + file.bytes, 0);
|
|
193
|
+
if (files.length === 0) {
|
|
194
|
+
throw sourceError("Nothing to upload after applying ignore and secret filters.");
|
|
195
|
+
}
|
|
196
|
+
let dirty = !top;
|
|
197
|
+
let remote;
|
|
198
|
+
let commitSha;
|
|
199
|
+
if (top) {
|
|
200
|
+
const status = await deps.git(["status", "--porcelain"], root);
|
|
201
|
+
dirty = status.ok && status.stdout.trim().length > 0;
|
|
202
|
+
const origin = await deps.git(["remote", "get-url", "origin"], root);
|
|
203
|
+
if (origin.ok && origin.stdout.trim())
|
|
204
|
+
remote = origin.stdout.trim();
|
|
205
|
+
const head = await deps.git(["rev-parse", "HEAD"], root);
|
|
206
|
+
if (head.ok && head.stdout.trim())
|
|
207
|
+
commitSha = head.stdout.trim();
|
|
208
|
+
}
|
|
209
|
+
const directoryName = basename(root) || "upload";
|
|
210
|
+
const pathHash = createHash("sha256").update(root).digest("hex").slice(0, 32);
|
|
211
|
+
return {
|
|
212
|
+
root,
|
|
213
|
+
files,
|
|
214
|
+
excluded,
|
|
215
|
+
fileCount: files.length,
|
|
216
|
+
bytes,
|
|
217
|
+
dirty,
|
|
218
|
+
remote,
|
|
219
|
+
commitSha,
|
|
220
|
+
directoryName,
|
|
221
|
+
pathHash,
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
export function formatPackSummary(plan, dryRun) {
|
|
225
|
+
const lines = [
|
|
226
|
+
dryRun ? "Would upload:" : "Uploading:",
|
|
227
|
+
` ${plan.fileCount} files, ${plan.bytes} bytes`,
|
|
228
|
+
` directory ${plan.directoryName}`,
|
|
229
|
+
];
|
|
230
|
+
if (plan.remote)
|
|
231
|
+
lines.push(` remote ${plan.remote}`);
|
|
232
|
+
const topExcluded = plan.excluded.slice(0, 8);
|
|
233
|
+
if (topExcluded.length > 0) {
|
|
234
|
+
lines.push(" excluded:");
|
|
235
|
+
for (const item of topExcluded) {
|
|
236
|
+
lines.push(` ${item.path} (${item.reason})`);
|
|
237
|
+
}
|
|
238
|
+
if (plan.excluded.length > topExcluded.length) {
|
|
239
|
+
lines.push(` … ${plan.excluded.length - topExcluded.length} more`);
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
return `${lines.join("\n")}\n`;
|
|
243
|
+
}
|
|
244
|
+
export function assertPackedArchiveFitsUpload(bytes) {
|
|
245
|
+
if (bytes > PACK_MAX_ARCHIVE_BYTES) {
|
|
246
|
+
throw sourceError(`Packed archive is ${bytes} bytes; the upload limit is 100 MB.`);
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
export async function writePackArchive(plan) {
|
|
250
|
+
const entries = [];
|
|
251
|
+
for (const file of plan.files) {
|
|
252
|
+
const posix = posixPath(file.relativePath);
|
|
253
|
+
const abs = join(plan.root, file.relativePath);
|
|
254
|
+
const info = await lstat(abs);
|
|
255
|
+
if (info.isSymbolicLink()) {
|
|
256
|
+
throw sourceError(`Refusing to pack symlink ${posix}.`);
|
|
257
|
+
}
|
|
258
|
+
if (!info.isFile()) {
|
|
259
|
+
throw sourceError(`Refusing to pack non-file ${posix}.`);
|
|
260
|
+
}
|
|
261
|
+
entries.push({ name: posix, content: await readFile(abs) });
|
|
262
|
+
}
|
|
263
|
+
const tar = createUstar(entries);
|
|
264
|
+
const gz = gzipDeterministic(tar);
|
|
265
|
+
assertPackedArchiveFitsUpload(gz.byteLength);
|
|
266
|
+
return {
|
|
267
|
+
bytes: gz,
|
|
268
|
+
sha256: createHash("sha256").update(gz).digest("hex"),
|
|
269
|
+
};
|
|
270
|
+
}
|
|
271
|
+
export function packManifest(plan, contentSha256) {
|
|
272
|
+
return {
|
|
273
|
+
remote: plan.remote,
|
|
274
|
+
commitSha: plan.commitSha,
|
|
275
|
+
dirty: plan.dirty,
|
|
276
|
+
fileCount: plan.fileCount,
|
|
277
|
+
bytes: plan.bytes,
|
|
278
|
+
contentSha256,
|
|
279
|
+
directoryName: plan.directoryName,
|
|
280
|
+
pathHash: plan.pathHash,
|
|
281
|
+
};
|
|
282
|
+
}
|
|
283
|
+
//# sourceMappingURL=pack.js.map
|
package/dist/pack.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pack.js","sourceRoot":"","sources":["../src/pack.ts"],"names":[],"mappings":"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"}
|
package/dist/redact.d.ts
ADDED
package/dist/redact.js
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { TOKEN_RE } from "./config.js";
|
|
2
|
+
const PRIVATE_TOKEN_RE = /PrivateToken\s+token\s*=\s*"[^"]*"/gi;
|
|
3
|
+
const JWT_RE = /eyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+/g;
|
|
4
|
+
const SPT_RE = /spt_[A-Za-z0-9_]+/g;
|
|
5
|
+
export function redactSecrets(text) {
|
|
6
|
+
return text
|
|
7
|
+
.replace(TOKEN_RE, "cslop_***")
|
|
8
|
+
.replace(PRIVATE_TOKEN_RE, 'PrivateToken token="***"')
|
|
9
|
+
.replace(JWT_RE, "[redacted-jwt]")
|
|
10
|
+
.replace(SPT_RE, "spt_***");
|
|
11
|
+
}
|
|
12
|
+
export function tokenLast4(token) {
|
|
13
|
+
if (token.length < 4)
|
|
14
|
+
return token;
|
|
15
|
+
return token.slice(-4);
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=redact.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redact.js","sourceRoot":"","sources":["../src/redact.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC,MAAM,gBAAgB,GAAG,sCAAsC,CAAC;AAChE,MAAM,MAAM,GAAG,wDAAwD,CAAC;AACxE,MAAM,MAAM,GAAG,oBAAoB,CAAC;AAEpC,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,OAAO,IAAI;SACR,OAAO,CAAC,QAAQ,EAAE,WAAW,CAAC;SAC9B,OAAO,CAAC,gBAAgB,EAAE,0BAA0B,CAAC;SACrD,OAAO,CAAC,MAAM,EAAE,gBAAgB,CAAC;SACjC,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,KAAa;IACtC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IACnC,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACzB,CAAC"}
|
package/dist/skill.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export declare const SKILL_HEADINGS: readonly ["When to scan", "Git preconditions", "Transport", "Connect with Link", "Relay human actions", "Waiting", "Reading the report", "Fix loop", "Stop conditions", "Report back", "Email", "Never print tokens"];
|
|
2
|
+
export declare function skillCorePath(): string;
|
|
3
|
+
export declare function loadSkillCore(readFile?: (path: string) => string): string;
|
|
4
|
+
export declare function renderSkillMd(core: string): string;
|
|
5
|
+
export declare function renderCursorMdc(core: string): string;
|
|
6
|
+
export declare function renderAgentsSnippet(core: string): string;
|
|
7
|
+
export declare function wrapOwnedFile(content: string): string;
|
|
8
|
+
export declare function upsertMarkerBlock(existing: string, block: string): string;
|
|
9
|
+
export declare function removeMarkerBlock(existing: string): string;
|
|
10
|
+
export declare function assertSkillCoreComplete(core: string): string[];
|