clud-bug 0.6.34 → 0.7.0-rc.11
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 +20 -0
- package/bin/clud-bug.js +10 -1353
- package/data/canonical-v1.json +37 -0
- package/dist/cli/agents-md.d.ts +16 -0
- package/dist/cli/agents-md.d.ts.map +1 -0
- package/dist/cli/agents-md.js +226 -0
- package/dist/cli/agents-md.js.map +1 -0
- package/dist/cli/audit.d.ts +13 -0
- package/dist/cli/audit.d.ts.map +1 -0
- package/dist/cli/audit.js +90 -0
- package/dist/cli/audit.js.map +1 -0
- package/dist/cli/branch-protection.d.ts +57 -0
- package/dist/cli/branch-protection.d.ts.map +1 -0
- package/dist/cli/branch-protection.js +118 -0
- package/dist/cli/branch-protection.js.map +1 -0
- package/dist/cli/configure-github.d.ts +58 -0
- package/dist/cli/configure-github.d.ts.map +1 -0
- package/dist/cli/configure-github.js +242 -0
- package/dist/cli/configure-github.js.map +1 -0
- package/dist/cli/edit-workflow.d.ts +18 -0
- package/dist/cli/edit-workflow.d.ts.map +1 -0
- package/dist/cli/edit-workflow.js +43 -0
- package/dist/cli/edit-workflow.js.map +1 -0
- package/dist/cli/index.d.ts +9 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +19 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/main.d.ts +3 -0
- package/dist/cli/main.d.ts.map +1 -0
- package/dist/cli/main.js +2067 -0
- package/dist/cli/main.js.map +1 -0
- package/dist/cli/skill-usage.d.ts +109 -0
- package/dist/cli/skill-usage.d.ts.map +1 -0
- package/dist/cli/skill-usage.js +380 -0
- package/dist/cli/skill-usage.js.map +1 -0
- package/dist/cli/skills.d.ts +56 -0
- package/dist/cli/skills.d.ts.map +1 -0
- package/dist/cli/skills.js +292 -0
- package/dist/cli/skills.js.map +1 -0
- package/dist/cli/update.d.ts +29 -0
- package/dist/cli/update.d.ts.map +1 -0
- package/dist/cli/update.js +205 -0
- package/dist/cli/update.js.map +1 -0
- package/dist/cli/usage.d.ts +142 -0
- package/dist/cli/usage.d.ts.map +1 -0
- package/dist/cli/usage.js +348 -0
- package/dist/cli/usage.js.map +1 -0
- package/dist/core/audit.d.ts +8 -0
- package/dist/core/audit.d.ts.map +1 -0
- package/dist/core/audit.js +47 -0
- package/dist/core/audit.js.map +1 -0
- package/dist/core/auto-resolve.d.ts +235 -0
- package/dist/core/auto-resolve.d.ts.map +1 -0
- package/dist/core/auto-resolve.js +293 -0
- package/dist/core/auto-resolve.js.map +1 -0
- package/dist/core/configure-github.d.ts +179 -0
- package/dist/core/configure-github.d.ts.map +1 -0
- package/dist/core/configure-github.js +289 -0
- package/dist/core/configure-github.js.map +1 -0
- package/dist/core/detect.d.ts +77 -0
- package/dist/core/detect.d.ts.map +1 -0
- package/dist/core/detect.js +262 -0
- package/dist/core/detect.js.map +1 -0
- package/dist/core/diff-findings.d.ts +96 -0
- package/dist/core/diff-findings.d.ts.map +1 -0
- package/dist/core/diff-findings.js +261 -0
- package/dist/core/diff-findings.js.map +1 -0
- package/dist/core/formal-review.d.ts +79 -0
- package/dist/core/formal-review.d.ts.map +1 -0
- package/dist/core/formal-review.js +71 -0
- package/dist/core/formal-review.js.map +1 -0
- package/dist/core/index.d.ts +17 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +66 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/inline-threads.d.ts +160 -0
- package/dist/core/inline-threads.d.ts.map +1 -0
- package/dist/core/inline-threads.js +369 -0
- package/dist/core/inline-threads.js.map +1 -0
- package/dist/core/prompt-builder.d.ts +164 -0
- package/dist/core/prompt-builder.d.ts.map +1 -0
- package/dist/core/prompt-builder.js +419 -0
- package/dist/core/prompt-builder.js.map +1 -0
- package/dist/core/prompts.d.ts +9 -0
- package/dist/core/prompts.d.ts.map +1 -0
- package/dist/core/prompts.js +401 -0
- package/dist/core/prompts.js.map +1 -0
- package/dist/core/render-review.d.ts +6 -0
- package/dist/core/render-review.d.ts.map +1 -0
- package/dist/core/render-review.js +219 -0
- package/dist/core/render-review.js.map +1 -0
- package/dist/core/render.d.ts +13 -0
- package/dist/core/render.d.ts.map +1 -0
- package/dist/core/render.js +62 -0
- package/dist/core/render.js.map +1 -0
- package/dist/core/resolve-verifier.d.ts +46 -0
- package/dist/core/resolve-verifier.d.ts.map +1 -0
- package/dist/core/resolve-verifier.js +187 -0
- package/dist/core/resolve-verifier.js.map +1 -0
- package/dist/core/review-schema-zod.d.ts +240 -0
- package/dist/core/review-schema-zod.d.ts.map +1 -0
- package/dist/core/review-schema-zod.js +218 -0
- package/dist/core/review-schema-zod.js.map +1 -0
- package/dist/core/review-schema.d.ts +42 -0
- package/dist/core/review-schema.d.ts.map +1 -0
- package/dist/core/review-schema.js +156 -0
- package/dist/core/review-schema.js.map +1 -0
- package/dist/core/review-writeback.d.ts +193 -0
- package/dist/core/review-writeback.d.ts.map +1 -0
- package/dist/core/review-writeback.js +364 -0
- package/dist/core/review-writeback.js.map +1 -0
- package/dist/core/skills.d.ts +147 -0
- package/dist/core/skills.d.ts.map +1 -0
- package/dist/core/skills.js +726 -0
- package/dist/core/skills.js.map +1 -0
- package/dist/core/version.d.ts +2 -0
- package/dist/core/version.d.ts.map +1 -0
- package/dist/core/version.js +4 -0
- package/dist/core/version.js.map +1 -0
- package/package.json +37 -5
- package/{lib/agents-md.js → src/cli/agents-md.ts} +25 -14
- package/{lib/audit.js → src/cli/audit.ts} +37 -44
- package/{lib/branch-protection.js → src/cli/branch-protection.ts} +75 -11
- package/src/cli/configure-github.ts +329 -0
- package/{lib/edit-workflow.js → src/cli/edit-workflow.ts} +32 -11
- package/src/cli/index.ts +107 -0
- package/src/cli/main.ts +2204 -0
- package/{lib/skill-usage.js → src/cli/skill-usage.ts} +168 -94
- package/src/cli/skills.ts +386 -0
- package/{lib/update.js → src/cli/update.ts} +87 -27
- package/{lib/usage.js → src/cli/usage.ts} +167 -76
- package/src/core/audit.ts +53 -0
- package/src/core/auto-resolve.ts +488 -0
- package/src/core/configure-github.ts +497 -0
- package/{lib/detect.js → src/core/detect.ts} +100 -47
- package/src/core/diff-findings.ts +323 -0
- package/src/core/formal-review.ts +168 -0
- package/src/core/index.ts +250 -0
- package/src/core/inline-threads.ts +471 -0
- package/src/core/prompt-builder.ts +561 -0
- package/{lib/prompts.js → src/core/prompts.ts} +16 -2
- package/{lib/render-review.js → src/core/render-review.ts} +57 -25
- package/{lib/render.js → src/core/render.ts} +37 -17
- package/src/core/resolve-verifier.ts +228 -0
- package/src/core/review-schema-zod.ts +262 -0
- package/{lib/review-schema.js → src/core/review-schema.ts} +68 -5
- package/src/core/review-writeback.ts +565 -0
- package/{lib/skills.js → src/core/skills.ts} +456 -342
- package/src/core/version.ts +3 -0
- package/templates/clud-bug-review.md.tmpl +115 -0
- package/templates/workflow-py.yml.tmpl +80 -3
- package/templates/workflow-ts.yml.tmpl +80 -3
- package/templates/workflow.yml.tmpl +175 -8
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { loadCanonicalV1, type OctokitLike } from '../core/configure-github.js';
|
|
2
|
+
export interface RunConfigureGithubOptions {
|
|
3
|
+
/** "owner/repo" target — required. */
|
|
4
|
+
target?: string | null;
|
|
5
|
+
/** Target branch (default `main`). */
|
|
6
|
+
branch?: string;
|
|
7
|
+
/** Render diff only; skip PATCH calls. */
|
|
8
|
+
dryRun?: boolean;
|
|
9
|
+
/** Suppress progress chatter; emit only the final `ok` summary. */
|
|
10
|
+
quiet?: boolean;
|
|
11
|
+
/** Emit the SPEC §3.23.1 status payload as JSON instead of key-colon-value. */
|
|
12
|
+
json?: boolean;
|
|
13
|
+
/** Resolver for the GitHub token (tests pass a stub). */
|
|
14
|
+
resolveToken?: () => Promise<string | null>;
|
|
15
|
+
/** Octokit factory (tests inject a fake; defaults to the gh-adapter). */
|
|
16
|
+
octokitFactory?: (token: string) => OctokitLike;
|
|
17
|
+
/** Stdout writer (tests capture). */
|
|
18
|
+
stdout?: (msg: string) => void;
|
|
19
|
+
/** Stderr writer (tests capture). */
|
|
20
|
+
stderr?: (msg: string) => void;
|
|
21
|
+
}
|
|
22
|
+
/** Resolved outcome of a configure-github run, for the §3.23.1 status payload. */
|
|
23
|
+
export interface ConfigureSummary {
|
|
24
|
+
owner: string;
|
|
25
|
+
repo: string;
|
|
26
|
+
/** True when the repo already matches canonical-v1 (idempotent no-op). */
|
|
27
|
+
alreadyCanonical: boolean;
|
|
28
|
+
/** True when this was a --dry-run (no PATCH calls made). */
|
|
29
|
+
dryRun: boolean;
|
|
30
|
+
/** Number of changes (applied, or pending for dry-run; 0 for a no-op). */
|
|
31
|
+
changes: number;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* SPEC §3.23.1 (NORMATIVE): emit a single-line status payload carrying
|
|
35
|
+
* `alreadyCanonical` + `rulesetVersion` as named fields — JSON for machine
|
|
36
|
+
* consumption, key-colon-value for humans.
|
|
37
|
+
*/
|
|
38
|
+
export declare function formatConfigureSummary(summary: ConfigureSummary, json: boolean): string;
|
|
39
|
+
/**
|
|
40
|
+
* Entry point — wired into `clud-bug.js` dispatch. Returns a Node-style
|
|
41
|
+
* exit code so the dispatcher can `process.exit()` deterministically. We
|
|
42
|
+
* don't call `process.exit` ourselves so tests can drive the function
|
|
43
|
+
* without taking down the harness.
|
|
44
|
+
*/
|
|
45
|
+
export declare function runConfigureGithub(options: RunConfigureGithubOptions): Promise<number>;
|
|
46
|
+
/**
|
|
47
|
+
* Builds an `OctokitLike` instance backed by `gh api` shell-outs. This
|
|
48
|
+
* lets us satisfy the structural interface without pulling in
|
|
49
|
+
* `@octokit/rest` as a runtime dep (~200KB). The App passes its real
|
|
50
|
+
* Octokit instance instead.
|
|
51
|
+
*/
|
|
52
|
+
export declare function ghCliOctokit(token: string): OctokitLike;
|
|
53
|
+
/**
|
|
54
|
+
* Re-exported so callers can preload the ruleset (e.g. for a `--show-ruleset`
|
|
55
|
+
* flag in future). Currently exists for parity with the App's pattern.
|
|
56
|
+
*/
|
|
57
|
+
export { loadCanonicalV1 };
|
|
58
|
+
//# sourceMappingURL=configure-github.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"configure-github.d.ts","sourceRoot":"","sources":["../../src/cli/configure-github.ts"],"names":[],"mappings":"AAwBA,OAAO,EAEL,eAAe,EACf,KAAK,WAAW,EAEjB,MAAM,6BAA6B,CAAC;AAErC,MAAM,WAAW,yBAAyB;IACxC,sCAAsC;IACtC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,sCAAsC;IACtC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,0CAA0C;IAC1C,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,mEAAmE;IACnE,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,+EAA+E;IAC/E,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,yDAAyD;IACzD,YAAY,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC5C,yEAAyE;IACzE,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,WAAW,CAAC;IAChD,qCAAqC;IACrC,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,qCAAqC;IACrC,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CAChC;AAwBD,kFAAkF;AAClF,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,0EAA0E;IAC1E,gBAAgB,EAAE,OAAO,CAAC;IAC1B,4DAA4D;IAC5D,MAAM,EAAE,OAAO,CAAC;IAChB,0EAA0E;IAC1E,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,gBAAgB,EAAE,IAAI,EAAE,OAAO,GAAG,MAAM,CAevF;AAED;;;;;GAKG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,yBAAyB,GACjC,OAAO,CAAC,MAAM,CAAC,CAwFjB;AAkBD;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,CAyFvD;AAOD;;;GAGG;AACH,OAAO,EAAE,eAAe,EAAE,CAAC"}
|
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
// `clud-bug configure-github` CLI command — applies the SPEC §7 canonical
|
|
2
|
+
// branch protection ruleset to a target repo.
|
|
3
|
+
//
|
|
4
|
+
// External users installing the App expect "best practice branch protection"
|
|
5
|
+
// applied automatically. This command lets them opt in offline + dry-run
|
|
6
|
+
// safely BEFORE the App's auto-setup runs server-side. Same core logic
|
|
7
|
+
// powers both paths (the App imports `applyCanonicalRuleset` from
|
|
8
|
+
// clud-bug/core; this CLI passes a `gh api`-wrapping adapter so users
|
|
9
|
+
// don't need `@octokit/rest` on their machine).
|
|
10
|
+
//
|
|
11
|
+
// Usage:
|
|
12
|
+
//
|
|
13
|
+
// clud-bug configure-github <owner>/<repo>
|
|
14
|
+
// clud-bug configure-github <owner>/<repo> --dry-run
|
|
15
|
+
// clud-bug configure-github <owner>/<repo> --branch develop
|
|
16
|
+
//
|
|
17
|
+
// Auth ladder:
|
|
18
|
+
//
|
|
19
|
+
// 1. `GITHUB_TOKEN` env var (CI-friendly, no `gh` install required)
|
|
20
|
+
// 2. `gh auth token` (developer workstation default)
|
|
21
|
+
//
|
|
22
|
+
// If neither produces a token, exits 1 with a recovery message.
|
|
23
|
+
import { spawn, spawnSync } from 'node:child_process';
|
|
24
|
+
import { applyCanonicalRuleset, loadCanonicalV1, } from '../core/configure-github.js';
|
|
25
|
+
const HELP = `clud-bug configure-github — apply SPEC §7 canonical branch protection.
|
|
26
|
+
|
|
27
|
+
Usage:
|
|
28
|
+
clud-bug configure-github <owner>/<repo> [options]
|
|
29
|
+
|
|
30
|
+
Options:
|
|
31
|
+
--dry-run Compute diff and print it, but do NOT call PATCH endpoints.
|
|
32
|
+
--branch <name> Target branch (default: main).
|
|
33
|
+
--quiet,-q Suppress progress chatter; emit only the final summary.
|
|
34
|
+
--json Emit the status payload as JSON (machine consumption).
|
|
35
|
+
--help,-h Show this help.
|
|
36
|
+
|
|
37
|
+
Auth (resolved in order):
|
|
38
|
+
1. GITHUB_TOKEN env var (CI-friendly)
|
|
39
|
+
2. \`gh auth token\` (developer workstation)
|
|
40
|
+
|
|
41
|
+
Exit codes:
|
|
42
|
+
0 success or already-canonical
|
|
43
|
+
1 auth missing, PATCH error, or unrecoverable transport failure
|
|
44
|
+
2 CLI usage error (missing target, bad flag)
|
|
45
|
+
`;
|
|
46
|
+
/**
|
|
47
|
+
* SPEC §3.23.1 (NORMATIVE): emit a single-line status payload carrying
|
|
48
|
+
* `alreadyCanonical` + `rulesetVersion` as named fields — JSON for machine
|
|
49
|
+
* consumption, key-colon-value for humans.
|
|
50
|
+
*/
|
|
51
|
+
export function formatConfigureSummary(summary, json) {
|
|
52
|
+
const { owner, repo, alreadyCanonical, dryRun, changes } = summary;
|
|
53
|
+
if (json) {
|
|
54
|
+
return (JSON.stringify({ owner, repo, alreadyCanonical, rulesetVersion: 'v1', dryRun, changes }) + '\n');
|
|
55
|
+
}
|
|
56
|
+
if (alreadyCanonical) {
|
|
57
|
+
return `ok configure-github: owner: ${owner} repo: ${repo} alreadyCanonical: true rulesetVersion: v1\n`;
|
|
58
|
+
}
|
|
59
|
+
const plural = changes === 1 ? '' : 's';
|
|
60
|
+
if (dryRun) {
|
|
61
|
+
return `ok configure-github: dry-run on ${owner}/${repo} — ${changes} change${plural} pending\n`;
|
|
62
|
+
}
|
|
63
|
+
return `ok configure-github: ${owner}/${repo} converged to canonical-v1 (${changes} change${plural})\n`;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Entry point — wired into `clud-bug.js` dispatch. Returns a Node-style
|
|
67
|
+
* exit code so the dispatcher can `process.exit()` deterministically. We
|
|
68
|
+
* don't call `process.exit` ourselves so tests can drive the function
|
|
69
|
+
* without taking down the harness.
|
|
70
|
+
*/
|
|
71
|
+
export async function runConfigureGithub(options) {
|
|
72
|
+
const { target, branch = 'main', dryRun = false, quiet = false, json = false, resolveToken = defaultResolveToken, octokitFactory = ghCliOctokit, stdout = (msg) => process.stdout.write(msg), stderr = (msg) => process.stderr.write(msg), } = options;
|
|
73
|
+
if (!target) {
|
|
74
|
+
stderr(HELP);
|
|
75
|
+
return 2;
|
|
76
|
+
}
|
|
77
|
+
const match = /^([^/]+)\/([^/]+)$/.exec(target);
|
|
78
|
+
if (!match) {
|
|
79
|
+
stderr(`clud-bug configure-github: target must be in owner/repo form, got "${target}".\n`);
|
|
80
|
+
return 2;
|
|
81
|
+
}
|
|
82
|
+
const [, owner, repo] = match;
|
|
83
|
+
const token = await resolveToken();
|
|
84
|
+
if (!token) {
|
|
85
|
+
stderr('clud-bug configure-github: no GitHub token found.\n' +
|
|
86
|
+
' Set GITHUB_TOKEN, or install + auth gh: brew install gh && gh auth login\n');
|
|
87
|
+
return 1;
|
|
88
|
+
}
|
|
89
|
+
if (!quiet) {
|
|
90
|
+
stdout(`\u{1F41B} configure-github: applying canonical-v1 ruleset to ${owner}/${repo} (branch=${branch})\n`);
|
|
91
|
+
}
|
|
92
|
+
// Single-call orchestration: the CLI previously called
|
|
93
|
+
// applyCanonicalRuleset twice in apply mode (dry-run first to display the
|
|
94
|
+
// planned changes, then a real call to apply). That two-read pattern
|
|
95
|
+
// opened a TOCTOU window — concurrent changes between the two reads
|
|
96
|
+
// could make the displayed list diverge from the actually-applied list,
|
|
97
|
+
// and the dry-run cost a redundant API round-trip every time. Drop the
|
|
98
|
+
// preview-first read: pass `dryRun` straight through. The function's
|
|
99
|
+
// idempotency contract (returns `alreadyCanonical: true` + empty changes
|
|
100
|
+
// on a no-op) means we don't need a separate "look before you leap"
|
|
101
|
+
// call. Users who want preview semantics run `--dry-run` first as a
|
|
102
|
+
// distinct invocation — idiomatic CLI behavior. Surfaced by PR #166
|
|
103
|
+
// reviewer (CTO follow-up 2026-06-17).
|
|
104
|
+
const octokit = octokitFactory(token);
|
|
105
|
+
let result;
|
|
106
|
+
try {
|
|
107
|
+
result = await applyCanonicalRuleset(octokit, {
|
|
108
|
+
owner,
|
|
109
|
+
repo,
|
|
110
|
+
branch,
|
|
111
|
+
dryRun,
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
catch (err) {
|
|
115
|
+
stderr(`clud-bug configure-github: ${dryRun ? 'failed to read current state' : 'PATCH failed'}: ${stringifyError(err)}\n`);
|
|
116
|
+
return 1;
|
|
117
|
+
}
|
|
118
|
+
if (result.alreadyCanonical) {
|
|
119
|
+
if (!quiet)
|
|
120
|
+
stdout(' No changes — repo already matches canonical-v1.\n');
|
|
121
|
+
stdout(formatConfigureSummary({ owner, repo, alreadyCanonical: true, dryRun, changes: 0 }, json));
|
|
122
|
+
return 0;
|
|
123
|
+
}
|
|
124
|
+
if (!quiet) {
|
|
125
|
+
const verb = dryRun ? 'Planned' : 'Applied';
|
|
126
|
+
stdout(` ${verb} changes (${result.changes.length}):\n`);
|
|
127
|
+
for (const c of result.changes)
|
|
128
|
+
stdout(` - ${c}\n`);
|
|
129
|
+
}
|
|
130
|
+
if (dryRun) {
|
|
131
|
+
stdout(formatConfigureSummary({ owner, repo, alreadyCanonical: false, dryRun: true, changes: result.changes.length }, json));
|
|
132
|
+
return 0;
|
|
133
|
+
}
|
|
134
|
+
stdout(formatConfigureSummary({ owner, repo, alreadyCanonical: false, dryRun: false, changes: result.changes.length }, json));
|
|
135
|
+
return 0;
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Auth ladder: env var first, then `gh auth token`. Surfaces a token
|
|
139
|
+
* string on success or `null` if neither source has one (caller prints
|
|
140
|
+
* the recovery hint).
|
|
141
|
+
*/
|
|
142
|
+
async function defaultResolveToken() {
|
|
143
|
+
const fromEnv = process.env.GITHUB_TOKEN?.trim();
|
|
144
|
+
if (fromEnv)
|
|
145
|
+
return fromEnv;
|
|
146
|
+
const result = spawnSync('gh', ['auth', 'token'], { encoding: 'utf8' });
|
|
147
|
+
if (result.status === 0) {
|
|
148
|
+
const tok = result.stdout.trim();
|
|
149
|
+
if (tok)
|
|
150
|
+
return tok;
|
|
151
|
+
}
|
|
152
|
+
return null;
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Builds an `OctokitLike` instance backed by `gh api` shell-outs. This
|
|
156
|
+
* lets us satisfy the structural interface without pulling in
|
|
157
|
+
* `@octokit/rest` as a runtime dep (~200KB). The App passes its real
|
|
158
|
+
* Octokit instance instead.
|
|
159
|
+
*/
|
|
160
|
+
export function ghCliOctokit(token) {
|
|
161
|
+
// We pass GITHUB_TOKEN through the spawn env so gh's API surface picks
|
|
162
|
+
// it up consistently whether the user supplied env or gh auth.
|
|
163
|
+
const env = { ...process.env, GITHUB_TOKEN: token };
|
|
164
|
+
function ghApi(method, path, body) {
|
|
165
|
+
return new Promise((resolve, reject) => {
|
|
166
|
+
const args = ['api', '-X', method];
|
|
167
|
+
if (body !== undefined) {
|
|
168
|
+
args.push('--input', '-');
|
|
169
|
+
}
|
|
170
|
+
args.push(path);
|
|
171
|
+
// Add an Accept header so 404s return the structured error, not a
|
|
172
|
+
// friendlier shell hint. The wrapping err.message detection in
|
|
173
|
+
// `isBranchNotProtected` keys on the structured form.
|
|
174
|
+
args.push('-H', 'Accept: application/vnd.github+json');
|
|
175
|
+
const child = spawn('gh', args, {
|
|
176
|
+
env,
|
|
177
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
178
|
+
});
|
|
179
|
+
let stdout = '';
|
|
180
|
+
let stderr = '';
|
|
181
|
+
child.stdout.on('data', (d) => {
|
|
182
|
+
stdout += d.toString();
|
|
183
|
+
});
|
|
184
|
+
child.stderr.on('data', (d) => {
|
|
185
|
+
stderr += d.toString();
|
|
186
|
+
});
|
|
187
|
+
child.on('error', reject);
|
|
188
|
+
child.on('close', (code) => {
|
|
189
|
+
if (code !== 0) {
|
|
190
|
+
const httpMatch = /HTTP (\d{3})/.exec(stderr);
|
|
191
|
+
const status = httpMatch ? Number(httpMatch[1]) : undefined;
|
|
192
|
+
const err = new Error((stderr.trim() || stdout.trim() || `gh api exited ${code}`).slice(0, 500));
|
|
193
|
+
if (status !== undefined)
|
|
194
|
+
err.status = status;
|
|
195
|
+
reject(err);
|
|
196
|
+
return;
|
|
197
|
+
}
|
|
198
|
+
try {
|
|
199
|
+
resolve(stdout ? JSON.parse(stdout) : {});
|
|
200
|
+
}
|
|
201
|
+
catch (parseErr) {
|
|
202
|
+
reject(parseErr);
|
|
203
|
+
}
|
|
204
|
+
});
|
|
205
|
+
if (body !== undefined) {
|
|
206
|
+
child.stdin.end(JSON.stringify(body));
|
|
207
|
+
}
|
|
208
|
+
else {
|
|
209
|
+
child.stdin.end();
|
|
210
|
+
}
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
return {
|
|
214
|
+
repos: {
|
|
215
|
+
async getBranchProtection({ owner, repo, branch }) {
|
|
216
|
+
const data = await ghApi('GET', `/repos/${owner}/${repo}/branches/${branch}/protection`);
|
|
217
|
+
return { data: data };
|
|
218
|
+
},
|
|
219
|
+
async updateBranchProtection({ owner, repo, branch, ...rest }) {
|
|
220
|
+
return ghApi('PUT', `/repos/${owner}/${repo}/branches/${branch}/protection`, rest);
|
|
221
|
+
},
|
|
222
|
+
async get({ owner, repo }) {
|
|
223
|
+
const data = await ghApi('GET', `/repos/${owner}/${repo}`);
|
|
224
|
+
return { data: data };
|
|
225
|
+
},
|
|
226
|
+
async update({ owner, repo, ...rest }) {
|
|
227
|
+
return ghApi('PATCH', `/repos/${owner}/${repo}`, rest);
|
|
228
|
+
},
|
|
229
|
+
},
|
|
230
|
+
};
|
|
231
|
+
}
|
|
232
|
+
function stringifyError(err) {
|
|
233
|
+
if (err instanceof Error)
|
|
234
|
+
return err.message;
|
|
235
|
+
return String(err);
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Re-exported so callers can preload the ruleset (e.g. for a `--show-ruleset`
|
|
239
|
+
* flag in future). Currently exists for parity with the App's pattern.
|
|
240
|
+
*/
|
|
241
|
+
export { loadCanonicalV1 };
|
|
242
|
+
//# sourceMappingURL=configure-github.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"configure-github.js","sourceRoot":"","sources":["../../src/cli/configure-github.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export interface PendingWorkflowEdits {
|
|
2
|
+
allWorkflow: boolean;
|
|
3
|
+
files: string[];
|
|
4
|
+
nonWorkflow: string[];
|
|
5
|
+
}
|
|
6
|
+
export declare function getPendingWorkflowEdits(cwd?: string): PendingWorkflowEdits;
|
|
7
|
+
export declare function isWorkflowFile(path: string): boolean;
|
|
8
|
+
export declare function makeBranchName(date?: Date): string;
|
|
9
|
+
export interface GitOptions {
|
|
10
|
+
allowFail?: boolean | undefined;
|
|
11
|
+
}
|
|
12
|
+
export interface GitResult {
|
|
13
|
+
ok: boolean;
|
|
14
|
+
stdout: string;
|
|
15
|
+
stderr: string;
|
|
16
|
+
}
|
|
17
|
+
export declare function git(cwd: string, args: string[], opts?: GitOptions): GitResult;
|
|
18
|
+
//# sourceMappingURL=edit-workflow.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"edit-workflow.d.ts","sourceRoot":"","sources":["../../src/cli/edit-workflow.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE,OAAO,CAAC;IACrB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,wBAAgB,uBAAuB,CAAC,GAAG,GAAE,MAAsB,GAAG,oBAAoB,CAyBzF;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEpD;AAED,wBAAgB,cAAc,CAAC,IAAI,GAAE,IAAiB,GAAG,MAAM,CAG9D;AAED,MAAM,WAAW,UAAU;IACzB,SAAS,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CACjC;AAED,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,GAAE,UAAe,GAAG,SAAS,CAMjF"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { spawnSync } from 'node:child_process';
|
|
2
|
+
export function getPendingWorkflowEdits(cwd = process.cwd()) {
|
|
3
|
+
// --untracked-files=all so new files in new directories are reported as
|
|
4
|
+
// individual paths instead of being collapsed to the parent dir (default
|
|
5
|
+
// 'normal' mode would emit '.github/' for a brand-new clud-bug-review.yml).
|
|
6
|
+
const r = spawnSync('git', ['status', '--porcelain', '--untracked-files=all'], { cwd, encoding: 'utf8' });
|
|
7
|
+
if (r.status !== 0) {
|
|
8
|
+
// r.stderr is `string | null` under strict; safe to coalesce to '' for the
|
|
9
|
+
// error message — null here means the child failed to spawn entirely.
|
|
10
|
+
throw new Error(`git status failed: ${(r.stderr ?? '').trim()}`);
|
|
11
|
+
}
|
|
12
|
+
const stdout = r.stdout ?? '';
|
|
13
|
+
const lines = stdout.split('\n').filter(Boolean);
|
|
14
|
+
if (lines.length === 0)
|
|
15
|
+
return { allWorkflow: true, files: [], nonWorkflow: [] };
|
|
16
|
+
const files = [];
|
|
17
|
+
const nonWorkflow = [];
|
|
18
|
+
for (const line of lines) {
|
|
19
|
+
// porcelain format: XY <space> <path> ; rename: XY old -> new
|
|
20
|
+
// .pop() on a non-empty split always yields a string here, but
|
|
21
|
+
// noUncheckedIndexedAccess makes TS pessimistic — coalesce + trim.
|
|
22
|
+
const path = (line.slice(3).split(' -> ').pop() ?? '').trim();
|
|
23
|
+
files.push(path);
|
|
24
|
+
if (!isWorkflowFile(path))
|
|
25
|
+
nonWorkflow.push(path);
|
|
26
|
+
}
|
|
27
|
+
return { allWorkflow: nonWorkflow.length === 0, files, nonWorkflow };
|
|
28
|
+
}
|
|
29
|
+
export function isWorkflowFile(path) {
|
|
30
|
+
return /^\.github\/workflows\/clud-bug-.*\.ya?ml$/.test(path);
|
|
31
|
+
}
|
|
32
|
+
export function makeBranchName(date = new Date()) {
|
|
33
|
+
const stamp = date.toISOString().replace(/[:.]/g, '-').slice(0, 19);
|
|
34
|
+
return `clud-bug/edit-workflow-${stamp}`;
|
|
35
|
+
}
|
|
36
|
+
export function git(cwd, args, opts = {}) {
|
|
37
|
+
const r = spawnSync('git', args, { cwd, encoding: 'utf8' });
|
|
38
|
+
if (r.status !== 0 && !opts.allowFail) {
|
|
39
|
+
throw new Error(`git ${args.join(' ')} failed (${r.status}): ${(r.stderr ?? '').trim()}`);
|
|
40
|
+
}
|
|
41
|
+
return { ok: r.status === 0, stdout: (r.stdout ?? '').trim(), stderr: (r.stderr ?? '').trim() };
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=edit-workflow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"edit-workflow.js","sourceRoot":"","sources":["../../src/cli/edit-workflow.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export { main } from './main.js';
|
|
2
|
+
export { detectRepo, detectDefaultBranch, getProtectionState, enableConversationResolution, type GhResult, type GhOptions, type GhInvoker, type DetectRepoOptions, type DetectedRepo, type DetectDefaultBranchOptions, type ProtectionState, type GetProtectionStateOptions, type EnableConversationResolutionOptions, type EnableResult, } from './branch-protection.js';
|
|
3
|
+
export { getPendingWorkflowEdits, isWorkflowFile, makeBranchName, git, type PendingWorkflowEdits, type GitOptions, type GitResult, } from './edit-workflow.js';
|
|
4
|
+
export { renderBlock, detectSkillRelPath, upsertBlock, hasAgentsMdImport, removeBlock, applyToRepo, type RenderBlockOptions, type ApplyToRepoResult, } from './agents-md.js';
|
|
5
|
+
export { computeSkillUsageDelta, mergeSkillUsage, assessSkillHealth, formatHealthDashboard, DEFAULT_GH_RUNNER, fetchUsageArtifacts, aggregateUsageStream, type SkillDelta, type SkillUsageEntry, type SkillDeltaMap, type SkillUsageMap, type SkillHealthStatus, type SkillHealthRow, type GhRunResult, type GhRunner, type FetchUsageArtifactsOptions, type UsageArtifactRecord, } from './skill-usage.js';
|
|
6
|
+
export { PRICING, computeReviewCost, costPerLOC, cacheHitRate, extractTokensFromLog, rollup, formatRollup, type ModelPricing, type TokenCounts, type CostParts, type ReviewCost, type ExtractedTokens, type ReviewRecord, type RollupGroupStats, type RollupTotal, type RollupTrend, type RollupOutlier, type UnknownModelReview, type Rollup, type FormatRollupOptions, } from './usage.js';
|
|
7
|
+
export { runUpdate, type RunUpdateOptions, type UpdateChangeRecord, type UpdateSkippedRecord, type RunUpdateResult, } from './update.js';
|
|
8
|
+
export { runConfigureGithub, ghCliOctokit, type RunConfigureGithubOptions, } from './configure-github.js';
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EACL,UAAU,EACV,mBAAmB,EACnB,kBAAkB,EAClB,4BAA4B,EAC5B,KAAK,QAAQ,EACb,KAAK,SAAS,EACd,KAAK,SAAS,EACd,KAAK,iBAAiB,EACtB,KAAK,YAAY,EACjB,KAAK,0BAA0B,EAC/B,KAAK,eAAe,EACpB,KAAK,yBAAyB,EAC9B,KAAK,mCAAmC,EACxC,KAAK,YAAY,GAClB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EACL,uBAAuB,EACvB,cAAc,EACd,cAAc,EACd,GAAG,EACH,KAAK,oBAAoB,EACzB,KAAK,UAAU,EACf,KAAK,SAAS,GACf,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,WAAW,EACX,kBAAkB,EAClB,WAAW,EACX,iBAAiB,EACjB,WAAW,EACX,WAAW,EACX,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,GACvB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,sBAAsB,EACtB,eAAe,EACf,iBAAiB,EACjB,qBAAqB,EACrB,iBAAiB,EACjB,mBAAmB,EACnB,oBAAoB,EACpB,KAAK,UAAU,EACf,KAAK,eAAe,EACpB,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,iBAAiB,EACtB,KAAK,cAAc,EACnB,KAAK,WAAW,EAChB,KAAK,QAAQ,EACb,KAAK,0BAA0B,EAC/B,KAAK,mBAAmB,GACzB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,OAAO,EACP,iBAAiB,EACjB,UAAU,EACV,YAAY,EACZ,oBAAoB,EACpB,MAAM,EACN,YAAY,EACZ,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,KAAK,SAAS,EACd,KAAK,UAAU,EACf,KAAK,eAAe,EACpB,KAAK,YAAY,EACjB,KAAK,gBAAgB,EACrB,KAAK,WAAW,EAChB,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,KAAK,kBAAkB,EACvB,KAAK,MAAM,EACX,KAAK,mBAAmB,GACzB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,SAAS,EACT,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,EACxB,KAAK,eAAe,GACrB,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,kBAAkB,EAClB,YAAY,EACZ,KAAK,yBAAyB,GAC/B,MAAM,uBAAuB,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
// Public API surface for `clud-bug` CLI helpers (consumed via the package's
|
|
2
|
+
// `.` exports map → `dist/cli/index.js`).
|
|
3
|
+
//
|
|
4
|
+
// Each line re-exports one CLI module's public symbols. Modules are
|
|
5
|
+
// added incrementally as the v0.7.0 TypeScript migration converts each
|
|
6
|
+
// lib/* JS file.
|
|
7
|
+
// The top-level dispatcher main() lives in main.ts; bin/clud-bug.js
|
|
8
|
+
// imports it through this barrel and runs it. Keeping main() out of
|
|
9
|
+
// this file avoids accidental side effects when consumers
|
|
10
|
+
// `import { ... } from 'clud-bug'`.
|
|
11
|
+
export { main } from './main.js';
|
|
12
|
+
export { detectRepo, detectDefaultBranch, getProtectionState, enableConversationResolution, } from './branch-protection.js';
|
|
13
|
+
export { getPendingWorkflowEdits, isWorkflowFile, makeBranchName, git, } from './edit-workflow.js';
|
|
14
|
+
export { renderBlock, detectSkillRelPath, upsertBlock, hasAgentsMdImport, removeBlock, applyToRepo, } from './agents-md.js';
|
|
15
|
+
export { computeSkillUsageDelta, mergeSkillUsage, assessSkillHealth, formatHealthDashboard, DEFAULT_GH_RUNNER, fetchUsageArtifacts, aggregateUsageStream, } from './skill-usage.js';
|
|
16
|
+
export { PRICING, computeReviewCost, costPerLOC, cacheHitRate, extractTokensFromLog, rollup, formatRollup, } from './usage.js';
|
|
17
|
+
export { runUpdate, } from './update.js';
|
|
18
|
+
export { runConfigureGithub, ghCliOctokit, } from './configure-github.js';
|
|
19
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,0CAA0C;AAC1C,EAAE;AACF,oEAAoE;AACpE,uEAAuE;AACvE,iBAAiB;AAEjB,oEAAoE;AACpE,oEAAoE;AACpE,0DAA0D;AAC1D,oCAAoC;AACpC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EACL,UAAU,EACV,mBAAmB,EACnB,kBAAkB,EAClB,4BAA4B,GAW7B,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EACL,uBAAuB,EACvB,cAAc,EACd,cAAc,EACd,GAAG,GAIJ,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,WAAW,EACX,kBAAkB,EAClB,WAAW,EACX,iBAAiB,EACjB,WAAW,EACX,WAAW,GAGZ,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,sBAAsB,EACtB,eAAe,EACf,iBAAiB,EACjB,qBAAqB,EACrB,iBAAiB,EACjB,mBAAmB,EACnB,oBAAoB,GAWrB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,OAAO,EACP,iBAAiB,EACjB,UAAU,EACV,YAAY,EACZ,oBAAoB,EACpB,MAAM,EACN,YAAY,GAcb,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,SAAS,GAKV,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,kBAAkB,EAClB,YAAY,GAEb,MAAM,uBAAuB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../src/cli/main.ts"],"names":[],"mappings":"AAmOA,iBAAe,IAAI,kBA4BlB;AA45DD,OAAO,EAAE,IAAI,EAAE,CAAC"}
|