@fnmoa/cli 0.1.0 → 0.2.0

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
@@ -1,32 +1,38 @@
1
- # `@moa/cli` — `moa`
1
+ # `@fnmoa/cli` — `moa`
2
2
 
3
3
  A terminal client for the Moa server — drives tasks and workflows over the same
4
- HTTP API the dashboard uses. Lets the **agent** (inside the container) and the
5
- **operator** (on the host) manage everything without the UI.
4
+ HTTP API the dashboard uses.
6
5
 
7
- ## Run
6
+ ## Install
8
7
 
9
- **Inside the container** (the agent's path) — `moa` is on `PATH`, talks to the
10
- local server automatically:
8
+ ```sh
9
+ npm i -g @fnmoa/cli
10
+ ```
11
+
12
+ ## Setup
13
+
14
+ Run `moa login` (it also starts automatically on first run) — an interactive
15
+ onboarding that sets your server URL and API key:
11
16
 
12
17
  ```sh
13
- moa status
14
- moa wf pending
15
- moa wf solve mhbspot/repo 42 --watch
18
+ moa login
16
19
  ```
17
20
 
18
- **On the host** point it at the published API port (see
19
- `docker-compose.override.yml`, default `127.0.0.1:3030`):
21
+ It defaults to `https://cp.fnmoa.com`; grab your API key from the Moa dashboard.
22
+ Prefer non-interactive? `moa config set url <url>` and `moa config set key <key>`.
23
+
24
+ Then use it:
20
25
 
21
26
  ```sh
22
- export MOA_API_URL=http://localhost:3030
23
- pnpm --filter @moa/cli exec tsx src/index.ts status
24
- # or, after `pnpm --filter @moa/cli build`, use the `moa` bin
27
+ moa status
28
+ moa wf pending
29
+ moa wf solve owner/repo 42 --watch
25
30
  ```
26
31
 
27
32
  ## Commands
28
33
 
29
34
  ```
35
+ moa login connect: set server URL + API key (interactive)
30
36
  moa status overview snapshot
31
37
  moa setup connector (Claude/GitHub) status
32
38
  moa tasks | task <id> list / show tasks
@@ -54,49 +60,40 @@ moa config show effective URL/key + file path
54
60
  moa config set url <url> persist the API URL (~/.moa/cli.json)
55
61
  moa config set key <key> persist an API key
56
62
  moa config clear
57
- ```
58
63
 
59
- ## Knowledge base for agents
60
-
61
- The command set is a **self-describing registry** `moa help --json` emits the
62
- full catalog (every command + sub-action, with `usage` and documented `args`)
63
- as JSON, so an agent can discover capabilities programmatically:
64
-
65
- ```sh
66
- moa help --json
67
- # { "api": "...", "commands": [ { "name": "wf solve", "usage": "...", "args": [...] }, ... ] }
64
+ moa skills list the bundled Moa skills
65
+ moa skills show <name> print a skill's SKILL.md
66
+ moa skills install [name] [--tool claude|cursor|codex|all] [--dir D] [--force]
68
67
  ```
69
68
 
70
- `moa help` (text) is rendered from the same registry, so docs never drift.
69
+ `moa help --json` emits the full command catalog (every command + sub-action,
70
+ with `usage` and documented `args`) as JSON, so an agent can discover
71
+ capabilities programmatically. `moa help` (text) is rendered from the same
72
+ registry, so docs never drift.
71
73
 
72
- ## Structure (modular)
74
+ ## Skills
73
75
 
74
- ```
75
- src/
76
- index.ts entry: parse argv dispatch → help/--json
77
- registry.ts COMMANDS list + catalog() (the KB)
78
- command.ts Command / CommandMeta types
79
- args.ts argv parser
80
- ui.ts color + status formatting
81
- client.ts HTTP API client
82
- commands/ one module per group: status, tasks, workflows, github
83
- ```
76
+ The CLI bundles ready-to-use agent skills (setup, ship-issue, review-pr,
77
+ triage-audit, run-task, oracle, profiles). Install them into your coding agent —
78
+ each tool gets the right format:
84
79
 
85
- Add a command by writing a `Command` in `commands/` and listing it in
86
- `registry.ts` it appears in help, the JSON catalog, and dispatch automatically.
80
+ ```sh
81
+ moa skills # list them
82
+ moa skills install --tool claude # → ~/.claude/skills/<name>/SKILL.md
83
+ moa skills install --tool cursor # → ./.cursor/rules/<name>.mdc
84
+ moa skills install --tool codex # → ~/.codex/prompts/<name>.md (use as /<name>)
85
+ moa skills install --tool all # all three
86
+ moa skills install moa-setup --tool cursor # just one skill
87
+ ```
87
88
 
88
89
  ## Config
89
90
 
90
91
  URL/key resolve **env var → `~/.moa/cli.json` (`moa config`) → default**, so you
91
- can persist them once instead of exporting env vars:
92
-
93
- ```sh
94
- moa config set url http://localhost:3030
95
- ```
92
+ can persist them once instead of exporting env vars.
96
93
 
97
94
  | Env | Default | |
98
95
  | --- | --- | --- |
99
- | `MOA_API_URL` | `http://localhost:3000` | Server base URL |
100
- | `MOA_API_KEY` | — | API key; if unset, the CLI bootstraps the single default operator |
96
+ | `MOA_API_URL` | `https://cp.fnmoa.com` | Server base URL |
97
+ | `MOA_API_KEY` | — | API key |
101
98
  | `MOA_CONFIG` | `~/.moa/cli.json` | Config file path |
102
99
  | `NO_COLOR` | — | Disable ANSI colors |
package/dist/client.js CHANGED
@@ -56,7 +56,7 @@ async function key() {
56
56
  catch (e) {
57
57
  if (e instanceof ApiError && [401, 403, 503].includes(e.status)) {
58
58
  throw new Error('auto-bootstrap is unavailable on this workspace (enrolled to a control-plane). ' +
59
- 'Set $MOA_API_KEY or save a key with: moa config set key <key>');
59
+ 'Run `moa login` to set your API key (or set $MOA_API_KEY).');
60
60
  }
61
61
  throw e;
62
62
  }
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,94 @@
1
+ import { createInterface } from 'node:readline';
2
+ import { DEFAULT_URL, CONFIG_PATH, resolveProfile, currentProfileName, setProfileField, mask, } from '../config.js';
3
+ import { banner, c, die } from '../ui.js';
4
+ const cleanUrl = (u) => u.replace(/\/$/, '');
5
+ /** Ask a question with an optional default (Enter accepts the default). */
6
+ function ask(rl, query, def) {
7
+ const prompt = def ? `${query} ${c.dim(`[${def}]`)} ` : `${query} `;
8
+ return new Promise((resolve) => rl.question(prompt, (a) => resolve(a.trim() || def || '')));
9
+ }
10
+ /** Ask for a secret without echoing keystrokes to the terminal. */
11
+ function askSecret(rl, query) {
12
+ process.stdout.write(`${query} `);
13
+ rl.muted = true;
14
+ return new Promise((resolve) => rl.question('', (a) => {
15
+ rl.muted = false;
16
+ process.stdout.write('\n');
17
+ resolve(a.trim());
18
+ }));
19
+ }
20
+ /** Probe the server with the key — returns an error string, or null if it works.
21
+ * Lenient by design: only a definitive 401/403 means a bad key, and a network
22
+ * failure/timeout means unreachable. Any other HTTP status (the public URL is a
23
+ * control-plane proxy whose exact routes vary) counts as "reached, key accepted".
24
+ * Done with a raw fetch so it uses the freshly-entered url/key, not the client's
25
+ * cached profile resolved at import time. */
26
+ async function verify(url, key) {
27
+ try {
28
+ const res = await fetch(`${url}/setup/status`, {
29
+ headers: { 'x-api-key': key },
30
+ signal: AbortSignal.timeout(6000),
31
+ });
32
+ if (res.status === 401 || res.status === 403)
33
+ return 'key rejected';
34
+ return null;
35
+ }
36
+ catch (e) {
37
+ if (e instanceof Error && e.name === 'TimeoutError')
38
+ return 'no response (timed out)';
39
+ return e instanceof Error ? e.message : String(e);
40
+ }
41
+ }
42
+ export async function runLogin(_a) {
43
+ console.log(banner());
44
+ if (!process.stdin.isTTY) {
45
+ die('login is interactive — run it in a terminal, or use `moa config set url <url>` and `moa config set key <key>`');
46
+ }
47
+ const current = resolveProfile();
48
+ const name = currentProfileName();
49
+ console.log(` Let's connect the ${c.bold('moa')} CLI to your workspace.\n`);
50
+ const rl = createInterface({ input: process.stdin, output: process.stdout });
51
+ // Honor muting so secret entry doesn't echo to the terminal.
52
+ rl._writeToOutput = (s) => {
53
+ if (!rl.muted)
54
+ process.stdout.write(s);
55
+ };
56
+ let url;
57
+ let key;
58
+ try {
59
+ url = cleanUrl(await ask(rl, ' API URL', current.apiUrl || DEFAULT_URL));
60
+ const existing = current.apiKey;
61
+ const keyPrompt = existing
62
+ ? ` API key ${c.dim(`(Enter keeps ${mask(existing)})`)}:`
63
+ : ` API key ${c.dim('(from your Moa dashboard):')}`;
64
+ key = (await askSecret(rl, keyPrompt)) || existing || '';
65
+ }
66
+ finally {
67
+ rl.close();
68
+ }
69
+ if (!key)
70
+ die('no API key provided — grab one from your Moa dashboard, then run `moa login` again.');
71
+ process.stdout.write(`\n ${c.dim('verifying…')}`);
72
+ const err = await verify(url, key);
73
+ process.stdout.write('\r\x1b[K'); // clear the "verifying…" line
74
+ setProfileField(name, 'apiUrl', url);
75
+ setProfileField(name, 'apiKey', key);
76
+ if (err) {
77
+ console.log(` ${c.yellow('⚠')} couldn't verify ${c.dim(`(${err})`)} — saved anyway; check the URL/key.`);
78
+ }
79
+ else {
80
+ console.log(` ${c.green('✓')} connected to ${c.cyan(url)}`);
81
+ }
82
+ console.log(` ${c.green('✓')} saved to profile ${c.bold(name)} ${c.dim(`(${CONFIG_PATH})`)}\n`);
83
+ console.log(` Try: ${c.cyan('moa status')} ${c.dim('·')} ${c.cyan('moa wf pending')} ${c.dim('·')} ${c.cyan('moa help')}\n`);
84
+ }
85
+ export const loginCmd = {
86
+ name: 'login',
87
+ group: 'config',
88
+ summary: 'Connect the CLI: set your server URL + API key (interactive).',
89
+ usage: 'moa login',
90
+ async run(a) {
91
+ await runLogin(a);
92
+ },
93
+ };
94
+ //# sourceMappingURL=login.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,225 @@
1
+ import { readdirSync, readFileSync, writeFileSync, existsSync, mkdirSync, copyFileSync, statSync } from 'node:fs';
2
+ import { fileURLToPath } from 'node:url';
3
+ import { dirname, join } from 'node:path';
4
+ import { homedir } from 'node:os';
5
+ import { c, die } from '../ui.js';
6
+ import { flagStr, hasFlag } from '../args.js';
7
+ /** Walk up from this module to the package root (the dir with package.json). */
8
+ function pkgRoot() {
9
+ let dir = dirname(fileURLToPath(import.meta.url));
10
+ for (let i = 0; i < 8; i++) {
11
+ if (existsSync(join(dir, 'package.json')))
12
+ return dir;
13
+ const up = dirname(dir);
14
+ if (up === dir)
15
+ break;
16
+ dir = up;
17
+ }
18
+ return dir;
19
+ }
20
+ /** The bundled skills directory — shipped at <pkg>/src/skills (see package.json `files`). */
21
+ function skillsDir() {
22
+ return join(pkgRoot(), 'src', 'skills');
23
+ }
24
+ /** Pull `name` and `description` out of a SKILL.md YAML frontmatter block
25
+ * (handles both single-line and folded `>-` descriptions). */
26
+ function frontmatter(md) {
27
+ const fm = md.match(/^---\s*\n([\s\S]*?)\n---/)?.[1] ?? '';
28
+ let name = '';
29
+ const descParts = [];
30
+ let inDesc = false;
31
+ for (const line of fm.split('\n')) {
32
+ const kv = line.match(/^(\w+):\s?(.*)$/);
33
+ if (kv) {
34
+ inDesc = false;
35
+ if (kv[1] === 'name')
36
+ name = kv[2].trim();
37
+ else if (kv[1] === 'description') {
38
+ const v = kv[2].trim();
39
+ if (v && !['>', '>-', '|', '|-'].includes(v))
40
+ descParts.push(v);
41
+ inDesc = true;
42
+ }
43
+ }
44
+ else if (inDesc && line.trim()) {
45
+ descParts.push(line.trim());
46
+ }
47
+ }
48
+ return { name, description: descParts.join(' ').replace(/\s+/g, ' ').trim() };
49
+ }
50
+ /** Markdown body with the YAML frontmatter stripped. */
51
+ function skillBody(md) {
52
+ return md.replace(/^---\s*\n[\s\S]*?\n---\s*\n?/, '').trim() + '\n';
53
+ }
54
+ /** One-line summary for the list view: the description up to its first sentence,
55
+ * capped so the table stays readable. Full text is in `moa skills show`. */
56
+ function summarize(desc) {
57
+ const firstSentence = desc.split(/(?<=\.)\s/)[0] ?? desc;
58
+ const max = 96;
59
+ return firstSentence.length > max ? firstSentence.slice(0, max - 1).trimEnd() + '…' : firstSentence;
60
+ }
61
+ function listSkills() {
62
+ const root = skillsDir();
63
+ if (!existsSync(root))
64
+ return [];
65
+ const out = [];
66
+ for (const slug of readdirSync(root).sort()) {
67
+ const dir = join(root, slug);
68
+ const md = join(dir, 'SKILL.md');
69
+ if (!statSync(dir).isDirectory() || !existsSync(md))
70
+ continue;
71
+ const { name, description } = frontmatter(readFileSync(md, 'utf8'));
72
+ out.push({ slug, name: name || slug, description, dir });
73
+ }
74
+ return out;
75
+ }
76
+ /** Recursively copy a skill folder into <dest>. */
77
+ function copyDir(src, dest) {
78
+ mkdirSync(dest, { recursive: true });
79
+ for (const entry of readdirSync(src)) {
80
+ const s = join(src, entry);
81
+ const d = join(dest, entry);
82
+ if (statSync(s).isDirectory())
83
+ copyDir(s, d);
84
+ else
85
+ copyFileSync(s, d);
86
+ }
87
+ }
88
+ function toolFor(name, dirOverride) {
89
+ switch (name) {
90
+ case 'claude': {
91
+ // Native Claude Code skills: a folder with SKILL.md (+ any sibling files).
92
+ const base = dirOverride || join(homedir(), '.claude', 'skills');
93
+ return {
94
+ base,
95
+ dest: (s) => join(base, s.slug),
96
+ write(s) {
97
+ const dest = join(base, s.slug);
98
+ copyDir(s.dir, dest);
99
+ return dest;
100
+ },
101
+ };
102
+ }
103
+ case 'cursor': {
104
+ // Cursor project rules: <project>/.cursor/rules/<slug>.mdc with rule frontmatter.
105
+ const base = dirOverride || join(process.cwd(), '.cursor', 'rules');
106
+ return {
107
+ base,
108
+ dest: (s) => join(base, `${s.slug}.mdc`),
109
+ write(s, md) {
110
+ mkdirSync(base, { recursive: true });
111
+ const dest = join(base, `${s.slug}.mdc`);
112
+ const content = `---\ndescription: ${s.description}\nglobs:\nalwaysApply: false\n---\n\n${skillBody(md)}`;
113
+ writeFileSync(dest, content);
114
+ return dest;
115
+ },
116
+ };
117
+ }
118
+ case 'codex': {
119
+ // Codex custom prompts: $CODEX_HOME/prompts/<slug>.md → invokable as /<slug>.
120
+ const codexHome = process.env.CODEX_HOME || join(homedir(), '.codex');
121
+ const base = dirOverride || join(codexHome, 'prompts');
122
+ return {
123
+ base,
124
+ dest: (s) => join(base, `${s.slug}.md`),
125
+ write(s, md) {
126
+ mkdirSync(base, { recursive: true });
127
+ const dest = join(base, `${s.slug}.md`);
128
+ const content = `# ${s.name}\n\n${s.description}\n\n${skillBody(md)}`;
129
+ writeFileSync(dest, content);
130
+ return dest;
131
+ },
132
+ };
133
+ }
134
+ default:
135
+ return die(`unknown --tool "${name}" (expected: claude, cursor, codex, or all)`);
136
+ }
137
+ }
138
+ const ALL_TOOLS = ['claude', 'cursor', 'codex'];
139
+ const RELOAD_HINT = {
140
+ claude: 'Restart Claude Code (or reload skills) to pick them up.',
141
+ cursor: 'Cursor loads .cursor/rules automatically; reopen the project if needed.',
142
+ codex: 'In Codex, run the skill as a slash command, e.g. /moa-setup.',
143
+ };
144
+ export const skillsCmd = {
145
+ name: 'skills',
146
+ group: 'skills',
147
+ summary: 'List the bundled Moa skills, show one, or install them for Claude/Cursor/Codex.',
148
+ usage: 'moa skills | moa skills show <name> | moa skills install [name] [--tool claude|cursor|codex|all] [--dir <path>] [--force]',
149
+ args: [
150
+ { name: '--tool', desc: 'target tool: claude (default), cursor, codex, or all (comma-separated ok)' },
151
+ { name: '--dir', desc: 'override the install directory (single --tool only)' },
152
+ { name: '--force', desc: 'overwrite an existing skill of the same name' },
153
+ ],
154
+ subcommands: [
155
+ { name: 'skills', group: 'skills', summary: 'List the bundled skills.', usage: 'moa skills' },
156
+ { name: 'skills show', group: 'skills', summary: "Print a skill's SKILL.md.", usage: 'moa skills show <name>' },
157
+ {
158
+ name: 'skills install',
159
+ group: 'skills',
160
+ summary: 'Install skills for Claude/Cursor/Codex. No name = all skills.',
161
+ usage: 'moa skills install [name] [--tool claude|cursor|codex|all] [--dir <path>] [--force]',
162
+ },
163
+ ],
164
+ async run(a) {
165
+ const sub = a.pos[0];
166
+ const skills = listSkills();
167
+ // List (default).
168
+ if (!sub || sub === 'list') {
169
+ if (!skills.length)
170
+ return console.log(c.dim('no bundled skills found'));
171
+ const width = Math.max(...skills.map((s) => s.slug.length));
172
+ console.log(c.bold('Bundled Moa skills') + c.dim(` (${skills.length})`));
173
+ for (const s of skills)
174
+ console.log(` ${c.cyan(s.slug.padEnd(width))} ${c.dim(summarize(s.description))}`);
175
+ console.log(c.dim('\nInstall: moa skills install [name] [--tool claude|cursor|codex|all] · Show: moa skills show <name>'));
176
+ return;
177
+ }
178
+ if (sub === 'show') {
179
+ const name = a.pos[1];
180
+ if (!name)
181
+ die('usage: moa skills show <name>');
182
+ const skill = skills.find((s) => s.slug === name || s.name === name);
183
+ if (!skill)
184
+ die(`unknown skill: ${name} (try: moa skills)`);
185
+ console.log(readFileSync(join(skill.dir, 'SKILL.md'), 'utf8'));
186
+ return;
187
+ }
188
+ if (sub === 'install') {
189
+ if (!skills.length)
190
+ die('no bundled skills found to install');
191
+ const toolArg = (flagStr(a, 'tool') || 'claude').toLowerCase();
192
+ const toolNames = toolArg === 'all' ? ALL_TOOLS : toolArg.split(',').map((t) => t.trim()).filter(Boolean);
193
+ const dirOverride = flagStr(a, 'dir');
194
+ if (dirOverride && toolNames.length > 1)
195
+ die('--dir works with a single --tool only');
196
+ const force = hasFlag(a, 'force');
197
+ const only = a.pos[1];
198
+ const chosen = only ? skills.filter((s) => s.slug === only || s.name === only) : skills;
199
+ if (only && !chosen.length)
200
+ die(`unknown skill: ${only} (try: moa skills)`);
201
+ for (const toolName of toolNames) {
202
+ const tool = toolFor(toolName, dirOverride);
203
+ console.log(c.bold(toolName) + c.dim(` → ${tool.base}`));
204
+ let installed = 0;
205
+ let skipped = 0;
206
+ for (const s of chosen) {
207
+ if (existsSync(tool.dest(s)) && !force) {
208
+ console.log(` ${c.yellow('skip')} ${s.slug} ${c.dim('(exists — use --force)')}`);
209
+ skipped++;
210
+ continue;
211
+ }
212
+ const dest = tool.write(s, readFileSync(join(s.dir, 'SKILL.md'), 'utf8'));
213
+ console.log(` ${c.green('✓')} ${s.slug} ${c.dim('→ ' + dest)}`);
214
+ installed++;
215
+ }
216
+ console.log(c.dim(` ${installed} installed, ${skipped} skipped`));
217
+ if (installed)
218
+ console.log(c.dim(` ${RELOAD_HINT[toolName]}`));
219
+ }
220
+ return;
221
+ }
222
+ die(`unknown skills command: ${sub} (try: moa skills)`);
223
+ },
224
+ };
225
+ //# sourceMappingURL=skills.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills.js","sourceRoot":"","sources":["../../src/commands/skills.ts"],"names":[],"mappings":"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"}
package/dist/config.js CHANGED
@@ -4,7 +4,7 @@ import { join, dirname } from 'node:path';
4
4
  import { parse } from './args.js';
5
5
  /** Persisted CLI config (overridden by env vars). */
6
6
  export const CONFIG_PATH = process.env.MOA_CONFIG || join(homedir(), '.moa', 'cli.json');
7
- export const DEFAULT_URL = 'http://localhost:3000';
7
+ export const DEFAULT_URL = 'https://cp.fnmoa.com';
8
8
  export function readConfig() {
9
9
  try {
10
10
  return JSON.parse(readFileSync(CONFIG_PATH, 'utf8'));
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -1,8 +1,11 @@
1
1
  #!/usr/bin/env node
2
+ import { existsSync } from 'node:fs';
2
3
  import { parse } from './args.js';
3
4
  import { c, die } from './ui.js';
4
5
  import { API_URL, PROFILE } from './client.js';
6
+ import { CONFIG_PATH } from './config.js';
5
7
  import { catalog, findCommand } from './registry.js';
8
+ import { runLogin } from './commands/login.js';
6
9
  // Don't crash when output is piped to `head`/`grep` and the reader closes early.
7
10
  // (Throwing inside an 'error' listener would crash with an unhandled exception.)
8
11
  process.stdout.on('error', (e) => {
@@ -11,7 +14,7 @@ process.stdout.on('error', (e) => {
11
14
  console.error(`stdout error: ${e.message}`);
12
15
  process.exit(1);
13
16
  });
14
- const GROUP_ORDER = ['status', 'tasks', 'workflows', 'oracle', 'github', 'config'];
17
+ const GROUP_ORDER = ['status', 'tasks', 'workflows', 'oracle', 'github', 'config', 'skills'];
15
18
  const GROUP_TITLE = {
16
19
  status: 'Status',
17
20
  tasks: 'Tasks',
@@ -19,6 +22,7 @@ const GROUP_TITLE = {
19
22
  oracle: 'Oracle',
20
23
  github: 'GitHub',
21
24
  config: 'Config',
25
+ skills: 'Skills',
22
26
  };
23
27
  function help(asJson) {
24
28
  const cmds = catalog();
@@ -66,6 +70,10 @@ function help(asJson) {
66
70
  async function main() {
67
71
  const { pos, flags } = parse(process.argv.slice(2));
68
72
  const name = pos[0];
73
+ // First run (no config yet, interactive terminal): onboard instead of dumping help.
74
+ if (!name && !flags.json && process.stdin.isTTY && !existsSync(CONFIG_PATH) && !process.env.MOA_API_KEY) {
75
+ return runLogin({ pos: [], flags });
76
+ }
69
77
  if (!name || name === 'help' || name === '-h' || flags.help) {
70
78
  return help(!!flags.json);
71
79
  }
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/registry.js CHANGED
@@ -1,4 +1,6 @@
1
1
  import { statusCmd, setupCmd } from './commands/status.js';
2
+ import { loginCmd } from './commands/login.js';
3
+ import { skillsCmd } from './commands/skills.js';
2
4
  import { whoamiCmd } from './commands/whoami.js';
3
5
  import { trackCmd } from './commands/track.js';
4
6
  import { tasksCmd, taskCmd, runCmd, cancelCmd } from './commands/tasks.js';
@@ -8,6 +10,7 @@ import { oracleCmd } from './commands/oracle.js';
8
10
  import { configCmd } from './commands/config.js';
9
11
  /** Every top-level command. Add a module here to extend the CLI. */
10
12
  export const COMMANDS = [
13
+ loginCmd,
11
14
  statusCmd,
12
15
  setupCmd,
13
16
  whoamiCmd,
@@ -20,6 +23,7 @@ export const COMMANDS = [
20
23
  ghCmd,
21
24
  oracleCmd,
22
25
  configCmd,
26
+ skillsCmd,
23
27
  ];
24
28
  export function findCommand(name) {
25
29
  return COMMANDS.find((cmd) => cmd.name === name);
@@ -1 +1 @@
1
- {"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAC3E,OAAO,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAC;AAChD,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAGjD,oEAAoE;AACpE,MAAM,CAAC,MAAM,QAAQ,GAAc;IACjC,SAAS;IACT,QAAQ;IACR,SAAS;IACT,QAAQ;IACR,OAAO;IACP,MAAM;IACN,SAAS;IACT,KAAK;IACL,QAAQ;IACR,KAAK;IACL,SAAS;IACT,SAAS;CACV,CAAC;AAEF,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;AACnD,CAAC;AAED,MAAM,MAAM,GAAG,CAAC,GAAY,EAAe,EAAE,CAAC,CAAC;IAC7C,IAAI,EAAE,GAAG,CAAC,IAAI;IACd,KAAK,EAAE,GAAG,CAAC,KAAK;IAChB,OAAO,EAAE,GAAG,CAAC,OAAO;IACpB,KAAK,EAAE,GAAG,CAAC,KAAK;IAChB,IAAI,EAAE,GAAG,CAAC,IAAI;IACd,QAAQ,EAAE,GAAG,CAAC,QAAQ;CACvB,CAAC,CAAC;AAEH;;;;GAIG;AACH,MAAM,UAAU,OAAO;IACrB,MAAM,GAAG,GAAkB,EAAE,CAAC;IAC9B,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,IAAI,GAAG,CAAC,WAAW,EAAE,MAAM;YAAE,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,WAAW,CAAC,CAAC;;YACrD,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7B,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAC3E,OAAO,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAC;AAChD,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAGjD,oEAAoE;AACpE,MAAM,CAAC,MAAM,QAAQ,GAAc;IACjC,QAAQ;IACR,SAAS;IACT,QAAQ;IACR,SAAS;IACT,QAAQ;IACR,OAAO;IACP,MAAM;IACN,SAAS;IACT,KAAK;IACL,QAAQ;IACR,KAAK;IACL,SAAS;IACT,SAAS;IACT,SAAS;CACV,CAAC;AAEF,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;AACnD,CAAC;AAED,MAAM,MAAM,GAAG,CAAC,GAAY,EAAe,EAAE,CAAC,CAAC;IAC7C,IAAI,EAAE,GAAG,CAAC,IAAI;IACd,KAAK,EAAE,GAAG,CAAC,KAAK;IAChB,OAAO,EAAE,GAAG,CAAC,OAAO;IACpB,KAAK,EAAE,GAAG,CAAC,KAAK;IAChB,IAAI,EAAE,GAAG,CAAC,IAAI;IACd,QAAQ,EAAE,GAAG,CAAC,QAAQ;CACvB,CAAC,CAAC;AAEH;;;;GAIG;AACH,MAAM,UAAU,OAAO;IACrB,MAAM,GAAG,GAAkB,EAAE,CAAC;IAC9B,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,IAAI,GAAG,CAAC,WAAW,EAAE,MAAM;YAAE,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,WAAW,CAAC,CAAC;;YACrD,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7B,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
package/dist/ui.js CHANGED
@@ -10,6 +10,22 @@ export const c = {
10
10
  cyan: wrap('36'),
11
11
  amber: wrap('33'),
12
12
  };
13
+ /** 256-color foreground (no-op when color is disabled). */
14
+ const fg = (n) => (s) => (noColor ? s : `\x1b[38;5;${n}m${s}\x1b[0m`);
15
+ // fnmoa wordmark in block letters, colored top→bottom as a cyan→blue gradient.
16
+ const LOGO = [
17
+ '█████ █ █ █ █ ███ ███ ',
18
+ '█ ██ █ ██ ██ █ █ █ █',
19
+ '████ █ █ █ █ █ █ █ █ █████',
20
+ '█ █ ██ █ █ █ █ █ █',
21
+ '█ █ █ █ █ ███ █ █',
22
+ ];
23
+ const LOGO_FG = [51, 45, 39, 33, 27];
24
+ /** The fnmoa banner — wordmark + tagline, gradient-colored. */
25
+ export function banner() {
26
+ const art = LOGO.map((line, i) => ' ' + fg(LOGO_FG[i])(line)).join('\n');
27
+ return `\n${art}\n ${c.dim('autonomous GitHub coding workflows')}\n`;
28
+ }
13
29
  export const statusColor = (s) => s === 'succeeded'
14
30
  ? c.green(s)
15
31
  : s === 'failed'
package/dist/ui.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"ui.js","sourceRoot":"","sources":["../src/ui.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAE1E,MAAM,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;AAChE,MAAM,IAAI,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,CAAC,CAAkB,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC;AAEvG,MAAM,CAAC,MAAM,CAAC,GAAG;IACf,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC;IACd,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC;IACf,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC;IACjB,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC;IACf,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC;IAClB,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC;IAChB,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC;CAClB,CAAC;AAEF,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,CAAS,EAAU,EAAE,CAC/C,CAAC,KAAK,WAAW;IACf,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;IACZ,CAAC,CAAC,CAAC,KAAK,QAAQ;QACd,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACV,CAAC,CAAC,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,QAAQ;YACjC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;YACb,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAEnB,8EAA8E;AAC9E,MAAM,UAAU,OAAO,CAAC,IAA+B;IACrD,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,CAAC;IACrB,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;IACnC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;QAAE,OAAO,EAAE,CAAC;IACnC,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;IAC3D,IAAI,CAAC,GAAG,EAAE;QAAE,OAAO,GAAG,CAAC,OAAO,CAAC;IAC/B,IAAI,CAAC,GAAG,IAAI;QAAE,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC;IAClD,IAAI,CAAC,GAAG,KAAK;QAAE,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC;IACrD,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,GAAG,CAAC,GAAW;IAC7B,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC,CAAC;IACjC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC"}
1
+ {"version":3,"file":"ui.js","sourceRoot":"","sources":["../src/ui.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fnmoa/cli",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "description": "Terminal client for the Moa server — drive tasks and GitHub workflows over its HTTP API",
5
5
  "type": "module",
6
6
  "bin": {
@@ -9,6 +9,7 @@
9
9
  "main": "dist/index.js",
10
10
  "files": [
11
11
  "dist",
12
+ "src/skills",
12
13
  "README.md"
13
14
  ],
14
15
  "engines": {
@@ -0,0 +1,35 @@
1
+ ---
2
+ name: moa-oracle
3
+ description: >-
4
+ Consult Moa's domain knowledge-base oracles — `moa oracle list` to see domains,
5
+ `moa oracle consult <domain> "<question>"` to ask, `moa oracle history` to review past
6
+ answers. Use to get a read-only answer sourced strictly from a specific knowledge base.
7
+ ---
8
+
9
+ # Consult Moa oracles
10
+
11
+ An **oracle** is a read-only knowledge base. A `<domain>-oracle` subagent answers
12
+ questions **only from that KB** — useful for grounded, source-bounded answers. Requires
13
+ a connected CLI (see **moa-setup**).
14
+
15
+ ## Use
16
+
17
+ ```sh
18
+ moa oracle list # available domains
19
+ moa oracle consult <domain> "<question>" --watch # ask; --watch streams to the answer
20
+ moa oracle history # past consultations (--limit N, --json)
21
+ ```
22
+
23
+ Example:
24
+
25
+ ```sh
26
+ moa oracle list
27
+ moa oracle consult architecture "how do workflow runs isolate git worktrees?" --watch
28
+ ```
29
+
30
+ ## Notes
31
+
32
+ - Answers are bounded to the KB — if the KB doesn't cover it, the oracle says so rather
33
+ than guessing.
34
+ - `--watch` exits non-zero if the consultation fails.
35
+ - `moa status` lists the oracle domains the server currently exposes.
@@ -0,0 +1,49 @@
1
+ ---
2
+ name: moa-profiles
3
+ description: >-
4
+ Act as multiple operators or orgs with Moa CLI profiles — `moa config add/use`, a
5
+ per-command `--profile` override, `$MOA_PROFILE`, and `moa whoami`. Use for
6
+ multi-operator review flows (solver ≠ reviewer) or driving several workspaces/orgs.
7
+ ---
8
+
9
+ # Multi-operator / multi-org profiles
10
+
11
+ `~/.moa/cli.json` holds **named profiles** — each is one operator: a workspace URL + an
12
+ API key. Profiles are how you run flows that need more than one identity (e.g. one
13
+ operator solves, another reviews) or target multiple workspaces/orgs. Requires a
14
+ connected CLI (see **moa-setup**).
15
+
16
+ ## Manage profiles
17
+
18
+ ```sh
19
+ moa config add owner --url <url> --key <ownerKey> --label "owner"
20
+ moa config add member --url <url> --key <memberKey> --label "member"
21
+ moa config use member # switch the active profile
22
+ moa config # show active + list (● = active)
23
+ moa config remove <name>
24
+ ```
25
+
26
+ ## Pick an identity per command
27
+
28
+ ```sh
29
+ moa <cmd> --profile owner # one-off override (no switch)
30
+ MOA_PROFILE=owner moa <cmd> # same, via env var
31
+ moa whoami # who am I right now (+ GitHub login)
32
+ ```
33
+
34
+ Precedence: `--profile <name>` → `$MOA_PROFILE` → active (`config use`) → `default`.
35
+
36
+ ## Why it matters
37
+
38
+ - **Author ≠ reviewer:** GitHub blocks approving your own PR, so the realistic review
39
+ loop needs two operators:
40
+ ```sh
41
+ moa config use owner
42
+ moa wf solve <repo> <issue#> --watch
43
+ MOA_PROFILE=member moa wf review <repo> <pr#> --watch
44
+ moa wf merge <repo> <pr#> --watch
45
+ ```
46
+ - **Multiple orgs/workspaces:** give each its own profile (distinct URL + key) and switch
47
+ with `moa config use`.
48
+
49
+ Field precedence within a profile: `env ($MOA_API_URL / $MOA_API_KEY) → profile → default`.
@@ -0,0 +1,47 @@
1
+ ---
2
+ name: moa-review-pr
3
+ description: >-
4
+ Review and unblock pull requests with Moa — `moa wf review` for a structured verdict,
5
+ `moa wf address` to apply review feedback, `moa wf fix-ci` to get red CI green, and
6
+ `moa wf review-fix` to converge to approval. Use to review a PR, address comments, or
7
+ fix failing checks.
8
+ ---
9
+
10
+ # Review & unblock PRs with Moa
11
+
12
+ Requires a connected CLI (see **moa-setup**). Repos are `owner/repo`; add `--watch` to
13
+ stream the timeline (exits non-zero on failure).
14
+
15
+ ## Review a PR
16
+
17
+ ```sh
18
+ moa wf pending # your review inbox
19
+ moa wf review <repo> <pr#> --watch # → APPROVE / REQUEST_CHANGES + inline comments
20
+ ```
21
+
22
+ The pipeline reconciles review state live from GitHub, so a review by **any** operator
23
+ (or done directly on GitHub) advances the track — solver and reviewer needn't match.
24
+
25
+ ## Unblock a PR
26
+
27
+ | Situation | Command | What it does |
28
+ |---|---|---|
29
+ | Reviewer asked for changes | `moa wf address <repo> <pr#>` | applies the feedback, pushes to the PR branch |
30
+ | CI is red | `moa wf fix-ci <repo> <pr#>` | reads checks/logs, pushes a fix |
31
+ | Want it to reach APPROVE | `moa wf review-fix <repo> <pr#>` | loops review → fix → re-review until approved |
32
+
33
+ ```sh
34
+ moa wf fix-ci <repo> <pr#> --watch # diagnose failing checks → push a fix
35
+ moa wf address <repo> <pr#> --watch # turn review comments into a commit
36
+ moa wf review-fix <repo> <pr#> --watch # converge to APPROVE + a fix commit
37
+ ```
38
+
39
+ Then merge once approved + green (see **moa-ship-issue**): `moa wf merge <repo> <pr#> --watch`.
40
+
41
+ ## Notes
42
+
43
+ - **Self-review:** GitHub won't let a PR's author approve/request-changes their own PR
44
+ (only comment). Review as a different operator — see **moa-profiles**.
45
+ - **`address` vs `review-fix`:** `address` applies existing feedback once; `review-fix`
46
+ owns the whole review↔fix loop until it converges.
47
+ - Inspect progress with `moa wf get <id> --watch`; failed checks and cost are shown there.
@@ -0,0 +1,44 @@
1
+ ---
2
+ name: moa-run-task
3
+ description: >-
4
+ Run an ad-hoc Moa agent task outside the GitHub workflow — `moa run "<prompt>" --dir
5
+ <path> --watch`, inspect with `moa task`, cancel a run, and track cost. Use for one-off
6
+ coding or analysis tasks not tied to an issue or PR.
7
+ ---
8
+
9
+ # Ad-hoc agent tasks with Moa
10
+
11
+ For work that isn't an issue/PR workflow, run the agent directly. Tasks are async:
12
+ `moa run` returns immediately as `queued`, then the run goes
13
+ `queued → running → succeeded | failed | canceled`. Requires a connected CLI (see
14
+ **moa-setup**).
15
+
16
+ ## Run
17
+
18
+ ```sh
19
+ moa run "add a hello() to src/index.ts" --watch
20
+ moa run "<prompt>" --dir /path/to/repo --watch # run against a specific directory
21
+ moa run "<prompt>" --autonomous --watch # less interactive, more autonomy
22
+ ```
23
+
24
+ `--watch` streams the live activity feed until the task finishes (and exits non-zero
25
+ if it fails).
26
+
27
+ ## Inspect & manage
28
+
29
+ ```sh
30
+ moa tasks # recent tasks (--limit N, default 30; --json for raw)
31
+ moa task <id> # one task: result, sessionId, numTurns, costUsd
32
+ moa task <id> --json # raw API response
33
+ moa cancel <taskId> # kill a running task (cancels its claude child)
34
+ ```
35
+
36
+ `moa task <id>` accepts a unique id prefix.
37
+
38
+ ## Notes
39
+
40
+ - Each task is one `claude` child process; **cancel** kills it.
41
+ - Cost: every finished task reports `costUsd`; `moa status --spend` shows the cumulative
42
+ total for the operator.
43
+ - For GitHub-driven work (issue→PR, review, fix-CI, merge), use the workflow skills:
44
+ **moa-ship-issue** and **moa-review-pr**.
@@ -0,0 +1,60 @@
1
+ ---
2
+ name: moa-setup
3
+ description: >-
4
+ Install and connect the `moa` CLI (@fnmoa/cli) to a Moa workspace — npm install,
5
+ `moa login`, verify the Claude/GitHub connectors, and run a first status check.
6
+ Use when setting up Moa for the first time, moving to a new machine, or
7
+ troubleshooting auth errors like "auto-bootstrap is unavailable".
8
+ ---
9
+
10
+ # Setting up the `moa` CLI
11
+
12
+ `moa` is a terminal client for a Moa **workspace** (an HTTP API). It authenticates
13
+ with an `x-api-key` and defaults to `https://cp.fnmoa.com`.
14
+
15
+ ## 1. Install
16
+
17
+ ```sh
18
+ npm i -g @fnmoa/cli
19
+ moa --help
20
+ ```
21
+
22
+ ## 2. Connect
23
+
24
+ ```sh
25
+ moa login # interactive: server URL (default cp.fnmoa.com) + API key
26
+ ```
27
+
28
+ `moa login` also starts automatically the first time you run bare `moa` with no
29
+ config. It saves to `~/.moa/cli.json` and verifies the key against the server. Grab
30
+ your API key from the Moa dashboard.
31
+
32
+ Non-interactive equivalent (CI, scripts):
33
+
34
+ ```sh
35
+ moa config set url https://cp.fnmoa.com
36
+ moa config set key <api-key>
37
+ # or per-shell: export MOA_API_URL=… MOA_API_KEY=…
38
+ ```
39
+
40
+ ## 3. Verify
41
+
42
+ ```sh
43
+ moa whoami # which operator am I (+ GitHub login)
44
+ moa setup # connector status: claude (connected?) · github (@login?)
45
+ moa status # server snapshot: oracles, task/session counts, queue
46
+ ```
47
+
48
+ ## Troubleshooting
49
+
50
+ - **`auto-bootstrap is unavailable … (enrolled to a control-plane)`** — the workspace
51
+ requires a pre-issued key. Run `moa login` (or `moa config set key <key>`); the key
52
+ comes from the dashboard, not auto-bootstrap.
53
+ - **`cannot reach <url>`** — wrong URL or server down. Re-check with `moa config`, fix
54
+ with `moa config set url <url>`.
55
+ - **`key rejected`** — the key is wrong/expired; re-run `moa login` with a fresh key.
56
+ - **Connectors not connected** (`moa setup` shows red) — connect Claude/GitHub from the
57
+ dashboard; the workflows need them.
58
+
59
+ Config precedence per field: `env ($MOA_API_URL / $MOA_API_KEY) → active profile → default`.
60
+ For multiple operators or orgs, see the **moa-profiles** skill.
@@ -0,0 +1,54 @@
1
+ ---
2
+ name: moa-ship-issue
3
+ description: >-
4
+ Turn a GitHub issue into a merged PR with Moa — `moa wf solve` to implement and open
5
+ a PR, review it, then `moa wf merge`. Watch each run's live timeline. Use when you
6
+ want Moa to implement a known issue end-to-end and ship it.
7
+ ---
8
+
9
+ # Ship an issue with Moa (issue → PR → merge)
10
+
11
+ Moa reads the issue, writes the code behind a verify gate (the repo's tests), and
12
+ opens a PR — the git/gh is deterministic; the agent only reasons. It never commits or
13
+ merges on its own; the workflow does. Requires a connected CLI (see **moa-setup**).
14
+
15
+ Repos are `owner/repo`. Add `--watch` to stream the step timeline until the run ends
16
+ (a watch exits non-zero if the run fails/cancels).
17
+
18
+ ## The happy path
19
+
20
+ ```sh
21
+ moa wf solve <repo> <issue#> --watch # agent codes → verify gate → opens PR
22
+ moa wf review <repo> <pr#> --watch # structured verdict + inline comments
23
+ moa wf merge <repo> <pr#> --watch # guarded: needs approved + green
24
+ ```
25
+
26
+ Check state any time:
27
+
28
+ ```sh
29
+ moa track <repo> # the issue's pipeline stage (… → branched → pr → merged)
30
+ moa wf list # recent runs
31
+ moa wf get <id> --watch # one run + its step timeline (and cost)
32
+ moa wf pending # your review inbox (issues/PRs awaiting you)
33
+ ```
34
+
35
+ ## Variations
36
+
37
+ | Goal | Command |
38
+ |---|---|
39
+ | Issue → branch only (no PR), re-runnable | `moa wf branch <repo> <issue#>` |
40
+ | Open a PR from an existing branch | `moa wf open-pr <repo> <issue#>` |
41
+ | Apply review feedback to the PR | `moa wf address <repo> <pr#>` |
42
+ | Get failing CI green | `moa wf fix-ci <repo> <pr#>` |
43
+ | Review → fix → re-review until APPROVE | `moa wf review-fix <repo> <pr#>` |
44
+
45
+ For reviewing/unblocking PRs in depth, see **moa-review-pr**.
46
+
47
+ ## Notes
48
+
49
+ - **Author ≠ reviewer:** GitHub blocks approving your own PR. Use a second operator
50
+ (see **moa-profiles**) or let the `review` workflow post the verdict.
51
+ - **Verify gate:** `solve` runs the repo's tests before pushing — a repo with no test
52
+ script weakens the signal.
53
+ - **Cost:** each run reports `costUsd`; `moa wf get <id>` shows per-run cost. Add
54
+ `moa status --spend` for the cumulative total.
@@ -0,0 +1,47 @@
1
+ ---
2
+ name: moa-triage-audit
3
+ description: >-
4
+ Discover and categorize work with Moa — `moa wf triage` to categorize/label an issue,
5
+ and `moa wf report-issue` to audit a repo and file new GitHub issues. Use to triage an
6
+ incoming issue or have Moa audit a codebase and file what it finds.
7
+ ---
8
+
9
+ # Triage & audit with Moa
10
+
11
+ Requires a connected CLI (see **moa-setup**). Repos are `owner/repo`; add `--watch` to
12
+ stream the timeline.
13
+
14
+ ## Triage an existing issue
15
+
16
+ ```sh
17
+ moa wf triage <repo> <issue#> --watch # read-only: categorize / suggest labels
18
+ ```
19
+
20
+ Use it to sort an incoming issue before deciding whether to `solve` it
21
+ (see **moa-ship-issue**).
22
+
23
+ ## Audit a repo and file issues
24
+
25
+ `report-issue` is **repo-level** (no issue/PR number): the agent reads the repo, recalls
26
+ past hotspots from memory, audits it — optionally focused by `--instruction` — and files
27
+ its findings as GitHub issue(s).
28
+
29
+ ```sh
30
+ moa wf report-issue <repo> --watch
31
+ moa wf report-issue <repo> --instruction "audit src/ for missing input validation and unhandled edge cases" --watch
32
+ ```
33
+
34
+ Omit `--instruction` for a general audit; the agent decides what's worth filing. This is
35
+ how you point Moa at a codebase to *discover* work rather than act on a known item. It
36
+ files issues on the **target repo** — it is not a channel for reporting bugs about Moa
37
+ itself.
38
+
39
+ ## See what's open
40
+
41
+ ```sh
42
+ moa gh issues # open issues Moa can see
43
+ moa gh pulls # open PRs
44
+ moa track <repo> # per-issue pipeline stages
45
+ ```
46
+
47
+ Next: turn a filed/triaged issue into a PR with **moa-ship-issue**.