whipped 0.0.1 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Binary file
@@ -0,0 +1,14 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en" class="dark">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <link rel="icon" type="image/png" href="/favicon.png" />
7
+ <title>whipped</title>
8
+ <script type="module" crossorigin src="/assets/index-rpsRpaUU.js"></script>
9
+ <link rel="stylesheet" crossorigin href="/assets/index-Dgu7Q26n.css">
10
+ </head>
11
+ <body>
12
+ <div id="root"></div>
13
+ </body>
14
+ </html>
package/package.json CHANGED
@@ -1,7 +1,73 @@
1
1
  {
2
2
  "name": "whipped",
3
- "version": "0.0.1",
4
- "description": "Autonomous AI agent kanban board because the AI has no choice.",
5
- "keywords": ["ai", "agents", "kanban", "claude", "codex"],
6
- "license": "MIT"
3
+ "version": "0.1.1",
4
+ "description": "Autonomous AI agent kanban board for Claude, Codex, Opencode, and Cursor.",
5
+ "type": "module",
6
+ "files": [
7
+ "dist",
8
+ "README.md",
9
+ "scripts/postinstall.mjs"
10
+ ],
11
+ "bin": {
12
+ "whipped": "dist/cli.js"
13
+ },
14
+ "engines": {
15
+ "node": ">=22"
16
+ },
17
+ "scripts": {
18
+ "clean": "rm -rf dist",
19
+ "build": "pnpm clean && pnpm web:build && node scripts/build.mjs",
20
+ "prepublishOnly": "pnpm build",
21
+ "postinstall": "node scripts/postinstall.mjs",
22
+ "dev": "NODE_ENV=development tsx src/cli.ts",
23
+ "dev:full": "node scripts/dev-full.mjs",
24
+ "web:dev": "pnpm --filter @whipped/web dev",
25
+ "web:build": "pnpm --filter @whipped/web build",
26
+ "typecheck": "tsc -p tsconfig.json --noEmit",
27
+ "web:typecheck": "pnpm --filter @whipped/web typecheck",
28
+ "lint": "biome lint src web-ui/src",
29
+ "format": "biome format --write ."
30
+ },
31
+ "dependencies": {
32
+ "@hono/zod-validator": "^0.8.0",
33
+ "@modelcontextprotocol/sdk": "^1.29.0",
34
+ "@octokit/graphql": "^8.1.2",
35
+ "@octokit/rest": "^21.1.1",
36
+ "@playwright/mcp": "^0.0.75",
37
+ "@xterm/addon-serialize": "^0.14.0",
38
+ "@xterm/headless": "^6.0.0",
39
+ "better-sqlite3": "^12.10.0",
40
+ "commander": "^14.0.3",
41
+ "croner": "^10.0.1",
42
+ "hono": "^4.12.23",
43
+ "node-pty": "^1.2.0-beta.11",
44
+ "open": "^11.0.0",
45
+ "ora": "^9.3.0",
46
+ "pino": "^10.3.1",
47
+ "pino-pretty": "^13.1.3",
48
+ "proper-lockfile": "^4.1.2",
49
+ "tree-kill": "^1.2.2",
50
+ "ws": "^8.18.0",
51
+ "zod": "^4.3.6"
52
+ },
53
+ "devDependencies": {
54
+ "@biomejs/biome": "^2.3.5",
55
+ "@types/better-sqlite3": "^7.6.13",
56
+ "@types/node": "^22.10.5",
57
+ "@types/proper-lockfile": "^4.1.4",
58
+ "@types/ws": "^8.18.1",
59
+ "esbuild": "^0.27.4",
60
+ "tsx": "^4.20.3",
61
+ "typescript": "^5.9.3"
62
+ },
63
+ "pnpm": {
64
+ "onlyBuiltDependencies": [
65
+ "better-sqlite3",
66
+ "esbuild",
67
+ "node-pty"
68
+ ],
69
+ "overrides": {
70
+ "hono": "4.12.23"
71
+ }
72
+ }
7
73
  }
@@ -0,0 +1,43 @@
1
+ // Runs after `npm install -g whipped`. Only shows a message for global installs.
2
+ if (process.env.npm_config_global !== "true") process.exit(0);
3
+
4
+ import { existsSync, readFileSync } from "node:fs";
5
+ import { homedir } from "node:os";
6
+ import { join } from "node:path";
7
+
8
+ const homeDir = process.env.WHIPPED_HOME_DIR ?? join(homedir(), ".whipped");
9
+ const statePath = join(homeDir, "daemon.pid");
10
+
11
+ let isRunning = false;
12
+ let url = "";
13
+
14
+ if (existsSync(statePath)) {
15
+ try {
16
+ const state = JSON.parse(readFileSync(statePath, "utf8"));
17
+ if (typeof state.pid === "number") {
18
+ try {
19
+ process.kill(state.pid, 0);
20
+ isRunning = true;
21
+ url = state.url ?? "";
22
+ } catch {
23
+ // process not alive
24
+ }
25
+ }
26
+ } catch {
27
+ // ignore parse errors
28
+ }
29
+ }
30
+
31
+ if (isRunning) {
32
+ process.stdout.write(
33
+ `\n✓ whipped updated.\n\n` +
34
+ ` A whipped daemon is already running${url ? ` at ${url}` : ""}.\n` +
35
+ ` Run \`whipped restart\` to apply the update.\n\n`,
36
+ );
37
+ } else {
38
+ process.stdout.write(
39
+ `\n✓ whipped installed.\n\n` +
40
+ ` Run \`whipped\` inside a git repo to start the board.\n` +
41
+ ` Run \`whipped start\` to run it as a background daemon.\n\n`,
42
+ );
43
+ }