codeloop 0.1.15 → 0.1.17

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.
@@ -0,0 +1,3 @@
1
+ export declare function baselineApproveCommand(): Promise<void>;
2
+ export declare function baselineStatusCommand(): Promise<void>;
3
+ //# sourceMappingURL=baseline.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"baseline.d.ts","sourceRoot":"","sources":["../../src/commands/baseline.ts"],"names":[],"mappings":"AAuCA,wBAAsB,sBAAsB,IAAI,OAAO,CAAC,IAAI,CAAC,CAsB5D;AAED,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC,CAuB3D"}
@@ -0,0 +1,63 @@
1
+ import chalk from "chalk";
2
+ import { join } from "path";
3
+ import { existsSync, readFileSync } from "fs";
4
+ const CHANGELOG_PATH = ".codeloop/baseline_changelog.json";
5
+ function loadLog(cwd) {
6
+ const p = join(cwd, CHANGELOG_PATH);
7
+ if (!existsSync(p))
8
+ return { version: 1, entries: [] };
9
+ try {
10
+ return JSON.parse(readFileSync(p, "utf-8"));
11
+ }
12
+ catch {
13
+ return { version: 1, entries: [] };
14
+ }
15
+ }
16
+ function saveLog(cwd, log) {
17
+ const { writeFileSync, mkdirSync } = require("fs");
18
+ const dir = join(cwd, ".codeloop");
19
+ mkdirSync(dir, { recursive: true });
20
+ writeFileSync(join(cwd, CHANGELOG_PATH), JSON.stringify(log, null, 2));
21
+ }
22
+ export async function baselineApproveCommand() {
23
+ const cwd = process.cwd();
24
+ const log = loadLog(cwd);
25
+ const pending = log.entries.filter((e) => !e.approved);
26
+ if (pending.length === 0) {
27
+ console.log(chalk.green("No pending baseline changes to approve."));
28
+ return;
29
+ }
30
+ const target = pending[pending.length - 1];
31
+ target.approved = true;
32
+ target.approved_by = "cli";
33
+ target.approved_at = new Date().toISOString();
34
+ saveLog(cwd, log);
35
+ console.log(chalk.green("Approved baseline change:"));
36
+ console.log(` Screens: ${target.screens.join(", ")}`);
37
+ console.log(` Commit: ${target.commit_sha ?? "n/a"}`);
38
+ console.log(` Branch: ${target.branch ?? "n/a"}`);
39
+ console.log(` Time: ${target.timestamp}`);
40
+ if (target.notes)
41
+ console.log(` Notes: ${target.notes}`);
42
+ }
43
+ export async function baselineStatusCommand() {
44
+ const cwd = process.cwd();
45
+ const log = loadLog(cwd);
46
+ if (log.entries.length === 0) {
47
+ console.log(chalk.dim("No baseline changes recorded."));
48
+ return;
49
+ }
50
+ const pending = log.entries.filter((e) => !e.approved);
51
+ const approved = log.entries.filter((e) => e.approved);
52
+ console.log(chalk.bold("Baseline change log"));
53
+ console.log(` Total: ${log.entries.length}`);
54
+ console.log(` Approved: ${chalk.green(String(approved.length))}`);
55
+ console.log(` Pending: ${pending.length > 0 ? chalk.yellow(String(pending.length)) : "0"}`);
56
+ console.log();
57
+ const recent = log.entries.slice(-5).reverse();
58
+ for (const e of recent) {
59
+ const status = e.approved ? chalk.green("APPROVED") : chalk.yellow("PENDING");
60
+ console.log(` ${status} ${e.timestamp} ${e.screens.join(", ")}`);
61
+ }
62
+ }
63
+ //# sourceMappingURL=baseline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"baseline.js","sourceRoot":"","sources":["../../src/commands/baseline.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ interface DashboardOptions {
2
+ port?: string;
3
+ host?: string;
4
+ share?: boolean;
5
+ open?: boolean;
6
+ }
7
+ export declare function dashboardCommand(options?: DashboardOptions): Promise<void>;
8
+ export {};
9
+ //# sourceMappingURL=dashboard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard.d.ts","sourceRoot":"","sources":["../../src/commands/dashboard.ts"],"names":[],"mappings":"AAMA,UAAU,gBAAgB;IACxB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAkBD,wBAAsB,gBAAgB,CAAC,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CAqCpF"}
@@ -0,0 +1,54 @@
1
+ import { spawn } from "node:child_process";
2
+ import { existsSync } from "node:fs";
3
+ import { join, dirname, resolve as resolvePath } from "node:path";
4
+ import { createRequire } from "node:module";
5
+ import chalk from "chalk";
6
+ function locateDashboardEntry() {
7
+ const require = createRequire(import.meta.url);
8
+ try {
9
+ return require.resolve("@codelooptech/dashboard-ui");
10
+ }
11
+ catch {
12
+ const candidates = [
13
+ join(process.cwd(), "packages", "dashboard-ui", "dist", "server.js"),
14
+ join(dirname(new URL(import.meta.url).pathname), "..", "..", "..", "dashboard-ui", "dist", "server.js"),
15
+ ];
16
+ for (const c of candidates) {
17
+ if (existsSync(c))
18
+ return resolvePath(c);
19
+ }
20
+ throw new Error("Could not locate @codelooptech/dashboard-ui — run `npm run build` from the monorepo root.");
21
+ }
22
+ }
23
+ export async function dashboardCommand(options = {}) {
24
+ const entry = locateDashboardEntry();
25
+ const port = parseInt(options.port ?? "3737", 10);
26
+ const host = options.host ?? "127.0.0.1";
27
+ const projectRoot = process.cwd();
28
+ if (!existsSync(join(projectRoot, ".codeloop"))) {
29
+ console.warn(chalk.yellow(`Warning: ${join(projectRoot, ".codeloop")} not found — dashboard will show empty state.`));
30
+ console.warn(chalk.dim("Run `npx codeloop init` and let an agent invoke codeloop_verify first."));
31
+ }
32
+ const url = `http://${host}:${port}`;
33
+ console.log(chalk.cyan(`Starting CodeLoop dashboard at ${url}…`));
34
+ const child = spawn(process.execPath, [
35
+ "-e",
36
+ `import("${entry}").then(({ startDashboard }) => startDashboard({ projectRoot: ${JSON.stringify(projectRoot)}, host: ${JSON.stringify(host)}, port: ${port}, log: (m) => console.log(m) }));`,
37
+ ], { stdio: "inherit" });
38
+ if (options.open !== false) {
39
+ setTimeout(() => openInBrowser(url), 600);
40
+ }
41
+ if (options.share) {
42
+ console.log(chalk.dim("--share requested. Run `cloudflared tunnel --url " + url + "` in another terminal to expose publicly."));
43
+ }
44
+ child.on("exit", (code) => process.exit(code ?? 0));
45
+ process.on("SIGINT", () => {
46
+ child.kill("SIGINT");
47
+ process.exit(0);
48
+ });
49
+ }
50
+ function openInBrowser(url) {
51
+ const cmd = process.platform === "darwin" ? "open" : process.platform === "win32" ? "start" : "xdg-open";
52
+ spawn(cmd, [url], { stdio: "ignore", detached: true }).unref();
53
+ }
54
+ //# sourceMappingURL=dashboard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard.js","sourceRoot":"","sources":["../../src/commands/dashboard.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function doctorCommand(): void;
2
+ //# sourceMappingURL=doctor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAyCA,wBAAgB,aAAa,IAAI,IAAI,CAmJpC"}
@@ -0,0 +1,104 @@
1
+ import { existsSync, readFileSync } from "fs";
2
+ import { join } from "path";
3
+ import { homedir } from "os";
4
+ import chalk from "chalk";
5
+ import { GLOBAL_CLAUDE_MEMORY_BEGIN, GLOBAL_CLAUDE_MEMORY_END, } from "../templates/global-rules.js";
6
+ function check(label, ok, detail, fix) {
7
+ return { label, ok, detail, fix };
8
+ }
9
+ function fileContains(path, needle) {
10
+ try {
11
+ return readFileSync(path, "utf-8").includes(needle);
12
+ }
13
+ catch {
14
+ return false;
15
+ }
16
+ }
17
+ function jsonHasKey(path, ...keys) {
18
+ try {
19
+ let obj = JSON.parse(readFileSync(path, "utf-8"));
20
+ for (const k of keys) {
21
+ if (typeof obj !== "object" || obj === null || !(k in obj))
22
+ return false;
23
+ obj = obj[k];
24
+ }
25
+ return true;
26
+ }
27
+ catch {
28
+ return false;
29
+ }
30
+ }
31
+ export function doctorCommand() {
32
+ const home = homedir();
33
+ const cwd = process.cwd();
34
+ const results = [];
35
+ // ── Global MCP Registration ─────────────────────────────────────
36
+ const cursorMcpPath = join(home, ".cursor", "mcp.json");
37
+ results.push(check("Global MCP: ~/.cursor/mcp.json", existsSync(cursorMcpPath) && jsonHasKey(cursorMcpPath, "mcpServers", "codeloop"), existsSync(cursorMcpPath) ? "File exists" : "File not found", "Run: npx codeloop init --global"));
38
+ const claudeMcpPath = join(home, ".claude.json");
39
+ results.push(check("Global MCP: ~/.claude.json", existsSync(claudeMcpPath) && jsonHasKey(claudeMcpPath, "mcpServers", "codeloop"), existsSync(claudeMcpPath) ? "File exists" : "File not found", "Run: npx codeloop init --global"));
40
+ // ── Agent Rules ─────────────────────────────────────────────────
41
+ const claudeMemoryPath = join(home, ".claude", "CLAUDE.md");
42
+ const claudeMemoryOk = existsSync(claudeMemoryPath) &&
43
+ fileContains(claudeMemoryPath, GLOBAL_CLAUDE_MEMORY_BEGIN) &&
44
+ fileContains(claudeMemoryPath, GLOBAL_CLAUDE_MEMORY_END);
45
+ results.push(check("Claude Code global rules: ~/.claude/CLAUDE.md", claudeMemoryOk, claudeMemoryOk ? "CodeLoop section found" : "Missing or no CodeLoop section", "Run: npx codeloop init --global"));
46
+ const cursorRulePath = join(home, ".cursor", "rules", "codeloop.mdc");
47
+ results.push(check("Cursor global rule file: ~/.cursor/rules/codeloop.mdc", existsSync(cursorRulePath), existsSync(cursorRulePath) ? "File exists (forward-compat)" : "File not found", "Run: npx codeloop init --global"));
48
+ const cursorUserRulePath = join(home, ".cursor", "codeloop-user-rule.md");
49
+ results.push(check("Cursor paste source: ~/.cursor/codeloop-user-rule.md", existsSync(cursorUserRulePath), existsSync(cursorUserRulePath)
50
+ ? "File exists — paste its contents into Cursor → Settings → Rules → User Rules"
51
+ : "File not found", "Run: npx codeloop cursor-rule"));
52
+ // ── MCP Server Instructions (new in 0.1.14) ────────────────────
53
+ results.push(check("MCP server 'instructions' field", true, "The MCP server injects CodeLoop rules into the agent system prompt automatically via the instructions field. No user action needed — this activates in every workspace where the MCP is registered."));
54
+ // ── Current Project ─────────────────────────────────────────────
55
+ const projectConfig = join(cwd, ".codeloop", "config.json");
56
+ results.push(check(`Project config: ${join(cwd, ".codeloop/config.json")}`, existsSync(projectConfig), existsSync(projectConfig) ? "Initialized" : "Not initialized in this directory", "Run: npx codeloop init (or let the AI agent call codeloop_init_project)"));
57
+ const cursorProjectRules = join(cwd, ".cursor", "rules", "core.mdc");
58
+ const claudeProjectRules = join(cwd, "CLAUDE.md");
59
+ const hasProjectRules = existsSync(cursorProjectRules) || existsSync(claudeProjectRules);
60
+ results.push(check("Project agent rules", hasProjectRules, hasProjectRules
61
+ ? `Found: ${[cursorProjectRules, claudeProjectRules].filter(existsSync).map((p) => p.replace(cwd + "/", "")).join(", ")}`
62
+ : "No .cursor/rules/core.mdc or CLAUDE.md found", "Run: npx codeloop init"));
63
+ // ── Print Results ───────────────────────────────────────────────
64
+ const sep = chalk.cyan("─".repeat(72));
65
+ console.log("");
66
+ console.log(sep);
67
+ console.log(` ${chalk.bold.cyan("CodeLoop Doctor")} — activation chain diagnostics`);
68
+ console.log(sep);
69
+ console.log("");
70
+ let allOk = true;
71
+ for (const r of results) {
72
+ const icon = r.ok ? chalk.green("✓") : chalk.red("✗");
73
+ console.log(` ${icon} ${r.ok ? chalk.white(r.label) : chalk.yellow(r.label)}`);
74
+ if (r.detail) {
75
+ console.log(` ${chalk.dim(r.detail)}`);
76
+ }
77
+ if (!r.ok && r.fix) {
78
+ console.log(` ${chalk.dim("Fix:")} ${chalk.cyan(r.fix)}`);
79
+ allOk = false;
80
+ }
81
+ }
82
+ console.log("");
83
+ if (allOk) {
84
+ console.log(` ${chalk.bold.green("All checks passed!")} CodeLoop is fully configured.`);
85
+ }
86
+ else {
87
+ console.log(` ${chalk.bold.yellow("Some checks failed.")} Run the suggested fixes above.`);
88
+ }
89
+ console.log("");
90
+ console.log(` ${chalk.dim("How CodeLoop activates in Cursor (layered redundancy):")}`);
91
+ console.log(` ${chalk.dim("1.")} MCP server ${chalk.bold("instructions")} field → injected into agent system prompt`);
92
+ console.log(` ${chalk.dim("2.")} Tool description prefixes → every tool self-advertises the verify rule`);
93
+ console.log(` ${chalk.dim("3.")} INIT_HINT on responses → fires when project is not yet initialized`);
94
+ console.log(` ${chalk.dim("4.")} Cursor User Rules (paste) → reinforcement for proactive triggering`);
95
+ if (!allOk && !existsSync(cursorRulePath)) {
96
+ console.log("");
97
+ console.log(` ${chalk.dim("Tip:")} install the CodeLoop Cursor extension to skip the manual paste:`);
98
+ console.log(` ${chalk.cyan("npx codeloop install-cursor-extension")}`);
99
+ console.log(` ${chalk.dim("or open Cursor settings directly:")} ${chalk.cyan("cursor://settings/cursor.rules.userRules")}`);
100
+ }
101
+ console.log(sep);
102
+ console.log("");
103
+ }
104
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ export declare const MARKETPLACE_LIVE = false;
2
+ export interface InstallOptions {
3
+ vsix?: string;
4
+ channel?: "stable" | "preview";
5
+ fromMarketplace?: boolean;
6
+ marketplaceId?: string;
7
+ }
8
+ /**
9
+ * Install the extension by marketplace publisher.extension id.
10
+ * Returns true on success, false on any failure (so the caller can fall
11
+ * back to the GitHub release path).
12
+ */
13
+ export declare function installFromMarketplace(cursorBin: string, extensionId: string): boolean;
14
+ export declare function installCursorExtensionCommand(options?: InstallOptions): Promise<void>;
15
+ //# sourceMappingURL=install-cursor-extension.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install-cursor-extension.d.ts","sourceRoot":"","sources":["../../src/commands/install-cursor-extension.ts"],"names":[],"mappings":"AAcA,eAAO,MAAM,gBAAgB,QAAQ,CAAC;AAGtC,MAAM,WAAW,cAAc;IAC7B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;IAC/B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AA8ED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAKtF;AAED,wBAAsB,6BAA6B,CAAC,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CA4D/F"}
@@ -0,0 +1,136 @@
1
+ import { execSync, spawnSync } from "node:child_process";
2
+ import { existsSync, mkdirSync, writeFileSync } from "node:fs";
3
+ import { tmpdir } from "node:os";
4
+ import { join } from "node:path";
5
+ import chalk from "chalk";
6
+ import { request } from "node:https";
7
+ import { URL } from "node:url";
8
+ const RELEASE_API = "https://api.github.com/repos/OrienjoJi/codeloop-mcp/releases/latest";
9
+ const ASSET_NAME_PREFIX = "codeloop-cursor-extension-";
10
+ // Flip to `true` once the extension is live on the Cursor / VS Code marketplace.
11
+ // Until then, --from-marketplace prints a notice and falls through to the
12
+ // GitHub release download path below so the command remains useful.
13
+ export const MARKETPLACE_LIVE = false;
14
+ const DEFAULT_MARKETPLACE_ID = "codelooptech.codeloop-cursor-extension";
15
+ function which(bin) {
16
+ const r = spawnSync("which", [bin], { encoding: "utf-8" });
17
+ return r.status === 0 && r.stdout ? r.stdout.trim() : null;
18
+ }
19
+ function fetchJson(url) {
20
+ return new Promise((resolve, reject) => {
21
+ const opts = new URL(url);
22
+ const req = request({
23
+ hostname: opts.hostname,
24
+ path: opts.pathname,
25
+ method: "GET",
26
+ headers: { "User-Agent": "codeloop-cli", Accept: "application/vnd.github+json" },
27
+ }, (res) => {
28
+ let body = "";
29
+ res.on("data", (c) => (body += c));
30
+ res.on("end", () => {
31
+ try {
32
+ resolve(JSON.parse(body));
33
+ }
34
+ catch (err) {
35
+ reject(err);
36
+ }
37
+ });
38
+ });
39
+ req.on("error", reject);
40
+ req.end();
41
+ });
42
+ }
43
+ function download(url, dest) {
44
+ return new Promise((resolve, reject) => {
45
+ const opts = new URL(url);
46
+ const req = request({
47
+ hostname: opts.hostname,
48
+ path: opts.pathname + opts.search,
49
+ method: "GET",
50
+ headers: { "User-Agent": "codeloop-cli" },
51
+ }, (res) => {
52
+ if (res.statusCode === 302 || res.statusCode === 301) {
53
+ if (res.headers.location) {
54
+ download(res.headers.location, dest).then(resolve, reject);
55
+ return;
56
+ }
57
+ }
58
+ if (res.statusCode !== 200) {
59
+ reject(new Error(`HTTP ${res.statusCode} downloading ${url}`));
60
+ return;
61
+ }
62
+ const chunks = [];
63
+ res.on("data", (c) => chunks.push(c));
64
+ res.on("end", () => {
65
+ writeFileSync(dest, Buffer.concat(chunks));
66
+ resolve();
67
+ });
68
+ });
69
+ req.on("error", reject);
70
+ req.end();
71
+ });
72
+ }
73
+ /**
74
+ * Install the extension by marketplace publisher.extension id.
75
+ * Returns true on success, false on any failure (so the caller can fall
76
+ * back to the GitHub release path).
77
+ */
78
+ export function installFromMarketplace(cursorBin, extensionId) {
79
+ const result = spawnSync(cursorBin, ["--install-extension", extensionId], {
80
+ stdio: "inherit",
81
+ });
82
+ return result.status === 0;
83
+ }
84
+ export async function installCursorExtensionCommand(options = {}) {
85
+ const cursor = which("cursor");
86
+ if (!cursor) {
87
+ console.error(chalk.red("Cursor CLI not found on PATH. Install Cursor and ensure `cursor` is on PATH first."));
88
+ process.exit(1);
89
+ }
90
+ const marketplaceId = options.marketplaceId || DEFAULT_MARKETPLACE_ID;
91
+ if (options.fromMarketplace) {
92
+ if (!MARKETPLACE_LIVE) {
93
+ console.log(chalk.dim("--from-marketplace requested, but the CodeLoop extension is not live on the marketplace yet; falling back to the latest GitHub release."));
94
+ }
95
+ else {
96
+ console.log(chalk.cyan(`Installing ${marketplaceId} from the Cursor marketplace…`));
97
+ const ok = installFromMarketplace(cursor, marketplaceId);
98
+ if (ok) {
99
+ console.log("");
100
+ console.log(chalk.green("CodeLoop Cursor extension installed from the marketplace."));
101
+ console.log(chalk.dim("Restart Cursor for the extension to activate, then run: codeloop doctor"));
102
+ return;
103
+ }
104
+ console.log(chalk.yellow("Marketplace install failed; falling back to the latest GitHub release. (Set --no-fallback to disable.)"));
105
+ }
106
+ }
107
+ let vsixPath = options.vsix;
108
+ if (!vsixPath) {
109
+ console.log(chalk.cyan("Fetching latest CodeLoop Cursor extension release…"));
110
+ const release = await fetchJson(RELEASE_API);
111
+ const asset = release.assets.find((a) => a.name.startsWith(ASSET_NAME_PREFIX) && a.name.endsWith(".vsix"));
112
+ if (!asset) {
113
+ console.error(chalk.red(`No ${ASSET_NAME_PREFIX}*.vsix asset found in release ${release.tag_name}.`));
114
+ process.exit(1);
115
+ }
116
+ const dl = join(tmpdir(), `codeloop-cursor-extension-${Date.now()}.vsix`);
117
+ if (!existsSync(tmpdir()))
118
+ mkdirSync(tmpdir(), { recursive: true });
119
+ console.log(chalk.dim(`Downloading ${asset.name}…`));
120
+ await download(asset.browser_download_url, dl);
121
+ vsixPath = dl;
122
+ }
123
+ console.log(chalk.cyan(`Installing ${vsixPath} into Cursor…`));
124
+ try {
125
+ execSync(`"${cursor}" --install-extension "${vsixPath}"`, { stdio: "inherit" });
126
+ console.log("");
127
+ console.log(chalk.green("CodeLoop Cursor extension installed."));
128
+ console.log(chalk.dim("Restart Cursor for the extension to activate, then run: codeloop doctor"));
129
+ }
130
+ catch {
131
+ console.error(chalk.red("Cursor install command failed. You can install manually:"));
132
+ console.error(` cursor --install-extension "${vsixPath}"`);
133
+ process.exit(1);
134
+ }
135
+ }
136
+ //# sourceMappingURL=install-cursor-extension.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install-cursor-extension.js","sourceRoot":"","sources":["../../src/commands/install-cursor-extension.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACrC,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAE/B,MAAM,WAAW,GAAG,qEAAqE,CAAC;AAC1F,MAAM,iBAAiB,GAAG,4BAA4B,CAAC;AAEvD,iFAAiF;AACjF,0EAA0E;AAC1E,oEAAoE;AACpE,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,CAAC;AACtC,MAAM,sBAAsB,GAAG,wCAAwC,CAAC;AAmBxE,SAAS,KAAK,CAAC,GAAW;IACxB,MAAM,CAAC,GAAG,SAAS,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;IAC3D,OAAO,CAAC,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AAC7D,CAAC;AAED,SAAS,SAAS,CAAC,GAAW;IAC5B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QAC1B,MAAM,GAAG,GAAG,OAAO,CACjB;YACE,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,IAAI,EAAE,IAAI,CAAC,QAAQ;YACnB,MAAM,EAAE,KAAK;YACb,OAAO,EAAE,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,EAAE,6BAA6B,EAAE;SACjF,EACD,CAAC,GAAG,EAAE,EAAE;YACN,IAAI,IAAI,GAAG,EAAE,CAAC;YACd,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;YACnC,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;gBACjB,IAAI,CAAC;oBACH,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAoB,CAAC,CAAC;gBAC/C,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,MAAM,CAAC,GAAG,CAAC,CAAC;gBACd,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CACF,CAAC;QACF,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACxB,GAAG,CAAC,GAAG,EAAE,CAAC;IACZ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,QAAQ,CAAC,GAAW,EAAE,IAAY;IACzC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QAC1B,MAAM,GAAG,GAAG,OAAO,CACjB;YACE,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,IAAI,EAAE,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,MAAM;YACjC,MAAM,EAAE,KAAK;YACb,OAAO,EAAE,EAAE,YAAY,EAAE,cAAc,EAAE;SAC1C,EACD,CAAC,GAAG,EAAE,EAAE;YACN,IAAI,GAAG,CAAC,UAAU,KAAK,GAAG,IAAI,GAAG,CAAC,UAAU,KAAK,GAAG,EAAE,CAAC;gBACrD,IAAI,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;oBACzB,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;oBAC3D,OAAO;gBACT,CAAC;YACH,CAAC;YACD,IAAI,GAAG,CAAC,UAAU,KAAK,GAAG,EAAE,CAAC;gBAC3B,MAAM,CAAC,IAAI,KAAK,CAAC,QAAQ,GAAG,CAAC,UAAU,gBAAgB,GAAG,EAAE,CAAC,CAAC,CAAC;gBAC/D,OAAO;YACT,CAAC;YACD,MAAM,MAAM,GAAa,EAAE,CAAC;YAC5B,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;YAC9C,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;gBACjB,aAAa,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;gBAC3C,OAAO,EAAE,CAAC;YACZ,CAAC,CAAC,CAAC;QACL,CAAC,CACF,CAAC;QACF,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACxB,GAAG,CAAC,GAAG,EAAE,CAAC;IACZ,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CAAC,SAAiB,EAAE,WAAmB;IAC3E,MAAM,MAAM,GAAG,SAAS,CAAC,SAAS,EAAE,CAAC,qBAAqB,EAAE,WAAW,CAAC,EAAE;QACxE,KAAK,EAAE,SAAS;KACjB,CAAC,CAAC;IACH,OAAO,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,6BAA6B,CAAC,UAA0B,EAAE;IAC9E,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC/B,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,oFAAoF,CAAC,CAAC,CAAC;QAC/G,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa,IAAI,sBAAsB,CAAC;IAEtE,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;QAC5B,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,GAAG,CACP,yIAAyI,CAC1I,CACF,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,aAAa,+BAA+B,CAAC,CAAC,CAAC;YACpF,MAAM,EAAE,GAAG,sBAAsB,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;YACzD,IAAI,EAAE,EAAE,CAAC;gBACP,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,2DAA2D,CAAC,CAAC,CAAC;gBACtF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,yEAAyE,CAAC,CAAC,CAAC;gBAClG,OAAO;YACT,CAAC;YACD,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,MAAM,CACV,wGAAwG,CACzG,CACF,CAAC;QACJ,CAAC;IACH,CAAC;IAED,IAAI,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAC5B,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,oDAAoD,CAAC,CAAC,CAAC;QAC9E,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,WAAW,CAAC,CAAC;QAC7C,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;QAC3G,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,iBAAiB,iCAAiC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;YACtG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,6BAA6B,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAC1E,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC;YAAE,SAAS,CAAC,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACpE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,eAAe,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;QACrD,MAAM,QAAQ,CAAC,KAAK,CAAC,oBAAoB,EAAE,EAAE,CAAC,CAAC;QAC/C,QAAQ,GAAG,EAAE,CAAC;IAChB,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,QAAQ,eAAe,CAAC,CAAC,CAAC;IAC/D,IAAI,CAAC;QACH,QAAQ,CAAC,IAAI,MAAM,0BAA0B,QAAQ,GAAG,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QAChF,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAC,CAAC;QACjE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,yEAAyE,CAAC,CAAC,CAAC;IACpG,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,0DAA0D,CAAC,CAAC,CAAC;QACrF,OAAO,CAAC,KAAK,CAAC,iCAAiC,QAAQ,GAAG,CAAC,CAAC;QAC5D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * `codeloop verify` and `codeloop gate` — CLI wrappers around the MCP
3
+ * server's JSON-RPC tools. With `--json`, prints a single JSON envelope
4
+ * to stdout (suitable for jq parsing in CI). All human-friendly output
5
+ * is sent to stderr in --json mode so stdout stays clean.
6
+ */
7
+ export interface RunMcpToolOptions {
8
+ toolName: string;
9
+ args: Record<string, unknown>;
10
+ cwd?: string;
11
+ env?: Record<string, string>;
12
+ timeoutMs?: number;
13
+ }
14
+ export declare function runMcpTool({ toolName, args, cwd, env, timeoutMs, }: RunMcpToolOptions): Promise<unknown>;
15
+ interface VerifyOptions {
16
+ scope?: "full" | "affected";
17
+ platform?: string;
18
+ json?: boolean;
19
+ projectDir?: string;
20
+ }
21
+ export declare function verifyCommand(opts: VerifyOptions): Promise<void>;
22
+ interface GateOptions {
23
+ sectionId?: string;
24
+ threshold?: number;
25
+ json?: boolean;
26
+ projectDir?: string;
27
+ runId?: string;
28
+ }
29
+ export declare function gateCommand(opts: GateOptions): Promise<void>;
30
+ export {};
31
+ //# sourceMappingURL=verify.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../src/commands/verify.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAiBH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAsB,UAAU,CAAC,EAC/B,QAAQ,EACR,IAAI,EACJ,GAAG,EACH,GAAG,EACH,SAAmB,GACpB,EAAE,iBAAiB,GAAG,OAAO,CAAC,OAAO,CAAC,CA0GtC;AAED,UAAU,aAAa;IACrB,KAAK,CAAC,EAAE,MAAM,GAAG,UAAU,CAAC;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wBAAsB,aAAa,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CA2BtE;AAED,UAAU,WAAW;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,WAAW,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAuBlE"}
@@ -0,0 +1,153 @@
1
+ /**
2
+ * `codeloop verify` and `codeloop gate` — CLI wrappers around the MCP
3
+ * server's JSON-RPC tools. With `--json`, prints a single JSON envelope
4
+ * to stdout (suitable for jq parsing in CI). All human-friendly output
5
+ * is sent to stderr in --json mode so stdout stays clean.
6
+ */
7
+ import { spawn } from "node:child_process";
8
+ import { resolve } from "node:path";
9
+ export async function runMcpTool({ toolName, args, cwd, env, timeoutMs = 600_000, }) {
10
+ const initRequest = {
11
+ jsonrpc: "2.0",
12
+ id: 1,
13
+ method: "initialize",
14
+ params: {
15
+ protocolVersion: "2024-11-05",
16
+ capabilities: {},
17
+ clientInfo: { name: "codeloop-cli", version: "0.1.16" },
18
+ },
19
+ };
20
+ const callRequest = {
21
+ jsonrpc: "2.0",
22
+ id: 2,
23
+ method: "tools/call",
24
+ params: { name: toolName, arguments: args },
25
+ };
26
+ return new Promise((resolvePromise, rejectPromise) => {
27
+ const child = spawn("codeloop-mcp-server", [], {
28
+ cwd: cwd ? resolve(cwd) : process.cwd(),
29
+ env: { ...process.env, ...(env ?? {}) },
30
+ stdio: ["pipe", "pipe", "pipe"],
31
+ });
32
+ let stdoutBuf = "";
33
+ let stderrBuf = "";
34
+ let settled = false;
35
+ const timer = setTimeout(() => {
36
+ if (settled)
37
+ return;
38
+ settled = true;
39
+ child.kill("SIGKILL");
40
+ rejectPromise(new Error(`MCP tool "${toolName}" timed out after ${timeoutMs}ms`));
41
+ }, timeoutMs);
42
+ child.stdout.on("data", (chunk) => {
43
+ stdoutBuf += chunk.toString("utf-8");
44
+ // JSON-RPC frames are newline-delimited. Once we see the response
45
+ // for id 2, we have what we need.
46
+ const lines = stdoutBuf.split("\n");
47
+ for (const line of lines) {
48
+ const trimmed = line.trim();
49
+ if (!trimmed.startsWith("{"))
50
+ continue;
51
+ try {
52
+ const msg = JSON.parse(trimmed);
53
+ if (msg.id === 2) {
54
+ clearTimeout(timer);
55
+ settled = true;
56
+ child.stdin.end();
57
+ child.kill();
58
+ if (msg.error) {
59
+ rejectPromise(new Error(`MCP error: ${msg.error.message} (code ${msg.error.code})`));
60
+ }
61
+ else {
62
+ const result = msg.result;
63
+ const textBlock = result?.content?.find((c) => c.type === "text");
64
+ if (textBlock?.text) {
65
+ try {
66
+ resolvePromise(JSON.parse(textBlock.text));
67
+ }
68
+ catch {
69
+ resolvePromise(textBlock.text);
70
+ }
71
+ }
72
+ else {
73
+ resolvePromise(result);
74
+ }
75
+ }
76
+ return;
77
+ }
78
+ }
79
+ catch {
80
+ // Partial frame — keep buffering.
81
+ }
82
+ }
83
+ });
84
+ child.stderr.on("data", (chunk) => {
85
+ stderrBuf += chunk.toString("utf-8");
86
+ });
87
+ child.on("error", (err) => {
88
+ if (settled)
89
+ return;
90
+ settled = true;
91
+ clearTimeout(timer);
92
+ rejectPromise(new Error(`Failed to spawn codeloop-mcp-server: ${err.message}. Is it installed? (npm i -g codeloop-mcp-server)`));
93
+ });
94
+ child.on("close", (code) => {
95
+ if (settled)
96
+ return;
97
+ settled = true;
98
+ clearTimeout(timer);
99
+ rejectPromise(new Error(`codeloop-mcp-server exited with code ${code} before responding.\nstderr: ${stderrBuf.slice(-2000)}`));
100
+ });
101
+ child.stdin.write(JSON.stringify(initRequest) + "\n");
102
+ child.stdin.write(JSON.stringify(callRequest) + "\n");
103
+ });
104
+ }
105
+ export async function verifyCommand(opts) {
106
+ const result = (await runMcpTool({
107
+ toolName: "codeloop_verify",
108
+ args: {
109
+ scope: opts.scope ?? "full",
110
+ platform: opts.platform ?? "auto",
111
+ ...(opts.projectDir ? { project_dir: resolve(opts.projectDir) } : {}),
112
+ },
113
+ }));
114
+ if (opts.json) {
115
+ process.stdout.write(JSON.stringify(result) + "\n");
116
+ return;
117
+ }
118
+ console.log(`Run ID: ${result.run_id ?? "<unknown>"}`);
119
+ console.log(`Pass / Fail / Warning: ${result.pass_count}/${result.fail_count}/${result.warning_count}`);
120
+ console.log(`Confidence: ${result.confidence}`);
121
+ console.log(`Summary: ${result.summary}`);
122
+ if (typeof result.next_recommended_action === "string") {
123
+ console.log(`Next: ${result.next_recommended_action}`);
124
+ }
125
+ const failed = Number(result.fail_count ?? 0);
126
+ if (failed > 0) {
127
+ process.exitCode = 1;
128
+ }
129
+ }
130
+ export async function gateCommand(opts) {
131
+ const result = (await runMcpTool({
132
+ toolName: "codeloop_gate_check",
133
+ args: {
134
+ ...(opts.sectionId ? { section_id: opts.sectionId } : {}),
135
+ ...(opts.runId ? { run_id: opts.runId } : {}),
136
+ ...(opts.threshold ? { confidence_threshold: opts.threshold } : {}),
137
+ ...(opts.projectDir ? { project_dir: resolve(opts.projectDir) } : {}),
138
+ },
139
+ }));
140
+ if (opts.json) {
141
+ process.stdout.write(JSON.stringify(result) + "\n");
142
+ return;
143
+ }
144
+ console.log(`Status: ${result.status ?? result.gate_status}`);
145
+ console.log(`Confidence: ${result.confidence}`);
146
+ if (result.reasoning)
147
+ console.log(`Reasoning: ${result.reasoning}`);
148
+ const status = String(result.status ?? result.gate_status ?? "");
149
+ if (status !== "ready_for_review" && status !== "passed") {
150
+ process.exitCode = 1;
151
+ }
152
+ }
153
+ //# sourceMappingURL=verify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify.js","sourceRoot":"","sources":["../../src/commands/verify.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAsBpC,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,EAC/B,QAAQ,EACR,IAAI,EACJ,GAAG,EACH,GAAG,EACH,SAAS,GAAG,OAAO,GACD;IAClB,MAAM,WAAW,GAAG;QAClB,OAAO,EAAE,KAAc;QACvB,EAAE,EAAE,CAAC;QACL,MAAM,EAAE,YAAY;QACpB,MAAM,EAAE;YACN,eAAe,EAAE,YAAY;YAC7B,YAAY,EAAE,EAAE;YAChB,UAAU,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,QAAQ,EAAE;SACxD;KACF,CAAC;IACF,MAAM,WAAW,GAAG;QAClB,OAAO,EAAE,KAAc;QACvB,EAAE,EAAE,CAAC;QACL,MAAM,EAAE,YAAY;QACpB,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE;KAC5C,CAAC;IAEF,OAAO,IAAI,OAAO,CAAU,CAAC,cAAc,EAAE,aAAa,EAAE,EAAE;QAC5D,MAAM,KAAK,GAAG,KAAK,CAAC,qBAAqB,EAAE,EAAE,EAAE;YAC7C,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE;YACvC,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE;YACvC,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;SAChC,CAAC,CAAC;QAEH,IAAI,SAAS,GAAG,EAAE,CAAC;QACnB,IAAI,SAAS,GAAG,EAAE,CAAC;QACnB,IAAI,OAAO,GAAG,KAAK,CAAC;QAEpB,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YAC5B,IAAI,OAAO;gBAAE,OAAO;YACpB,OAAO,GAAG,IAAI,CAAC;YACf,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACtB,aAAa,CAAC,IAAI,KAAK,CAAC,aAAa,QAAQ,qBAAqB,SAAS,IAAI,CAAC,CAAC,CAAC;QACpF,CAAC,EAAE,SAAS,CAAC,CAAC;QAEd,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;YACxC,SAAS,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YAErC,kEAAkE;YAClE,kCAAkC;YAClC,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACpC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;gBAC5B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;oBAAE,SAAS;gBACvC,IAAI,CAAC;oBACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAoB,CAAC;oBACnD,IAAI,GAAG,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC;wBACjB,YAAY,CAAC,KAAK,CAAC,CAAC;wBACpB,OAAO,GAAG,IAAI,CAAC;wBACf,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;wBAClB,KAAK,CAAC,IAAI,EAAE,CAAC;wBACb,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;4BACd,aAAa,CACX,IAAI,KAAK,CAAC,cAAc,GAAG,CAAC,KAAK,CAAC,OAAO,UAAU,GAAG,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,CACtE,CAAC;wBACJ,CAAC;6BAAM,CAAC;4BACN,MAAM,MAAM,GAAG,GAAG,CAAC,MAAwB,CAAC;4BAC5C,MAAM,SAAS,GAAG,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;4BAClE,IAAI,SAAS,EAAE,IAAI,EAAE,CAAC;gCACpB,IAAI,CAAC;oCACH,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;gCAC7C,CAAC;gCAAC,MAAM,CAAC;oCACP,cAAc,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;gCACjC,CAAC;4BACH,CAAC;iCAAM,CAAC;gCACN,cAAc,CAAC,MAAM,CAAC,CAAC;4BACzB,CAAC;wBACH,CAAC;wBACD,OAAO;oBACT,CAAC;gBACH,CAAC;gBAAC,MAAM,CAAC;oBACP,kCAAkC;gBACpC,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;YACxC,SAAS,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACxB,IAAI,OAAO;gBAAE,OAAO;YACpB,OAAO,GAAG,IAAI,CAAC;YACf,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,aAAa,CACX,IAAI,KAAK,CACP,wCAAwC,GAAG,CAAC,OAAO,mDAAmD,CACvG,CACF,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YACzB,IAAI,OAAO;gBAAE,OAAO;YACpB,OAAO,GAAG,IAAI,CAAC;YACf,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,aAAa,CACX,IAAI,KAAK,CACP,wCAAwC,IAAI,gCAAgC,SAAS,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,EAAE,CACrG,CACF,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC,CAAC;QACtD,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;AACL,CAAC;AASD,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAAmB;IACrD,MAAM,MAAM,GAAG,CAAC,MAAM,UAAU,CAAC;QAC/B,QAAQ,EAAE,iBAAiB;QAC3B,IAAI,EAAE;YACJ,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,MAAM;YAC3B,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,MAAM;YACjC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACtE;KACF,CAAC,CAA4B,CAAC;IAE/B,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC;QACpD,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,WAAW,MAAM,CAAC,MAAM,IAAI,WAAW,EAAE,CAAC,CAAC;IACvD,OAAO,CAAC,GAAG,CAAC,0BAA0B,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC;IACxG,OAAO,CAAC,GAAG,CAAC,eAAe,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;IAChD,OAAO,CAAC,GAAG,CAAC,YAAY,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;IAC1C,IAAI,OAAO,MAAM,CAAC,uBAAuB,KAAK,QAAQ,EAAE,CAAC;QACvD,OAAO,CAAC,GAAG,CAAC,SAAS,MAAM,CAAC,uBAAuB,EAAE,CAAC,CAAC;IACzD,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,UAAU,IAAI,CAAC,CAAC,CAAC;IAC9C,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;QACf,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC;AACH,CAAC;AAUD,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAiB;IACjD,MAAM,MAAM,GAAG,CAAC,MAAM,UAAU,CAAC;QAC/B,QAAQ,EAAE,qBAAqB;QAC/B,IAAI,EAAE;YACJ,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACzD,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7C,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,oBAAoB,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACnE,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACtE;KACF,CAAC,CAA4B,CAAC;IAE/B,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC;QACpD,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,WAAW,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;IAC9D,OAAO,CAAC,GAAG,CAAC,eAAe,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;IAChD,IAAI,MAAM,CAAC,SAAS;QAAE,OAAO,CAAC,GAAG,CAAC,cAAc,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;IACpE,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC;IACjE,IAAI,MAAM,KAAK,kBAAkB,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;QACzD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC;AACH,CAAC"}
package/dist/index.js CHANGED
@@ -8,6 +8,11 @@ import { statusCommand } from "./commands/status.js";
8
8
  import { configureCommand } from "./commands/configure.js";
9
9
  import { designFetchCommand, designCompareCommand } from "./commands/design.js";
10
10
  import { cursorRuleCommand } from "./commands/cursor-rule.js";
11
+ import { doctorCommand } from "./commands/doctor.js";
12
+ import { installCursorExtensionCommand } from "./commands/install-cursor-extension.js";
13
+ import { dashboardCommand } from "./commands/dashboard.js";
14
+ import { baselineApproveCommand, baselineStatusCommand } from "./commands/baseline.js";
15
+ import { verifyCommand, gateCommand } from "./commands/verify.js";
11
16
  const program = new Command();
12
17
  program
13
18
  .name("codeloop")
@@ -68,5 +73,79 @@ program
68
73
  .option("--raw", "Print only the snippet (suitable for piping to pbcopy / xclip)")
69
74
  .option("--print", "Alias for --raw")
70
75
  .action((options) => cursorRuleCommand(options));
76
+ program
77
+ .command("doctor")
78
+ .description("Diagnose the CodeLoop activation chain — verify global MCP, agent rules, and project config")
79
+ .action(() => doctorCommand());
80
+ program
81
+ .command("install-cursor-extension")
82
+ .description("Download and install the CodeLoop Cursor .vsix extension (auto-installs the User Rule)")
83
+ .option("--vsix <path>", "Install a specific .vsix file instead of the latest GitHub release")
84
+ .option("--channel <channel>", "Release channel: stable | preview", "stable")
85
+ .option("--from-marketplace", "Install from the Cursor / VS Code extension marketplace by extension ID (falls back to GitHub release if unavailable)")
86
+ .option("--marketplace-id <id>", "Override the marketplace publisher.extension id", "codelooptech.codeloop-cursor-extension")
87
+ .action((options) => installCursorExtensionCommand(options));
88
+ program
89
+ .command("dashboard")
90
+ .description("Open the local CodeLoop dashboard for run artifacts (screenshots, video, gate scores)")
91
+ .option("--port <port>", "Port to listen on", "3737")
92
+ .option("--host <host>", "Host to bind to", "127.0.0.1")
93
+ .option("--share", "Print cloudflared tunnel hint for sharing the dashboard publicly")
94
+ .option("--no-open", "Do not auto-open the system browser")
95
+ .action((options) => dashboardCommand(options));
96
+ const baseline = program
97
+ .command("baseline")
98
+ .description("Manage visual baseline governance (approve, status)");
99
+ baseline
100
+ .command("approve")
101
+ .description("Approve the most recent pending baseline change")
102
+ .action(() => baselineApproveCommand());
103
+ baseline
104
+ .command("status")
105
+ .description("Show baseline change log summary")
106
+ .action(() => baselineStatusCommand());
107
+ program
108
+ .command("verify")
109
+ .description("Run the CodeLoop verification suite (build, tests, lint, screenshots)")
110
+ .option("--scope <scope>", "Verification scope: full | affected", "full")
111
+ .option("--platform <platform>", "Platform hint: auto | web | mobile | api", "auto")
112
+ .option("--project-dir <path>", "Project directory (default: cwd)")
113
+ .option("--json", "Emit a single JSON envelope to stdout (suppresses human output)")
114
+ .action(async (options) => {
115
+ try {
116
+ await verifyCommand(options);
117
+ }
118
+ catch (err) {
119
+ if (options.json) {
120
+ process.stdout.write(JSON.stringify({ error: err instanceof Error ? err.message : String(err) }) + "\n");
121
+ }
122
+ else {
123
+ console.error(err instanceof Error ? err.message : String(err));
124
+ }
125
+ process.exitCode = 2;
126
+ }
127
+ });
128
+ program
129
+ .command("gate")
130
+ .description("Run the CodeLoop quality gate check on the latest run")
131
+ .option("-s, --section-id <id>", "Section identifier from the active plan")
132
+ .option("--run-id <id>", "Specific run id to gate (defaults to latest)")
133
+ .option("--threshold <num>", "Confidence threshold (0-100)", (v) => parseInt(v, 10))
134
+ .option("--project-dir <path>", "Project directory (default: cwd)")
135
+ .option("--json", "Emit a single JSON envelope to stdout (suppresses human output)")
136
+ .action(async (options) => {
137
+ try {
138
+ await gateCommand(options);
139
+ }
140
+ catch (err) {
141
+ if (options.json) {
142
+ process.stdout.write(JSON.stringify({ error: err instanceof Error ? err.message : String(err) }) + "\n");
143
+ }
144
+ else {
145
+ console.error(err instanceof Error ? err.message : String(err));
146
+ }
147
+ process.exitCode = 2;
148
+ }
149
+ });
71
150
  program.parse();
72
151
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -2,11 +2,8 @@
2
2
  * Print a copy-paste-ready Cursor User Rule snippet so the user can finish
3
3
  * the always-on Cursor setup in two clicks.
4
4
  *
5
- * Why this is a manual step: Cursor's User Rules live in the Settings UI
6
- * (Cursor Settings Rules User Rules) and are stored in Cursor's
7
- * internal settings, not on disk. There is no documented file path that
8
- * Cursor reads as a global user rule, so we surface the snippet here for
9
- * the user to paste once. After that, Cursor enforces it on every workspace.
5
+ * Automatically copies the snippet to the system clipboard on macOS/Windows/Linux
6
+ * and attempts to open Cursor Settings for immediate pasting.
10
7
  */
11
8
  export declare function printCursorUserRuleBanner(opts?: {
12
9
  sourcePath?: string | null;
@@ -1 +1 @@
1
- {"version":3,"file":"cursor-rule-banner.d.ts","sourceRoot":"","sources":["../../src/utils/cursor-rule-banner.ts"],"names":[],"mappings":"AAGA;;;;;;;;;GASG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,CAAC,EAAE;IAAE,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAAG,IAAI,CAiDrF"}
1
+ {"version":3,"file":"cursor-rule-banner.d.ts","sourceRoot":"","sources":["../../src/utils/cursor-rule-banner.ts"],"names":[],"mappings":"AA0BA;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,CAAC,EAAE;IAAE,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAAG,IAAI,CA+DrF"}
@@ -1,14 +1,37 @@
1
1
  import chalk from "chalk";
2
+ import { execSync } from "child_process";
2
3
  import { GLOBAL_CURSOR_USER_RULE_SNIPPET } from "../templates/global-rules.js";
4
+ function copyToClipboard(text) {
5
+ const platform = process.platform;
6
+ try {
7
+ if (platform === "darwin") {
8
+ execSync("pbcopy", { input: text, stdio: ["pipe", "ignore", "ignore"] });
9
+ return true;
10
+ }
11
+ else if (platform === "win32") {
12
+ execSync("clip", { input: text, stdio: ["pipe", "ignore", "ignore"] });
13
+ return true;
14
+ }
15
+ else {
16
+ // Linux: try xclip, then xsel, then wl-copy (Wayland)
17
+ for (const cmd of ["xclip -selection clipboard", "xsel --clipboard --input", "wl-copy"]) {
18
+ try {
19
+ execSync(cmd, { input: text, stdio: ["pipe", "ignore", "ignore"] });
20
+ return true;
21
+ }
22
+ catch { /* try next */ }
23
+ }
24
+ }
25
+ }
26
+ catch { /* clipboard not available */ }
27
+ return false;
28
+ }
3
29
  /**
4
30
  * Print a copy-paste-ready Cursor User Rule snippet so the user can finish
5
31
  * the always-on Cursor setup in two clicks.
6
32
  *
7
- * Why this is a manual step: Cursor's User Rules live in the Settings UI
8
- * (Cursor Settings Rules User Rules) and are stored in Cursor's
9
- * internal settings, not on disk. There is no documented file path that
10
- * Cursor reads as a global user rule, so we surface the snippet here for
11
- * the user to paste once. After that, Cursor enforces it on every workspace.
33
+ * Automatically copies the snippet to the system clipboard on macOS/Windows/Linux
34
+ * and attempts to open Cursor Settings for immediate pasting.
12
35
  */
13
36
  export function printCursorUserRuleBanner(opts) {
14
37
  const sep = chalk.cyan("─".repeat(72));
@@ -21,10 +44,15 @@ export function printCursorUserRuleBanner(opts) {
21
44
  console.log(` rule below has to be pasted ${chalk.bold("once")}. After that, Cursor applies it to`);
22
45
  console.log(` every workspace automatically.`);
23
46
  console.log("");
47
+ const copied = copyToClipboard(GLOBAL_CURSOR_USER_RULE_SNIPPET);
48
+ if (copied) {
49
+ console.log(` ${chalk.green("✓")} ${chalk.bold.green("Copied to clipboard!")}`);
50
+ console.log("");
51
+ }
24
52
  console.log(` ${chalk.bold("How:")}`);
25
- console.log(` 1. Open Cursor → ${chalk.bold("Settings")} → ${chalk.bold("Rules")}`);
53
+ console.log(` 1. Open Cursor → ${chalk.bold("Settings")} (${chalk.dim("Cmd+, / Ctrl+,")}) → ${chalk.bold("Rules")}`);
26
54
  console.log(` 2. Click ${chalk.bold("+ Add Rule")} under ${chalk.bold("User Rules")}`);
27
- console.log(` 3. Paste the snippet below and save`);
55
+ console.log(` 3. ${copied ? chalk.bold("Paste (Cmd+V / Ctrl+V)") : "Paste the snippet below"} and save`);
28
56
  if (opts?.sourcePath) {
29
57
  console.log("");
30
58
  console.log(` ${chalk.dim("(Also saved to")} ${chalk.cyan(opts.sourcePath)} ${chalk.dim("for easy copy-paste.)")}`);
@@ -38,9 +66,11 @@ export function printCursorUserRuleBanner(opts) {
38
66
  }
39
67
  console.log(chalk.dim(" ── end of snippet ──"));
40
68
  console.log("");
41
- console.log(` ${chalk.dim("Skipping this step is OK")} the MCP server is still globally available`);
42
- console.log(` and its tool descriptions self-bootstrap. The User Rule just guarantees`);
43
- console.log(` Cursor proactively triggers CodeLoop on every code change.`);
69
+ console.log(` ${chalk.yellow("⚠")} Even if you skip this step, the MCP server's ${chalk.bold("instructions")} field`);
70
+ console.log(` injects CodeLoop rules into the agent's system prompt automatically.`);
71
+ console.log(` The User Rule is a ${chalk.bold("reinforcement")} that guarantees proactive triggering.`);
72
+ console.log("");
73
+ console.log(` ${chalk.dim("Verify your setup anytime:")} ${chalk.cyan("npx codeloop doctor")}`);
44
74
  console.log(sep);
45
75
  console.log("");
46
76
  }
@@ -1 +1 @@
1
- {"version":3,"file":"cursor-rule-banner.js","sourceRoot":"","sources":["../../src/utils/cursor-rule-banner.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cursor-rule-banner.js","sourceRoot":"","sources":["../../src/utils/cursor-rule-banner.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "codeloop",
3
- "version": "0.1.15",
3
+ "version": "0.1.17",
4
4
  "description": "CLI tool for CodeLoop — automated verification for AI coding agents",
5
5
  "type": "module",
6
6
  "bin": {
@@ -30,6 +30,7 @@
30
30
  ],
31
31
  "license": "MIT",
32
32
  "dependencies": {
33
+ "@codelooptech/dashboard-ui": "*",
33
34
  "@inquirer/prompts": "^7.5.0",
34
35
  "chalk": "^5.4.1",
35
36
  "commander": "^13.1.0",