agent-conveyor 0.1.25 → 0.1.26

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
@@ -122,7 +122,10 @@ PATH="$tmp_prefix/bin:$PATH" conveyor --help
122
122
  PATH="$tmp_prefix/bin:$PATH" workerctl --help
123
123
  ```
124
124
 
125
- `conveyor doctor` reports local dependency health (tmux, codex, etc.).
125
+ `conveyor doctor --json` reports local dependency health (tmux, codex, etc.),
126
+ package/bin resolution, Codex home, installed operator plugin version, installed
127
+ operator skills, and an `operator_ready` summary for Codex app manager/worker
128
+ setup.
126
129
  `conveyor db-doctor` initializes and checks the SQLite control-plane
127
130
  database.
128
131
  On Node versions where `node:sqlite` is still marked experimental, SQLite
@@ -151,6 +154,13 @@ static landing page. From the repo, `npm run docs:landing` serves it at
151
154
  `http://127.0.0.1:8765/`.
152
155
  The GitHub Pages version lives at
153
156
  [`neonwatty.github.io/agent-conveyor`](https://neonwatty.github.io/agent-conveyor/).
157
+ Pages deploys from the protected `landing-page` branch through the
158
+ `Pages` GitHub Actions workflow; propose public landing-page edits against
159
+ that branch rather than relying on ordinary `main` package PRs to publish the
160
+ site.
161
+ Pull requests into `landing-page` run the `Landing Page PR` workflow, which
162
+ checks linting, unused exports/files, tests, build output, the landing-page
163
+ screenshot gate, and a diff-scoped max-lines guard for changed text files.
154
164
  Use `node scripts/check-landing-page.mjs` for a docs-only desktop/mobile
155
165
  screenshot gate; this does not run the full package release smoke.
156
166
 
@@ -163,7 +173,7 @@ and inspect the plugin:
163
173
  ```bash
164
174
  npm install -g agent-conveyor
165
175
  conveyor install-plugin
166
- conveyor plugin-status
176
+ conveyor doctor --json
167
177
  ```
168
178
 
169
179
  The per-project default ledger for operator sessions is
@@ -1130,7 +1130,7 @@ function parseRuntimeArgs(args, env) {
1130
1130
  index += 1;
1131
1131
  }
1132
1132
  else if (arg === "--codex-home") {
1133
- if (command !== "install-skills" && command !== "install-plugin" && command !== "plugin-status" && command !== "plugin-path") {
1133
+ if (command !== "install-skills" && command !== "install-plugin" && command !== "plugin-status" && command !== "plugin-path" && command !== "doctor") {
1134
1134
  return { command, enabled, error: "Unsupported TypeScript runtime option: --codex-home", explicit, flags, task };
1135
1135
  }
1136
1136
  const value = valueAfter(queue, index, arg);
@@ -11952,9 +11952,20 @@ function runDoctorCommand(parsed, options) {
11952
11952
  const root = stateRoot({ cwd: targetCwd, env: options.env });
11953
11953
  const tmuxPath = commandPath("tmux", options);
11954
11954
  const codexPath = options.codexCommandResolver?.("codex") ?? commandPath("codex", options);
11955
+ const conveyorPath = commandPath("conveyor", options);
11956
+ const workerctlPath = commandPath("workerctl", options);
11957
+ const packageRoot = packageRootFromRuntimeModule();
11958
+ const packageVersion = packageVersionFromRoot(packageRoot);
11959
+ const plugin = agentConveyorPluginStatus(parsed, options);
11960
+ const pluginSkillsInstalled = plugin.skills.every((skill) => skill.installed);
11955
11961
  const checks = [
11956
11962
  { name: "tmux", ok: Boolean(tmuxPath), path: tmuxPath },
11957
11963
  { name: "codex", ok: Boolean(codexPath), path: codexPath },
11964
+ { name: "conveyor_on_path", ok: Boolean(conveyorPath), path: conveyorPath },
11965
+ { name: "workerctl_on_path", ok: Boolean(workerctlPath), path: workerctlPath },
11966
+ { name: "plugin_installed", ok: plugin.installed, installed_version: plugin.installed_version },
11967
+ { name: "plugin_version_matches", ok: plugin.version_matches, package_version: packageVersion, plugin_version: plugin.plugin_version },
11968
+ { name: "plugin_skills_installed", ok: pluginSkillsInstalled, missing: plugin.skills.filter((skill) => !skill.installed).map((skill) => skill.name) },
11958
11969
  ];
11959
11970
  if (tmuxPath) {
11960
11971
  const proc = runProcess(["tmux", "-V"], options);
@@ -11966,8 +11977,44 @@ function runDoctorCommand(parsed, options) {
11966
11977
  }
11967
11978
  checks.push({ name: "target_cwd_exists", ok: pathIsDirectory(targetCwd), path: targetCwd });
11968
11979
  checks.push({ name: "state_root_exists", ok: existsSync(root), path: root });
11969
- const ok = checks.every((check) => check.name === "state_root_exists" || check.ok === true);
11970
- return { ...jsonResult({ checks, ok, project_root: packageRootFromRuntimeModule(), workers: doctorWorkerSummaries(root) }), exitCode: ok ? 0 : 1 };
11980
+ const commandReady = Boolean(conveyorPath) && Boolean(workerctlPath) && Boolean(codexPath) && Boolean(tmuxPath);
11981
+ const operatorReady = commandReady && plugin.installed && plugin.version_matches && pluginSkillsInstalled;
11982
+ const ok = checks.every((check) => check.name === "state_root_exists"
11983
+ || check.name === "conveyor_on_path"
11984
+ || check.name === "workerctl_on_path"
11985
+ || check.name === "plugin_installed"
11986
+ || check.name === "plugin_version_matches"
11987
+ || check.name === "plugin_skills_installed"
11988
+ || check.ok === true);
11989
+ return {
11990
+ ...jsonResult({
11991
+ checks,
11992
+ codex_home: plugin.paths.codex_home,
11993
+ commands: {
11994
+ codex: { ok: Boolean(codexPath), path: codexPath },
11995
+ conveyor: { ok: Boolean(conveyorPath), path: conveyorPath },
11996
+ tmux: { ok: Boolean(tmuxPath), path: tmuxPath },
11997
+ workerctl: { ok: Boolean(workerctlPath), path: workerctlPath },
11998
+ },
11999
+ ok,
12000
+ operator_ready: operatorReady,
12001
+ package: {
12002
+ name: "agent-conveyor",
12003
+ root: packageRoot,
12004
+ version: packageVersion,
12005
+ },
12006
+ platform: process.platform,
12007
+ plugin,
12008
+ project_root: packageRoot,
12009
+ runtime: {
12010
+ node: process.version,
12011
+ state_root: root,
12012
+ target_cwd: targetCwd,
12013
+ },
12014
+ workers: doctorWorkerSummaries(root),
12015
+ }),
12016
+ exitCode: ok ? 0 : 1,
12017
+ };
11971
12018
  }
11972
12019
  function runDoctorSelfCommand(parsed, options) {
11973
12020
  if (parsed.task !== null) {