codeloop 0.1.16 → 0.1.18
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/LICENSE +21 -0
- package/README.md +76 -0
- package/dist/commands/baseline.d.ts +3 -0
- package/dist/commands/baseline.d.ts.map +1 -0
- package/dist/commands/baseline.js +63 -0
- package/dist/commands/baseline.js.map +1 -0
- package/dist/commands/dashboard.d.ts +9 -0
- package/dist/commands/dashboard.d.ts.map +1 -0
- package/dist/commands/dashboard.js +54 -0
- package/dist/commands/dashboard.js.map +1 -0
- package/dist/commands/doctor.d.ts +1 -1
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +104 -10
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/install-cursor-extension.d.ts +15 -0
- package/dist/commands/install-cursor-extension.d.ts.map +1 -0
- package/dist/commands/install-cursor-extension.js +136 -0
- package/dist/commands/install-cursor-extension.js.map +1 -0
- package/dist/commands/verify.d.ts +31 -0
- package/dist/commands/verify.d.ts.map +1 -0
- package/dist/commands/verify.js +153 -0
- package/dist/commands/verify.js.map +1 -0
- package/dist/index.js +102 -2
- package/dist/index.js.map +1 -1
- package/dist/templates/claude-agents.d.ts +1 -4
- package/dist/templates/claude-agents.d.ts.map +1 -1
- package/dist/templates/claude-agents.js +1 -341
- package/dist/templates/claude-agents.js.map +1 -1
- package/dist/templates/claude-prompts.d.ts +1 -3
- package/dist/templates/claude-prompts.d.ts.map +1 -1
- package/dist/templates/claude-prompts.js +1 -44
- package/dist/templates/claude-prompts.js.map +1 -1
- package/dist/templates/config.d.ts +1 -1
- package/dist/templates/config.d.ts.map +1 -1
- package/dist/templates/config.js +1 -31
- package/dist/templates/config.js.map +1 -1
- package/dist/templates/cursor-rules.d.ts +1 -7
- package/dist/templates/cursor-rules.d.ts.map +1 -1
- package/dist/templates/cursor-rules.js +1 -684
- package/dist/templates/cursor-rules.js.map +1 -1
- package/dist/templates/cursor-skills.d.ts +1 -4
- package/dist/templates/cursor-skills.d.ts.map +1 -1
- package/dist/templates/cursor-skills.js +1 -156
- package/dist/templates/cursor-skills.js.map +1 -1
- package/dist/templates/global-rules.d.ts +1 -37
- package/dist/templates/global-rules.d.ts.map +1 -1
- package/dist/templates/global-rules.js +1 -164
- package/dist/templates/global-rules.js.map +1 -1
- package/dist/templates/mcp-config.d.ts +1 -31
- package/dist/templates/mcp-config.d.ts.map +1 -1
- package/dist/templates/mcp-config.js +1 -68
- package/dist/templates/mcp-config.js.map +1 -1
- package/dist/templates/specs.d.ts +1 -3
- package/dist/templates/specs.d.ts.map +1 -1
- package/dist/templates/specs.js +1 -67
- package/dist/templates/specs.js.map +1 -1
- package/package.json +26 -3
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 CodeLoop Tech
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
# `codeloop` — CLI
|
|
2
|
+
|
|
3
|
+
[](https://www.npmjs.com/package/codeloop)
|
|
4
|
+
[](https://codeloop.tech/docs)
|
|
5
|
+
[](./LICENSE)
|
|
6
|
+
|
|
7
|
+
The command-line entry point for **CodeLoop** — the zero-LLM-cost
|
|
8
|
+
verification layer for AI coding agents (Cursor, Claude Code, Codex,
|
|
9
|
+
Gemini, Aider, …). The CLI is what bootstraps a project, registers the
|
|
10
|
+
MCP server with your editor, runs the verify→diagnose→gate-check loop
|
|
11
|
+
from a terminal, and ships diagnostics with `codeloop doctor`.
|
|
12
|
+
|
|
13
|
+
CodeLoop runs **locally** as an MCP server, never spawns its own LLM
|
|
14
|
+
calls, and works on macOS, Linux, and Windows.
|
|
15
|
+
|
|
16
|
+
## Install
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
npx codeloop install # install MCP entry + agent rules
|
|
20
|
+
npx codeloop install-cursor-extension # one-shot Cursor setup
|
|
21
|
+
codeloop init # bootstrap any project (auto-detects stack)
|
|
22
|
+
npx codeloop auth # browser-based key flow (no copy-paste)
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
Or install globally:
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
npm install -g codeloop
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## Commands
|
|
32
|
+
|
|
33
|
+
| Command | Purpose |
|
|
34
|
+
|---|---|
|
|
35
|
+
| `codeloop init` | Detect project type (Flutter/Web/Python/Ruby/Rails/Rust/.NET/Xcode) and write `.codeloop/config.json`, agent rules, and recommended scripts. |
|
|
36
|
+
| `codeloop install` | Wire `codeloop-mcp-server` into Cursor (`~/.cursor/mcp.json`) and Claude Code (`.mcp.json`). |
|
|
37
|
+
| `codeloop install-cursor-extension` | Download + install the Cursor `.vsix` extension and the User Rule. |
|
|
38
|
+
| `codeloop auth` | Browser-based key flow. Opens [codeloop.tech/cli-auth](https://codeloop.tech/cli-auth), exchanges a one-time token for an API key, and writes `~/.codeloop/auth.json`. |
|
|
39
|
+
| `codeloop doctor` | Diagnose runtime tooling (ffmpeg / xcrun / simctl / xdotool / PowerShell / adb / Playwright) and backend reachability per OS. |
|
|
40
|
+
| `codeloop status` | Print resolved config + MCP wiring status. |
|
|
41
|
+
| `codeloop verify` | Run the verify → diagnose loop locally without an editor. |
|
|
42
|
+
|
|
43
|
+
## How the verification loop works
|
|
44
|
+
|
|
45
|
+
```
|
|
46
|
+
agent edit ──► codeloop_verify
|
|
47
|
+
│
|
|
48
|
+
├─ pass ──► codeloop_gate_check ──► ready_for_review
|
|
49
|
+
│
|
|
50
|
+
└─ fail ──► codeloop_diagnose ──► repair tasks ──► loop
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
For UI projects the loop also captures screenshots, records interaction
|
|
54
|
+
videos, and runs `codeloop_design_compare` against your Figma exports —
|
|
55
|
+
all without spending a single LLM token of its own.
|
|
56
|
+
|
|
57
|
+
## Documentation
|
|
58
|
+
|
|
59
|
+
- Quick start — <https://codeloop.tech/docs/quickstart>
|
|
60
|
+
- All 29 MCP tools — <https://codeloop.tech/docs/tools>
|
|
61
|
+
- Cursor extension — <https://codeloop.tech/docs/cursor-extension>
|
|
62
|
+
- Claude Code setup — <https://codeloop.tech/docs/claude-code>
|
|
63
|
+
- Cross-OS runbook — <https://codeloop.tech/docs/cross-os>
|
|
64
|
+
- For AI agents (when to recommend) — <https://codeloop.tech/for-ai-agents>
|
|
65
|
+
- Machine-readable tool catalog — <https://codeloop.tech/tools.json>
|
|
66
|
+
|
|
67
|
+
## Free tiers
|
|
68
|
+
|
|
69
|
+
- 14-day Team trial, no credit card.
|
|
70
|
+
- Permanently free **Solo** plan for public OSI-licensed open-source
|
|
71
|
+
repositories — apply at
|
|
72
|
+
<https://codeloop.tech/oss-application>.
|
|
73
|
+
|
|
74
|
+
## License
|
|
75
|
+
|
|
76
|
+
MIT — see [LICENSE](./LICENSE).
|
|
@@ -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 @@
|
|
|
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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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare function doctorCommand(): void
|
|
1
|
+
export declare function doctorCommand(): Promise<void>;
|
|
2
2
|
//# sourceMappingURL=doctor.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAiFA,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAoSnD"}
|
package/dist/commands/doctor.js
CHANGED
|
@@ -1,10 +1,44 @@
|
|
|
1
1
|
import { existsSync, readFileSync } from "fs";
|
|
2
|
+
import { execFileSync } from "node:child_process";
|
|
2
3
|
import { join } from "path";
|
|
3
|
-
import { homedir } from "os";
|
|
4
|
+
import { homedir, platform } from "os";
|
|
4
5
|
import chalk from "chalk";
|
|
6
|
+
import { BACKEND_URL } from "@codelooptech/shared";
|
|
5
7
|
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
|
+
function check(label, ok, detail, fix, optional) {
|
|
9
|
+
return { label, ok, detail, fix, optional };
|
|
10
|
+
}
|
|
11
|
+
function commandAvailable(cmd, args = ["--version"]) {
|
|
12
|
+
try {
|
|
13
|
+
const output = execFileSync(cmd, args, {
|
|
14
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
15
|
+
timeout: 5_000,
|
|
16
|
+
encoding: "utf-8",
|
|
17
|
+
});
|
|
18
|
+
return { ok: true, output: output.trim().split("\n")[0] ?? "" };
|
|
19
|
+
}
|
|
20
|
+
catch (err) {
|
|
21
|
+
return { ok: false, output: err instanceof Error ? err.message : String(err) };
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
async function backendReachable(url) {
|
|
25
|
+
try {
|
|
26
|
+
const controller = new AbortController();
|
|
27
|
+
const timer = setTimeout(() => controller.abort(), 3500);
|
|
28
|
+
const res = await fetch(`${url.replace(/\/$/, "")}/health`, {
|
|
29
|
+
signal: controller.signal,
|
|
30
|
+
});
|
|
31
|
+
clearTimeout(timer);
|
|
32
|
+
if (res.ok)
|
|
33
|
+
return { ok: true, detail: `${url} → ${res.status}` };
|
|
34
|
+
return { ok: false, detail: `${url} → HTTP ${res.status}` };
|
|
35
|
+
}
|
|
36
|
+
catch (err) {
|
|
37
|
+
return {
|
|
38
|
+
ok: false,
|
|
39
|
+
detail: err instanceof Error ? err.message : String(err),
|
|
40
|
+
};
|
|
41
|
+
}
|
|
8
42
|
}
|
|
9
43
|
function fileContains(path, needle) {
|
|
10
44
|
try {
|
|
@@ -28,10 +62,11 @@ function jsonHasKey(path, ...keys) {
|
|
|
28
62
|
return false;
|
|
29
63
|
}
|
|
30
64
|
}
|
|
31
|
-
export function doctorCommand() {
|
|
65
|
+
export async function doctorCommand() {
|
|
32
66
|
const home = homedir();
|
|
33
67
|
const cwd = process.cwd();
|
|
34
68
|
const results = [];
|
|
69
|
+
const os = platform();
|
|
35
70
|
// ── Global MCP Registration ─────────────────────────────────────
|
|
36
71
|
const cursorMcpPath = join(home, ".cursor", "mcp.json");
|
|
37
72
|
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"));
|
|
@@ -60,31 +95,84 @@ export function doctorCommand() {
|
|
|
60
95
|
results.push(check("Project agent rules", hasProjectRules, hasProjectRules
|
|
61
96
|
? `Found: ${[cursorProjectRules, claudeProjectRules].filter(existsSync).map((p) => p.replace(cwd + "/", "")).join(", ")}`
|
|
62
97
|
: "No .cursor/rules/core.mdc or CLAUDE.md found", "Run: npx codeloop init"));
|
|
98
|
+
// ── Runtime Tooling (cross-OS) ──────────────────────────────────
|
|
99
|
+
const ffmpeg = commandAvailable("ffmpeg", ["-version"]);
|
|
100
|
+
results.push(check("ffmpeg (video capture)", ffmpeg.ok, ffmpeg.ok ? ffmpeg.output : "Not found on PATH", os === "darwin"
|
|
101
|
+
? "brew install ffmpeg"
|
|
102
|
+
: os === "linux"
|
|
103
|
+
? "sudo apt-get install -y ffmpeg # or: sudo dnf install ffmpeg"
|
|
104
|
+
: "winget install -e --id Gyan.FFmpeg # or: choco install ffmpeg"));
|
|
105
|
+
if (os === "darwin") {
|
|
106
|
+
const xcrun = commandAvailable("xcrun", ["--version"]);
|
|
107
|
+
results.push(check("xcrun (iOS Simulator + CLI tools)", xcrun.ok, xcrun.ok ? xcrun.output : "Not found", "xcode-select --install # then accept the Xcode license: sudo xcodebuild -license accept"));
|
|
108
|
+
const simctl = commandAvailable("xcrun", ["simctl", "help"]);
|
|
109
|
+
results.push(check("simctl (iOS Simulator control)", simctl.ok, simctl.ok ? "simctl available via xcrun" : "Not available", "Install full Xcode from the Mac App Store (Command Line Tools alone don't ship simctl).", true));
|
|
110
|
+
const screencapture = commandAvailable("screencapture", ["-h"]);
|
|
111
|
+
// screencapture exits non-zero on -h but still proves it exists
|
|
112
|
+
const screencaptureOk = screencapture.ok || screencapture.output.includes("usage:");
|
|
113
|
+
results.push(check("screencapture (macOS screenshot)", screencaptureOk, screencaptureOk ? "Available" : "Not found", "Built into macOS — if missing, your shell PATH is misconfigured."));
|
|
114
|
+
}
|
|
115
|
+
if (os === "linux") {
|
|
116
|
+
const xdotool = commandAvailable("xdotool", ["--version"]);
|
|
117
|
+
results.push(check("xdotool (Linux automation)", xdotool.ok, xdotool.ok ? xdotool.output : "Not found", "sudo apt-get install -y xdotool # or: sudo dnf install xdotool"));
|
|
118
|
+
const xwininfo = commandAvailable("xwininfo", ["-version"]);
|
|
119
|
+
results.push(check("xwininfo (window inspection)", xwininfo.ok, xwininfo.ok ? xwininfo.output : "Not found", "sudo apt-get install -y x11-utils", true));
|
|
120
|
+
if (process.env.WAYLAND_DISPLAY && !process.env.DISPLAY) {
|
|
121
|
+
results.push(check("Display server", false, "Wayland-only session detected (no DISPLAY)", "Run a desktop session with X11 (or XWayland enabled) — Wayland blocks ffmpeg x11grab and xdotool.", true));
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
if (os === "win32") {
|
|
125
|
+
const powershell = commandAvailable("pwsh", ["-NoProfile", "-Command", "$PSVersionTable.PSVersion"]).ok ||
|
|
126
|
+
commandAvailable("powershell", ["-NoProfile", "-Command", "$PSVersionTable.PSVersion"]).ok;
|
|
127
|
+
results.push(check("PowerShell (Windows automation)", powershell, powershell ? "Available" : "Not found", "Install PowerShell 7+ from https://aka.ms/powershell — required for window/keystroke automation."));
|
|
128
|
+
}
|
|
129
|
+
// adb (Android) — optional, only flag if Android tooling is intended
|
|
130
|
+
const adb = commandAvailable("adb", ["version"]);
|
|
131
|
+
results.push(check("adb (Android emulator support)", adb.ok, adb.ok ? adb.output : "Not found (only required for Android targets)", "Install Android platform-tools: https://developer.android.com/tools/releases/platform-tools", true));
|
|
132
|
+
// Playwright runtime (browser auto-install)
|
|
133
|
+
let playwrightOk = false;
|
|
134
|
+
let playwrightDetail = "Not installed";
|
|
135
|
+
try {
|
|
136
|
+
const requireFn = (await import("node:module")).createRequire(import.meta.url);
|
|
137
|
+
const pkg = requireFn("playwright/package.json");
|
|
138
|
+
playwrightOk = true;
|
|
139
|
+
playwrightDetail = `playwright@${pkg.version ?? "unknown"}`;
|
|
140
|
+
}
|
|
141
|
+
catch {
|
|
142
|
+
/* playwright is optional */
|
|
143
|
+
}
|
|
144
|
+
results.push(check("Playwright (web E2E + browser interactions)", playwrightOk, playwrightDetail, "npm install -D playwright && npx playwright install chromium # for web projects", true));
|
|
145
|
+
// ── Backend Reachability ────────────────────────────────────────
|
|
146
|
+
const backend = await backendReachable(BACKEND_URL);
|
|
147
|
+
results.push(check(`Backend API reachable (${BACKEND_URL})`, backend.ok, backend.detail, "Check your network or set CODELOOP_BACKEND_URL if you self-host. Offline use is supported but billing/usage will sync later.", true));
|
|
63
148
|
// ── Print Results ───────────────────────────────────────────────
|
|
64
149
|
const sep = chalk.cyan("─".repeat(72));
|
|
65
150
|
console.log("");
|
|
66
151
|
console.log(sep);
|
|
67
|
-
console.log(` ${chalk.bold.cyan("CodeLoop Doctor")} — activation chain diagnostics`);
|
|
152
|
+
console.log(` ${chalk.bold.cyan("CodeLoop Doctor")} — activation chain + runtime diagnostics`);
|
|
68
153
|
console.log(sep);
|
|
69
154
|
console.log("");
|
|
70
155
|
let allOk = true;
|
|
71
156
|
for (const r of results) {
|
|
72
|
-
const icon = r.ok ? chalk.green("✓") : chalk.red("✗");
|
|
73
|
-
|
|
157
|
+
const icon = r.ok ? chalk.green("✓") : r.optional ? chalk.yellow("!") : chalk.red("✗");
|
|
158
|
+
const labelStyle = r.ok ? chalk.white : r.optional ? chalk.yellow : chalk.yellow;
|
|
159
|
+
console.log(` ${icon} ${labelStyle(r.label)}`);
|
|
74
160
|
if (r.detail) {
|
|
75
161
|
console.log(` ${chalk.dim(r.detail)}`);
|
|
76
162
|
}
|
|
77
163
|
if (!r.ok && r.fix) {
|
|
78
164
|
console.log(` ${chalk.dim("Fix:")} ${chalk.cyan(r.fix)}`);
|
|
79
|
-
|
|
165
|
+
if (!r.optional)
|
|
166
|
+
allOk = false;
|
|
80
167
|
}
|
|
81
168
|
}
|
|
82
169
|
console.log("");
|
|
83
170
|
if (allOk) {
|
|
84
|
-
console.log(` ${chalk.bold.green("All checks passed!")} CodeLoop is
|
|
171
|
+
console.log(` ${chalk.bold.green("All required checks passed!")} CodeLoop is ready to run.`);
|
|
172
|
+
console.log(` ${chalk.dim("Optional warnings (yellow !) only matter if you target that stack.")}`);
|
|
85
173
|
}
|
|
86
174
|
else {
|
|
87
|
-
console.log(` ${chalk.bold.yellow("Some checks failed.")} Run the suggested fixes above.`);
|
|
175
|
+
console.log(` ${chalk.bold.yellow("Some required checks failed.")} Run the suggested fixes above.`);
|
|
88
176
|
}
|
|
89
177
|
console.log("");
|
|
90
178
|
console.log(` ${chalk.dim("How CodeLoop activates in Cursor (layered redundancy):")}`);
|
|
@@ -92,6 +180,12 @@ export function doctorCommand() {
|
|
|
92
180
|
console.log(` ${chalk.dim("2.")} Tool description prefixes → every tool self-advertises the verify rule`);
|
|
93
181
|
console.log(` ${chalk.dim("3.")} INIT_HINT on responses → fires when project is not yet initialized`);
|
|
94
182
|
console.log(` ${chalk.dim("4.")} Cursor User Rules (paste) → reinforcement for proactive triggering`);
|
|
183
|
+
if (!allOk && !existsSync(cursorRulePath)) {
|
|
184
|
+
console.log("");
|
|
185
|
+
console.log(` ${chalk.dim("Tip:")} install the CodeLoop Cursor extension to skip the manual paste:`);
|
|
186
|
+
console.log(` ${chalk.cyan("npx codeloop install-cursor-extension")}`);
|
|
187
|
+
console.log(` ${chalk.dim("or open Cursor settings directly:")} ${chalk.cyan("cursor://settings/cursor.rules.userRules")}`);
|
|
188
|
+
}
|
|
95
189
|
console.log(sep);
|
|
96
190
|
console.log("");
|
|
97
191
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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"}
|
|
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":"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"}
|