orbitmap 0.6.0 → 0.7.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.
Files changed (55) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +9 -9
  3. package/dist/adapters/cloud.d.ts +16 -1
  4. package/dist/adapters/cloud.js +13 -2
  5. package/dist/adapters/cloud.js.map +1 -1
  6. package/dist/adapters/local/adapter.d.ts +3 -0
  7. package/dist/adapters/local/adapter.js +3 -1
  8. package/dist/adapters/local/adapter.js.map +1 -1
  9. package/dist/adapters/local/entities/planning.d.ts +8 -2
  10. package/dist/adapters/local/entities/planning.js +34 -3
  11. package/dist/adapters/local/entities/planning.js.map +1 -1
  12. package/dist/adapters/local/entities/tasks.d.ts +1 -1
  13. package/dist/adapters/local/entities/tasks.js +33 -1
  14. package/dist/adapters/local/entities/tasks.js.map +1 -1
  15. package/dist/adapters/local/entities/work-items.d.ts +12 -1
  16. package/dist/adapters/local/entities/work-items.js +42 -13
  17. package/dist/adapters/local/entities/work-items.js.map +1 -1
  18. package/dist/adapters/types.d.ts +32 -0
  19. package/dist/agent-instructions.d.ts +9 -9
  20. package/dist/agent-instructions.js +64 -30
  21. package/dist/agent-instructions.js.map +1 -1
  22. package/dist/commands/create.d.ts +1 -0
  23. package/dist/commands/create.js +17 -6
  24. package/dist/commands/create.js.map +1 -1
  25. package/dist/commands/ideas.d.ts +17 -0
  26. package/dist/commands/ideas.js +35 -2
  27. package/dist/commands/ideas.js.map +1 -1
  28. package/dist/commands/intent.d.ts +22 -0
  29. package/dist/commands/intent.js +78 -10
  30. package/dist/commands/intent.js.map +1 -1
  31. package/dist/commands/mission.d.ts +1 -0
  32. package/dist/commands/mission.js +1 -1
  33. package/dist/commands/mission.js.map +1 -1
  34. package/dist/commands/orbit.d.ts +1 -0
  35. package/dist/commands/orbit.js +1 -1
  36. package/dist/commands/orbit.js.map +1 -1
  37. package/dist/commands/status.d.ts +1 -0
  38. package/dist/commands/status.js +7 -1
  39. package/dist/commands/status.js.map +1 -1
  40. package/dist/errors.d.ts +25 -1
  41. package/dist/errors.js +10 -2
  42. package/dist/errors.js.map +1 -1
  43. package/dist/index.js +50 -13
  44. package/dist/index.js.map +1 -1
  45. package/dist/output.js +12 -0
  46. package/dist/output.js.map +1 -1
  47. package/dist/work-log.js +8 -0
  48. package/dist/work-log.js.map +1 -1
  49. package/dist/write-target.d.ts +13 -3
  50. package/dist/write-target.js +40 -3
  51. package/dist/write-target.js.map +1 -1
  52. package/package.json +1 -1
  53. package/dist/commands/projects.d.ts +0 -3
  54. package/dist/commands/projects.js +0 -28
  55. package/dist/commands/projects.js.map +0 -1
@@ -7,6 +7,20 @@
7
7
  * command modules, never by the adapter.
8
8
  */
9
9
  import type { WorkLogEntry } from '../work-log.js';
10
+ /**
11
+ * Where a new idea lands — the `scope` field of `POST /ideas` (API 10.6.0).
12
+ *
13
+ * - `'area'` — the idea belongs to the area the invocation is scoped to (the
14
+ * `X-Orbitmap-Area` header in cloud mode, the `areas/<slug>/` subtree in local mode).
15
+ * - `'workspace'` — the idea belongs to the workspace and is linked to no area.
16
+ *
17
+ * The CLI always sends it. The server's own ladder (`scope=workspace` → body `area_id` →
18
+ * `X-Orbitmap-Area` → no area context at all) would resolve an omitted `scope` from the
19
+ * ambient header, which is exactly the guess this field exists to remove: from the
20
+ * workspace root the CLI means "workspace level", and it has to say so rather than let a
21
+ * default decide.
22
+ */
23
+ export type IdeaScope = 'workspace' | 'area';
10
24
  export interface WorkspaceAdapter {
11
25
  /**
12
26
  * `GET /context` — since API 10.0.0 this is MATCHING MATERIAL, not a work queue:
@@ -76,6 +90,7 @@ export interface WorkspaceAdapter {
76
90
  area_id?: string;
77
91
  source_issue_id?: string;
78
92
  intent_id?: string;
93
+ mission_id?: string;
79
94
  orbit_id?: string | null;
80
95
  }): Promise<unknown>;
81
96
  editTaskContent(taskId: string, data: {
@@ -262,11 +277,16 @@ export interface WorkspaceAdapter {
262
277
  }): Promise<unknown>;
263
278
  /** `GET /ideas/{id_or_number}` — uuid, bare code or `ID-xxxxxx`; the server resolves it. */
264
279
  getIdea(idOrNumber: string): Promise<unknown>;
280
+ /**
281
+ * `POST /ideas`. {@link IdeaScope} is sent EXPLICITLY on every call — see its doc for why
282
+ * a server-side default is not good enough.
283
+ */
265
284
  createIdea(data: {
266
285
  content: string;
267
286
  title?: string;
268
287
  priority?: string;
269
288
  metadata?: Record<string, unknown>;
289
+ scope?: IdeaScope;
270
290
  }): Promise<unknown>;
271
291
  /** `PATCH /ideas/{id_or_number}/status`. */
272
292
  updateIdeaStatus(idOrNumber: string, data: {
@@ -332,6 +352,11 @@ export interface WorkspaceAdapter {
332
352
  bundle?: boolean;
333
353
  slim?: boolean;
334
354
  }): Promise<unknown>;
355
+ /**
356
+ * `area_ids` on create declares the intent's areas from the start, exactly as on
357
+ * {@link WorkspaceAdapter.updateIntent} — each entry a slug or uuid, written to the
358
+ * `intent_area` pivot. Distinct from `area_id`, which only derives workspace context.
359
+ */
335
360
  createIntent(data: {
336
361
  name: string;
337
362
  outcome?: string;
@@ -339,6 +364,7 @@ export interface WorkspaceAdapter {
339
364
  plan?: string;
340
365
  status?: string;
341
366
  area_id?: string;
367
+ area_ids?: string[];
342
368
  }): Promise<unknown>;
343
369
  /**
344
370
  * `logs` is the status-transition batch: entries written verbatim, in order, inside the
@@ -356,6 +382,12 @@ export interface WorkspaceAdapter {
356
382
  status?: string;
357
383
  area_ids?: string[];
358
384
  logs?: WorkLogEntry[];
385
+ /**
386
+ * Answer to the INTENT_CLOSE_OPEN_ITEMS refusal (API 10.8.0): how a close to
387
+ * done/cancelled should treat still-open child items. Cloud-only semantics —
388
+ * the local adapter performs no open-children refusal, so it ignores the flag.
389
+ */
390
+ close_with_open_items?: 'relocate' | 'cancel' | 'force';
359
391
  }): Promise<unknown>;
360
392
  linkIntentItem(idOrNumber: string, data: {
361
393
  item_type: string;
@@ -32,19 +32,19 @@ export declare const SKILL_NAME = "orbitmap";
32
32
  export declare const SESSION_FOCUS_SECTION = "## Session focus\n\nSESSION FOCUS \u2014 Ensure, don't call. A session focus file ({mission, intents (\u22643 typical \u2014\na SOFT cap: focus holds what the session is actively advancing), areas, agent_id,\nmatched_at}) lives in your session temp directory. If present and the agent identity\nmatches: do NOT call context. If missing or invalid \u2014 an identity or area mismatch\ninvalidates it \u2014 call `orbitmap context` once, match the conversation against its\nhandles, write the file, and STATE the match in one line \u2014 the intent's NAME, its number\nonly at first mention. Never narrow silently: every task query you send still carries\n`--intent` explicitly. An intent you just created or fetched joins the focus by its\nhandle \u2014 no context call. If a write fails INTENT_CLOSED: your focus is stale \u2014 re-derive\nand say so. Before creating a new intent or declaring none exists: fetch the 1\u20133 nearest\ncandidates with `intent show --no-logs` and judge from their bodies, not TL;DRs \u2014 a rule\nfor creation/dedup decision points only. If nothing matches: offer to frame an intent\n(brainstorm gate) \u2014 never create a bare shell; if declined, work from the fetched missions\nand intents (\"look wider\").\n\nTRANSIENT references never enter focus: an intent fetched for a dedup check or a\ncross-comparison is read and used, not focused; a real focus switch is stated aloud\n(\"focus now X, parking Y\"). The file is an optimization with graceful failure \u2014 the\nconversation is the primary carrier, the file only compaction insurance: no file \u2192 the\nensure rule above triggers one context call. Agent memory directories are the WRONG store\nfor focus (a cross-session lifetime means stale focus).";
33
33
  export declare const FRESHNESS_SECTION = "## Freshness\n\nTwo universal rules \u2014 they apply to EVERY OrbitMap object, in every flow:\n- TRUST THE WRITE'S ECHO. A successful write already returns the updated object \u2014 the\n echo IS the current state. Never re-fetch an object just to verify a write you made.\n- COMPARE THE HELD MARKER BEFORE RE-FETCHING ANYTHING BIG. Every full fetch hands you a\n change marker \u2014 the `updated_at` + `last_log_id` pair on intents (tasks and missions\n carry the pair too), `version` on documents. Hold it; re-fetch only on a mismatch.\n\nPROBE FLOW (intents): the session focus file remembers each focused intent's\n`updated_at` + `last_log_id` pair from the last FULL fetch. To check whether an\nintent moved, run `orbitmap intent show IN-x --slim` \u2014 a ~150-token probe (handle,\nTL;DRs, areas, mission, task counts, the pair). Pair unchanged \u2192 the intent has not\nmoved: SAY SO in one line and keep working from what you hold \u2014 no full fetch. Pair\nchanged \u2192 re-fetch (`intent show IN-x`, with `--no-logs` when the log tail is not\nneeded) and remember the new pair in the focus file.";
34
34
  export declare function worklogKeepDropTest(indent?: string): string;
35
- export declare const SKILL_ORBITMAP_FRONTMATTER = "---\nname: orbitmap\ndescription: >\n OrbitMap project management via the orbitmap CLI. Use when the user mentions OrbitMap,\n orbit, tasks, backlog, missions, intents, ideas, issues, vibes, or asks to track,\n plan, or log work. Entry point: object model, context resolution, command reference.\n---";
36
- export declare const SKILL_ORBITMAP_BODY = "# OrbitMap CLI \u2014 core\n\nOrbitMap is an agentic project management platform. You interact with it exclusively\nthrough the `orbitmap` CLI (run with `npx orbitmap \u2026` if not on PATH). The CLI works\nidentically in cloud mode and local-files mode \u2014 never assume which one is active, and\nnever read or write the workspace's data files directly. The CLI is the only interface.\n\n## Goal\nOperate OrbitMap correctly: ensure session focus (below) instead of ritually calling\ncontext, act on the mission and intents the session is about, write every item to the area\nthe work belongs to, and go through the CLI only \u2014 never the data files.\n\n**Interface:** every action below is an OrbitMap operation \u2014 run the `orbitmap` CLI command\nshown, or its equivalent MCP tool when this session uses MCP; `orbitmap <cmd> --help` and the\nMCP tool schemas are the authority. Never edit the workspace data files directly.\n\n## General behaviour\n- Always prioritise the user's direct request. If the user asks you to do something\n (read a file, write code, answer a question), handle that first.\n- Only interact with OrbitMap when the user explicitly asks you to (e.g. \"check my\n tasks\", \"start a task\", \"what's on my backlog\", \"log this idea\").\n- When the user mentions OrbitMap, orbit, task, backlog, or project-management concepts\n in the context of tracking work, use `orbitmap` commands to handle the request.\n\n## Object model\n- Workspace = team level. Area = repo-level scope (formerly Project) \u2014 tasks, vibes and\n most issues live in an area. Mission (MS-) = time-boxed workspace focus; at most one\n active. Intent (IN-) = workspace-level goal grouping tasks/issues. Idea (ID-) = future\n possibility, not a problem. Issue (IS-) = problem/bug. Vibe (VB-) = ad-hoc work log\n outside a task. Task (TS-) = unit of work.\n- Entity numbers (TS-xxxxxx etc.) are accepted by every command that takes an id.\n\n## Session focus\n\nSESSION FOCUS \u2014 Ensure, don't call. A session focus file ({mission, intents (\u22643 typical \u2014\na SOFT cap: focus holds what the session is actively advancing), areas, agent_id,\nmatched_at}) lives in your session temp directory. If present and the agent identity\nmatches: do NOT call context. If missing or invalid \u2014 an identity or area mismatch\ninvalidates it \u2014 call `orbitmap context` once, match the conversation against its\nhandles, write the file, and STATE the match in one line \u2014 the intent's NAME, its number\nonly at first mention. Never narrow silently: every task query you send still carries\n`--intent` explicitly. An intent you just created or fetched joins the focus by its\nhandle \u2014 no context call. If a write fails INTENT_CLOSED: your focus is stale \u2014 re-derive\nand say so. Before creating a new intent or declaring none exists: fetch the 1\u20133 nearest\ncandidates with `intent show --no-logs` and judge from their bodies, not TL;DRs \u2014 a rule\nfor creation/dedup decision points only. If nothing matches: offer to frame an intent\n(brainstorm gate) \u2014 never create a bare shell; if declined, work from the fetched missions\nand intents (\"look wider\").\n\nTRANSIENT references never enter focus: an intent fetched for a dedup check or a\ncross-comparison is read and used, not focused; a real focus switch is stated aloud\n(\"focus now X, parking Y\"). The file is an optimization with graceful failure \u2014 the\nconversation is the primary carrier, the file only compaction insurance: no file \u2192 the\nensure rule above triggers one context call. Agent memory directories are the WRONG store\nfor focus (a cross-session lifetime means stale focus).\n\n## Freshness\n\nTwo universal rules \u2014 they apply to EVERY OrbitMap object, in every flow:\n- TRUST THE WRITE'S ECHO. A successful write already returns the updated object \u2014 the\n echo IS the current state. Never re-fetch an object just to verify a write you made.\n- COMPARE THE HELD MARKER BEFORE RE-FETCHING ANYTHING BIG. Every full fetch hands you a\n change marker \u2014 the `updated_at` + `last_log_id` pair on intents (tasks and missions\n carry the pair too), `version` on documents. Hold it; re-fetch only on a mismatch.\n\nPROBE FLOW (intents): the session focus file remembers each focused intent's\n`updated_at` + `last_log_id` pair from the last FULL fetch. To check whether an\nintent moved, run `orbitmap intent show IN-x --slim` \u2014 a ~150-token probe (handle,\nTL;DRs, areas, mission, task counts, the pair). Pair unchanged \u2192 the intent has not\nmoved: SAY SO in one line and keep working from what you hold \u2014 no full fetch. Pair\nchanged \u2192 re-fetch (`intent show IN-x`, with `--no-logs` when the log tail is not\nneeded) and remember the new pair in the focus file.\n\n## Context\n- Ensure session focus (above) \u2014 at most ONE `orbitmap context` call per session, and none\n while a valid focus file is held. `orbitmap context` is authoritative MATCHING MATERIAL:\n your agent identity, the missions and intents as handles with TL;DR summaries, standalone\n mission workitems, the areas you work in, and document metadata. It carries no task\n lists and no bodies \u2014 fetch deeper on demand (`orbitmap intent show IN-x`,\n `orbitmap tasks --intent IN-x`, `orbitmap doc <slug>`). Never list areas and never\n ask the user \"which area?\" before you have read it.\n- You work in a WORKSPACE, not inside a single area. Missions, intents\n and documents are workspace-level and take no area \u2014 a document is exactly ONE copy,\n global to the workspace, never per-area. Tasks, vibes, issues and ideas are\n AREA-scoped.\n- Missions and intents outrank individual tasks. Asked to work on \"what matters\", take the\n active mission and open intents from context and pick work that serves them.\n- The area follows from the directory, never from a question to the user:\n `.orbitmap/config.json` maps directories \u2192 area slugs at the workspace root, and each\n area directory carries its own `.orbitmap/config.json` marker naming its area. That\n config is the only source of truth \u2014 never hard-code area names anywhere.\n So: do area-scoped work from the directory it belongs to and let the CLI resolve it.\n- `--area <slug>` is an OVERRIDE for a single call, not part of normal usage \u2014 reach for it\n only to read or write outside the area the current directory resolves to.\n- If a command fails with `AREA_CONTEXT_REQUIRED`, its details list the mapped\n directories: cd into the right one, or retry with `--area <slug>`.\n- WRITES: the resolved area is a default for *reading*, never a statement of where the\n work belongs. Before creating anything area-scoped (task, subtask, issue, vibe),\n derive the target area from the work itself (which repo/package it lives in) and pass\n `--area <slug>` if that differs from the area the CLI echoes. If the work itself is\n genuinely ambiguous, ASK THE USER; do not guess. There is no\n `move` command: a write in the wrong area has to be recreated.\n- Every write echoes its scope on stderr: `creates in area <slug> (source: \u2026)` when it\n creates an object, `scoped to area <slug> (source: \u2026)` when it changes one by id. A\n `source` of `global ~/.orbitmap/config.json` is a machine-wide leftover that nothing\n here chose \u2014 treat it as unconfirmed and pass `--area` explicitly.\n\n## Task or intent?\n\nAn intent earns its gates when the work carries knowledge someone would otherwise\nre-derive or re-litigate: a decision with a rejected alternative, a design that outlives\nthe change, a constraint worth recording. Work with none of that \u2014 a typo, a copy tweak,\nan obvious one-file fix \u2014 is a task: create it, do it, log it, done. The same test the\nwork log uses for what to write down. If a \"small\" fix turns out to hide a real decision,\nstop and frame it; discovering that mid-change is normal, not a failure.\n\n## Task statuses\nbacklog, todo, in_progress, in_review, review_changes, done, blocked.\n`orbitmap tasks` defaults to todo,in_progress. Ask for others explicitly, e.g.\n`orbitmap tasks --status backlog` when the user asks about the backlog.\n\n## Listing tasks\n- A list spans EVERY area you can reach and EVERY assignee \u2014 nothing narrows it to the\n current directory or to you. It is capped at 30 rows with the totals behind the cap\n printed, and every list states the filters that produced it. Read that line before you\n answer from a list.\n- While you are executing an intent, EVERY task query carries `--intent IN-x`. Nothing\n narrows a list to an intent on your behalf: a bare `orbitmap tasks` is you having\n deliberately left the intent to look at the whole workspace.\n- `orbitmap intent show IN-x` already carries the intent's own tasks, so intent lifecycle\n work needs no filter at all. `orbitmap tasks --intent IN-x` is the escape hatch for the\n times you want the task-list shape \u2014 statuses, assignees, the filter line \u2014 instead.\n\n## Command reference (all commands accept --json)\n- Context: `orbitmap context` (once per session at most \u2014 see Session focus),\n `orbitmap overview`, `orbitmap areas`\n (rarely needed \u2014 context already lists the areas you work in)\n- Tasks: `orbitmap tasks [--status s1,s2] [--intent IN-x]`, `orbitmap task TS-x`,\n `orbitmap get <ID>`,\n `orbitmap start [TS-x]`, `orbitmap status TS-x <status> [--delivery <d>]`,\n `orbitmap create \"title\" [--intent IN-x|--mission MS-x] [--priority p]`,\n `orbitmap subtask TS-parent \"title\"`, `orbitmap assign TS-x [agent]`,\n `orbitmap dep add|remove TS-a TS-b`, `orbitmap log TS-x \"msg\" --type <t>`\n- Issues: `orbitmap issue register|list|show|status|resolve`\n- Ideas: `orbitmap idea add|list|show|status`\n- Vibes: `orbitmap vibe log|list|show`\n- Missions: `orbitmap mission list|show|create|update|status|link|unlink`\n- Intents: `orbitmap intent list|show|create|update|link|unlink`\n (`show` embeds the context bundle \u2014 `--no-bundle` strips it, `--slim` is the\n freshness probe, `--no-logs` skips the log tail)\n- Documents: `orbitmap docs`, `orbitmap doc <slug> [--section \"## H\"|--full]`,\n `orbitmap doc-import`, `orbitmap doc-update`\n\n## Error handling\n- If OrbitMap is unreachable (network down / workspace directory unavailable), inform\n the user and continue the primary work without logging. Do NOT retry failed orbitmap\n calls in a loop \u2014 report the issue and proceed with the task.";
37
- export declare const SKILL_EXECUTE_FRONTMATTER = "---\nname: orbitmap-execute\ndescription: >\n Executing OrbitMap work \u2014 the fourth gate of the product-building flow. Two flows:\n \"execute IN-x\" delivers a whole planned intent in the background (parallel worker\n waves, per-task tests, the intent test, an impact pass against a baseline, a\n goal-based fix loop, everything ending in_review on an intent branch \u2014 merging stays\n the user's), and \"work on TS-x\" runs a single tracked task (starting/resuming,\n logging, finishing with the correct status, git branches and delivery status). Use\n whenever executing a planned intent or implementing, resuming, or finishing a\n tracked task.\n---";
35
+ export declare const SKILL_ORBITMAP_FRONTMATTER = "---\nname: orbitmap\ndescription: >\n OrbitMap project management via the orbitmap CLI \u2014 the entry point other orbitmap-*\n skills require. Use whenever the user wants to build, add, change or fix something, in\n whatever words they use \u2014 do not wait for OrbitMap vocabulary \u2014 as well as when they\n mention OrbitMap, orbit, tasks, backlog, missions, intents, ideas, issues, vibes, or ask\n to track, plan, or log work. Covers the object model, context resolution, and command\n reference.\n---";
36
+ export declare const SKILL_ORBITMAP_BODY = "# OrbitMap CLI \u2014 core\n\nOrbitMap is an agentic project management platform. You interact with it exclusively\nthrough the `orbitmap` CLI (run with `npx orbitmap \u2026` if not on PATH). The CLI works\nidentically in cloud mode and local-files mode \u2014 never assume which one is active, and\nnever read or write the workspace's data files directly. The CLI is the only interface.\n\n## Goal\nOperate OrbitMap correctly: ensure session focus (below) instead of ritually calling\ncontext, act on the mission and intents the session is about, write every item to the area\nthe work belongs to, and go through the CLI only \u2014 never the data files.\n\n**Interface:** every action below is an OrbitMap operation \u2014 run the `orbitmap` CLI command\nshown, or its equivalent MCP tool when this session uses MCP; `orbitmap <cmd> --help` and the\nMCP tool schemas are the authority. Never edit the workspace data files directly.\n\n## General behaviour\n- Always prioritise the user's direct request. If the user asks you to do something\n (read a file, write code, answer a question), handle that first.\n- When the user mentions OrbitMap, orbit, task, backlog, or project-management concepts\n in the context of tracking work \u2014 in whatever words they use \u2014 use `orbitmap` commands\n to handle the request.\n\n## Object model\n- Workspace = team level. Area = repo-level scope (formerly Project) \u2014 tasks, vibes and\n most issues live in an area. Mission (MS-) = time-boxed workspace focus; at most one\n active. Intent (IN-) = workspace-level goal grouping tasks/issues. Idea (ID-) = future\n possibility, not a problem. Issue (IS-) = problem/bug. Vibe (VB-) = ad-hoc work log\n outside a task. Task (TS-) = unit of work.\n- Entity numbers (TS-xxxxxx etc.) are accepted by every command that takes an id.\n\n## Naming workitems in output\nRefer to a workitem by its NAME together with its key, at first mention in any message,\nsummary or report \u2014 \"Align skills and validators (IN-b2h63q)\". NEVER a bare key: a key\nalone is unreadable to the user, who tracks the work by name. Keep no key-to-name mapping\nanywhere \u2014 not in a file, not in memory. Every list, `show` and context response already\npairs the two, so take the name from the response you already have; if you do not have it,\nfetch the item rather than emitting the key on its own.\n\n## Session focus\n\nSESSION FOCUS \u2014 Ensure, don't call. A session focus file ({mission, intents (\u22643 typical \u2014\na SOFT cap: focus holds what the session is actively advancing), areas, agent_id,\nmatched_at}) lives in your session temp directory. If present and the agent identity\nmatches: do NOT call context. If missing or invalid \u2014 an identity or area mismatch\ninvalidates it \u2014 call `orbitmap context` once, match the conversation against its\nhandles, write the file, and STATE the match in one line \u2014 the intent's NAME, its number\nonly at first mention. Never narrow silently: every task query you send still carries\n`--intent` explicitly. An intent you just created or fetched joins the focus by its\nhandle \u2014 no context call. If a write fails INTENT_CLOSED: your focus is stale \u2014 re-derive\nand say so. Before creating a new intent or declaring none exists: fetch the 1\u20133 nearest\ncandidates with `intent show --no-logs` and judge from their bodies, not TL;DRs \u2014 a rule\nfor creation/dedup decision points only. If nothing matches: offer to frame an intent\n(brainstorm gate) \u2014 never create a bare shell; if declined, work from the fetched missions\nand intents (\"look wider\").\n\nTRANSIENT references never enter focus: an intent fetched for a dedup check or a\ncross-comparison is read and used, not focused; a real focus switch is stated aloud\n(\"focus now X, parking Y\"). The file is an optimization with graceful failure \u2014 the\nconversation is the primary carrier, the file only compaction insurance: no file \u2192 the\nensure rule above triggers one context call. Agent memory directories are the WRONG store\nfor focus (a cross-session lifetime means stale focus).\n\n## Freshness\n\nTwo universal rules \u2014 they apply to EVERY OrbitMap object, in every flow:\n- TRUST THE WRITE'S ECHO. A successful write already returns the updated object \u2014 the\n echo IS the current state. Never re-fetch an object just to verify a write you made.\n- COMPARE THE HELD MARKER BEFORE RE-FETCHING ANYTHING BIG. Every full fetch hands you a\n change marker \u2014 the `updated_at` + `last_log_id` pair on intents (tasks and missions\n carry the pair too), `version` on documents. Hold it; re-fetch only on a mismatch.\n\nPROBE FLOW (intents): the session focus file remembers each focused intent's\n`updated_at` + `last_log_id` pair from the last FULL fetch. To check whether an\nintent moved, run `orbitmap intent show IN-x --slim` \u2014 a ~150-token probe (handle,\nTL;DRs, areas, mission, task counts, the pair). Pair unchanged \u2192 the intent has not\nmoved: SAY SO in one line and keep working from what you hold \u2014 no full fetch. Pair\nchanged \u2192 re-fetch (`intent show IN-x`, with `--no-logs` when the log tail is not\nneeded) and remember the new pair in the focus file.\n\n## Context\n- Ensure session focus (above) \u2014 at most ONE `orbitmap context` call per session, and none\n while a valid focus file is held. `orbitmap context` is authoritative MATCHING MATERIAL:\n your agent identity, the missions and intents as handles with TL;DR summaries, standalone\n mission workitems, the areas you work in, and document metadata. It carries no task\n lists and no bodies \u2014 fetch deeper on demand (`orbitmap intent show IN-x`,\n `orbitmap tasks --intent IN-x`, `orbitmap doc <slug>`). Never list areas and never\n ask the user \"which area?\" before you have read it.\n- You work in a WORKSPACE, not inside a single area. Missions and intents are\n workspace-level and take no area. Documents live at area OR workspace level.\n Tasks, vibes, issues and ideas are AREA-scoped.\n- Missions and intents outrank individual tasks. Asked to work on \"what matters\", take the\n active mission and open intents from context and pick work that serves them.\n- The area follows from the directory, never from a question to the user:\n `.orbitmap/config.json` maps directories \u2192 area slugs at the workspace root, and each\n area directory carries its own `.orbitmap/config.json` marker naming its area. That\n config is the only source of truth \u2014 never hard-code area names anywhere.\n So: do area-scoped work from the directory it belongs to and let the CLI resolve it.\n- `--area <slug>` is an OVERRIDE for a single call, not part of normal usage \u2014 reach for it\n only to read or write outside the area the current directory resolves to.\n- If a command fails with `AREA_CONTEXT_REQUIRED`, its details list the mapped\n directories: cd into the right one, or retry with `--area <slug>`.\n- WRITES: the resolved area is a default for *reading*, never a statement of where the\n work belongs. Before creating anything area-scoped (task, subtask, issue, vibe),\n derive the target area from the work itself (which repo/package it lives in) and pass\n `--area <slug>` if that differs from the area the CLI echoes. If the work itself is\n genuinely ambiguous, ASK THE USER; do not guess. There is no\n `move` command: a write in the wrong area has to be recreated.\n- Every write echoes its scope on stderr: `creates in area <slug> (source: \u2026)` when it\n creates an object, `scoped to area <slug> (source: \u2026)` when it changes one by id. A\n `source` of `global ~/.orbitmap/config.json` is a machine-wide leftover that nothing\n here chose \u2014 treat it as unconfirmed and pass `--area` explicitly.\n\n## Task or intent?\n\nAn intent earns its gates when the work carries knowledge someone would otherwise\nre-derive or re-litigate: a decision with a rejected alternative, a design that outlives\nthe change, a constraint worth recording. Work with none of that \u2014 a typo, a copy tweak,\nan obvious one-file fix \u2014 is a task: create it, do it, log it, done. The same test the\nwork log uses for what to write down. If a \"small\" fix turns out to hide a real decision,\nstop and frame it; discovering that mid-change is normal, not a failure.\n\n## Task statuses\nbacklog, todo, in_progress, in_review, review_changes, done, blocked.\n`orbitmap tasks` defaults to todo,in_progress. Ask for others explicitly, e.g.\n`orbitmap tasks --status backlog` when the user asks about the backlog.\n\n## Listing tasks\n- A list spans EVERY area you can reach and EVERY assignee \u2014 nothing narrows it to the\n current directory or to you. It is capped at 30 rows with the totals behind the cap\n printed, and every list states the filters that produced it. Read that line before you\n answer from a list.\n- While you are executing an intent, EVERY task query carries `--intent IN-x`. Nothing\n narrows a list to an intent on your behalf: a bare `orbitmap tasks` is you having\n deliberately left the intent to look at the whole workspace.\n- `orbitmap intent show IN-x` already carries the intent's own tasks, so intent lifecycle\n work needs no filter at all. `orbitmap tasks --intent IN-x` is the escape hatch for the\n times you want the task-list shape \u2014 statuses, assignees, the filter line \u2014 instead.\n\n## Command reference (all commands accept --json)\n- Context: `orbitmap context` (once per session at most \u2014 see Session focus),\n `orbitmap overview`, `orbitmap areas`\n (rarely needed \u2014 context already lists the areas you work in)\n- Tasks: `orbitmap tasks [--status s1,s2] [--intent IN-x]`, `orbitmap task TS-x`,\n `orbitmap get <ID>`,\n `orbitmap start [TS-x]`, `orbitmap status TS-x <status> [--delivery <d>]`,\n `orbitmap create \"title\" [--intent IN-x] [--priority p]`,\n `orbitmap subtask TS-parent \"title\"`, `orbitmap assign TS-x [agent]`,\n `orbitmap dep add|remove TS-a TS-b`, `orbitmap log TS-x \"msg\" --type <t>`\n- Issues: `orbitmap issue register|list|show|status|resolve`\n- Ideas: `orbitmap idea add|list|show|status`\n- Vibes: `orbitmap vibe log|list|show`\n- Missions: `orbitmap mission list|show|create|update|status|link|unlink`\n- Intents: `orbitmap intent list|show|create|update|link|unlink`\n (`show` embeds the context bundle \u2014 `--no-bundle` strips it, `--slim` is the\n freshness probe, `--no-logs` skips the log tail)\n- Documents: `orbitmap docs`, `orbitmap doc <slug> [--section \"## H\"|--full]`,\n `orbitmap doc-import`, `orbitmap doc-update`\n\n## Error handling\n- If OrbitMap is unreachable (network down / workspace directory unavailable), inform\n the user and continue the primary work without logging. Do NOT retry failed orbitmap\n calls in a loop \u2014 report the issue and proceed with the task.";
37
+ export declare const SKILL_EXECUTE_FRONTMATTER = "---\nname: orbitmap-execute\ndescription: >\n Executing OrbitMap work \u2014 the fourth gate of the product-building flow. Two flows:\n \"execute IN-x\" delivers a whole planned intent in the background (parallel worker\n waves, per-task tests, the intent test, an impact pass against a baseline, a\n goal-based fix loop, everything ending in_review on an intent branch \u2014 merging stays\n the user's), and \"work on TS-x\" runs a single tracked task (starting/resuming,\n logging, finishing with the correct status, git branches and delivery status). Use\n whenever executing a planned intent or implementing, resuming, or finishing a\n tracked task. Requires the `orbitmap` core skill.\n---";
38
38
  export declare const SKILL_EXECUTE_BODY: string;
39
39
  export declare const SKILL_EXECUTE_REFERENCES: Readonly<Record<string, string>>;
40
- export declare const SKILL_PLAN_FRONTMATTER = "---\nname: orbitmap-plan\ndescription: >\n Planning an intent's design into executable tasks in OrbitMap \u2014 the third gate of the\n product-building flow (after design). Decomposes the agreed design into Orb-hierarchy\n tasks that provably cover the intent: tests per task + an intent-level test, a coverage\n hard-gate, correct-area placement, self-contained context/doc-grounded agent_instructions,\n cross-task notes in the intent plan field, and a doc-update-after-green step; then creates\n the tasks and hands off to orbitmap-execute. Use for \"plan this intent\", \"break this down\n into tasks\", an intent entering `plan` status \u2014 and for general planning (missions,\n intents, promoting ideas, triaging issues).\n---";
40
+ export declare const SKILL_PLAN_FRONTMATTER = "---\nname: orbitmap-plan\ndescription: >\n Planning an intent's design into executable tasks in OrbitMap \u2014 the third gate of the\n product-building flow (after design). Decomposes the agreed design into Orb-hierarchy\n tasks that provably cover the intent: tests per task + an intent-level test, a coverage\n hard-gate, correct-area placement, self-contained context/doc-grounded agent_instructions,\n cross-task notes in the intent plan field, and a doc-update-after-green step; then creates\n the tasks and hands off to orbitmap-execute. Use for \"plan this intent\", \"break this down\n into tasks\", an intent entering `plan` status \u2014 and for general planning (missions,\n intents, promoting ideas, triaging issues). Requires the `orbitmap` core skill.\n---";
41
41
  export declare const SKILL_PLAN_BODY: string;
42
- export declare const SKILL_BRAINSTORM_FRONTMATTER = "---\nname: orbitmap-brainstorm\ndescription: >\n Brainstorming an idea into an agreed outcome in OrbitMap \u2014 the first gate of the\n product-building flow, run as a natural thinking-partner conversation. You MUST use this\n before any creative work \u2014 creating features, building components, adding functionality,\n or modifying behavior. It explores intent, requirements and constraints one question at a\n time until the outcome is AGREED, writes that outcome to the intent's outcome field, and\n files useful asides to the design (and, when relevant, plan) fields for the later gates.\n Use for \"I have an idea\", \"brainstorm this\", \"let's think through X\", \"what should we\n build/do about X\", shaping an intent's outcome, or an intent at `new` status.\n---";
42
+ export declare const SKILL_BRAINSTORM_FRONTMATTER = "---\nname: orbitmap-brainstorm\ndescription: >\n Brainstorming an idea into an agreed outcome in OrbitMap \u2014 the first gate of the\n product-building flow, run as a natural thinking-partner conversation. You MUST use this\n before any creative work \u2014 creating features, building components, adding functionality,\n or modifying behavior. It explores intent, requirements and constraints one question at a\n time until the outcome is AGREED, writes that outcome to the intent's outcome field, and\n files useful asides to the design (and, when relevant, plan) fields for the later gates.\n Use for \"I have an idea\", \"brainstorm this\", \"let's think through X\", \"what should we\n build/do about X\", shaping an intent's outcome, or an intent at `new` status. Requires\n the `orbitmap` core skill.\n---";
43
43
  export declare const SKILL_BRAINSTORM_BODY: string;
44
- export declare const SKILL_DESIGN_FRONTMATTER = "---\nname: orbitmap-design\ndescription: >\n Designing an intent's solution in OrbitMap \u2014 the second gate of the product-building\n flow (after brainstorm): turns an agreed outcome into an approach,\n technical spec, and UX (when there's UI), one question at a time, then writes the\n result to the intent's design field. Use for \"design this intent\", \"let's design X\", or\n an intent entering `design` status. Use it once the outcome is agreed; if the outcome is\n still missing or vague, step aside to `orbitmap-brainstorm` first.\n---";
44
+ export declare const SKILL_DESIGN_FRONTMATTER = "---\nname: orbitmap-design\ndescription: >\n Designing an intent's solution in OrbitMap \u2014 the second gate of the product-building\n flow (after brainstorm): turns an agreed outcome into an approach,\n technical spec, and UX (when there's UI), one question at a time, then writes the\n result to the intent's design field. Use for \"design this intent\", \"let's design X\", or\n an intent entering `design` status. Use it once the outcome is agreed; if the outcome is\n still missing or vague, step aside to `orbitmap-brainstorm` first. Requires the\n `orbitmap` core skill.\n---";
45
45
  export declare const SKILL_DESIGN_BODY: string;
46
- export declare const SKILL_DOCS_FRONTMATTER = "---\nname: orbitmap-docs\ndescription: >\n Reading and updating OrbitMap documents (specs, architecture, guides, decisions).\n Use when the user asks to read, import, or update project documentation tracked in\n OrbitMap.\n---";
47
- export declare const SKILL_DOCS_BODY = "# OrbitMap documents\n\nDocuments are workspace-level: exactly ONE copy per workspace, never per-area. No document\ncommand takes an area, and their metadata (slug, when to use) already rides the context\npayload your session focus was matched from (see Session focus in the `orbitmap` skill \u2014\nensure, don't re-call).\n\n## Goal\nRead and update OrbitMap documents efficiently: pull only the context you need (TOC \u2192\nsection \u2192 full, never dump a whole doc into the conversation), and make every change\nthrough the CLI \u2014 never by editing the workspace files directly.\n\n**Interface:** every action below is an OrbitMap operation \u2014 run the `orbitmap` CLI command\nshown, or its equivalent MCP tool when this session uses MCP; `orbitmap <cmd> --help` and the\nMCP tool schemas are the authority. Never edit the workspace data files directly.\n\n## Choosing what to read\n`orbitmap docs` lists documents with their `context` (when the doc is relevant) and\n`sections_count`. Use context to pick the right document; use sections_count to decide\nwhether to fetch the TOC first (many sections) or go straight to full.\n\n## Token-efficient reading flow\n1. `orbitmap doc <slug>` \u2192 context + table of contents (cheap).\n2. `orbitmap doc <slug> --section \"## Auth\"` \u2192 just that section.\n3. `orbitmap doc <slug> --full` \u2192 full content (expensive \u2014 last resort).\nUse the lightest mode that answers your question. When the CLI reports a local file path\nfor the full content, read that file instead of printing the content into the\nconversation.\n\n## Editing\n- Import a new document: `orbitmap doc-import <file.md> --title \"\u2026\" --type\n spec|architecture|api|guide|decision|changelog|other [--context \"\u2026\"]`.\n- Update: `orbitmap doc-update <slug> --file <file.md>` (replaces content, bumps\n version).\n- To change an OrbitMap document, ALWAYS go through these commands \u2014 NEVER edit files\n inside the OrbitMap workspace/cache directories directly.\n\n## Editing safely \u2014 documents have NO revert (known server defects: IS-8wwkb9)\n- Prefer section ops (`doc-patch --replace-section/--insert-section`); use line-based\n ops only when no section op can express the change \u2014 line coordinates are shifted\n server-side assuming ASCENDING order, and blank edges of op content get trimmed.\n- The section parser is not fence-aware: a line-start `#` INSIDE a code block is taken\n for a heading and becomes a section boundary. Keep code-block comments inline\n (`cmd # comment`), and check target sections for this hazard BEFORE replacing them.\n- Never read a document between a `doc-update` upload and its confirm \u2014 a cached read\n makes the confirm silently re-save the OLD content while still bumping the version.\n- After ANY write, re-read the changed section (or TOC for structure) and verify the\n result actually matches what you sent. A bumped version number is not proof.";
46
+ export declare const SKILL_DOCS_FRONTMATTER = "---\nname: orbitmap-docs\ndescription: >\n Reading and updating OrbitMap documents (specs, architecture, guides, decisions).\n Use when the user asks to read, import, or update project documentation tracked in\n OrbitMap. Requires the `orbitmap` core skill.\n---";
47
+ export declare const SKILL_DOCS_BODY = "# OrbitMap documents\n\nDocuments live at area or workspace level: `orbitmap docs` lists every document you can\nreach \u2014 your areas' documents plus the workspace-level ones \u2014 and their metadata (slug,\nwhen to use) already rides the context payload your session focus was matched from (see\nSession focus in the `orbitmap` skill \u2014 ensure, don't re-call).\n\n## Goal\nRead and update OrbitMap documents efficiently: pull only the context you need (TOC \u2192\nsection \u2192 full, never dump a whole doc into the conversation), and make every change\nthrough the CLI \u2014 never by editing the workspace files directly.\n\n**Interface:** every action below is an OrbitMap operation \u2014 run the `orbitmap` CLI command\nshown, or its equivalent MCP tool when this session uses MCP; `orbitmap <cmd> --help` and the\nMCP tool schemas are the authority. Never edit the workspace data files directly.\n\n## Choosing what to read\n`orbitmap docs` lists documents with their `context` (when the doc is relevant) and\n`sections_count`. Use context to pick the right document; use sections_count to decide\nwhether to fetch the TOC first (many sections) or go straight to full.\n\n## Token-efficient reading flow\n1. `orbitmap doc <slug>` \u2192 context + table of contents (cheap).\n2. `orbitmap doc <slug> --section \"## Auth\"` \u2192 just that section.\n3. `orbitmap doc <slug> --full` \u2192 full content (expensive \u2014 last resort).\nUse the lightest mode that answers your question. When the CLI reports a local file path\nfor the full content, read that file instead of printing the content into the\nconversation.\n\n## Editing\n- Import a new document: `orbitmap doc-import <title> --file <file.md> --type\n spec|architecture|api|guide|decision|changelog|other [--context \"\u2026\"]`. It lands\n area-level, resolved from the current directory; add `--workspace-id <slug-or-uuid>`\n to create it workspace-level instead.\n- Update: `orbitmap doc-update <slug> --file <file.md>` (replaces content, bumps\n version).\n- To change an OrbitMap document, ALWAYS go through these commands \u2014 NEVER edit files\n inside the OrbitMap workspace/cache directories directly.\n\n## Editing safely \u2014 documents have NO revert (known server defects: IS-8wwkb9)\n- Prefer section ops (`doc-patch --replace-section/--insert-section`); use line-based\n ops only when no section op can express the change \u2014 line coordinates are shifted\n server-side assuming ASCENDING order, and blank edges of op content get trimmed.\n- The section parser is not fence-aware: a line-start `#` INSIDE a code block is taken\n for a heading and becomes a section boundary. Keep code-block comments inline\n (`cmd # comment`), and check target sections for this hazard BEFORE replacing them.\n- Never read a document between a `doc-update` upload and its confirm \u2014 a cached read\n makes the confirm silently re-save the OLD content while still bumping the version.\n- After ANY write, re-read the changed section (or TOC for structure) and verify the\n result actually matches what you sent. A bumped version number is not proof.";
48
48
  export interface SkillDef {
49
49
  /** Skill name = directory name under `.claude/skills/`. */
50
50
  name: string;
@@ -67,7 +67,7 @@ export interface SkillDef {
67
67
  references?: Readonly<Record<string, string>>;
68
68
  }
69
69
  export declare const SKILLS: readonly SkillDef[];
70
- export declare const THIN_HOOK_CLAUDE = "## OrbitMap\n\nWork is tracked in OrbitMap via the `orbitmap` CLI. You work in a WORKSPACE, which can span\nseveral repositories: each repo is an AREA, while missions, intents and documents belong to\nthe workspace itself, not to any one repo.\nLoad the OrbitMap skills whenever the user wants to build, add, change or fix something, in\nwhatever words they use \u2014 do not wait for OrbitMap vocabulary. Load them too when they talk\nabout tracking work (backlog, tasks, missions, intents, ideas, issues, documents, planning).\nNothing gets built before it is framed: a feature, component or behaviour change gets an intent\n\u2014 outcome (brainstorm) \u2192 design \u2192 plan \u2192 build (execute), one gate at a time, written to the\nintent as you go. Small self-contained work (a typo, an obvious one-file fix) is just a task.\nNEVER finish a task, intent or mission without a final `orbitmap log` entry and a status update;\nthe final entry closes a record that already exists. Finished work defaults to `in_review`, not `done`.\nOrbitMap tool responses may carry an Instructions section \u2014 act on it before continuing.";
70
+ export declare const THIN_HOOK_CLAUDE = "## OrbitMap\n\nWork is tracked in OrbitMap via the `orbitmap` CLI. You work in a WORKSPACE, which can span\nseveral repositories: each repo is an AREA, while missions, intents and documents belong to\nthe workspace itself, not to any one repo.\nLoad the OrbitMap skills whenever the user wants to build, add, change or fix something, in\nwhatever words they use \u2014 do not wait for OrbitMap vocabulary. Load them too when they talk\nabout tracking work (backlog, tasks, missions, intents, ideas, issues, documents, planning).\nLoad the core skill 'orbitmap' first, before any other orbitmap-* skill \u2014 they all build on it.\nNothing gets built before it is framed: a feature, component or behaviour change gets an intent\n\u2014 outcome (brainstorm) \u2192 design \u2192 plan \u2192 build (execute), one gate at a time, written to the\nintent as you go. Small self-contained work (a typo, an obvious one-file fix) is just a task.\nNEVER finish a task, intent or mission without a final `orbitmap log` entry and a status update;\nthe final entry closes a record that already exists. Finished work defaults to `in_review`, not `done`.\nOrbitMap tool responses may carry an Instructions section \u2014 act on it before continuing.";
71
71
  export declare const THIN_HOOK_GENERIC = "## OrbitMap\n\nWork is tracked in OrbitMap via the `orbitmap` CLI. You work in a WORKSPACE, which can span\nseveral repositories: each repo is an AREA, while missions, intents and documents belong to\nthe workspace itself, not to any one repo.\nFollow the sections below whenever the user wants to build, add, change or fix something, in\nwhatever words they use \u2014 do not wait for OrbitMap vocabulary. Follow them too when they talk\nabout tracking work (backlog, tasks, missions, intents, ideas, issues, documents, planning).\nNothing gets built before it is framed: a feature, component or behaviour change gets an intent\n\u2014 outcome (brainstorm) \u2192 design \u2192 plan \u2192 build (execute), one gate at a time, written to the\nintent as you go. Small self-contained work (a typo, an obvious one-file fix) is just a task.\nNEVER finish a task, intent or mission without a final `orbitmap log` entry and a status update;\nthe final entry closes a record that already exists. Finished work defaults to `in_review`, not `done`.\nOrbitMap tool responses may carry an Instructions section \u2014 act on it before continuing.";
72
72
  /** Build one SKILL.md file (frontmatter + body) for Claude. */
73
73
  export declare function buildSkillFile(skill: SkillDef): string;
@@ -174,9 +174,12 @@ ${c}task records why every decision was made and never what was built.`;
174
174
  export const SKILL_ORBITMAP_FRONTMATTER = `---
175
175
  name: orbitmap
176
176
  description: >
177
- OrbitMap project management via the orbitmap CLI. Use when the user mentions OrbitMap,
178
- orbit, tasks, backlog, missions, intents, ideas, issues, vibes, or asks to track,
179
- plan, or log work. Entry point: object model, context resolution, command reference.
177
+ OrbitMap project management via the orbitmap CLI the entry point other orbitmap-*
178
+ skills require. Use whenever the user wants to build, add, change or fix something, in
179
+ whatever words they use do not wait for OrbitMap vocabulary — as well as when they
180
+ mention OrbitMap, orbit, tasks, backlog, missions, intents, ideas, issues, vibes, or ask
181
+ to track, plan, or log work. Covers the object model, context resolution, and command
182
+ reference.
180
183
  ---`;
181
184
  export const SKILL_ORBITMAP_BODY = `# OrbitMap CLI — core
182
185
 
@@ -197,10 +200,9 @@ MCP tool schemas are the authority. Never edit the workspace data files directly
197
200
  ## General behaviour
198
201
  - Always prioritise the user's direct request. If the user asks you to do something
199
202
  (read a file, write code, answer a question), handle that first.
200
- - Only interact with OrbitMap when the user explicitly asks you to (e.g. "check my
201
- tasks", "start a task", "what's on my backlog", "log this idea").
202
203
  - When the user mentions OrbitMap, orbit, task, backlog, or project-management concepts
203
- in the context of tracking work, use \`orbitmap\` commands to handle the request.
204
+ in the context of tracking work — in whatever words they use — use \`orbitmap\` commands
205
+ to handle the request.
204
206
 
205
207
  ## Object model
206
208
  - Workspace = team level. Area = repo-level scope (formerly Project) — tasks, vibes and
@@ -210,6 +212,14 @@ MCP tool schemas are the authority. Never edit the workspace data files directly
210
212
  outside a task. Task (TS-) = unit of work.
211
213
  - Entity numbers (TS-xxxxxx etc.) are accepted by every command that takes an id.
212
214
 
215
+ ## Naming workitems in output
216
+ Refer to a workitem by its NAME together with its key, at first mention in any message,
217
+ summary or report — "Align skills and validators (IN-b2h63q)". NEVER a bare key: a key
218
+ alone is unreadable to the user, who tracks the work by name. Keep no key-to-name mapping
219
+ anywhere — not in a file, not in memory. Every list, \`show\` and context response already
220
+ pairs the two, so take the name from the response you already have; if you do not have it,
221
+ fetch the item rather than emitting the key on its own.
222
+
213
223
  ${SESSION_FOCUS_SECTION}
214
224
 
215
225
  ${FRESHNESS_SECTION}
@@ -222,10 +232,9 @@ ${FRESHNESS_SECTION}
222
232
  lists and no bodies — fetch deeper on demand (\`orbitmap intent show IN-x\`,
223
233
  \`orbitmap tasks --intent IN-x\`, \`orbitmap doc <slug>\`). Never list areas and never
224
234
  ask the user "which area?" before you have read it.
225
- - You work in a WORKSPACE, not inside a single area. Missions, intents
226
- and documents are workspace-level and take no area a document is exactly ONE copy,
227
- global to the workspace, never per-area. Tasks, vibes, issues and ideas are
228
- AREA-scoped.
235
+ - You work in a WORKSPACE, not inside a single area. Missions and intents are
236
+ workspace-level and take no area. Documents live at area OR workspace level.
237
+ Tasks, vibes, issues and ideas are AREA-scoped.
229
238
  - Missions and intents outrank individual tasks. Asked to work on "what matters", take the
230
239
  active mission and open intents from context and pick work that serves them.
231
240
  - The area follows from the directory, never from a question to the user:
@@ -281,7 +290,7 @@ backlog, todo, in_progress, in_review, review_changes, done, blocked.
281
290
  - Tasks: \`orbitmap tasks [--status s1,s2] [--intent IN-x]\`, \`orbitmap task TS-x\`,
282
291
  \`orbitmap get <ID>\`,
283
292
  \`orbitmap start [TS-x]\`, \`orbitmap status TS-x <status> [--delivery <d>]\`,
284
- \`orbitmap create "title" [--intent IN-x|--mission MS-x] [--priority p]\`,
293
+ \`orbitmap create "title" [--intent IN-x] [--priority p]\`,
285
294
  \`orbitmap subtask TS-parent "title"\`, \`orbitmap assign TS-x [agent]\`,
286
295
  \`orbitmap dep add|remove TS-a TS-b\`, \`orbitmap log TS-x "msg" --type <t>\`
287
296
  - Issues: \`orbitmap issue register|list|show|status|resolve\`
@@ -309,7 +318,7 @@ description: >
309
318
  the user's), and "work on TS-x" runs a single tracked task (starting/resuming,
310
319
  logging, finishing with the correct status, git branches and delivery status). Use
311
320
  whenever executing a planned intent or implementing, resuming, or finishing a
312
- tracked task.
321
+ tracked task. Requires the \`orbitmap\` core skill.
313
322
  ---`;
314
323
  export const SKILL_EXECUTE_BODY = `# Executing OrbitMap work
315
324
 
@@ -430,7 +439,10 @@ MCP tool schemas are the authority. Never edit the workspace data files directly
430
439
  branch — the intent branch is named in the report, not left underfoot. Report in
431
440
  chat: what shipped, what was decided, what is blocked and why, deviations from the
432
441
  plan, gate results vs baseline. Write ONE resume
433
- point: \`orbitmap log IN-x "Resume point: …" --type note\`. Then end the run:
442
+ point: \`orbitmap log IN-x "Resume point: …" --type note\`. Before the transition, run
443
+ \`orbitmap intent show IN-x --slim\` and verify every task is \`in_review\`, \`done\`, or
444
+ \`blocked\` with a logged blocker — an \`in_progress\` task means a fold step was
445
+ skipped; fix it before moving on. Then end the run:
434
446
  \`orbitmap intent update IN-x --status in_review --log <entries>\` — the transition's
435
447
  response carries an Instructions section (it will ask for release notes); FOLLOW it.
436
448
  Merging and closing to \`done\` are the USER'S. The merge EVENT — whoever performs
@@ -652,7 +664,7 @@ description: >
652
664
  cross-task notes in the intent plan field, and a doc-update-after-green step; then creates
653
665
  the tasks and hands off to orbitmap-execute. Use for "plan this intent", "break this down
654
666
  into tasks", an intent entering \`plan\` status — and for general planning (missions,
655
- intents, promoting ideas, triaging issues).
667
+ intents, promoting ideas, triaging issues). Requires the \`orbitmap\` core skill.
656
668
  ---`;
657
669
  export const SKILL_PLAN_BODY = `# Planning a design into executable tasks
658
670
 
@@ -776,8 +788,10 @@ ${worklogKeepDropTest(' ')}
776
788
  add or fix tasks and re-check. Do NOT proceed while a gap remains.
777
789
  7. Write cross-task PLANNING NOTES + a short SUMMARY to the intent \`plan\` field —
778
790
  \`orbitmap intent update IN-x --plan "<notes>"\`: decisions valid for all tasks,
779
- sequencing rationale, and the coverage argument. This REPLACES any seed notes that were
780
- in the field you have already absorbed them.
791
+ sequencing rationale, and the coverage argument. AUTHOR THE FIELD AS: a summary
792
+ paragraph first, then a line containing only \`---\`, then the body. The server reads the
793
+ part before \`---\` as the field's TL;DR and flags a field written without one.
794
+ This REPLACES any seed notes that were in the field — you have already absorbed them.
781
795
  8. Ensure a final DOC-UPDATE task exists: after the implementation is done and all tests
782
796
  are green, update the OrbitMap documentation (see the \`orbitmap-docs\` skill).
783
797
  9. SELF-REVIEW the plan with fresh eyes (see the Self-review section) and fix issues inline.
@@ -868,12 +882,15 @@ triaging issues):
868
882
  - **Missions:** \`orbitmap mission list|show MS-x\`; \`orbitmap mission create "name"
869
883
  [--outcome "…"] [--start d] [--end d]\`; \`orbitmap mission status MS-x
870
884
  active|completed|cancelled\` (activating fails while another is active — complete/cancel
871
- it first); \`orbitmap mission link|unlink MS-x IN-y|TS-y|IS-y|ID-y\`. A mission status
885
+ it first); \`orbitmap mission link|unlink MS-x --type task|issue|idea|intent --id <uuid>\`
886
+ (the linked object goes by UUID — this endpoint rejects display numbers). A mission status
872
887
  change takes the same repeatable \`--log <type>:<content>\` and is refused (422) without
873
888
  at least one entry — \`cancelled\` above all needs its \`decision:"<why abandoned>"\`.
874
889
  \`orbitmap log MS-x "…" --type …\` logs against a mission outside a transition.
875
- - **Intents:** \`orbitmap intent create "name" [--outcome "…"] [--design "…"] [--plan "…"]
876
- [--mission MS-x]\`, statuses new design plan build done (or cancelled). The
890
+ - **Intents:** \`orbitmap intent create "name" [--outcome "…"] [--design "…"] [--plan "…"]\`
891
+ (there is no \`--mission\` flag attach after creation with \`orbitmap mission link MS-x
892
+ --type intent --id <uuid>\`), statuses new → design → plan → build → done (or
893
+ cancelled). The
877
894
  \`outcome\` is the north star, \`design\` the agreed solution, \`plan\` the agreed build
878
895
  plan — produced by the \`orbitmap-brainstorm\` / \`orbitmap-design\` / \`orbitmap-plan\`
879
896
  gates respectively.
@@ -918,7 +935,8 @@ description: >
918
935
  time until the outcome is AGREED, writes that outcome to the intent's outcome field, and
919
936
  files useful asides to the design (and, when relevant, plan) fields for the later gates.
920
937
  Use for "I have an idea", "brainstorm this", "let's think through X", "what should we
921
- build/do about X", shaping an intent's outcome, or an intent at \`new\` status.
938
+ build/do about X", shaping an intent's outcome, or an intent at \`new\` status. Requires
939
+ the \`orbitmap\` core skill.
922
940
  ---`;
923
941
  export const SKILL_BRAINSTORM_BODY = `# Framing an idea into an outcome
924
942
 
@@ -964,6 +982,9 @@ you hand to \`orbitmap-design\` (and, through the plan field, to \`orbitmap-plan
964
982
  ONE question. Prefer proposing a sensible default for the user to correct over an open
965
983
  interrogation. Aim for the few highest-leverage questions — "one question at a time" sets
966
984
  the pace, not the total count.
985
+ - **Answer before asking.** When the user's turn contains a question, answer it first —
986
+ completely — before asking your own. Never return a question with a question; an
987
+ unanswered user question makes every next question feel like an interrogation.
967
988
  - **Lead with a recommendation.** Present options and the outcome conversationally, leading
968
989
  with the option you recommend and WHY — never a flat, neutral menu with no steer.
969
990
  - **YAGNI.** Cut every want that does not serve the outcome; a smaller outcome ships.
@@ -1029,7 +1050,10 @@ ${worklogKeepDropTest(' ')}
1029
1050
  4. Persist (create or refine). Update an existing unprocessed intent, or create one:
1030
1051
  \`orbitmap intent update IN-x --outcome "<agreed outcome>" [--design "<design notes>"] [--plan "<plan notes>"]\`
1031
1052
  / \`orbitmap intent create "<name>" --outcome "<agreed outcome>" [--design "…"] [--plan "…"]\`.
1032
- The agreed **outcome** goes in the outcome field. Route the captured notes by type
1053
+ The agreed **outcome** goes in the outcome field. AUTHOR EVERY FIELD THE SAME WAY: a
1054
+ summary paragraph first, then a line containing only \`---\`, then the body. The server
1055
+ reads the part before \`---\` as the field's TL;DR and flags a field written without one.
1056
+ Route the captured notes by type —
1033
1057
  HOW / tech / UX → the **design** field; build-order / task ideas / execution risks → the
1034
1058
  **plan** field (OPTIONAL — only if the conversation produced any). Mark the user's notes
1035
1059
  as the user's in both fields; you may add your own, kept separate. The design gate reads
@@ -1118,7 +1142,8 @@ description: >
1118
1142
  technical spec, and UX (when there's UI), one question at a time, then writes the
1119
1143
  result to the intent's design field. Use for "design this intent", "let's design X", or
1120
1144
  an intent entering \`design\` status. Use it once the outcome is agreed; if the outcome is
1121
- still missing or vague, step aside to \`orbitmap-brainstorm\` first.
1145
+ still missing or vague, step aside to \`orbitmap-brainstorm\` first. Requires the
1146
+ \`orbitmap\` core skill.
1122
1147
  ---`;
1123
1148
  export const SKILL_DESIGN_BODY = `# Designing an intent's solution
1124
1149
 
@@ -1162,6 +1187,9 @@ holds a real design doc instead of raw notes, treat it as existing design to ref
1162
1187
  ONE question. Prefer proposing a sensible default for the user to correct over an open
1163
1188
  interrogation. Aim for the few highest-leverage questions — "one question at a time" sets
1164
1189
  the pace, not the total count.
1190
+ - **Answer before asking.** When the user's turn contains a question, answer it first —
1191
+ completely — before asking your own. Never return a question with a question; an
1192
+ unanswered user question makes every next question feel like an interrogation.
1165
1193
  - **Lead with a recommendation.** When you propose approaches or technical options, lead
1166
1194
  with the one you recommend and WHY — never a flat, neutral menu with no steer.
1167
1195
  - **YAGNI.** Cut every part of the design that does not serve the outcome; a smaller
@@ -1248,7 +1276,10 @@ ${worklogKeepDropTest(' ')}
1248
1276
  5. Present the draft in sections scaled to their complexity (a few sentences when simple,
1249
1277
  more when nuanced); after each section ask whether it looks right, and get the user's
1250
1278
  approval before writing anything.
1251
- 6. Write it: \`orbitmap intent update IN-x --design "<doc>"\`. This REPLACES any framing
1279
+ 6. Write it: \`orbitmap intent update IN-x --design "<doc>"\`. AUTHOR THE FIELD AS: a
1280
+ summary paragraph first, then a line containing only \`---\`, then the body. The server
1281
+ reads the part before \`---\` as the field's TL;DR and flags a field written without one.
1282
+ This REPLACES any framing
1252
1283
  notes that were in the field — you have already absorbed them into the doc. When the
1253
1284
  spec names the repos the build will touch, declare them on the intent in the same
1254
1285
  update — \`--areas <slug>,<slug>\` — so session-focus matching works from declared data.
@@ -1346,14 +1377,14 @@ name: orbitmap-docs
1346
1377
  description: >
1347
1378
  Reading and updating OrbitMap documents (specs, architecture, guides, decisions).
1348
1379
  Use when the user asks to read, import, or update project documentation tracked in
1349
- OrbitMap.
1380
+ OrbitMap. Requires the \`orbitmap\` core skill.
1350
1381
  ---`;
1351
1382
  export const SKILL_DOCS_BODY = `# OrbitMap documents
1352
1383
 
1353
- Documents are workspace-level: exactly ONE copy per workspace, never per-area. No document
1354
- command takes an area, and their metadata (slug, when to use) already rides the context
1355
- payload your session focus was matched from (see Session focus in the \`orbitmap\` skill —
1356
- ensure, don't re-call).
1384
+ Documents live at area or workspace level: \`orbitmap docs\` lists every document you can
1385
+ reach your areas' documents plus the workspace-level ones — and their metadata (slug,
1386
+ when to use) already rides the context payload your session focus was matched from (see
1387
+ Session focus in the \`orbitmap\` skill — ensure, don't re-call).
1357
1388
 
1358
1389
  ## Goal
1359
1390
  Read and update OrbitMap documents efficiently: pull only the context you need (TOC →
@@ -1378,8 +1409,10 @@ for the full content, read that file instead of printing the content into the
1378
1409
  conversation.
1379
1410
 
1380
1411
  ## Editing
1381
- - Import a new document: \`orbitmap doc-import <file.md> --title "…" --type
1382
- spec|architecture|api|guide|decision|changelog|other [--context "…"]\`.
1412
+ - Import a new document: \`orbitmap doc-import <title> --file <file.md> --type
1413
+ spec|architecture|api|guide|decision|changelog|other [--context "…"]\`. It lands
1414
+ area-level, resolved from the current directory; add \`--workspace-id <slug-or-uuid>\`
1415
+ to create it workspace-level instead.
1383
1416
  - Update: \`orbitmap doc-update <slug> --file <file.md>\` (replaces content, bumps
1384
1417
  version).
1385
1418
  - To change an OrbitMap document, ALWAYS go through these commands — NEVER edit files
@@ -1439,6 +1472,7 @@ the workspace itself, not to any one repo.
1439
1472
  Load the OrbitMap skills whenever the user wants to build, add, change or fix something, in
1440
1473
  whatever words they use — do not wait for OrbitMap vocabulary. Load them too when they talk
1441
1474
  about tracking work (backlog, tasks, missions, intents, ideas, issues, documents, planning).
1475
+ Load the core skill 'orbitmap' first, before any other orbitmap-* skill — they all build on it.
1442
1476
  Nothing gets built before it is framed: a feature, component or behaviour change gets an intent
1443
1477
  — outcome (brainstorm) → design → plan → build (execute), one gate at a time, written to the
1444
1478
  intent as you go. Small self-contained work (a typo, an obvious one-file fix) is just a task.
@@ -1 +1 @@
1
- {"version":3,"file":"agent-instructions.js","sourceRoot":"","sources":["../src/agent-instructions.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"agent-instructions.js","sourceRoot":"","sources":["../src/agent-instructions.ts"],"names":[],"mappings":"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"}
@@ -11,5 +11,6 @@ export declare function createCommand(title: string, options: {
11
11
  instructions?: string;
12
12
  fromIssue?: string;
13
13
  intent?: string;
14
+ mission?: string;
14
15
  orbit?: string;
15
16
  }): Promise<void>;
@@ -1,15 +1,25 @@
1
1
  import { createAdapter } from '../adapters/factory.js';
2
2
  import { confirmWriteTarget } from '../write-target.js';
3
- import { formatOutput, printError, printSuccess } from '../output.js';
3
+ import { formatOutput, printError, printSuccess, printValidationError } from '../output.js';
4
4
  export async function createCommand(title, options) {
5
+ // Mutually exclusive by design (TS-bh8d25): a task under an intent reaches its
6
+ // mission THROUGH the intent, so the server rejects both together with a 422.
7
+ // Rejecting here — before the write-target prompt and before any request — turns
8
+ // that round trip into an immediate, actionable message.
9
+ if (options.intent && options.mission) {
10
+ printValidationError('--intent and --mission are mutually exclusive — a task under an intent reaches ' +
11
+ 'the mission through the intent. Provide only one (or set the mission on the intent).', options.json);
12
+ return;
13
+ }
5
14
  try {
6
15
  await confirmWriteTarget('create task', options);
7
16
  const client = await createAdapter(options.area);
8
- // Every object reference below — the issue, the intent, the orbit, the agent — travels
9
- // VERBATIM. `POST /tasks` validates `source_issue_id`, `intent_id`, `orbit_id` and
10
- // `agent_id` with `App\Rules\EntityRef` (shape only) and resolves the uuid / display
11
- // number / bare code / slug server-side (TS-av6332), answering 404 ISSUE_NOT_FOUND,
12
- // INTENT_NOT_FOUND, ORBIT_NOT_FOUND or AGENT_NOT_FOUND when the reference is unknown.
17
+ // Every object reference below — the issue, the intent, the mission, the orbit, the
18
+ // agent — travels VERBATIM. `POST /tasks` validates `source_issue_id`, `intent_id`,
19
+ // `mission_id`, `orbit_id` and `agent_id` with `App\Rules\EntityRef` (shape only) and
20
+ // resolves the uuid / display number / bare code / slug server-side (TS-av6332),
21
+ // answering 404 ISSUE_NOT_FOUND, INTENT_NOT_FOUND, MISSION_NOT_FOUND, ORBIT_NOT_FOUND
22
+ // or AGENT_NOT_FOUND when the reference is unknown.
13
23
  // Resolving any of them here would duplicate server logic and cost an extra round trip —
14
24
  // which is exactly what `--from-issue` used to pay for a `GET /issues/{id_or_number}`.
15
25
  const response = (await client.createTask({
@@ -23,6 +33,7 @@ export async function createCommand(title, options) {
23
33
  agent_instructions: options.instructions,
24
34
  source_issue_id: options.fromIssue,
25
35
  intent_id: options.intent,
36
+ mission_id: options.mission,
26
37
  orbit_id: options.orbit,
27
38
  }));
28
39
  if (options.json) {
@@ -1 +1 @@
1
- {"version":3,"file":"create.js","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAoBtE,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,KAAa,EACb,OAcC;IAED,IAAI,CAAC;QACH,MAAM,kBAAkB,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;QACjD,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAEjD,uFAAuF;QACvF,mFAAmF;QACnF,qFAAqF;QACrF,oFAAoF;QACpF,sFAAsF;QACtF,yFAAyF;QACzF,uFAAuF;QACvF,MAAM,QAAQ,GAAG,CAAC,MAAM,MAAM,CAAC,UAAU,CAAC;YACxC,KAAK;YACL,WAAW,EAAE,OAAO,CAAC,IAAI;YACzB,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,gBAAgB,EAAE,OAAO,CAAC,MAAM;YAChC,QAAQ,EAAE,OAAO,CAAC,OAAO;YACzB,WAAW,EAAE,OAAO,CAAC,MAAM;YAC3B,kBAAkB,EAAE,OAAO,CAAC,YAAY;YACxC,eAAe,EAAE,OAAO,CAAC,SAAS;YAClC,SAAS,EAAE,OAAO,CAAC,MAAM;YACzB,QAAQ,EAAE,OAAO,CAAC,KAAK;SACxB,CAAC,CAAmB,CAAC;QAEtB,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC;YAC1C,OAAO;QACT,CAAC;QAED,MAAM,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC;QACxB,IAAI,GAAG,GAAG,iBAAiB,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,cAAc,IAAI,CAAC,CAAC,WAAW,MAAM,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,QAAQ,GAAG,CAAC;QACzG,yFAAyF;QACzF,wFAAwF;QACxF,yFAAyF;QACzF,qDAAqD;QACrD,IAAI,CAAC,CAAC,mBAAmB,EAAE,CAAC;YAC1B,GAAG,IAAI,qBAAqB,CAAC,CAAC,mBAAmB,IAAI,OAAO,CAAC,SAAS,sBAAsB,CAAC;QAC/F,CAAC;QACD,IAAI,CAAC,CAAC,oBAAoB,EAAE,CAAC;YAC3B,GAAG,IAAI,cAAc,CAAC,CAAC,oBAAoB,EAAE,CAAC;QAChD,CAAC;QACD,IAAI,CAAC,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC;YACxB,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,CAAC;gBAC5B,GAAG,IAAI,cAAc,CAAC,EAAE,CAAC;YAC3B,CAAC;QACH,CAAC;QACD,YAAY,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC3B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,UAAU,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QAChC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"create.js","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAoB5F,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,KAAa,EACb,OAeC;IAED,+EAA+E;IAC/E,8EAA8E;IAC9E,iFAAiF;IACjF,yDAAyD;IACzD,IAAI,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACtC,oBAAoB,CAClB,iFAAiF;YAC/E,sFAAsF,EACxF,OAAO,CAAC,IAAI,CACb,CAAC;QACF,OAAO;IACT,CAAC;IAED,IAAI,CAAC;QACH,MAAM,kBAAkB,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;QACjD,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAEjD,oFAAoF;QACpF,oFAAoF;QACpF,sFAAsF;QACtF,iFAAiF;QACjF,sFAAsF;QACtF,oDAAoD;QACpD,yFAAyF;QACzF,uFAAuF;QACvF,MAAM,QAAQ,GAAG,CAAC,MAAM,MAAM,CAAC,UAAU,CAAC;YACxC,KAAK;YACL,WAAW,EAAE,OAAO,CAAC,IAAI;YACzB,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,gBAAgB,EAAE,OAAO,CAAC,MAAM;YAChC,QAAQ,EAAE,OAAO,CAAC,OAAO;YACzB,WAAW,EAAE,OAAO,CAAC,MAAM;YAC3B,kBAAkB,EAAE,OAAO,CAAC,YAAY;YACxC,eAAe,EAAE,OAAO,CAAC,SAAS;YAClC,SAAS,EAAE,OAAO,CAAC,MAAM;YACzB,UAAU,EAAE,OAAO,CAAC,OAAO;YAC3B,QAAQ,EAAE,OAAO,CAAC,KAAK;SACxB,CAAC,CAAmB,CAAC;QAEtB,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC;YAC1C,OAAO;QACT,CAAC;QAED,MAAM,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC;QACxB,IAAI,GAAG,GAAG,iBAAiB,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,cAAc,IAAI,CAAC,CAAC,WAAW,MAAM,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,QAAQ,GAAG,CAAC;QACzG,yFAAyF;QACzF,wFAAwF;QACxF,yFAAyF;QACzF,qDAAqD;QACrD,IAAI,CAAC,CAAC,mBAAmB,EAAE,CAAC;YAC1B,GAAG,IAAI,qBAAqB,CAAC,CAAC,mBAAmB,IAAI,OAAO,CAAC,SAAS,sBAAsB,CAAC;QAC/F,CAAC;QACD,IAAI,CAAC,CAAC,oBAAoB,EAAE,CAAC;YAC3B,GAAG,IAAI,cAAc,CAAC,CAAC,oBAAoB,EAAE,CAAC;QAChD,CAAC;QACD,IAAI,CAAC,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC;YACxB,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,CAAC;gBAC5B,GAAG,IAAI,cAAc,CAAC,EAAE,CAAC;YAC3B,CAAC;QACH,CAAC;QACD,YAAY,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC3B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,UAAU,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QAChC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC;AACH,CAAC"}
@@ -12,6 +12,19 @@ export declare function ideaShowCommand(idOrNumber: string, options: {
12
12
  json: boolean;
13
13
  area?: string;
14
14
  }): Promise<void>;
15
+ /**
16
+ * `orbitmap idea add` — **the directory decides where the idea lands.**
17
+ *
18
+ * From an area directory the idea belongs to that area; from the workspace root it belongs
19
+ * to the workspace and to no area. Both are legitimate destinations, so neither may be
20
+ * guessed: the command resolves the context itself and sends `scope` explicitly, rather
21
+ * than letting the server infer one from whatever `X-Orbitmap-Area` happens to be set.
22
+ *
23
+ * Two explicit overrides, and they contradict each other: `--area <slug>` names the area,
24
+ * `--workspace` forces workspace level from inside an area directory. `--workspace` does not
25
+ * strip the area header — it does not have to, because `scope: 'workspace'` outranks the
26
+ * header server-side, and that header is also how the server finds *which workspace*.
27
+ */
15
28
  export declare function ideaAddCommand(options: {
16
29
  json: boolean;
17
30
  area?: string;
@@ -20,6 +33,10 @@ export declare function ideaAddCommand(options: {
20
33
  content?: string;
21
34
  title?: string;
22
35
  priority?: string;
36
+ /** `--workspace`: file the idea at workspace level, whatever this directory maps to. */
37
+ workspace?: boolean;
38
+ /** Resolution start directory; defaults to `process.cwd()`. Tests pass this. */
39
+ cwd?: string;
23
40
  }): Promise<void>;
24
41
  export declare function ideaStatusCommand(idOrNumber: string, options: {
25
42
  json: boolean;