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.
- package/LICENSE +21 -21
- package/README.md +9 -9
- package/dist/adapters/cloud.d.ts +16 -1
- package/dist/adapters/cloud.js +13 -2
- package/dist/adapters/cloud.js.map +1 -1
- package/dist/adapters/local/adapter.d.ts +3 -0
- package/dist/adapters/local/adapter.js +3 -1
- package/dist/adapters/local/adapter.js.map +1 -1
- package/dist/adapters/local/entities/planning.d.ts +8 -2
- package/dist/adapters/local/entities/planning.js +34 -3
- package/dist/adapters/local/entities/planning.js.map +1 -1
- package/dist/adapters/local/entities/tasks.d.ts +1 -1
- package/dist/adapters/local/entities/tasks.js +33 -1
- package/dist/adapters/local/entities/tasks.js.map +1 -1
- package/dist/adapters/local/entities/work-items.d.ts +12 -1
- package/dist/adapters/local/entities/work-items.js +42 -13
- package/dist/adapters/local/entities/work-items.js.map +1 -1
- package/dist/adapters/types.d.ts +32 -0
- package/dist/agent-instructions.d.ts +9 -9
- package/dist/agent-instructions.js +64 -30
- package/dist/agent-instructions.js.map +1 -1
- package/dist/commands/create.d.ts +1 -0
- package/dist/commands/create.js +17 -6
- package/dist/commands/create.js.map +1 -1
- package/dist/commands/ideas.d.ts +17 -0
- package/dist/commands/ideas.js +35 -2
- package/dist/commands/ideas.js.map +1 -1
- package/dist/commands/intent.d.ts +22 -0
- package/dist/commands/intent.js +78 -10
- package/dist/commands/intent.js.map +1 -1
- package/dist/commands/mission.d.ts +1 -0
- package/dist/commands/mission.js +1 -1
- package/dist/commands/mission.js.map +1 -1
- package/dist/commands/orbit.d.ts +1 -0
- package/dist/commands/orbit.js +1 -1
- package/dist/commands/orbit.js.map +1 -1
- package/dist/commands/status.d.ts +1 -0
- package/dist/commands/status.js +7 -1
- package/dist/commands/status.js.map +1 -1
- package/dist/errors.d.ts +25 -1
- package/dist/errors.js +10 -2
- package/dist/errors.js.map +1 -1
- package/dist/index.js +50 -13
- package/dist/index.js.map +1 -1
- package/dist/output.js +12 -0
- package/dist/output.js.map +1 -1
- package/dist/work-log.js +8 -0
- package/dist/work-log.js.map +1 -1
- package/dist/write-target.d.ts +13 -3
- package/dist/write-target.js +40 -3
- package/dist/write-target.js.map +1 -1
- package/package.json +1 -1
- package/dist/commands/projects.d.ts +0 -3
- package/dist/commands/projects.js +0 -28
- package/dist/commands/projects.js.map +0 -1
package/dist/adapters/types.d.ts
CHANGED
|
@@ -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
|
|
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
|
|
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
|
|
178
|
-
|
|
179
|
-
|
|
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
|
|
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
|
|
226
|
-
|
|
227
|
-
|
|
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
|
|
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\`.
|
|
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.
|
|
780
|
-
|
|
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
|
|
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
|
-
|
|
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.
|
|
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>"\`.
|
|
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
|
|
1354
|
-
|
|
1355
|
-
payload your session focus was matched from (see
|
|
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> --
|
|
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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"}
|
package/dist/commands/create.js
CHANGED
|
@@ -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
|
|
9
|
-
// VERBATIM. `POST /tasks` validates `source_issue_id`, `intent_id`,
|
|
10
|
-
// `agent_id` with `App\Rules\EntityRef` (shape only) and
|
|
11
|
-
// number / bare code / slug server-side (TS-av6332),
|
|
12
|
-
//
|
|
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;
|
|
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"}
|
package/dist/commands/ideas.d.ts
CHANGED
|
@@ -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;
|