claudekit-cli 3.36.0-dev.3 → 3.36.0-dev.30

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 CHANGED
@@ -9,8 +9,9 @@ Command-line tool and web dashboard for managing ClaudeKit projects.
9
9
  ClaudeKit Config UI (`ck`) provides both CLI and web dashboard for managing ClaudeKit projects. Built with Bun, TypeScript, and React, enables fast, secure project setup and comprehensive configuration management.
10
10
 
11
11
  **Key Features:**
12
- - **CLI Commands (14)**: new, init, config, projects, setup, skills, agents, commands, migrate, doctor, versions, update, uninstall, easter-egg
12
+ - **CLI Commands (16)**: new, init, config, projects, setup, skills, agents, commands, migrate, doctor, versions, update, uninstall, watch, content, easter-egg
13
13
  - **Web Dashboard**: Interactive React UI via `ck config ui` for configuration and project management
14
+ - **Hook Diagnostics Dashboard**: Inspect recent Claude hook activity and failures from `ck config` across global and project scopes
14
15
  - **Projects Registry**: Centralized registry at `~/.claudekit/projects.json` with file locking
15
16
  - **Skill Installation**: Install ClaudeKit skills to other coding agents (Cursor, Codex, etc.)
16
17
  - **Multi-tier Authentication**: gh CLI → env vars → keychain → prompt fallback
@@ -32,6 +33,8 @@ Comprehensive documentation in `/docs`:
32
33
  - **[Code Standards](./docs/code-standards.md)** - Coding conventions, best practices
33
34
  - **[Project Roadmap](./docs/project-roadmap.md)** - Release timeline, feature status
34
35
  - **[Deployment Guide](./docs/deployment-guide.md)** - Release procedures
36
+ - **[ck watch](./docs/ck-watch.md)** - GitHub issue monitoring daemon
37
+ - **[ck content](./docs/ck-content.md)** - Automated content generation from git activity
35
38
 
36
39
  ## Prerequisites
37
40
 
@@ -306,6 +309,64 @@ ck uninstall --yes # Non-interactive - skip confirmation (for scripts)
306
309
 
307
310
  **Note:** Only removes valid ClaudeKit installations (with metadata.json). Regular `.claude` directories from Claude Desktop are not affected.
308
311
 
312
+ ### Watch GitHub Issues (`ck watch`)
313
+
314
+ Autonomous daemon that monitors GitHub issues, analyzes them with Claude, generates plans, and creates PRs.
315
+
316
+ ```bash
317
+ # Start watching (single repo)
318
+ ck watch
319
+
320
+ # Dry-run mode (no posts/PRs)
321
+ ck watch --dry-run
322
+
323
+ # Custom poll interval (ms)
324
+ ck watch --interval 60000
325
+
326
+ # Force restart (clear state)
327
+ ck watch --force
328
+
329
+ # Verbose logging
330
+ ck watch --verbose
331
+ ```
332
+
333
+ **Features:** issue lifecycle management (10 statuses), Claude-powered brainstorming/planning, automatic PR creation, rate limiting (persisted across restarts), maintainer reply filtering, processedIssues TTL, optional git worktree isolation per issue, multi-repo support, graceful shutdown.
334
+
335
+ **Config:** `.ck.json` under `watch` key. See [docs/ck-watch.md](./docs/ck-watch.md) for full configuration reference.
336
+
337
+ ### Content Generation (`ck content`)
338
+
339
+ Daemon that scans git activity (commits, PRs, tags), generates social media content with Claude, and publishes to X/Twitter and Facebook.
340
+
341
+ ```bash
342
+ # Interactive setup wizard
343
+ ck content setup
344
+
345
+ # Start daemon
346
+ ck content start
347
+
348
+ # Check status
349
+ ck content status
350
+
351
+ # View logs
352
+ ck content logs
353
+
354
+ # Queue manual content
355
+ ck content queue
356
+
357
+ # Review workflow
358
+ ck content approve <id>
359
+ ck content reject <id>
360
+
361
+ # Dry-run / verbose
362
+ ck content start --dry-run
363
+ ck content start --verbose
364
+ ```
365
+
366
+ **Features:** 11-phase pipeline (scan → filter → classify → context → create → validate → review → photo → publish → engage → analyze), noise filtering, context caching (24h TTL), content validation, photo generation, 3 review modes (auto/manual/hybrid), quiet hours scheduling, engagement tracking, SQLite database, platform-specific adapters.
367
+
368
+ **Config:** `.ck.json` under `content` key. See [docs/ck-content.md](./docs/ck-content.md) for full configuration reference.
369
+
309
370
  ### Other Commands
310
371
 
311
372
  ```bash
package/bin/ck.js CHANGED
@@ -6,7 +6,7 @@
6
6
  * This is the entry point that NPM symlinks to when installing globally.
7
7
  */
8
8
 
9
- import { spawn } from "node:child_process";
9
+ import { execSync, spawn } from "node:child_process";
10
10
  import { existsSync } from "node:fs";
11
11
  import { dirname, join } from "node:path";
12
12
  import { fileURLToPath, pathToFileURL } from "node:url";
@@ -48,7 +48,59 @@ const getErrorMessage = (err) => {
48
48
  };
49
49
 
50
50
  /**
51
- * Run CLI via Node.js as fallback (slower but works on all platforms).
51
+ * Check if bun runtime is available on the system.
52
+ * Used to run dist/index.js with bun when no platform binary exists (e.g., dev releases).
53
+ * dist/index.js may contain bun-specific imports (bun:sqlite) that Node.js can't handle.
54
+ * Result is cached to avoid repeated execSync calls across fallback paths.
55
+ */
56
+ let _bunAvailable = undefined;
57
+ const hasBun = () => {
58
+ if (_bunAvailable !== undefined) return _bunAvailable;
59
+ try {
60
+ execSync("bun --version", { stdio: "ignore", timeout: 3000 });
61
+ _bunAvailable = true;
62
+ } catch {
63
+ _bunAvailable = false;
64
+ }
65
+ return _bunAvailable;
66
+ };
67
+
68
+ /**
69
+ * Run CLI via bun runtime. Preferred over Node.js when dist/index.js contains
70
+ * bun-specific imports (e.g., bun:sqlite) that the Node.js ESM loader rejects.
71
+ * @param {boolean} showWarning - Whether to show runtime info message
72
+ * @returns {Promise<void>} Resolves when bun process exits
73
+ */
74
+ const runWithBun = (showWarning = false) => {
75
+ const distPath = join(__dirname, "..", "dist", "index.js");
76
+ if (!existsSync(distPath)) {
77
+ throw new Error("Compiled distribution not found. This may indicate a packaging issue.");
78
+ }
79
+ if (showWarning) {
80
+ console.error("⚠️ Native binary not found, using bun runtime");
81
+ }
82
+ return new Promise((resolve) => {
83
+ const child = spawn("bun", [distPath, ...process.argv.slice(2)], {
84
+ stdio: "inherit",
85
+ windowsHide: true,
86
+ });
87
+ child.on("error", () => {
88
+ // bun spawn failed unexpectedly — caller handles fallback
89
+ resolve(false);
90
+ });
91
+ child.on("exit", (code, signal) => {
92
+ if (signal) {
93
+ process.kill(process.pid, signal);
94
+ return;
95
+ }
96
+ process.exitCode = code || 0;
97
+ resolve(true);
98
+ });
99
+ });
100
+ };
101
+
102
+ /**
103
+ * Run CLI via Node.js as last-resort fallback (slower, no bun: protocol support).
52
104
  * The imported dist/index.js handles its own process lifecycle via the cac CLI framework.
53
105
  * @param {boolean} showWarning - Whether to show fallback warning message
54
106
  * @throws {Error} If dist/index.js is missing or fails to load
@@ -115,17 +167,32 @@ const runBinary = (binaryPath) => {
115
167
 
116
168
  child.on("error", async (err) => {
117
169
  // Binary execution failed (e.g., ENOENT on Alpine/musl due to missing glibc)
118
- // Fall back to Node.js execution
170
+ // Fall back to bun, then Node.js
119
171
  errorOccurred = true;
172
+ if (hasBun()) {
173
+ const success = await runWithBun(true);
174
+ if (success) {
175
+ resolve();
176
+ return;
177
+ }
178
+ }
120
179
  try {
121
180
  await runWithNode(true);
122
181
  resolve();
123
182
  } catch (fallbackErr) {
183
+ const fallbackMsg = getErrorMessage(fallbackErr);
124
184
  console.error(`❌ Binary failed: ${getErrorMessage(err)}`);
125
- console.error(`❌ Fallback also failed: ${getErrorMessage(fallbackErr)}`);
126
- console.error(
127
- "Please report this issue at: https://github.com/mrgoonie/claudekit-cli/issues",
128
- );
185
+ console.error(`❌ Fallback also failed: ${fallbackMsg}`);
186
+ if (fallbackMsg.includes("bun:") || fallbackMsg.includes("Received protocol")) {
187
+ console.error("");
188
+ console.error("This version of ClaudeKit CLI requires the bun runtime.");
189
+ console.error("Install bun: curl -fsSL https://bun.sh/install | bash");
190
+ console.error("Or switch to stable: npm install -g claudekit-cli@latest");
191
+ } else {
192
+ console.error(
193
+ "Please report this issue at: https://github.com/mrgoonie/claudekit-cli/issues",
194
+ );
195
+ }
129
196
  process.exit(1);
130
197
  }
131
198
  });
@@ -148,16 +215,29 @@ const runBinary = (binaryPath) => {
148
215
  };
149
216
 
150
217
  /**
151
- * Handle fallback execution with error reporting
152
- * @param {string} errorPrefix - Prefix for error message if fallback fails
218
+ * Handle fallback execution: try bun first (handles bun: imports), then Node.js.
219
+ * @param {string} errorPrefix - Prefix for error message if all fallbacks fail
153
220
  * @param {boolean} showIssueLink - Whether to show issue reporting link
154
221
  */
155
222
  const handleFallback = async (errorPrefix, showIssueLink = false) => {
223
+ // Prefer bun — dist/index.js may contain bun-specific imports (bun:sqlite)
224
+ if (hasBun()) {
225
+ const success = await runWithBun(true);
226
+ if (success) return;
227
+ }
228
+ // Last resort: Node.js (works for stable builds without bun: imports)
156
229
  try {
157
230
  await runWithNode();
158
231
  } catch (err) {
159
- console.error(`❌ ${errorPrefix}: ${getErrorMessage(err)}`);
160
- if (showIssueLink) {
232
+ const errMsg = getErrorMessage(err);
233
+ console.error(`❌ ${errorPrefix}: ${errMsg}`);
234
+ // Detect bun-specific import failures and guide user to install bun
235
+ if (errMsg.includes("bun:") || errMsg.includes("Received protocol")) {
236
+ console.error("");
237
+ console.error("This version of ClaudeKit CLI requires the bun runtime.");
238
+ console.error("Install bun: curl -fsSL https://bun.sh/install | bash");
239
+ console.error("Or switch to stable: npm install -g claudekit-cli@latest");
240
+ } else if (showIssueLink) {
161
241
  console.error(
162
242
  "Please report this issue at: https://github.com/mrgoonie/claudekit-cli/issues",
163
243
  );