i-plane 1.2.0 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -76,6 +76,10 @@ i-plane update APP-8 --state started
76
76
  i-plane done APP-8
77
77
  ```
78
78
 
79
+ Workspace search returns up to 10 matches by default. Use `i-plane search "text"
80
+ --limit 100` to raise the bound (maximum 1000); output reports when more matches
81
+ exist. JSON search results contain `rows`, `limit` and `hasMore`.
82
+
79
83
  Replace `APP` and `APP-8` with your project and work item references. Add `--json`
80
84
  to any command for its structured result. Exit code `2` means an invalid call;
81
85
  `1` means an API or connection failure.
@@ -83,8 +87,9 @@ to any command for its structured result. Exit code `2` means an invalid call;
83
87
  For supported fields, compatibility details and development checks, see the
84
88
  [capability reference](docs/api-coverage.md).
85
89
 
86
- Pages use a Plane login and password instead of an API token. See the
87
- [page workflow](docs/pages.md) for session setup, block edits and delivery semantics.
90
+ Pages prefer the same API key when the for-plane extension is available. On stock
91
+ Plane, the CLI detects the missing endpoint and uses password sign-in. See
92
+ the [page workflow](docs/pages.md) for setup, block edits and delivery semantics.
88
93
  `i-plane page --help` carries the same command examples into your terminal.
89
94
 
90
95
  ## License
@@ -0,0 +1,2 @@
1
+ var e={flag:"--json",summary:"Print the model behind the output, with every field."},o={flag:"--project",value:"<ref>",summary:"Project by identifier (CLOUD), name, or unique name prefix."},n={...o,required:!0},f=[{flag:"--label",value:"<names>",summary:"Add comma-separated label names or IDs; preserve existing labels. Repeat flags keep the last value."},{flag:"--labels",value:"<names|none>",summary:"Replace all labels with this comma-separated list; none clears them. Cannot combine with --label."},{flag:"--parent",value:"<ID|none>",summary:"Parent work item, such as CLOUD-8; none removes the parent."},{flag:"--assignee",value:"<names|none>",summary:"Replace assignees with comma-separated display names, emails or UUIDs; none clears them."},{flag:"--due",value:"<date|none>",summary:"Due date in YYYY-MM-DD format; none clears it."},{flag:"--start",value:"<date|none>",summary:"Start date in YYYY-MM-DD format; none clears it."}],w={flag:"--color",value:"<#RRGGBB>",summary:"Six-digit hex color. Quote the value, for example '#336699'."},i={flag:"--description",value:"<text>",summary:"Plain-text description; replaces the existing description."},c={flag:"--name",value:"<name>",summary:"New name."},v={flag:"--identifier",value:"<ABC>",summary:"1–12 letters or digits, starting with a letter; normalized to uppercase."},U={flag:"--group",value:"<group>",summary:"backlog, unstarted, started, completed or cancelled."},u={flag:"--yes",required:!0,summary:"Confirm permanent deletion."},O=[{flag:"--intake",summary:"Enable intake; --intake=false disables it."},{flag:"--cycles",summary:"Enable cycles in the project; --cycles=false disables them."},{flag:"--modules",summary:"Enable modules in the project; --modules=false disables them."}],x={flag:"--start",value:"<date>",summary:"Start date in YYYY-MM-DD format."},C={flag:"--end",value:"<date>",summary:"Cycle end date in YYYY-MM-DD format; supply with --start."},I={flag:"--due",value:"<date>",summary:"Target date in YYYY-MM-DD format."},j={flag:"--status",value:"<status>",summary:"pending, rejected, snoozed, accepted or duplicate."},L=[{flag:"--description",value:"<markdown>",summary:"Markdown description; replaces the existing description."},{flag:"--priority",value:"<level>",summary:"urgent, high, medium, low or none."}],R=[{title:"LOOK AROUND",commands:[{name:"summary",maxPositionals:0,summary:"Projects in the workspace and how much is in each.",options:[e],examples:["i-plane summary"],next:["i-plane list <PROJECT>"]},{name:"projects",maxPositionals:0,alias:"ps",summary:"Projects with their identifiers.",options:[e],examples:["i-plane projects"]},{name:"list",maxPositionals:1,alias:"ls",args:"[project]",summary:"Work items of one project, one line each.",options:[{flag:"--state",value:"<name|group>",summary:"Keep one state. Group: backlog, unstarted, started, completed, cancelled."},{flag:"--priority",value:"<level>",summary:"Keep one level: urgent, high, medium, low, none."},{flag:"--limit",value:"<n>",summary:"Show the first n rows; n is a nonnegative integer. The output reports hidden rows."},o,e],examples:["i-plane list CLOUD","i-plane list CLOUD --state started","i-plane list CLOUD --priority urgent"],next:["i-plane show <ID>","i-plane update <ID> --state done"]},{name:"show",maxPositionals:1,args:"<ID>",summary:"One work item with its description as Markdown.",options:[o,{flag:"--comments",summary:"Include the discussion, converted to Markdown."},e],examples:["i-plane show CLOUD-8","i-plane show CLOUD-8 --comments"],next:["i-plane update CLOUD-8 --priority high",'i-plane comment CLOUD-8 "..."']},{name:"search",maxPositionals:null,alias:"find",args:"<text>",summary:"Search work items across the workspace; report whether more matches exist.",options:[{flag:"--limit",value:"<n>",summary:"Show up to n matches (1–1000, default 10); request one extra to detect more."},e],notes:["JSON returns rows, limit and hasMore. Text warns when more matches exist; raise --limit or narrow the query. No total count is inferred."],examples:['i-plane search "resolver"'],next:["i-plane show <ID>"]}]},{title:"CHANGE THINGS",commands:[{name:"create",maxPositionals:null,alias:"new",args:"<title>",summary:"Create a work item.",options:[...f,n,{flag:"--description",value:"<markdown>",summary:"Markdown: headings, code fences with a language, tables, lists, quotes."},{flag:"--priority",value:"<level>",summary:"urgent, high, medium, low, none."},{flag:"--state",value:"<name>",summary:"Starting state; default otherwise."},e],examples:['i-plane create "Fix the resolver" --project CLOUD --priority urgent --description "Observed: stale results. Expected: fresh data."','i-plane create "Prepare the documentation" --project CLOUD --label task --parent CLOUD-8 --due 2026-10-14'],notes:["Use create for work already accepted into the project. Use intake create for a report or idea that still needs a decision.","The title and --project are required. Use the reference returned by create in subsequent show/update commands.","--label adds labels by name; --labels replaces the complete list. Assignees and dates describe the work itself."],next:["i-plane show CLOUD-8 --comments","i-plane update CLOUD-8 --state started"]},{name:"update",maxPositionals:1,alias:"set",args:"<ID>",summary:"Change fields of a work item. Pass at least one flag.",options:[...f,{flag:"--state",value:"<name>",summary:"State by UUID, unique name or group; ambiguous names are rejected."},{flag:"--priority",value:"<level>",summary:"urgent, high, medium, low, none."},{flag:"--name",value:"<title>",summary:"New title."},{flag:"--description",value:"<markdown>",summary:"Replaces the description."},o,e],examples:['i-plane update CLOUD-8 --state started --assignee "Reader"','i-plane update CLOUD-8 --label "task,review" --due 2026-10-14',"i-plane update CLOUD-8 --labels none --parent none"],notes:["Pass at least one field to change. --project is only needed when the work item is addressed by UUID.","--label preserves current labels; --labels replaces them. none clears labels, parent, assignees or dates where documented."],next:["i-plane show CLOUD-8 --comments","i-plane done CLOUD-8"]},{name:"done",maxPositionals:1,args:"<ID>",summary:"Move to the first completed state. Shorthand for update --state.",options:[...f,{flag:"--priority",value:"<level>",summary:"Set priority while closing."},{flag:"--name",value:"<title>",summary:"Rename while closing."},{flag:"--description",value:"<markdown>",summary:"Replace the description."},o,e],examples:["i-plane done CLOUD-8"],notes:["Sets the first completed state and can update the other work item fields in the same call. --state is chosen by this command."],next:["i-plane show CLOUD-8"]},{name:"comment",maxPositionals:null,args:"<ID> <text>",summary:"Add a comment. Text is Markdown.",options:[o,e],examples:['i-plane comment CLOUD-8 "resolver cache was stale"']},{name:"comments",maxPositionals:1,args:"<ID>",summary:"Read all comments as Markdown, oldest first.",options:[o,e],examples:["i-plane comments CLOUD-8"],notes:["Read discussion before posting an answer. Bodies are Markdown, ordered oldest first; every page is fetched.","show --comments includes the same discussion beside the work item description."],next:["i-plane show CLOUD-8 --comments"]},{name:"delete",maxPositionals:1,alias:"rm",args:"<ID>",summary:"Delete a work item. Refuses without --yes.",options:[{flag:"--yes",required:!0,summary:"Confirm. Deleting cannot be undone."},o,e],examples:["i-plane delete CLOUD-8 --yes"]}]},{title:"PROJECT SHAPE",commands:[{name:"project create",maxPositionals:null,args:"<name>",summary:"Create a project. Names cannot contain special characters, including hyphens.",options:[...O,{...v,required:!0},i,e],examples:['i-plane project create "Knowledge Base" --identifier KB --description "Team documentation"','i-plane project create "Product Work" --identifier APP --cycles --modules --intake'],notes:["Both name and --identifier are required. Hyphens are not allowed in project names.","Enable the features needed for the workflow. --intake also initializes the incoming queue; a partial setup warning gives a project update command to retry."],next:["i-plane states KB",'i-plane label create task --project KB --color "#3B82F6"','i-plane create "Define the structure" --project KB --label task']},{name:"project update",maxPositionals:1,args:"<project>",summary:"Change project details or enable cycles, modules and intake.",options:[...O,c,v,i,e],examples:['i-plane project update CLOUD --description "Product delivery"',"i-plane project update CLOUD --modules --cycles --intake"],notes:["Change at least one field. --intake=false, --cycles=false and --modules=false disable the corresponding feature."],next:["i-plane modules CLOUD","i-plane intake list CLOUD --status pending"]},{name:"project archive",maxPositionals:1,args:"<project>",summary:"Archive a project and hide it from active lists.",options:[e],examples:["i-plane project archive KB"],notes:["Archive hides the project from active lists while preserving its data. Save its UUID before archiving if another operation needs an exact reference."],next:["i-plane projects"]},{name:"project rm",maxPositionals:1,args:"<project>",summary:"Permanently delete a project and its contents. Requires --yes.",options:[u,e],examples:["i-plane project rm TEST --yes"],notes:["Permanent deletion includes the project contents. Use project archive when the data should be kept."],next:["i-plane projects"]},{name:"label create",maxPositionals:null,args:"<name>",summary:"Create a work item label in a project. Default color: #808080.",options:[n,w,i,e],examples:['i-plane label create task --project KB --color "#336699"'],notes:["A label categorizes work items, for example bug, task or epic. --color is optional; the default is #808080.","Creating a label does not assign it to any work item. Use create/update --label with its name."],next:["i-plane labels CLOUD","i-plane update CLOUD-8 --label task"]},{name:"label rm",maxPositionals:1,args:"<label>",summary:"Delete a label by name or UUID. Requires --yes.",options:[n,u,e],examples:["i-plane label rm unused --project KB --yes"],notes:["Removes the project label. Review the label name and project before confirming with --yes."],next:["i-plane labels CLOUD"]},{name:"state create",maxPositionals:null,args:"<name>",summary:"Create a state. Requires --project, --color and --group.",options:[n,{...w,required:!0},{...U,required:!0},i,e],examples:['i-plane state create Review --project KB --color "#336699" --group started'],notes:["A state names a stage of the project workflow. --group determines its ordering and whether done considers it completed.","Both --color and --group are required. Creating a state does not move existing work items."],next:["i-plane states CLOUD","i-plane update CLOUD-8 --state Review"]},{name:"state update",maxPositionals:1,args:"<state>",summary:"Change a state by name or UUID. An ambiguous name is an error.",options:[n,c,w,U,i,e],examples:['i-plane state update Review --project KB --name "In Review"'],notes:["Change name, color, description or group. Changing the group also changes how work items in this state are classified."],next:["i-plane states CLOUD"]},{name:"state rm",maxPositionals:1,args:"<state>",summary:"Delete a state by name or UUID. Requires --yes; Plane may refuse states in use.",options:[n,u,e],examples:["i-plane state rm unused --project KB --yes"],notes:["Plane can refuse deletion of a state still in use. Inspect its work items and move them before retrying."],next:["i-plane states CLOUD"]},{name:"states",maxPositionals:1,args:"[project]",summary:"States and their groups — the names --state accepts.",options:[o,e],examples:["i-plane states CLOUD"]},{name:"labels",maxPositionals:1,args:"[project]",summary:"Labels of a project.",options:[o,e],examples:["i-plane labels CLOUD"]},{name:"members",maxPositionals:0,summary:"Who is in the workspace.",options:[e],examples:["i-plane members"]}]},{title:"PLANNING",summary:"Cycles schedule a time window. Modules group related work toward a goal and can span cycles.",commands:[{name:"cycles",maxPositionals:1,args:"[project]",summary:"All cycles and their dates. A cycle groups work by time.",options:[o,e],examples:["i-plane cycles CLOUD"],notes:["Cycles are time windows for planned work. Supply a project positionally or through --project.","Dates are shown in the project timezone. JSON keeps the server timestamps and includes the timezone."],next:['i-plane cycle issues "Sprint 1" --project CLOUD']},{name:"cycle create",maxPositionals:null,args:"<name>",summary:"Create a cycle. Supply --start and --end together; omit both for a draft.",options:[n,i,x,C,{flag:"--owner",value:"<member>",summary:"Owner by name, email or UUID; defaults to the token's user."},e],examples:['i-plane cycle create "Sprint 1" --project CLOUD --start 2026-10-01 --end 2026-10-14','i-plane cycle create "Next iteration" --project CLOUD'],notes:["Enable the feature first if needed: i-plane project update CLOUD --cycles.","Supply both --start and --end, or neither for a draft. The owner defaults to the token user; --owner selects another member."],next:['i-plane cycle add CLOUD-8 CLOUD-9 --project CLOUD --cycle "Sprint 1"','i-plane cycle issues "Sprint 1" --project CLOUD']},{name:"cycle update",maxPositionals:1,args:"<cycle>",summary:"Change a cycle name, description, owner or dates. Change --start and --end together; none clears both dates.",options:[n,c,i,x,C,{flag:"--owner",value:"<member>",summary:"Owner by name, email or UUID."},e],examples:['i-plane cycle update "Sprint 1" --project CLOUD --start 2026-10-01 --end 2026-10-14','i-plane cycle update "Next iteration" --project CLOUD --start none --end none'],notes:["An omitted --owner preserves the current owner. Change both dates together, including when clearing them with none.","Plane may refuse changes to completed cycles. Dates are displayed in the project timezone."],next:["i-plane cycles CLOUD"]},{name:"cycle add",maxPositionals:null,args:"<ID...>",summary:"Add work items to a cycle. All must belong to the selected project; this can move them from another cycle.",options:[n,{flag:"--cycle",required:!0,value:"<cycle>",summary:"Cycle by name, unique prefix or UUID."},e],examples:['i-plane cycle add CLOUD-8 CLOUD-9 --project CLOUD --cycle "Sprint 1"'],notes:["A work item belongs to one cycle. Adding it to another cycle moves its cycle assignment.","All references are resolved and checked against --project before the write."],next:['i-plane cycle issues "Sprint 1" --project CLOUD']},{name:"cycle issues",maxPositionals:1,args:"<cycle>",summary:"All work items in a cycle, one line each.",options:[n,e],examples:['i-plane cycle issues "Sprint 1" --project CLOUD'],notes:["Read the work planned for this time window. Names, state and priority are shown for every work item."],next:["i-plane show CLOUD-8 --comments"]},{name:"cycle transfer",maxPositionals:2,args:"<from> <to>",summary:"Move unfinished work to another cycle. The source cycle must have ended; completed and cancelled work stays behind.",options:[n,e],examples:['i-plane cycle transfer "Sprint 1" "Sprint 2" --project CLOUD'],notes:["Use at the end of an iteration to carry unfinished work forward. Completed and cancelled work stays in the source cycle.","Supply different source and target cycles from the same project. A dated source must have ended; an undated draft has no end-date check."],next:['i-plane cycle issues "Sprint 2" --project CLOUD']},{name:"modules",maxPositionals:1,args:"[project]",summary:"List feature, milestone or workstream modules and their overall status.",options:[o,e],examples:["i-plane modules CLOUD"],notes:["A module groups work toward a goal, such as a feature, launch or documentation effort. It can span several cycles.","A work item can belong to several modules. Module status and work item state are separate."],next:["i-plane module issues Documentation --project CLOUD","i-plane module create Documentation --project CLOUD --status planned"]},{name:"module create",maxPositionals:null,args:"<name>",summary:"Create a module for a feature, milestone or related workstream.",options:[n,i,x,I,{flag:"--status",value:"<status>",summary:"backlog, planned, in-progress, paused, completed or cancelled."},e],examples:['i-plane module create Documentation --project CLOUD --description "Goal: publish the operator guide. Scope: setup and recovery. Done: all examples verified." --status planned','i-plane module create "Autumn launch" --project CLOUD --start 2026-10-01 --due 2026-10-31 --status planned'],notes:["Enable the feature first if needed: i-plane project update CLOUD --modules.","This CLI fills the name, plain-text description, optional start/due dates and overall status. The dates do not have to be a paired sprint window.","Describe the goal, scope and completion criteria. Pass --status explicitly when its initial value matters: API and UI defaults can differ.","Plane also supports a module lead and members, independently of work item assignees. This CLI does not yet set those fields or edit module details."],next:["i-plane module add CLOUD-8 CLOUD-9 --project CLOUD --module Documentation","i-plane module issues Documentation --project CLOUD"]},{name:"module add",maxPositionals:null,args:"<ID...>",summary:"Add related work items to a module; they may belong to other modules too.",options:[n,{flag:"--module",required:!0,value:"<module>",summary:"Module by name, unique prefix or UUID."},e],examples:["i-plane module add CLOUD-8 CLOUD-9 --project CLOUD --module Documentation"],notes:["Module membership groups work by goal. It does not change the work item state, assignees or cycle.","Keep each referenced work item in the selected project. Check the module contents after adding."],next:["i-plane module issues Documentation --project CLOUD"]},{name:"module issues",maxPositionals:1,args:"<module>",summary:"All work items in a module, one line each.",options:[n,e],examples:["i-plane module issues Documentation --project CLOUD"],notes:["Use the list to assess what remains for the module goal. Work item states show progress; the module status is a separate planning field."],next:["i-plane show CLOUD-8 --comments","i-plane update CLOUD-8 --state started"]}]},{title:"INTAKE",summary:"Collect undecided reports and requests, add context, then accept, reject, snooze or link a duplicate.",commands:[{name:"intake list",maxPositionals:1,args:"[project]",summary:"Review incoming reports and requests before committing them to project work.",options:[o,j,e],examples:["i-plane intake list CLOUD --status pending","i-plane intake list CLOUD --status snoozed --json"],notes:["Intake is a triage queue for bug reports, ideas and support requests. Pending means no acceptance decision has been made.","--status filters locally: pending, rejected, snoozed, accepted or duplicate. Triage status is separate from a normal work item state.","Some servers hide expired snoozes from list/show. Keep issueId from JSON so update/rm can still address a hidden entry."],next:["i-plane intake show CLOUD-9 --project CLOUD","i-plane intake update CLOUD-9 --project CLOUD --status accepted"]},{name:"intake create",maxPositionals:null,args:"<title>",summary:"Submit a report or idea to triage without adding committed work to the board.",options:[n,...L,e],examples:['i-plane intake create "Search returns stale results" --project CLOUD --priority high --description "**Observed:** stale search results. **Expected:** fresh results. **Reproduce:** update a record, then search. **Impact:** outdated data." --json','i-plane intake create "Export documentation as PDF" --project CLOUD --priority low'],notes:["Enable intake first: i-plane project update CLOUD --intake. Requests start pending in the separate Triage state.","Fill a clear title, Markdown description and optional priority. Include observations, expected behavior, reproduction steps and impact.","Use --json and retain issueId for later triage actions. This CLI does not configure public intake forms or email channels."],next:["i-plane intake list CLOUD --status pending","i-plane intake show CLOUD-9 --project CLOUD"]},{name:"intake show",maxPositionals:1,args:"<ID>",summary:"Read an intake work item by readable reference or underlying work item UUID (issueId in JSON).",options:[n,e],examples:["i-plane intake show CLOUD-8 --project CLOUD"],notes:["Read the request and its current triage decision before changing it. The description is Markdown.","Use the readable work item number or underlying issueId from JSON, not the intake entry id. Expired snoozes may be hidden even from this read command."],next:["i-plane intake update CLOUD-9 --project CLOUD --status accepted","i-plane intake update CLOUD-9 --project CLOUD --status rejected"]},{name:"intake update",maxPositionals:1,args:"<ID>",summary:"Clarify a request or decide to accept, reject, snooze or mark it duplicate.",options:[n,c,...L,j,{flag:"--snooze-until",value:"<date>",summary:"Required with --status snoozed; YYYY-MM-DD at midnight UTC."},{flag:"--duplicate-of",value:"<ID>",summary:"Required with --status duplicate; readable reference or UUID in the same project."},e],examples:['i-plane intake update CLOUD-9 --project CLOUD --name "Search cache is not invalidated" --priority high --status accepted',"i-plane intake update CLOUD-9 --project CLOUD --status rejected","i-plane intake update CLOUD-9 --project CLOUD --status snoozed --snooze-until 2026-10-01","i-plane intake update CLOUD-9 --project CLOUD --status duplicate --duplicate-of CLOUD-8","i-plane intake update 11111111-1111-4111-8111-111111111111 --project CLOUD --status accepted"],notes:["Edit title, Markdown description and priority while triaging. pending is undecided; rejected declines the request without deleting it.","accepted moves triage work into the project default state through this API. Then use normal update to choose a state, assign people, labels and work dates.","snoozed postpones the decision until --snooze-until. duplicate points to an existing work item via --duplicate-of. Other status changes clear stale snooze/duplicate metadata.","When a snoozed entry has disappeared from lookup, pass its saved issueId UUID directly. UUID writes do not require list/show to find the entry.","The Plane UI offers more properties during intake. This CLI currently edits title, description, priority and the triage decision; it does not set assignees, labels or due dates before acceptance."],next:["i-plane show CLOUD-9 --comments",'i-plane update CLOUD-9 --state started --assignee "Reader" --label task']},{name:"intake rm",maxPositionals:1,args:"<ID>",summary:"Delete an intake entry. Unaccepted work items are deleted too; accepted work items stay on the board. Requires --yes.",options:[n,u,e],examples:["i-plane intake rm CLOUD-9 --project CLOUD --yes","i-plane intake rm 11111111-1111-4111-8111-111111111111 --project CLOUD --yes"],notes:["Use rejected to decline a request while keeping its record. rm is permanent and requires --yes.","Deleting an unaccepted entry also deletes its work item. Deleting an accepted entry keeps the work item on the board.","For an expired snooze hidden by the server, pass the saved issueId UUID directly."],next:["i-plane intake list CLOUD"]}]},{title:"PAGES",summary:"Project knowledge pages. Prefer API-key access; automatically use session sign-in on Plane without the extension.",commands:[{name:"pages",maxPositionals:1,args:"<project>",summary:"List project pages by UUID, name and modification date.",options:[e],examples:["i-plane pages DEBUG"],notes:["Reads page metadata through the automatically selected API-key or session endpoint. Page names accept exact or unique prefix matches; ambiguous names are errors."],next:['i-plane page show DEBUG "Project Design Spec"']},{name:"page show",maxPositionals:2,args:"<project> <page>",summary:"Read a project's saved page content as Markdown.",options:[e],examples:['i-plane page show DEBUG "Project Design Spec"'],notes:["Reads saved HTML, which may lag behind the live editor, usually by about ten seconds with no guaranteed upper bound. Content is returned as Markdown.","Requires PLANE_URL, PLANE_WORKSPACE and PLANE_API_KEY, as with other commands."],next:["i-plane pages DEBUG"]},{name:"page outline",maxPositionals:2,args:"<project> <page>",summary:"Read the live top-level blocks: index, anchor, kind and preview.",options:[{flag:"--json",summary:"Print the model behind the output, with every field."}],examples:['i-plane page outline DEBUG "Project Design Spec"'],notes:["Live reads do not stamp or modify the document. Run page stamp explicitly when anchors are missing."],next:['i-plane page read DEBUG "Project Design Spec" --block a1b2c3d4 --json']},{name:"page read",maxPositionals:2,args:"<project> <page>",summary:"Read one live block as Markdown, with a content fingerprint in JSON.",options:[{flag:"--block",summary:"Top-level block UUID or unique prefix from page outline.",value:"<anchor>",required:!0},{flag:"--json",summary:"Print the model behind the output, with every field."}],examples:['i-plane page read DEBUG "Project Design Spec" --block a1b2c3d4 --json'],notes:["Live reads do not stamp or modify the document. Run page stamp explicitly when anchors are missing.","The fingerprint describes block content, not its anchor. Set FINGERPRINT to the value returned by page read --json before using the next command. Read again after concurrent edits. Markdown cannot represent every rich-text feature; losses are reported."],next:['i-plane page set DEBUG "Project Design Spec" --block a1b2c3d4 --if-match "$FINGERPRINT" --text "Updated paragraph"']},{name:"page stamp",maxPositionals:2,args:"<project> <page>",summary:"Assign missing anchors to top-level blocks; explicit live write.",options:[{flag:"--json",summary:"Print the model behind the output, with every field."}],examples:['i-plane page stamp DEBUG "Project Design Spec"'],notes:["Success confirms delivery to the live server, not database persistence. Saved HTML can lag, usually about ten seconds with no guaranteed upper bound. No automatic mutation retries."],next:['i-plane page outline DEBUG "Project Design Spec"']},{name:"page create",maxPositionals:1,args:"<project>",summary:"Create a project page, optionally with Markdown content.",options:[{flag:"--name",summary:"Name of the new page.",value:"<name>",required:!0},{flag:"--file",summary:"Read Markdown from a UTF-8 file; mutually exclusive with --text.",value:"<path>"},{flag:"--text",summary:"Markdown content; mutually exclusive with --file.",value:"<markdown>"},{flag:"--allow-loss",summary:"Accept reported conversion or Markdown representation losses."},{flag:"--json",summary:"Print the model behind the output, with every field."}],examples:['i-plane page create DEBUG --name "Release notes" --text "# Release notes"'],notes:["Success confirms delivery to the live server, not database persistence. Saved HTML can lag, usually about ten seconds with no guaranteed upper bound. No automatic mutation retries.","Conversion losses require --allow-loss. Unsupported rich nodes or marks are reported; code-block languages are repaired before writing. Nested pages and --parent are unsupported by the project-page API.","Product nodes require confirmed server readers. Currently knowledgeReview writes are refused before sending changes; --allow-loss does not bypass this check.","Creation with content uses two steps. If writing fails after creation, the error includes the created page UUID; inspect it before retrying."],next:['i-plane page outline DEBUG "Release notes"']},{name:"page set",maxPositionals:2,args:"<project> <page>",summary:"Replace a page or one anchored block with Markdown.",options:[{flag:"--block",summary:"Top-level block UUID or unique prefix from page outline.",value:"<anchor>"},{flag:"--file",summary:"Read Markdown from a UTF-8 file; mutually exclusive with --text.",value:"<path>"},{flag:"--text",summary:"Markdown content; mutually exclusive with --file.",value:"<markdown>"},{flag:"--if-match",summary:"Require the block content fingerprint from page read --json.",value:"<fingerprint>"},{flag:"--force",summary:"Override a stale block fingerprint only; does not accept conversion losses."},{flag:"--allow-loss",summary:"Accept reported conversion or Markdown representation losses."},{flag:"--json",summary:"Print the model behind the output, with every field."}],examples:['i-plane page set DEBUG "Release notes" --text "# Updated release notes"','i-plane page set DEBUG "Release notes" --block a1b2c3d4 --if-match "$FINGERPRINT" --text "Updated paragraph"'],notes:["Success confirms delivery to the live server, not database persistence. Saved HTML can lag, usually about ten seconds with no guaranteed upper bound. No automatic mutation retries.","For a block edit, read with --json first and pass its fingerprint as --if-match. The first replacement block inherits the anchor; additional blocks receive new anchors. Repeating a command is not idempotent.","Conversion losses require --allow-loss. Unsupported rich nodes or marks are reported; code-block languages are repaired before writing. Nested pages and --parent are unsupported by the project-page API.","Product nodes require confirmed server readers. Currently knowledgeReview writes are refused before sending changes; --allow-loss does not bypass this check."],next:['i-plane page outline DEBUG "Release notes"']},{name:"page insert",maxPositionals:2,args:"<project> <page>",summary:"Insert Markdown after a block or at the end.",options:[{flag:"--after",summary:"Insert after this top-level anchor; mutually exclusive with --at-end.",value:"<anchor>"},{flag:"--at-end",summary:"Append to the live document; mutually exclusive with --after."},{flag:"--file",summary:"Read Markdown from a UTF-8 file; mutually exclusive with --text.",value:"<path>"},{flag:"--text",summary:"Markdown content; mutually exclusive with --file.",value:"<markdown>"},{flag:"--allow-loss",summary:"Accept reported conversion or Markdown representation losses."},{flag:"--json",summary:"Print the model behind the output, with every field."}],examples:['i-plane page insert DEBUG "Release notes" --at-end --text "New paragraph"','i-plane page insert DEBUG "Release notes" --after a1b2c3d4 --file appendix.md'],notes:["Success confirms delivery to the live server, not database persistence. Saved HTML can lag, usually about ten seconds with no guaranteed upper bound. No automatic mutation retries.","Conversion losses require --allow-loss. Unsupported rich nodes or marks are reported; code-block languages are repaired before writing. Nested pages and --parent are unsupported by the project-page API.","Product nodes require confirmed server readers. Currently knowledgeReview writes are refused before sending changes; --allow-loss does not bypass this check."],next:['i-plane page outline DEBUG "Release notes"']},{name:"page rm",maxPositionals:2,args:"<project> <page>",summary:"Delete a page or one anchored block with explicit confirmation.",options:[{flag:"--block",summary:"Top-level block UUID or unique prefix from page outline.",value:"<anchor>"},{flag:"--if-match",summary:"Require the block content fingerprint from page read --json.",value:"<fingerprint>"},{flag:"--force",summary:"Override a stale block fingerprint only; does not accept conversion losses."},{flag:"--yes",summary:"Confirm deletion. --yes=false does not confirm.",required:!0},{flag:"--json",summary:"Print the model behind the output, with every field."}],examples:['i-plane page rm DEBUG "Release notes" --yes'],notes:["Whole-page deletion archives the page first, as required by Plane. If deletion fails, the error reports the archived page UUID for recovery.","Success confirms delivery to the live server, not database persistence. Saved HTML can lag, usually about ten seconds with no guaranteed upper bound. No automatic mutation retries.","For a block edit, read with --json first and pass its fingerprint as --if-match. The first replacement block inherits the anchor; additional blocks receive new anchors. Repeating a command is not idempotent."],next:["i-plane pages DEBUG"]}]},{title:"SELF",commands:[{name:"config",maxPositionals:0,summary:"Resolved settings and the cached page access path, reason and expiry.",options:[e],examples:["i-plane config"]},{name:"whoami",maxPositionals:0,summary:"The account behind the token.",options:[e],examples:["i-plane whoami"]},{name:"guide",maxPositionals:0,summary:"This map, the usual order of work, and how the tool behaves.",options:[e],examples:["i-plane guide"]}]}],N=[{title:"Pages have a live editing workflow",body:"Use pages, page outline and page read --json before page set --block --if-match. Pages prefer an API key; Plane without the extension needs PLANE_LOGIN and PLANE_PASSWORD. Live acknowledgement confirms delivery; saved HTML can lag. Run page --help for examples."},{title:"Choose where the work belongs",body:"Use create for accepted project work, intake create for a report needing a decision, modules for a shared goal and cycles for a time window. The same work item can be in a cycle and several modules."},{title:"Examples use sample references",body:"Replace CLOUD, work item numbers, names and sample UUIDs with values from your own commands. Required options are marked in --help; USUALLY NEXT shows common follow-up calls."},{title:"Filtering happens here, not on the server",body:"The list endpoint honours fields and expand — that is where the saving comes from, "+"11 KB down to 737 bytes on the wire. But it accepts state_group, priority and order_by with a 200 and then ignores them. So --state and --priority narrow rows in this client. Never assume a server-side filter worked: it answers success and returns everything."},{title:"A list is complete unless it says otherwise",body:"list returns every work item of the project. --limit exists but is not the usual path; when it cuts the list, the last line says how many rows were hidden. Read that line "+"before concluding anything — a truncated list looks exactly like a complete one. "+"Search has a separate default limit of 10 and reports hasMore; raise --limit (up to 1000) or narrow the query."},{title:"Descriptions are Markdown in both directions",body:"Work item and intake descriptions, and comments, use Markdown; the CLI converts HTML at the edges. Project, label, state, cycle and module descriptions are plain text. show and comments return work item text as Markdown."},{title:"Work items are addressed the way people say them",body:"Normal work item references such as CLOUD-8 resolve directly. Hidden expired intake entries need the saved issueId UUID; list/show may no longer find them. Projects accept an identifier (CLOUD), a full name, or a unique name prefix; an ambiguous prefix is reported rather than guessed."},{title:"Nothing ever prompts",body:"A CLI that waits for input hangs an agent forever. A missing argument is an error that names what was expected and shows a real invocation."},{title:"Exit codes are distinguishable",body:"2 means the call was wrong — unknown command, missing argument, ambiguous project. "+"1 means Plane said no or could not be reached. Branch on the code instead of parsing text."},{title:"Every command takes --json",body:"The human form drops fields on purpose. When ids, timestamps or assignees matter, add --json and read the model instead."}],M=[{command:"i-plane summary",summary:"Start here: which projects exist and how full they are."},{command:"i-plane list CLOUD",summary:"Everything in one project. Narrow with --state, --priority."},{command:"i-plane show CLOUD-8",summary:"Read one before changing it; description included."},{command:"i-plane update CLOUD-8 --state started",summary:"Start accepted work; done closes it."},{command:"i-plane <command> --help",summary:"Flags and real examples for that command."},{command:"i-plane project update CLOUD --modules --cycles --intake",summary:"Enable planning and incoming requests for an existing project."},{command:"i-plane intake list CLOUD --status pending",summary:"Review reports before accepting them into project work."},{command:"i-plane module issues Documentation --project CLOUD",summary:"Inspect a goal's work across cycles."},{command:"i-plane config",summary:"When something lands in the wrong place, look here first."}],h=R.flatMap((a)=>a.commands),b=(a)=>h.find((t)=>t.name===a||t.alias===a),k=[e,{flag:"--refresh-pages",summary:"Clear cached page access detection; the next page command probes again."},{flag:"--session-cache",value:"<directory>",summary:"Private session cache directory for Plane without API-key pages."},{flag:"--help",summary:"Show help."},{flag:"--version",summary:"Show the installed version."},{flag:"--url",value:"<url>",summary:"Plane base URL."},{flag:"--token",value:"<token>",summary:"API token."},{flag:"--workspace",value:"<slug>",summary:"Workspace slug."},{flag:"--config",value:"<path>",summary:"Credentials file."}],A=k.map((a)=>a.flag.slice(2)),q=(a)=>new Set([...A,...(a.options??[]).map((t)=>t.flag.replace(/^--/,""))]),P=(a)=>h.filter((t)=>t.name.startsWith(`${a} `));var S=new Set([...k,...h.flatMap((a)=>a.options??[])].filter((a)=>a.value!==void 0).map((a)=>a.flag.slice(2))),T=(a,t)=>{let s=[],r=[],p=new Map,l=0;while(l<a.length){let d=a[l];if(d===void 0)break;if(d==="--"){r.push(...a.slice(l+1));break}if(d.startsWith("--")){let m=d.slice(2),g=m.indexOf("=");if(g>=0)p.set(m.slice(0,g),m.slice(g+1));else if(S.has(m)){let y=a[l+1];if(y===void 0||y.startsWith("--"))throw new D(`Flag --${m} needs a value.`);p.set(m,y),l+=1}else p.set(m,!0);l+=1;continue}if(s.length<t&&r.length===0)s.push(d);else r.push(d);l+=1}return{path:s,positionals:r,flags:p}};class D extends Error{constructor(a){super(a);this.name="UsageError"}}var _=(a,t)=>{let s=a.flags.get(t);return typeof s==="string"?s:void 0},E=new Set(["false","no","off","0",""]),F=(a,t)=>{let s=a.flags.get(t);if(s===void 0)return!1;if(s===!0)return!0;return!E.has(s.trim().toLowerCase())};var Y=(a)=>{let t=T(a,1),s=t.path[0];if(s===void 0)return t;if(P(s).length>0&&t.positionals[0]!==void 0)return{...t,path:[s,t.positionals[0]],positionals:t.positionals.slice(1)};return{...t,path:[b(s)?.name??s]}},z=(a,t)=>{let s=b(a??"");if(!s&&a&&a!=="help"&&a!=="version")return;let r=s?.maxPositionals;if(r!==null&&t.positionals.length>(r??0))throw new D(`${a??"i-plane"} accepts at most ${r??0} positional arguments. Quote multiword names as one argument.`)};
2
+ export{R as U,N as V,M as W,b as X,k as Y,A as Z,q as _,P as $,D as aa,_ as ba,F as ca,Y as da,z as ea};
@@ -0,0 +1,6 @@
1
+ import{createRequire as A}from"node:module";var f=Object.create;var{getPrototypeOf:u,defineProperty:c,getOwnPropertyNames:m}=Object;var h=Object.prototype.hasOwnProperty;function y(t){return this[t]}var x,b,R=(t,e,r)=>{var n=t!=null&&typeof t==="object";if(n){var s=e?x??=new WeakMap:b??=new WeakMap,l=s.get(t);if(l)return l}r=t!=null?f(u(t)):{};let o=e||!t||!t.__esModule?c(r,"default",{value:t,enumerable:!0}):r;if(t&&typeof t==="object"||typeof t==="function"){for(let i of m(t))if(!h.call(o,i))c(o,i,{get:y.bind(t,i),enumerable:!0})}if(n)s.set(t,o);return o};var O=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports);var T=(t)=>t;function w(t,e){this[t]=T.bind(null,e)}var C=(t,e)=>{for(var r in e)c(t,r,{get:e[r],enumerable:!0,configurable:!0,set:w.bind(e,r)})};var k=A(import.meta.url);var J=(t,e=" ")=>{if(t.length===0)return[];let r=Math.max(...t.map((n)=>n.name.length));return t.map((n)=>`${e}${n.name.padEnd(r)} ${n.text}`)},d=new Set,L=(t)=>{if(t===""){d.clear();return}d.add(t)},p=()=>{let t=new Set;for(let e of d){t.add(e),t.add(JSON.stringify(e).slice(1,-1));try{t.add(encodeURIComponent(e))}catch{}t.add(new URLSearchParams({value:e}).toString().slice(6));let r=e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;");t.add(r),t.add(r.replace(/'/g,"&#39;")),t.add(r.replace(/'/g,"&apos;"));for(let n of e.split(/\s+/))if(n.length>=12)t.add(n)}return[...t].sort((e,r)=>r.length-e.length)},M=(t)=>{let e=[];for(let n of p()){if(!n)continue;let s=t.indexOf(n);while(s>=0)e.push({start:s,end:s+n.length}),s=t.indexOf(n,s+1)}e.sort((n,s)=>n.start-s.start||s.end-n.end);let r=[];for(let n of e){let s=r.at(-1);if(s&&n.start<=s.end)s.end=Math.max(s.end,n.end);else r.push({...n})}return r},a=(t)=>{let e=t;for(let r of p())if(r!=="")e=e.split(r).join("[token]");return e},S=(t)=>{let e=a(t);process.stdout.write(e.endsWith(`
2
+ `)?e:`${e}
3
+ `)},g=(t)=>{if(typeof t==="string")return a(t);if(Array.isArray(t))return t.map(g);if(t!==null&&typeof t==="object"){let e={};for(let[r,n]of Object.entries(t))e[r]=g(n);return e}return t},N=(t,e,r)=>{let n=g(t);S(e?JSON.stringify(n,null,2):r(n))},U=(t,e=1)=>{process.stderr.write(`${a(t)}
4
+ `),process.exit(e)},V=(t)=>{process.stderr.write(`${a(t)}
5
+ `)},q=(t)=>(t??"").replace(/\s+/g," ").trim(),D=(t,e)=>t.length<=e?t:`${t.slice(0,e-1)}…`;
6
+ export{R as fa,O as ga,C as ha,k as ia,J as ja,L as ka,M as la,a as ma,N as na,U as oa,V as pa,q as qa,D as ra};
@@ -0,0 +1,8 @@
1
+ import{aa as c}from"./cli-2sf0pmt1.js";import{readFileSync as E}from"node:fs";import{homedir as A}from"node:os";import{join as P}from"node:path";var g=P(A(),".config","plane","credentials"),_=(e,o)=>{let n=new Map,r;try{r=E(e,"utf8")}catch{return n}for(let i of r.split(`
2
+ `)){let t=i.trim();if(t===""||t.startsWith("#"))continue;let l=t.indexOf("=");if(l<=0)continue;let f=t.slice(0,l).trim();if(!o.includes(f))continue;let s=t.slice(l+1).trim();if(s.startsWith('"')&&s.endsWith('"')||s.startsWith("'")&&s.endsWith("'"))s=s.slice(1,-1);n.set(f,s)}return n},u=(e)=>_(e,["PLANE_URL","PLANE_BASE_URL","PLANE_API_KEY","PLANE_WORKSPACE","PLANE_WORKSPACE_SLUG"]),a=(e,o,n,r)=>{if(e!==void 0&&e!=="")return{value:e,origin:"flag"};for(let i of o){let t=process.env[i];if(t!==void 0&&t!=="")return{value:t,origin:"env"}}for(let i of n){let t=r.get(i);if(t!==void 0&&t!=="")return{value:t,origin:"file"}}return},p=(e,o,n)=>{let r=e.replace(/\/+$/,""),i;try{i=new URL(r)}catch{throw new c(`The url is not a valid address: ${r}
3
+ it came from ${o==="file"?n:o}
4
+ expected something like https://plane.example.com`)}if(i.protocol!=="http:"&&i.protocol!=="https:")throw new c(`The url must be http or https, got ${i.protocol} in ${r}`);return r},d=(e,o,n,r)=>new c(`No ${e}. Set it one of three ways, highest wins:
5
+ --${e} <value>
6
+ ${o}=<value> in the environment
7
+ ${n}=<value> in ${r}`),v=(e)=>{let o=e.configPath??process.env.PLANE_CONFIG??g,n=u(o);return a(e.token,["PLANE_API_KEY","PLANE_TOKEN"],["PLANE_API_KEY"],n)?.value},R=(e,o=!1)=>{let n=e.configPath??process.env.PLANE_CONFIG??g,r=u(n),i=a(e.url,["PLANE_URL","PLANE_BASE_URL"],["PLANE_URL","PLANE_BASE_URL"],r),t=a(e.token,["PLANE_API_KEY","PLANE_TOKEN"],["PLANE_API_KEY"],r),l=a(e.workspace,["PLANE_WORKSPACE","PLANE_WORKSPACE_SLUG"],["PLANE_WORKSPACE","PLANE_WORKSPACE_SLUG"],r);if(i===void 0)throw d("url","PLANE_URL","PLANE_URL",n);if(t===void 0&&!o)throw d("token","PLANE_API_KEY","PLANE_API_KEY",n);if(l===void 0)throw d("workspace","PLANE_WORKSPACE","PLANE_WORKSPACE",n);return{url:{value:p(i.value,i.origin,n),origin:i.origin},token:t??{value:"",origin:"default"},workspace:l,configPath:n}},y=(e)=>e.length<=10?"***":`${e.slice(0,6)}…${e.slice(-4)}`;
8
+ export{_ as a,v as b,R as c,y as d};