@love-moon/conductor-cli 0.3.0 → 0.3.2

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/CHANGELOG.md ADDED
@@ -0,0 +1,144 @@
1
+ # @love-moon/conductor-cli
2
+
3
+ ## 0.3.2
4
+
5
+ ### Patch Changes
6
+
7
+ - 8e1d4a8: Prefer the bundled Copilot platform executable before the JS entrypoint so Node
8
+ 20 installs do not fail with `ERR_UNKNOWN_BUILTIN_MODULE: node:sqlite`.
9
+ - Updated dependencies [8e1d4a8]
10
+ - @love-moon/ai-sdk@0.3.2
11
+ - @love-moon/ai-manager@0.3.2
12
+ - @love-moon/conductor-sdk@0.3.2
13
+
14
+ ## 0.3.1
15
+
16
+ ### Patch Changes
17
+
18
+ - 4e8d4e5: Include `CHANGELOG.md` in published npm tarballs.
19
+
20
+ The `files` array in each package's `package.json` previously only
21
+ listed the build output (`bin`/`src` for the CLI, `dist` for the
22
+ modules). npm's `files` whitelist replaces the default include set,
23
+ and CHANGELOG is not one of the auto-included files (only
24
+ `package.json`, `README*`, `LICENSE*`, and `main` are unconditional).
25
+
26
+ As a result, every release through 0.3.0 published tarballs with no
27
+ CHANGELOG, so a consumer running `npm install` or unpacking the brew
28
+ artifact had no way to see what changed in the version they just
29
+ installed. The repo `cli/CHANGELOG.md` and the GitHub Release body
30
+ remain the canonical source until 0.3.1 ships with this fix.
31
+
32
+ - Updated dependencies [4e8d4e5]
33
+ - @love-moon/conductor-sdk@0.3.1
34
+ - @love-moon/ai-sdk@0.3.1
35
+ - @love-moon/ai-manager@0.3.1
36
+
37
+ ## 0.3.0
38
+
39
+ ### Minor Changes
40
+
41
+ - be3b3cb: Project list now merges same-name git projects that share a remote URL across daemons into a single card.
42
+
43
+ - `ProjectContext.snapshot()` (SDK) now captures the origin remote URL via `git config --get remote.origin.url` and exposes a `normalizeGitRemoteUrl` helper for callers that need their own equality comparison.
44
+ - The daemon's `validate_project_path` response carries a new `git_remote_url` field. Old daemons that don't send it stay forward-compatible — the web server treats missing values as "unmergeable" so projects from those daemons render standalone until they're refreshed.
45
+ - New web API surface:
46
+ - `PATCH /api/projects { mergeOptOut: true }` opts a project out of auto-grouping (manual split for accidental name collisions).
47
+ - `PATCH /api/projects { refresh: true }` re-runs the daemon validation handshake and back-fills `git_remote_url` for projects created before this feature.
48
+ - `GET /api/issues?project_ids=a,b` fetches issues from multiple projects in one call; responses include `daemonHost` + `projectName` for cross-daemon attribution.
49
+ - Schema: two new optional columns on `projects`: `git_remote_url` (nullable string) and `merge_opt_out` (boolean, default false). Run `pnpm -C web db:push` before upgrading.
50
+
51
+ - 23ac015: Add `fire_tmux_mode` for the daemon. When enabled (via the `fire_tmux_mode: true`
52
+ key in `~/.conductor/config.yaml` or the `CONDUCTOR_FIRE_TMUX_MODE=true`
53
+ environment variable), each Fire process is launched inside a detached
54
+ `tmux new-session -d` so that it runs under the tmux server with no
55
+ parent/child relationship to the daemon. Restarting or terminating the daemon
56
+ no longer affects running Fire processes; explicit `stop_task` requests use
57
+ `tmux kill-session` to terminate the corresponding session.
58
+
59
+ If `fire_tmux_mode` is enabled but `tmux` is not installed on PATH, the daemon
60
+ logs a warning at startup and silently falls back to direct spawn instead of
61
+ failing every `create_task` with ENOENT.
62
+
63
+ If a tmux session fails to launch (e.g. duplicate session name, tmux server
64
+ crashed), the daemon now reports a terminal status to the backend instead of
65
+ leaving the task stuck on RUNNING.
66
+
67
+ Session names embed a per-spawn uniqueness suffix
68
+ (`conductor-fire-<taskId>-<base36-time><rand>`) so a re-spawn of the same task
69
+ id while a prior session is still alive does not collide. The daemon also runs
70
+ a periodic best-effort liveness reaper (default every 30s; override via
71
+ `config.TMUX_LIVENESS_POLL_MS`) that walks tmux-mode entries in
72
+ `activeTaskProcesses` and removes any whose session no longer exists, so the
73
+ in-memory map does not accumulate stale entries when Fire exits naturally
74
+ inside its session.
75
+
76
+ ### Other Changes (retroactively documented)
77
+
78
+ The following changes shipped in `@love-moon/conductor-cli@0.3.0` but were
79
+ merged without a `changeset` entry and so didn't make it into the
80
+ auto-generated section above. See
81
+ `claw/lessons/arch_release-packages-pnpm-changesets-20260512.md` for the
82
+ process gap and the rule that every PR touching `cli/**` or `modules/**`
83
+ must run `npm run changeset`.
84
+
85
+ **New CLI commands**
86
+
87
+ - `cli`: `conductor project|issue|task` entity commands (RFC 0025). Adds
88
+ scriptable CLI access to project/issue/task CRUD against the connected
89
+ daemon. (`2e10756`)
90
+ - `cli`: `conductor project` accepts `--daemon-host` to disambiguate
91
+ same-named projects across multiple daemons. (`08eefee`)
92
+ - `cli`: `conductor project list` now prints a daemon column. (`552731b`)
93
+
94
+ **Daemon — Fire tmux mode (companion to `fire_tmux_mode`)**
95
+
96
+ - Daemon now `tmux send-keys`-friendly: env vars are propagated via
97
+ `tmux -e` flags so the Fire process inherits the spawn environment.
98
+ (`3cd3022`)
99
+ - Live Fire output is now visible via `tmux attach` thanks to a `tee`
100
+ inside the session shell. (`f07fbc6`)
101
+ - `stop_task` and `cleanup_task_worktree` now reap orphan tmux sessions.
102
+ (`1f7ef28`)
103
+ - A killed tmux-mode task reports `KILLED` directly from the daemon
104
+ instead of waiting on Fire to flip the status. (`59c6472`)
105
+ - `restart_task` clears stale tmux entries before re-spawning and refuses
106
+ with a clearer error if the session can't be acquired. (`c659663`)
107
+
108
+ **Daemon stability**
109
+
110
+ - Fix: reconcile / stale-recovery no longer kills `init` successor tasks
111
+ that haven't received their initial websocket message yet. (`d9258ba`)
112
+ - Fix: late websocket send after disconnect no longer crashes daemon
113
+ restart. (`a3532cc`)
114
+ - Fix: stale fire task attach is now guarded against double-binding.
115
+ (`dc73be9`)
116
+
117
+ **Worktree**
118
+
119
+ - Worktree folders are now named by branch (slugified) rather than by
120
+ the task id, making them human-meaningful inside repos with many
121
+ concurrent tasks. (`ed124b5`)
122
+ - The worktree scanner now skips symlinks that are git-tracked, so user
123
+ symlinks inside a worktree don't get treated as candidates. (`5281952`)
124
+
125
+ **Quota / accounts UI**
126
+
127
+ - Codex quota snapshots are now restored from the daemon cache on
128
+ refresh, so the daemon page doesn't blank out while a fresh fetch is
129
+ in flight. (`130bd93`)
130
+
131
+ **Internal refactor (no consumer API change)**
132
+
133
+ - `modules/ai-sdk`: resume logic has been split into per-provider
134
+ modules under `src/resume/<provider>.js`. The public exports
135
+ (`createAiSession`, `BUILT_IN_BACKENDS`, etc.) are unchanged.
136
+ Source-level only; the published `@love-moon/ai-sdk` version pinned
137
+ in `cli@0.3.0`'s manifest is still `0.2.42`, so consumer behavior is
138
+ identical to before — the refactor will reach npm with the next
139
+ ai-sdk release that includes a `changeset`. (`846f05a`)
140
+
141
+ ### Patch Changes
142
+
143
+ - Updated dependencies [be3b3cb]
144
+ - @love-moon/conductor-sdk@0.3.0
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@love-moon/conductor-cli",
3
- "version": "0.3.0",
4
- "gitCommitId": "b9f33cd",
3
+ "version": "0.3.2",
4
+ "gitCommitId": "519f104",
5
5
  "repository": {
6
6
  "type": "git",
7
7
  "url": "git+https://github.com/lovemoon-ai/conductor.git"
@@ -12,7 +12,8 @@
12
12
  },
13
13
  "files": [
14
14
  "bin",
15
- "src"
15
+ "src",
16
+ "CHANGELOG.md"
16
17
  ],
17
18
  "publishConfig": {
18
19
  "access": "public",
@@ -22,9 +23,9 @@
22
23
  "test": "node --test test/*.test.js"
23
24
  },
24
25
  "dependencies": {
25
- "@love-moon/ai-manager": "0.2.42",
26
- "@love-moon/ai-sdk": "0.2.42",
27
- "@love-moon/conductor-sdk": "0.3.0",
26
+ "@love-moon/ai-manager": "0.3.2",
27
+ "@love-moon/ai-sdk": "0.3.2",
28
+ "@love-moon/conductor-sdk": "0.3.2",
28
29
  "@github/copilot-sdk": "^0.2.2",
29
30
  "chrome-launcher": "^1.2.1",
30
31
  "chrome-remote-interface": "^0.33.0",
package/src/daemon.js CHANGED
@@ -4221,6 +4221,7 @@ export function startDaemon(config = {}, deps = {}) {
4221
4221
  repoRoot: null,
4222
4222
  worktreeBranch: null,
4223
4223
  lastCommit: null,
4224
+ lastCommitAt: null,
4224
4225
  fileCount: null,
4225
4226
  error: null,
4226
4227
  errorCode: null,
@@ -4263,6 +4264,10 @@ export function startDaemon(config = {}, deps = {}) {
4263
4264
  typeof snapshot?.lastCommit === "string" && snapshot.lastCommit.trim()
4264
4265
  ? snapshot.lastCommit.trim()
4265
4266
  : null,
4267
+ lastCommitAt:
4268
+ typeof snapshot?.lastCommitAt === "string" && snapshot.lastCommitAt.trim()
4269
+ ? snapshot.lastCommitAt.trim()
4270
+ : null,
4266
4271
  gitRemoteUrl:
4267
4272
  typeof snapshot?.gitRemoteUrl === "string" && snapshot.gitRemoteUrl.trim()
4268
4273
  ? snapshot.gitRemoteUrl.trim()
@@ -4291,6 +4296,7 @@ export function startDaemon(config = {}, deps = {}) {
4291
4296
  repo_root: result.repoRoot,
4292
4297
  worktree_branch: result.worktreeBranch,
4293
4298
  last_commit: result.lastCommit,
4299
+ last_commit_at: result.lastCommitAt,
4294
4300
  git_remote_url: result.gitRemoteUrl,
4295
4301
  file_count: result.fileCount,
4296
4302
  error: result.error,