rigjs
Version:
A multi-repos dev tool based on yarn and git.Rigjs is intended to be the simplest way to develop,share and deliver codes between different developers or different projects.
201 lines (182 loc) • 10.4 kB
text/typescript
import crewInit from './init';
import crewStatus from './status';
import crewBoard from './board';
import crewPendingQuestions from './pendingQuestions';
import crewSync from './sync';
import crewDoctor from './doctor';
import crewEngine from './engine';
import crewDispatch from './dispatchCommand';
import crewRun from './run';
import crewAsk from './ask';
import crewStub from './stub';
import { crewOverview } from '../overmind/rollup';
import omJournal from '../overmind/journal';
import omTaskNew from '../overmind/taskNew';
import { projectAdd, projectList, projectStatus, projectSync } from './project';
import { roleAdd, roleList, roleShow } from './roleCommand';
import { pendingAdd, pendingAnswer, pendingList, pendingRemove } from './pending';
// eslint-disable-next-line @typescript-eslint/no-explicit-any
export function registerCrewCommands(program: any): void {
const orchestrate = program.command('orchestrate [message...]')
.aliases(['crew', 'om', 'overmind'])
.description('Orchestrator-first multi-agent workspace over an Obsidian vault (aliases: crew, om, overmind)')
.option('--crew <name>', 'target crew name')
.action((message: string[] | undefined, opts: { crew?: string }) => crewAsk(message, opts));
orchestrate.command('init')
.description('initialize a crew vault')
.requiredOption('--vault <path>', 'Obsidian vault path')
.option('-n, --as <name>', 'crew name')
.option('--root <path>', 'root folder inside the vault (default: rig-crew)')
.option('--allow-project-vault', 'allow a vault path under projects/<submodule>')
.action(crewInit);
orchestrate.command('ask <message...>')
.description('send a message to the Orchestrator (MVP appends to Current-Goal.md)')
.option('--crew <name>', 'target crew name')
.action(crewAsk);
orchestrate.command('status')
.description('show crew progress summary')
.option('--crew <name>', 'target crew name')
.option('--json', 'machine-readable output')
.action(crewStatus);
orchestrate.command('pending-questions')
.alias('inbox')
.description('show open system→user pending questions (alias: inbox)')
.option('--crew <name>', 'target crew name')
.option('--json', 'machine-readable output')
.action(crewPendingQuestions);
orchestrate.command('board')
.description('refresh Dashboard.md')
.option('--crew <name>', 'target crew name')
.action(crewBoard);
orchestrate.command('sync')
.description('scan Markdown tasks and update crew state cache')
.option('--crew <name>', 'target crew name')
.action(crewSync);
// --- overmind aggregation (merged from the former `rig om`; see CLAUDE.md) ---
orchestrate.command('overview')
.description('cross-entity task-status rollup; --write (re)generates overmind.md')
.option('--write', 'also (re)generate overmind.md at the vault root')
.option('--crew <name>', 'target crew name')
.action(crewOverview);
orchestrate.command('journal [date]')
.description('roll completed tasks (status done + done-at; default today) into journal/<entity>/<YYMM>.md')
.option('--crew <name>', 'target crew name')
.action(omJournal);
orchestrate.command('task <project> <id>')
.description('scaffold a docs-sprint task file (docs/plan/tasks/<id>.md) for <project>')
.option('--role <role>', 'coder | designer | tester | researcher (default coder)')
.option('--engine <engine>', 'engine override (claude | codex | pi)')
.option('--status <status>', 'initial status (default draft)')
.option('--crew <name>', 'target crew name')
.action(omTaskNew);
orchestrate.command('doctor')
.description('check crew config, vault, rules, and project wiring')
.option('--crew <name>', 'target crew name')
.action(crewDoctor);
orchestrate.command('engine')
.description('show which execution engine resolves and why (5-level order; debug)')
.option('--crew <name>', 'target crew name')
.option('-p, --project <name>', 'resolve as if dispatching for this project')
.option('--engine <engine>', 'explicit task-level engine override (claude | codex | pi)')
.option('--json', 'machine-readable output')
.action(crewEngine);
orchestrate.command('dispatch <project>')
.description('run a prompt via the resolved engine in a fresh task/<id> worktree of <project> (MVP runtime)')
.requiredOption('--prompt <text>', 'prompt for the engine')
.option('--engine <engine>', 'engine override (claude | codex | pi); else resolved from project/crew/host')
.option('--task <id>', 'task id for the worktree branch (default: adhoc-<ts>)')
.option('--timeout <ms>', 'timeout in ms (default 600000)')
.option('--crew <name>', 'target crew name')
.action(crewDispatch);
const project = orchestrate.command('project').description('manage project owners');
project.command('add <name>')
.description('register a project owner')
.requiredOption('--path <path>', 'project path')
.option('--owner <name>', 'owner alias (default: maintainer:<name>)')
.option('--executor <name>', 'claude | codex | pi (default: crew defaultExecutor)')
.option('--test-command <cmd>', 'default focused test command')
.option('--no-write', 'mark owner as read-only')
.option('--crew <name>', 'target crew name')
.action(projectAdd);
project.command('sync')
.description('sync project owners from the vault projects/ directory')
.option('--from <path>', 'projects directory, relative to the vault (default: projects)')
.option('--executor <name>', 'default executor for newly discovered projects')
.option('--test-command <cmd>', 'default focused test command for newly discovered projects')
.option('--no-write', 'mark newly discovered owners as read-only')
.option('--keep-missing', 'keep projects that disappeared from the scanned directory')
.option('--no-archive-missing', 'do not archive stale rig-agents project folders')
.option('--crew <name>', 'target crew name')
.action(projectSync);
project.command('list')
.description('list registered projects')
.option('--crew <name>', 'target crew name')
.action(projectList);
project.command('status <name>')
.description('show one project status')
.option('--crew <name>', 'target crew name')
.action(projectStatus);
const role = orchestrate.command('role').description('manage global crew roles');
role.command('add <name>')
.description('add or update a global role from a markdown description')
.requiredOption('--from <file>', 'role description markdown file')
.option('--title <title>', 'display title')
.option('--summary <text>', 'short description')
.option('--agent <name>', 'agent/subagent name to use for this role')
.option('--executor <name>', 'claude | codex | pi')
.option('--force', 'update an existing custom role')
.option('--crew <name>', 'also materialize role files in this crew vault')
.action(roleAdd);
role.command('list')
.description('list built-in and custom roles')
.option('--crew <name>', 'target crew name')
.action(roleList);
role.command('show <name>')
.description('show one role definition')
.option('--crew <name>', 'target crew name')
.action(roleShow);
const pending = orchestrate.command('pending')
.description('list and manage materials the user must supply (per project)');
pending.command('list', { isDefault: true })
.description('list pending questions (default action; runs when `orchestrate pending` is used without a subcommand)')
.option('--crew <name>', 'target crew name')
.option('-p, --project <name>', 'limit to one project')
.option('--all', 'include resolved questions')
.option('--json', 'machine-readable output')
.action(pendingList);
pending.command('add <title...>')
.description('record a new pending question / missing material')
.option('--crew <name>', 'target crew name')
.option('-p, --project <name>', 'project name (auto-detected from CWD if omitted)')
.option('--why <text>', 'why this information is needed')
.option('--need <text>', 'what to provide (file path, value, decision, etc.)')
.option('--priority <level>', 'high | medium | low')
.option('--asked-by <role>', 'role or person who raised the question (default: orchestrator)')
.action((title: string[], opts: { crew?: string; project?: string; why?: string; need?: string; priority?: string; askedBy?: string }) => pendingAdd(title, opts));
pending.command('answer <id>')
.description('mark a pending question as resolved')
.option('--crew <name>', 'target crew name')
.option('-p, --project <name>', 'limit to one project')
.option('-n, --note <text>', 'short note describing what the user supplied')
.action(pendingAnswer);
pending.command('remove <id>')
.description('delete a pending question (use answer to keep history)')
.option('--crew <name>', 'target crew name')
.option('-p, --project <name>', 'limit to one project')
.action(pendingRemove);
orchestrate.command('plan').description('planned: Orchestrator refine + decompose').action(crewStub('plan'));
orchestrate.command('refine').description('planned: update Shared/Spec.md').action(crewStub('refine'));
orchestrate.command('decompose').description('planned: split Spec into owner/role tasks').action(crewStub('decompose'));
orchestrate.command('run <project>')
.description('dispatch all ready docs/plan/tasks of <project> to their engines in task worktrees (MVP develop)')
.option('--concurrency <n>', 'max parallel dispatches (default 4)')
.option('--timeout <ms>', 'per-task timeout in ms (default 600000)')
.option('--dry-run', 'show what would dispatch without running')
.option('--crew <name>', 'target crew name')
.action(crewRun);
orchestrate.command('research <topic...>').description('planned: ask Researcher to write a report').action(crewStub('research'));
orchestrate.command('report').description('planned: generate Orchestrator report').action(crewStub('report'));
const pm = orchestrate.command('pm').description('PM tools');
pm.command('prd').description('planned: generate/update PRD').action(crewStub('pm prd'));
pm.command('review <file>').description('planned: review PRD/Spec').action(crewStub('pm review'));
}