orbit-thread 1.1.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,15 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.2.0 — 12 October 2026
4
+
5
+ - Add **Orbit Resume**, a third canonical skill that recovers project context at the start of a fresh Codex or Claude Code session from the latest usable handoff, current Git state and only the living docs the task needs.
6
+ - Add read-only `npx orbit-thread resume` for a concise terminal summary of handoff, Git state and next action.
7
+ - Invoke manually with `$orbit-resume` (Codex), `/orbit-resume` (Claude Code) or `/orbit-thread:orbit-resume` (Claude marketplace plugin). Invocation can also be automatic where the host supports implicit skill invocation (`allow_implicit_invocation: true`); manual invocation is the documented fallback.
8
+ - Treat the handoff as a lead: current Git state and tracked docs override stale details, and missing, malformed, stale or future-dated handoffs are reported rather than guessed.
9
+ - Security safeguards: Resume is read-only and never resets, cleans, stashes, stages, commits or otherwise changes the working tree; it strips terminal-control sequences from displayed repository and handoff text, redacts secret-looking values, and does not read `.env` files, credentials or unrelated files.
10
+ - Install, update, Doctor and uninstall now manage all three skills (`handoff`, `orbit-setup`, `orbit-resume`) for both agents.
11
+ - Backwards compatible: existing v1.1.0 installations, `HANDOFF-STATE.md` files, `.orbit-thread/config.json` and living docs keep working unchanged; `orbit-thread update` adds Resume without touching locally edited managed files, and `orbit-handoff` remains a CLI alias.
12
+
3
13
  ## 1.1.0 — 7 October 2026
4
14
 
5
15
  - Rename the product from **Orbit Handoff** to **Orbit Thread**.
package/PRIVACY.md CHANGED
@@ -1,9 +1,83 @@
1
- # Privacy
1
+ # Privacy Policy
2
2
 
3
- Orbit Thread has no telemetry, remote service, external account or MCP server.
3
+ Last updated: 7 October 2026
4
4
 
5
- The Handoff writer processes input locally and saves `HANDOFF-STATE.md`. Orbit Setup writes local/project documentation, managed agent instructions, a small project configuration file and local ownership state. The CLI records hashes and the exact managed instruction blocks it adds.
5
+ ## Overview
6
6
 
7
- Installation through npm or a plugin marketplace uses the relevant registry or Git host. Your coding agent's model calls and privacy settings remain governed by its provider. Orbit Thread's local writer and setup/configuration scripts do not send repository content anywhere.
7
+ Orbit Thread is a local-first developer tool for project setup, coding-session continuity and verified handoffs.
8
8
 
9
- Keep secrets, credentials, personal data and sensitive production data out of handoffs and living docs. Pattern checks are limited and are not a data-loss-prevention system. `HANDOFF-STATE.md` and Orbit Thread's local ownership state are Git-ignored by setup; ignoring a previously tracked file does not untrack it.
9
+ Orbit Thread does not operate a remote service, require an Orbit Thread account, run an MCP server, or collect telemetry or analytics.
10
+
11
+ ## Data Orbit Thread processes
12
+
13
+ Orbit Thread does not collect or transmit user or repository content to an Orbit Thread-operated server.
14
+
15
+ When used in a coding project, Orbit Thread may process information that the user or coding agent makes available locally in order to:
16
+
17
+ - create or update project documentation and managed agent instructions;
18
+ - create and overwrite `HANDOFF-STATE.md`;
19
+ - store project configuration and local ownership state;
20
+ - record hashes and exact managed instruction blocks for safe updates and uninstall operations.
21
+
22
+ This information may include project names, source-code context, technical decisions and other information intentionally included in project documentation or handoffs.
23
+
24
+ Orbit Thread is not designed to collect or process payment-card information, protected health information, government identifiers, passwords, API keys, authentication tokens, MFA/OTP codes, recovery codes or other authentication secrets. Users should not place this information in Orbit Thread handoffs or living project documents.
25
+
26
+ Secret-pattern checks are a limited safety backstop and are not a data-loss-prevention system.
27
+
28
+ ## Purposes of processing
29
+
30
+ Orbit Thread processes local project information only as necessary to:
31
+
32
+ - prepare a project for coding-agent continuity;
33
+ - maintain concise project and execution state;
34
+ - safely install, update and uninstall Orbit Thread-managed files;
35
+ - verify ownership of managed content and avoid overwriting unrelated or locally modified files.
36
+
37
+ Orbit Thread does not use project information for advertising, behavioural profiling, analytics, model training or sale to third parties.
38
+
39
+ ## Sharing and recipients
40
+
41
+ Orbit Thread itself does not transmit repository content, handoffs or local project documentation to the developer of Orbit Thread or to an Orbit Thread-operated service.
42
+
43
+ Installation or distribution may involve third-party services such as npm, GitHub, OpenAI or Anthropic. Those services process information according to their own privacy policies and service settings.
44
+
45
+ When Orbit Thread is used through a coding agent, information intentionally provided to that agent may be processed by the agent provider under that provider's privacy settings and terms. Orbit Thread's local scripts do not independently transmit repository content to those providers.
46
+
47
+ ## Data retention
48
+
49
+ Orbit Thread does not retain user or project data on developer-operated servers because Orbit Thread operates no such service.
50
+
51
+ Local data remains on the user's device or project until the user removes it or the relevant file is overwritten.
52
+
53
+ `HANDOFF-STATE.md` is overwrite-only and is replaced when a new successful checkpoint is created.
54
+
55
+ Project documentation and `.orbit-thread` configuration may remain after Orbit Thread is uninstalled so that project-owned information is not destroyed automatically. Users may delete these files at any time.
56
+
57
+ Retention by npm, GitHub, OpenAI, Anthropic or other third-party services is governed by those services' own policies.
58
+
59
+ ## User controls
60
+
61
+ Users control the project information made available to Orbit Thread.
62
+
63
+ Users may inspect, edit or delete Orbit Thread-created local files at any time, including `HANDOFF-STATE.md`, project documentation and `.orbit-thread` configuration.
64
+
65
+ Orbit Thread can also be uninstalled using its CLI. Uninstall intentionally preserves project-owned documentation and configuration unless the user chooses to delete them separately.
66
+
67
+ Orbit Thread setup Git-ignores `HANDOFF-STATE.md` and local ownership state. Adding an already tracked file to `.gitignore` does not remove it from Git history or stop Git from tracking it.
68
+
69
+ ## Security and sensitive information
70
+
71
+ Do not place passwords, authentication secrets, private keys, recovery codes, personal data or sensitive production information in handoffs or living project documents.
72
+
73
+ Orbit Thread includes limited pattern checks intended to reduce accidental inclusion of obvious secrets, but these checks do not guarantee detection of sensitive data.
74
+
75
+ ## Changes to this policy
76
+
77
+ This policy may be updated when Orbit Thread's functionality or data practices change. Material changes will be reflected in this document and its Git history.
78
+
79
+ ## Contact
80
+
81
+ Privacy or security questions can be raised through the Orbit Thread GitHub repository:
82
+
83
+ https://github.com/shab1h-gh/orbit-thread/issues
package/README.md CHANGED
@@ -1,53 +1,91 @@
1
- # Orbit Thread
1
+ # 🧵 Orbit Thread
2
2
 
3
- **Keep coding agents aligned across long projects without carrying a huge conversation forever.**
3
+ **Pick up where you left off, without carrying an entire coding conversation into the next session.**
4
4
 
5
- [![Licence: MIT](https://img.shields.io/badge/licence-MIT-blue.svg)](LICENSE)
5
+ [![npm version](https://img.shields.io/npm/v/orbit-thread?label=npm)](https://www.npmjs.com/package/orbit-thread)
6
6
  [![CI](https://github.com/shab1h-gh/orbit-thread/actions/workflows/ci.yml/badge.svg)](https://github.com/shab1h-gh/orbit-thread/actions/workflows/ci.yml)
7
+ [![MIT licence](https://img.shields.io/badge/licence-MIT-blue.svg)](LICENSE)
7
8
 
8
- Orbit Thread is a small local continuity layer for Codex and Claude Code. It has two reusable skills:
9
+ Orbit Thread helps **Codex** and **Claude Code** keep their place during long projects. It gives each project a small set of useful documents and saves a short handoff when the agent reaches a verified checkpoint.
9
10
 
10
- - **Orbit Setup** prepares a project with lightweight living documentation and token-efficient agent rules.
11
- - **Handoff** keeps one short `HANDOFF-STATE.md` current so a fresh session can resume from verified state instead of replaying a large chat history.
11
+ No giant session diary. No separate account or hosted memory service. Your repository and Git history remain the source of truth.
12
12
 
13
- Tracked source, Git history and living project docs remain authoritative. The handoff is current execution state, not a changelog.
13
+ | Skill | What it does |
14
+ | --- | --- |
15
+ | 🧭 **Orbit Setup** | Prepares project docs, agent instructions and optional subagent preferences. |
16
+ | 🔁 **Handoff** | Records the current objective, completed work, risks and next actions in `HANDOFF-STATE.md`. |
17
+ | ▶️ **Resume** | Reconstructs concise current context from the handoff and read-only Git state. |
18
+
19
+ **Jump to:** [Quick start](#quick-start) · [How it works](#how-it-works) · [Setup files](#what-setup-creates) · [Handoff and Resume](#handoff-and-resume) · [Subagents](#configure-subagents) · [Doctor](#check-your-setup) · [Commands](#command-reference) · [Help](#troubleshooting)
14
20
 
15
21
  ## Quick start
16
22
 
17
- From the project you want to configure:
23
+ > 🚀 Run these commands **inside the project** you want to set up.
18
24
 
19
- ```sh
25
+ ```bash
20
26
  npx orbit-thread install
21
27
  npx orbit-thread setup
22
28
  ```
23
29
 
24
- Choose Codex, Claude Code or both when prompted.
25
-
26
- Non-interactive:
30
+ Choose Codex, Claude Code or both when prompted. To skip the questions:
27
31
 
28
- ```sh
32
+ ```bash
29
33
  npx orbit-thread install --agent both --scope project --yes
30
34
  npx orbit-thread setup --agent both --yes
31
35
  ```
32
36
 
33
- Then use the skills directly:
37
+ Once installed, call the skills in your coding agent:
38
+
39
+ | Where you're working | Set up a project | Save a handoff | Resume a fresh chat |
40
+ | --- | --- | --- | --- |
41
+ | Codex | `$orbit-setup` | `$handoff` | `$orbit-resume` |
42
+ | Claude Code | `/orbit-setup` | `/handoff` | `/orbit-resume` |
43
+ | Claude marketplace plugin | `/orbit-thread:orbit-setup` | `/orbit-thread:handoff` | `/orbit-thread:orbit-resume` |
44
+
45
+ The commands above are **skill invocations**, not Terminal commands. You can also ask the agent to run a handoff after a verified milestone.
46
+
47
+ ## How it works
48
+
49
+ Orbit Thread keeps **lasting project knowledge** separate from **what the agent is doing right now**.
50
+
51
+ ```text
52
+ Existing project
53
+ │
54
+ ▼
55
+ Orbit Setup
56
+ │
57
+ ├── Living docs and agent instructions
58
+ └── Project preferences
59
+ │
60
+ ▼
61
+ Agent completes verified work
62
+ │
63
+ ▼
64
+ Handoff rewrites HANDOFF-STATE.md
65
+ │
66
+ ▼
67
+ Next session checks handoff + Git + relevant docs
68
+ │
69
+ ▼
70
+ Continue from the last verified point
71
+ ```
72
+
73
+ The important distinction:
34
74
 
35
- | Agent | Setup | Handoff |
36
- | --- | --- | --- |
37
- | Codex standalone | `$orbit-setup` | `$handoff` |
38
- | Claude Code standalone | `/orbit-setup` | `/handoff` |
39
- | Claude plugin | `/orbit-thread:orbit-setup` | `/orbit-thread:handoff` |
75
+ - **Git** keeps the history of code and decisions.
76
+ - **Living docs** describe the project as it stands today.
77
+ - **`HANDOFF-STATE.md`** says where the current task stands and what needs doing next.
40
78
 
41
- ## What Orbit Setup creates
79
+ The handoff is a checkpoint, **not** another changelog or a substitute for Git. If the handoff is stale, the current repository state wins.
42
80
 
43
- Orbit Setup is designed to run before the first substantial coding prompt, or later to upgrade an existing project.
81
+ ## What setup creates
44
82
 
45
- If equivalent files do not already exist, it creates:
83
+ Orbit Setup can prepare a new project or add the workflow to an existing one. It creates missing files without duplicating equivalent documents already in the repository root or `docs/`.
46
84
 
47
85
  ```text
48
86
  project/
49
87
  ├── AGENTS.md
50
- ├── CLAUDE.md # when Claude is selected
88
+ ├── CLAUDE.md # if Claude Code is selected
51
89
  ├── .orbit-thread/
52
90
  │ └── config.json # tracked project preferences
53
91
  └── docs/
@@ -58,62 +96,37 @@ project/
58
96
  └── ROADMAP.md
59
97
  ```
60
98
 
61
- At the first meaningful checkpoint, Handoff creates:
99
+ The first successful Handoff also creates `HANDOFF-STATE.md`. That file and Orbit Thread's local ownership state are ignored by Git.
62
100
 
63
- ```text
64
- HANDOFF-STATE.md # local, Git-ignored, overwrite-only
65
- ```
66
-
67
- Orbit Thread also keeps its small internal ownership state local and Git-ignored.
68
-
69
- Existing product/design/architecture/security/roadmap files at either the repository root or under `docs/` are preserved instead of duplicated.
70
-
71
- ### Living-doc rules
72
-
73
- The generated project instructions tell the agent to:
101
+ ### Which document should change?
74
102
 
75
- - load only the docs relevant to the current task;
76
- - inspect only the source files it actually needs;
77
- - keep `PRODUCT.md`, `DESIGN.md`, `ARCHITECTURE.md`, `SECURITY.md` and `ROADMAP.md` as current truth;
78
- - update affected sections **in place** after verified changes;
79
- - never append session diaries or duplicate superseded sections;
80
- - keep Git as history;
81
- - never rewrite an applied migration;
82
- - run the smallest relevant verification before claiming completion.
83
-
84
- The document-routing rules are deliberately selective:
85
-
86
- - product behaviour, copy or scope → `PRODUCT.md`
87
- - UI/UX → `DESIGN.md`
88
- - runtime, data flow, infrastructure or integrations → `ARCHITECTURE.md`
89
- - auth, tenancy, secrets or other security-sensitive work → `SECURITY.md`
90
- - future planning only → `ROADMAP.md`
91
-
92
- This keeps routine tasks from loading every project document into context.
103
+ | Work completed | Update |
104
+ | --- | --- |
105
+ | Product behaviour, copy or scope | `PRODUCT.md` |
106
+ | Interface, layouts or user experience | `DESIGN.md` |
107
+ | Runtime, data flow or integrations | `ARCHITECTURE.md` |
108
+ | Authentication, permissions or secrets handling | `SECURITY.md` |
109
+ | Plans that have not been implemented | `ROADMAP.md` |
93
110
 
94
- ## Checkpoints and fresh-context recovery
111
+ The generated instructions ask coding agents to read only the documents and source files they need. After verified changes, they should **update the relevant sections in place**, not pile new notes underneath old ones.
95
112
 
96
- Orbit Thread asks the coding agent to run Handoff:
113
+ They also tell agents to preserve applied migrations, leave history to Git and run an appropriate check before claiming work is finished.
97
114
 
98
- - after a meaningful verified milestone that changed repository state or durable project truth;
99
- - after a completed coding task with such changes, before the final reply;
100
- - before `/clear`, session end, or a usage/context stop when the agent receives warning.
115
+ ## Handoff and Resume
101
116
 
102
- It intentionally skips read-only questions and trivial edits.
117
+ ### When to save a handoff
103
118
 
104
- Each successful checkpoint **overwrites** the previous `HANDOFF-STATE.md`. It does not grow into a development diary.
119
+ Handoff is intended for moments that matter:
105
120
 
106
- After a fresh, cleared or recovered session, the generated project rules tell the agent to recover in this order:
121
+ - After a verified milestone that changes the repository or lasting project information.
122
+ - At the end of a coding task that made those changes.
123
+ - Before clearing a session or stopping because of a usage or context warning.
107
124
 
108
- 1. read `HANDOFF-STATE.md` once if present;
109
- 2. inspect current branch/status/diff/recent Git log;
110
- 3. load only relevant living docs;
111
- 4. inspect only source needed for the recorded next action;
112
- 5. preserve valid uncommitted work and continue from the highest verified milestone.
125
+ It is not necessary for ordinary questions or tiny edits with no lasting effect. Each successful checkpoint **replaces** the previous handoff.
113
126
 
114
- ## Handoff format
127
+ ### What gets saved?
115
128
 
116
- A handoff is normally about 30 lines and has a hard cap of 50:
129
+ Handoffs are usually around 30 lines, with a **hard limit of 50 lines**.
117
130
 
118
131
  ```markdown
119
132
  # Handoff State
@@ -121,14 +134,14 @@ A handoff is normally about 30 lines and has a hard cap of 50:
121
134
  Updated: 07-10-2026 00:30
122
135
 
123
136
  ## Current objective
124
- - Finish account-security settings.
137
+ - Finish account security settings.
125
138
 
126
139
  ## Completed milestones
127
140
  - Added the settings route.
128
- - Connected password change and session revocation.
141
+ - Connected password changes and session revocation.
129
142
 
130
143
  ## In progress
131
- - Passkey-management UI.
144
+ - Passkey management UI.
132
145
 
133
146
  ## Open issues / risks
134
147
  - Passkey removal still needs a browser test.
@@ -142,115 +155,158 @@ Updated: 07-10-2026 00:30
142
155
  - Unit tests passed: 42/42.
143
156
  ```
144
157
 
145
- The writer validates before replacing the previous handoff, rejects obvious secret-like content, writes atomically, makes no network calls and does not mutate Git.
146
-
147
- ## Subagent configuration
158
+ The writer validates the replacement before saving it, checks for recognisable secret patterns and writes the file atomically. **It makes no network requests and does not change Git.** Secret detection is a safety net, not a guarantee; never put sensitive data in a handoff.
148
159
 
149
- Orbit Thread defaults to **no subagents unless they genuinely help**, with a maximum of two and no recursive subagents.
160
+ ### Starting a fresh session
150
161
 
151
- You can save project-specific model/reasoning preferences without hand-editing `AGENTS.md`:
162
+ Start each new coding task in a fresh chat. Orbit Setup asks the agent to invoke Resume once when the session starts (automatically where the host supports it). If it does not start automatically, use `$orbit-resume`, `/orbit-resume`, or `/orbit-thread:orbit-resume` in Claude marketplace installs. Do not invoke it repeatedly in the same session.
152
163
 
153
- ```sh
154
- npx orbit-thread configure --agent claude \
155
- --model "Claude Sonnet 5.5" --effort low
164
+ For a terminal summary, run:
156
165
 
157
- npx orbit-thread configure --agent codex \
158
- --model "GPT-6.1 Sol" --reasoning high
166
+ ```bash
167
+ npx orbit-thread resume
159
168
  ```
160
169
 
161
- Change the maximum:
170
+ Resume prints the handoff objective, verified milestones, unfinished work, risks, verification, current branch and working-tree status, next steps and relevant living-doc paths. It is read-only: it does not modify files or Git, install tools, deploy, or inspect secret files. It uses current repository evidence over stale handoff details, flags a handoff that appears older than the latest commit, and preserves dirty changes. If the handoff is absent or invalid, it says what is unknown rather than guessing.
162
171
 
163
- ```sh
164
- npx orbit-thread configure --max-subagents 1
172
+ This lightweight checkpoint saves tokens by replacing repeated conversation history with a short summary and only the project documents the next task needs. It cannot recover details that were never recorded, prove that an unrecorded check passed, or determine the user's next goal when none was stated. Use the current request as the objective and say when evidence is missing.
173
+
174
+ The project instructions ask the agent to:
175
+
176
+ 1. Use the Resume summary or read `HANDOFF-STATE.md` once if no summary was supplied.
177
+ 2. Check the branch, working tree, diff summary and recent Git history.
178
+ 3. Read only living docs relevant to the current task.
179
+ 4. Inspect only source needed for the next action.
180
+ 5. Preserve unfinished work and continue from the latest verified point.
181
+
182
+ You do not need to paste an old conversation into the next session.
183
+
184
+ ## Configure subagents
185
+
186
+ Orbit Thread only **records preferences**. It does not launch subagents itself.
187
+
188
+ By default, agents should use helpers only when the work warrants them. The configured maximum is **two**, and helpers should not spawn further helpers.
189
+
190
+ **Set the limit:**
191
+
192
+ ```bash
193
+ npx orbit-thread configure --max-subagents 2
165
194
  ```
166
195
 
167
- Disable subagents:
196
+ **Turn subagents off:**
168
197
 
169
- ```sh
198
+ ```bash
170
199
  npx orbit-thread configure --max-subagents 0
171
200
  ```
172
201
 
173
- Show configuration:
202
+ **Save preferred models and reasoning:**
203
+
204
+ ```bash
205
+ npx orbit-thread configure --agent codex --model "GPT-6 Luna" --reasoning high
206
+ npx orbit-thread configure --agent claude --model "Claude Sonnet 5.5" --effort medium
207
+ ```
208
+
209
+ **Check the saved settings:**
174
210
 
175
- ```sh
211
+ ```bash
176
212
  npx orbit-thread configure --show
177
213
  ```
178
214
 
179
- Reset saved subagent preferences:
215
+ **Reset one agent's preferences:**
180
216
 
181
- ```sh
217
+ ```bash
182
218
  npx orbit-thread configure --agent claude --reset-subagents
183
219
  ```
184
220
 
185
- Preferences are stored in `.orbit-thread/config.json` and reflected in Orbit Thread's managed section of `AGENTS.md`. They are preferences rather than hard dependencies: an unavailable exact model setting should not block useful work.
221
+ The settings live in `.orbit-thread/config.json` and are reflected in Orbit Thread's managed section of `AGENTS.md`. They are preferences, not requirements. If a named model is unavailable, the agent can use a suitable alternative.
186
222
 
187
- ## Project doctor
223
+ ## Check your setup
188
224
 
189
- Run:
225
+ > 🩺 **Doctor** checks Orbit Thread itself. It does not test whether your application works.
190
226
 
191
- ```sh
192
- npx orbit-thread doctor
227
+ Run it after installing, updating, changing configuration or moving to a fresh checkout:
228
+
229
+ ```bash
230
+ npx orbit-thread doctor --agent both --scope project
193
231
  ```
194
232
 
195
- It checks the managed skill installation and project continuity setup, including living docs, config, managed agent blocks, Git-ignore rules, duplicate root/docs files and handoff size.
233
+ Or check each integration separately:
196
234
 
197
- `npx orbit-thread check` remains the lightweight managed-skill installation check kept for Orbit Handoff compatibility; use `doctor` for the full project health check.
235
+ ```bash
236
+ npx orbit-thread doctor --agent codex --scope project
237
+ npx orbit-thread doctor --agent claude --scope project
238
+ ```
198
239
 
199
- ## Installation
240
+ Doctor checks skill versions (including Resume), project configuration, managed instruction blocks, living docs, Git ignore rules and handoff size.
200
241
 
201
- Requirements:
242
+ **How do you know it passed?** A successful command exits with status `0`. To print a clear confirmation:
202
243
 
203
- - Node.js 20+
204
- - Git for normal repository workflows
205
- - a POSIX shell and standard Unix utilities for the handoff writer
244
+ ```bash
245
+ npx orbit-thread doctor --agent both --scope project && echo "Orbit Thread Doctor passed"
246
+ ```
206
247
 
207
- macOS and Linux are supported. Native Windows is not currently supported; WSL is the expected route.
248
+ A nonzero result means the continuity setup needs attention. It does **not** necessarily mean your app or deployment is broken.
208
249
 
209
- ### npm / standalone Codex and Claude Code
250
+ For a quicker check of installed managed skills only:
210
251
 
211
- ```sh
212
- npx orbit-thread install
252
+ ```bash
253
+ npx orbit-thread check
213
254
  ```
214
255
 
215
- Project installs use:
256
+ ## Installation options
257
+
258
+ ### Requirements
216
259
 
217
- | Agent | Project location |
260
+ - **Node.js 20 or later**
261
+ - **Git** for normal repository work
262
+ - **POSIX shell and standard Unix tools** for the handoff writer
263
+
264
+ Orbit Thread supports **macOS and Linux**. For Windows, use **WSL**; native Windows is not currently supported.
265
+
266
+ ### npm for Codex or Claude Code
267
+
268
+ ```bash
269
+ npx orbit-thread install
270
+ ```
271
+
272
+ | Agent | Project skill directories |
218
273
  | --- | --- |
219
- | Codex | `.agents/skills/handoff/` and `.agents/skills/orbit-setup/` |
220
- | Claude Code | `.claude/skills/handoff/` and `.claude/skills/orbit-setup/` |
274
+ | Codex | `.agents/skills/handoff/`, `.agents/skills/orbit-setup/` and `.agents/skills/orbit-resume/` |
275
+ | Claude Code | `.claude/skills/handoff/`, `.claude/skills/orbit-setup/` and `.claude/skills/orbit-resume/` |
221
276
 
222
- User/global installs use the equivalent `~/.agents/skills/` or `~/.claude/skills/` locations.
277
+ A user level install uses the equivalent directories under `~/.agents/skills/` or `~/.claude/skills/`.
223
278
 
224
279
  ### Claude GitHub marketplace
225
280
 
226
- Inside Claude Code:
281
+ In **Claude Code**, run:
227
282
 
228
283
  ```text
229
284
  /plugin marketplace add shab1h-gh/orbit-thread
230
285
  /plugin install orbit-thread@orbit-thread
231
286
  ```
232
287
 
233
- Equivalent shell commands:
288
+ Or use these Terminal commands:
234
289
 
235
- ```sh
290
+ ```bash
236
291
  claude plugin marketplace add shab1h-gh/orbit-thread
237
292
  claude plugin install orbit-thread@orbit-thread
238
293
  ```
239
294
 
240
- The GitHub marketplace route is separate from Anthropic's official public directory.
295
+ This GitHub marketplace route is separate from the **official Anthropic public directory**. Installing from GitHub does not mean the plugin has been approved for that directory.
241
296
 
242
- ## Commands
297
+ ## Command reference
243
298
 
244
299
  | Command | Purpose |
245
300
  | --- | --- |
246
- | `npx orbit-thread install` | Install both skills for selected agent(s). |
247
- | `npx orbit-thread setup` | Prepare/upgrade the current project workflow and living docs. |
248
- | `npx orbit-thread configure` | Configure project subagent preferences. |
249
- | `npx orbit-thread doctor` | Check installation and project continuity health. |
250
- | `npx orbit-thread@latest update` | Upgrade unchanged managed skill files. |
251
- | `npx orbit-thread uninstall` | Remove managed skills/instruction blocks while preserving project-owned docs/config/state. |
252
- | `npx orbit-thread init` | Backwards-compatible alias for `setup`. |
253
- | `npx orbit-thread check` | Check managed skill installation (kept for Orbit Handoff compatibility). |
301
+ | `npx orbit-thread install` | Install the three skills for selected agents. |
302
+ | `npx orbit-thread setup` | Prepare or update project docs and managed instructions. |
303
+ | `npx orbit-thread resume` | Print a concise, read-only project and Git summary. |
304
+ | `npx orbit-thread configure` | Save project subagent preferences. |
305
+ | `npx orbit-thread doctor` | Check the project's continuity setup. |
306
+ | `npx orbit-thread check` | Check managed skill installation only. |
307
+ | `npx orbit-thread@latest update` | Update managed skills that have not been locally changed. |
308
+ | `npx orbit-thread uninstall` | Remove managed skills and blocks, preserving project docs and state. |
309
+ | `npx orbit-thread init` | Older alias for `setup`. |
254
310
 
255
311
  Common options:
256
312
 
@@ -260,61 +316,134 @@ Common options:
260
316
  --yes
261
317
  ```
262
318
 
263
- ## Migrating from Orbit Handoff 1.0.x
319
+ ### Update an existing installation
320
+
321
+ ```bash
322
+ npx orbit-thread@latest update --agent both --scope project --yes
323
+ npx orbit-thread@latest setup --agent both --yes
324
+ npx orbit-thread doctor --agent both --scope project
325
+ ```
264
326
 
265
- Orbit Thread is the successor to **Orbit Handoff**.
327
+ The update command protects locally edited managed skill files. Setup updates managed project instructions and creates missing living docs without replacing existing equivalents.
266
328
 
267
- Existing npm-managed users should install/update through the new package name:
329
+ ### Moving from Orbit Handoff 1.0.x
268
330
 
269
- ```sh
331
+ Orbit Thread is the successor to **Orbit Handoff**. The v1.1 and later CLI recognises compatible older managed installations and state while preserving local edits.
332
+
333
+ ```bash
270
334
  npx orbit-thread@latest update --agent both --scope project --yes
271
335
  npx orbit-thread@latest setup --agent both --yes
272
336
  npx orbit-thread doctor --agent both --scope project
273
337
  ```
274
338
 
275
- The v1.1 CLI recognises the managed Orbit Handoff installation/state and migrates it without intentionally overwriting local edits. The old `orbit-handoff` binary name remains an alias inside the Orbit Thread package for compatibility.
339
+ The old `orbit-handoff` binary name remains an alias inside the new package. Earlier npm releases remain unchanged.
276
340
 
277
- The historical `orbit-handoff` npm releases remain immutable.
341
+ If you installed the Claude GitHub marketplace plugin, update or reinstall it from `shab1h-gh/orbit-thread` and run `/orbit-thread:orbit-setup`.
278
342
 
279
- For Claude GitHub-marketplace users, update/reinstall from the renamed repository and run:
343
+ ## Troubleshooting
280
344
 
281
- ```text
282
- /orbit-thread:orbit-setup
345
+ <details>
346
+ <summary><strong>Doctor reports a changed AGENTS.md or CLAUDE.md block</strong></summary>
347
+
348
+ A Markdown formatter can change whitespace inside an Orbit Thread managed block. That can fail the integrity check even when the text looks fine.
349
+
350
+ Inspect the changes first:
351
+
352
+ ```bash
353
+ git diff -- AGENTS.md CLAUDE.md
283
354
  ```
284
355
 
285
- ## Updating Orbit Thread
356
+ **Only if those files have no work you need to keep**, restore them and rerun setup:
286
357
 
287
- ```sh
288
- npx orbit-thread@latest update --agent both --scope project --yes
289
- npx orbit-thread@latest setup --agent both --yes
358
+ ```bash
359
+ git restore -- AGENTS.md CLAUDE.md
360
+ npx orbit-thread setup --agent both --yes
361
+ npx orbit-thread doctor --agent both --scope project
290
362
  ```
291
363
 
292
- The first command updates unchanged managed skill files. The second updates the project-managed rules and creates only missing living docs.
364
+ If you have intentional edits, do **not** restore the whole files. Repair only the affected managed block, then rerun setup and Doctor. Consider excluding `AGENTS.md` and `CLAUDE.md` from Prettier using `.prettierignore`.
365
+
366
+ </details>
367
+
368
+ <details>
369
+ <summary><strong>Setup refuses to overwrite a managed block</strong></summary>
293
370
 
294
- Locally edited managed skill files are never force-overwritten.
371
+ That protection is deliberate. Orbit Thread will not replace a block it can no longer confirm it owns.
372
+
373
+ Review the block and its markers, preserve your own instructions, repair the managed portion and run:
374
+
375
+ ```bash
376
+ npx orbit-thread setup --agent both --yes
377
+ npx orbit-thread doctor --agent both --scope project
378
+ ```
379
+
380
+ Do not delete `.orbit-thread/state.json` or remove markers to get around the check.
381
+
382
+ </details>
383
+
384
+ <details>
385
+ <summary><strong>My handoff was rejected</strong></summary>
386
+
387
+ Keep `HANDOFF-STATE.md` at **50 lines or fewer**. Remove credentials, tokens, keys and sensitive personal or production information, then retry. The previous successful handoff is preserved when validation fails.
388
+
389
+ </details>
390
+
391
+ <details>
392
+ <summary><strong>Does Orbit Thread synchronise chats across agents?</strong></summary>
393
+
394
+ No. It keeps project documents and a local handoff that agents can read. It does not copy conversation history between Codex and Claude Code. A fresh session should check the handoff and Git rather than assume it has the earlier chat's context.
395
+
396
+ </details>
397
+
398
+ <details>
399
+ <summary><strong>What if a configured model is unavailable?</strong></summary>
400
+
401
+ The subagent model and reasoning values are suggestions, not enforced settings. Use an appropriate available model and keep the configured helper limit.
402
+
403
+ ```bash
404
+ npx orbit-thread configure --show
405
+ ```
406
+
407
+ </details>
408
+
409
+ <details>
410
+ <summary><strong>npm reports a cache permission error</strong></summary>
411
+
412
+ Try the Doctor command in your normal Terminal and check npm's cache before changing any permissions:
413
+
414
+ ```bash
415
+ npm config get cache
416
+ npm cache verify
417
+ ```
418
+
419
+ A restricted coding environment may report a permissions error even when your Mac's cache is healthy. Do not run npm with `sudo` or change ownership without identifying the failing path.
420
+
421
+ </details>
295
422
 
296
423
  ## Security and privacy
297
424
 
298
- Orbit Thread is local-first.
425
+ > 🔒 Orbit Thread's handoff writer runs locally. It does not send files to an Orbit Thread service, collect telemetry or alter Git.
299
426
 
300
- The handoff writer makes no network calls and does not mutate Git. Secret detection is a backstop, not a data-loss-prevention system, so never place credentials, personal data or sensitive production information in handoffs or project docs.
427
+ The installer protects unmanaged skills and locally modified managed files. Setup leaves unrelated instructions and existing project documents alone.
301
428
 
302
- The installer refuses unmanaged skill collisions and protects locally modified managed files. Setup preserves unrelated instructions and existing project docs.
429
+ The secret checker catches some recognisable patterns, **not every type of sensitive information**. Do not include passwords, API keys, recovery codes, personal data or production secrets in handoffs or living docs.
303
430
 
304
- There is no Orbit Thread telemetry. npm, GitHub, Claude and OpenAI still operate under their own service/privacy policies.
431
+ Installing packages or using a coding agent can still involve **npm, GitHub, OpenAI or Anthropic** under those providers' own terms and privacy policies.
305
432
 
306
- See [SECURITY.md](SECURITY.md) and [PRIVACY.md](PRIVACY.md).
433
+ Read [Security](SECURITY.md) and [Privacy](PRIVACY.md) for the details.
307
434
 
308
435
  ## Provider directories
309
436
 
310
- The repository includes a portable skills-only plugin ZIP suitable for OpenAI's plugin upload flow and a Claude plugin manifest suitable for Anthropic/GitHub distribution.
437
+ The repository includes a portable skills plugin ZIP for the OpenAI upload flow and a Claude plugin manifest for Anthropic and GitHub distribution.
311
438
 
312
- Public OpenAI and Anthropic directory approval is separate from npm/GitHub installation. See [docs/SUBMISSION.md](docs/SUBMISSION.md).
439
+ **Submission, approval and publication are separate steps.** A working npm or GitHub installation does not establish that a plugin is publicly listed by OpenAI or Anthropic. See [directory submission notes](docs/SUBMISSION.md).
313
440
 
314
441
  ## Contributing
315
442
 
316
- Issues and focused pull requests are welcome. See [CONTRIBUTING.md](CONTRIBUTING.md).
443
+ Bug reports, documentation improvements and focused pull requests are welcome.
444
+
445
+ See [CONTRIBUTING.md](CONTRIBUTING.md), or [open an issue](https://github.com/shab1h-gh/orbit-thread/issues).
317
446
 
318
447
  ## Licence
319
448
 
320
- [MIT](LICENSE) — Shabih Anwar.
449
+ [MIT](LICENSE). Created by **Shabih Anwar**.
@@ -1,8 +1,10 @@
1
1
  # npm publication and releases
2
2
 
3
- Orbit Thread v1.1.0 is the successor to Orbit Handoff v1.0.x.
3
+ Orbit Thread v1.2.0 adds Orbit Resume to the Orbit Thread line, which succeeded Orbit Handoff v1.0.x in v1.1.0.
4
4
 
5
- Historical `orbit-handoff@1.0.0` and `orbit-handoff@1.0.1` releases are immutable. Do not republish, unpublish or move their release tags.
5
+ `orbit-thread@1.1.0` is already published. v1.2.0 is a new version.
6
+
7
+ Historical `orbit-handoff@1.0.0`, `orbit-handoff@1.0.1` and `orbit-thread@1.1.0` releases are immutable. Do not republish, unpublish or move their release tags.
6
8
 
7
9
  The new primary package is:
8
10
 
@@ -33,15 +35,18 @@ claude plugin validate . --strict
33
35
  Inspect:
34
36
 
35
37
  ```text
36
- orbit-thread-1.1.0.tgz
37
- dist/orbit-thread-plugin-1.1.0.zip
38
+ orbit-thread-1.2.0.tgz
39
+ dist/orbit-thread-plugin-1.2.0.zip
38
40
  ```
39
41
 
40
- Confirm both canonical skills are present:
42
+ The npm tarball should contain 28 files (version 1.2.0, including `lib/resume.mjs` and `plugin/skills/orbit-resume/`). The plugin ZIP should contain the portable `plugin.json`, the three canonical skills and the listing icon. Neither should contain tests, `dist/`, credentials or other build residue.
43
+
44
+ Confirm all three canonical skills are present:
41
45
 
42
46
  ```text
43
47
  plugin/skills/handoff/
44
48
  plugin/skills/orbit-setup/
49
+ plugin/skills/orbit-resume/
45
50
  ```
46
51
 
47
52
  and that the packed CLI can install, setup, configure, doctor, update and uninstall in a disposable repository.
@@ -51,7 +56,7 @@ and that the packed CLI can install, setup, configure, doctor, update and uninst
51
56
  After release checks pass:
52
57
 
53
58
  ```sh
54
- npm publish ./orbit-thread-1.1.0.tgz --access public --registry https://registry.npmjs.org/
59
+ npm publish ./orbit-thread-1.2.0.tgz --access public --registry https://registry.npmjs.org/
55
60
  ```
56
61
 
57
62
  Complete npm's normal browser/2FA challenge if prompted. Never weaken npm account security to automate publication.
@@ -73,7 +78,7 @@ npx orbit-thread@latest doctor --agent both --scope project
73
78
  npx orbit-thread@latest uninstall --agent both --scope project --yes
74
79
  ```
75
80
 
76
- Verify `latest` resolves to `1.1.0` and package metadata points to `shab1h-gh/orbit-thread`.
81
+ Also confirm `npx orbit-thread@latest resume` runs read-only in the disposable repository. Verify `latest` resolves to `1.2.0` and package metadata points to `shab1h-gh/orbit-thread`.
77
82
 
78
83
  ## Existing Orbit Handoff users
79
84
 
@@ -85,7 +90,7 @@ npx orbit-thread@latest setup --agent both --yes
85
90
  npx orbit-thread doctor --agent both --scope project
86
91
  ```
87
92
 
88
- The v1.1 CLI accepts compatible Orbit Handoff ownership/project state and migrates it while refusing locally edited managed files.
93
+ The v1.1 and later CLI accepts compatible Orbit Handoff ownership/project state and migrates it while refusing locally edited managed files.
89
94
 
90
95
  After Orbit Thread is publicly verified, the old package may be deprecated with a migration message, but must not be unpublished:
91
96
 
@@ -1,15 +1,15 @@
1
1
  # Directory submission
2
2
 
3
- Updated 7 October 2026.
3
+ Updated 12 October 2026.
4
4
 
5
5
  Provider-directory review is separate from npm, GitHub and standalone installation.
6
6
 
7
7
  ## OpenAI / ChatGPT Plugins Directory
8
8
 
9
- Orbit Thread v1.1.0 is submitted as:
9
+ Orbit Thread v1.2.0 is submitted as:
10
10
 
11
11
  ```text
12
- dist/orbit-thread-plugin-1.1.0.zip
12
+ dist/orbit-thread-plugin-1.2.0.zip
13
13
  ```
14
14
 
15
15
  Build it with:
@@ -18,14 +18,14 @@ Build it with:
18
18
  npm run build:plugin
19
19
  ```
20
20
 
21
- The ZIP contains portable `plugin.json`, both canonical skills, OpenAI interface metadata, the Orbit Setup onboarding skill, listing icon and compatibility metadata. Orbit Thread needs no MCP server or external account.
21
+ The ZIP contains portable `plugin.json`, all three canonical skills, OpenAI interface metadata, the Orbit Setup onboarding skill, listing icon and compatibility metadata. Orbit Thread needs no MCP server or external account.
22
22
 
23
23
  ### Submission flow
24
24
 
25
- 1. Complete release validation and build the final v1.1.0 ZIP from the release commit/tag.
25
+ 1. Complete release validation and build the final v1.2.0 ZIP from the release commit/tag.
26
26
  2. Open the OpenAI Plugins publisher dashboard:
27
27
  `https://platform.openai.com/plugins`
28
- 3. Upload `orbit-thread-plugin-1.1.0.zip`.
28
+ 3. Upload `orbit-thread-plugin-1.2.0.zip`.
29
29
  4. Complete automated checks and resolve genuine findings.
30
30
  5. Review listing metadata and required policy/data-handling declarations.
31
31
  6. Choose **Submit for review**.
@@ -63,7 +63,7 @@ claude plugin validate ./plugin --strict
63
63
  claude plugin validate . --strict
64
64
  ```
65
65
 
66
- Then use the directory management/submission surface in Claude, connect the GitHub account that owns `shab1h-gh/orbit-thread`, select the repository/plugin, complete the listing details and submit it for review. Use the immutable v1.1.0 release/tag once created.
66
+ Then use the directory management/submission surface in Claude, connect the GitHub account that owns `shab1h-gh/orbit-thread`, select the repository/plugin, complete the listing details and submit it for review. Use the immutable v1.2.0 release/tag once created.
67
67
 
68
68
  A successful GitHub marketplace installation does not mean the plugin is approved for Anthropic's public directory.
69
69
 
@@ -177,3 +177,63 @@ Those native CLIs are not part of GitHub CI, so CI success does not claim those
177
177
 
178
178
  OpenAI and Anthropic public-directory review is separate from npm/GitHub distribution. Their publisher dashboards are authoritative after submission; local validation does not imply approval.
179
179
 
180
+ ## Orbit Resume v1.2.0 validation
181
+
182
+ Release validation completed on 12 October 2026 on the `feature/orbit-resume` branch (PR #3) for v1.2.0. `orbit-thread@1.1.0` was confirmed published on the public npm registry before the version bump; v1.2.0 has not been tagged, published or merged.
183
+
184
+ ### Verified locally for the v1.2.0 release candidate
185
+
186
+ - All 43 automated tests passed, including Codex and Claude project installation,
187
+ reinstall, update, Doctor, missing/invalid/stale handoffs, branch changes,
188
+ future dates, terminal-control sanitisation, secret redaction, and preservation
189
+ of dirty working trees.
190
+ - `npm run validate`, `npm run scan:public`, `npm run build:plugin` and
191
+ `git diff --check` passed.
192
+ - `claude plugin validate ./plugin --strict` and `claude plugin validate . --strict` passed.
193
+ - `npm pack` produced `orbit-thread-1.2.0.tgz` (28 files, including `lib/resume.mjs` and
194
+ `plugin/skills/orbit-resume/`), and `npm run smoke:pack` passed against it in a disposable
195
+ Git project: `resume`, install, setup, configure, Doctor, update and uninstall.
196
+ - `dist/orbit-thread-plugin-1.2.0.zip` contains 16 files: portable and Claude manifests,
197
+ all three skills, icon, licence, privacy and security documents. Both archives report
198
+ version 1.2.0 throughout, with no private paths or build residue.
199
+ - Release metadata (`package.json`, `plugin/plugin.json`, `plugin/.claude-plugin/plugin.json`
200
+ and `.claude-plugin/marketplace.json`) is consistent at 1.2.0; `npm run validate` enforces this.
201
+
202
+ ### Compatibility with v1.1.0 installations
203
+
204
+ Using the published `orbit-thread@1.1.0` from the npm registry, a disposable project was installed
205
+ and set up with `handoff` and `orbit-setup` only, then updated with the packed 1.2.0 CLI.
206
+ Update added `orbit-resume` for Codex and Claude, kept the existing `handoff` and `orbit-setup`
207
+ skills, `.orbit-thread/config.json`, local edits to living docs and user content in `AGENTS.md`, and
208
+ Doctor reported all three skills current at v1.2.0. A locally edited managed skill file was still
209
+ refused with an instruction to preserve changes. The 1.2.0 `resume` command ran read-only,
210
+ and uninstall preserved project docs and configuration.
211
+
212
+ ### Reported native agent testing (not CI)
213
+
214
+ The maintainer reported successful authenticated native testing of the feature-branch skills in fresh
215
+ Codex and Claude Code sessions, using a disposable Git project: Setup, Doctor, handoff
216
+ validation and Resume recovery scenarios passed, and both automatic and explicit manual Resume
217
+ invocation worked in each agent. This was an interactive local test recorded from the
218
+ maintainer's report; it is not part of GitHub CI and was not re-run during release preparation.
219
+ Codex emitted macOS temporary-cache warnings during Git reads but still reported branch,
220
+ status and commit.
221
+
222
+ ### Verified in GitHub CI
223
+
224
+ GitHub CI covers the macOS and Linux Node.js matrix, the test suite, package validation, the
225
+ public-source scan, plugin ZIP generation, `npm pack` and the packed-tarball smoke test. CI does not run
226
+ authenticated Codex or Claude sessions or `claude plugin validate`. The PR #3 CI run on the
227
+ previous commit passed; CI for the release commit is checked on the pull request after push.
228
+
229
+ ### Security review
230
+
231
+ A security review identified a low-risk terminal-control injection through branch metadata in a
232
+ local handoff. Resume strips terminal control sequences from displayed repository and handoff text; a
233
+ regression test confirms they do not reach terminal output.
234
+
235
+ ### Remaining release-gate checks
236
+
237
+ - Merge PR #3, then tag v1.2.0 from the merged release commit.
238
+ - Publish `orbit-thread@1.2.0` and repeat the public-registry smoke test described in
239
+ [PUBLISHING.md](PUBLISHING.md).
package/lib/cli.mjs CHANGED
@@ -6,6 +6,7 @@ import { fileURLToPath } from 'node:url';
6
6
  import { createInterface } from 'node:readline/promises';
7
7
  import { setupProject, checkProject, removeProjectConfig, resolveProjectRoot } from '../plugin/skills/orbit-setup/scripts/setup_project.mjs';
8
8
  import { configureProject, readProjectConfig } from '../plugin/skills/orbit-setup/scripts/project_config.mjs';
9
+ import { resumeProject } from './resume.mjs';
9
10
 
10
11
  const packageRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..');
11
12
  const pkg = JSON.parse(fs.readFileSync(path.join(packageRoot, 'package.json'), 'utf8'));
@@ -13,7 +14,7 @@ const skillsRoot = path.join(packageRoot, 'plugin/skills');
13
14
  const marker = '.orbit-thread.json';
14
15
  const legacyMarker = '.orbit-handoff.json';
15
16
  const agents = ['codex', 'claude'];
16
- const skills = ['handoff', 'orbit-setup'];
17
+ const skills = ['handoff', 'orbit-setup', 'orbit-resume'];
17
18
  const digest = data => crypto.createHash('sha256').update(data).digest('hex');
18
19
  const exists = p => { try { fs.lstatSync(p); return true; } catch (e) { if (e.code === 'ENOENT') return false; throw e; } };
19
20
 
@@ -143,6 +144,7 @@ Usage: orbit-thread <command> [options]
143
144
  Commands:
144
145
  install Install the Orbit Thread skills.
145
146
  setup Prepare/upgrade the current project workflow and living docs.
147
+ resume Show concise project continuity and current Git state (read-only).
146
148
  configure Set project subagent preferences.
147
149
  doctor Check installed skills and project continuity health.
148
150
  update Upgrade unchanged managed skill files to this package version.
@@ -204,7 +206,7 @@ export async function main(argv) {
204
206
 
205
207
  let [command, ...rest] = argv;
206
208
  if (command === 'init') command = 'setup';
207
- if (!['install', 'setup', 'configure', 'check', 'doctor', 'update', 'uninstall'].includes(command)) throw new Error(`Unknown command: ${command}`);
209
+ if (!['install', 'setup', 'resume', 'configure', 'check', 'doctor', 'update', 'uninstall'].includes(command)) throw new Error(`Unknown command: ${command}`);
208
210
 
209
211
  const options = parseOptions(rest);
210
212
  const scope = options.scope ?? 'project';
@@ -215,6 +217,12 @@ export async function main(argv) {
215
217
  let selected = selectedAgents(options.agent);
216
218
  const root = resolveProjectRoot(process.cwd());
217
219
 
220
+ if (command === 'resume') {
221
+ if (rest.length) throw new Error('resume does not accept options');
222
+ resumeProject(root);
223
+ return;
224
+ }
225
+
218
226
  if (command === 'configure') {
219
227
  if (options.show) { console.log(JSON.stringify(readProjectConfig(root), null, 2)); return; }
220
228
  if ((options.model !== undefined || options.reasoning !== undefined) && selected.length !== 1) {
package/lib/resume.mjs ADDED
@@ -0,0 +1,155 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { execFileSync } from 'node:child_process';
4
+
5
+ const handoffPath = root => path.join(root, 'HANDOFF-STATE.md');
6
+ const secret = /\b(api[_ -]?key|access[_ -]?token|refresh[_ -]?token|password|secret|authorization|bearer)\b\s*[:=]\s*[^\s,;]+/gi;
7
+
8
+ function scrub(value) {
9
+ const safe = value.slice(0, 500)
10
+ .replace(/\u001b\][^\u0007]*(?:\u0007|\u001b\\)/g, '')
11
+ .replace(/\u001b\[[0-?]*[ -/]*[@-~]/g, '')
12
+ .replace(/\u009b[0-?]*[ -/]*[@-~]/g, '')
13
+ .replace(/[\u0000-\u0008\u000b\u000c\u000e-\u001f\u007f-\u009f]/g, '');
14
+ if (/\b(?:password|passphrase|token|secret|credential|private\s+key|api[_ -]?key|authorization|bearer)\b/i.test(safe)) {
15
+ return '[redacted sensitive-looking handoff line]';
16
+ }
17
+ return safe.replace(secret, '$1=[redacted]');
18
+ }
19
+
20
+ function readHandoff(root) {
21
+ const file = handoffPath(root);
22
+ try {
23
+ const stat = fs.lstatSync(file);
24
+ if (stat.isSymbolicLink() || !stat.isFile()) return { state: 'invalid', reason: 'not a regular local file' };
25
+ if (stat.size > 32768) return { state: 'invalid', reason: 'larger than the 32 KB safety limit' };
26
+ const text = fs.readFileSync(file, 'utf8');
27
+ const lines = text.split(/\r?\n/);
28
+ if (lines.length > 51) return { state: 'invalid', reason: 'over the 50-line limit' };
29
+ if (!/^# Handoff State\s*$/m.test(text)) return { state: 'invalid', reason: 'missing the Handoff State heading' };
30
+ const updated = text.match(/^Updated:\s*(\d{2})-(\d{2})-(\d{4})(?:\s+\d{2}:\d{2})?\s*$/m);
31
+ const objective = section(text, 'Current objective');
32
+ if (!updated || !objective.length) return { state: 'invalid', reason: 'missing a valid update date or current objective' };
33
+ const date = new Date(Number(updated[3]), Number(updated[2]) - 1, Number(updated[1]));
34
+ if (Number.isNaN(date.valueOf()) || date.getDate() !== Number(updated[1]) || date.getMonth() !== Number(updated[2]) - 1) {
35
+ return { state: 'invalid', reason: 'invalid update date' };
36
+ }
37
+ return {
38
+ state: 'valid', text, updated: `${updated[3]}-${updated[2]}-${updated[1]}`,
39
+ fields: {
40
+ objective,
41
+ completed: section(text, 'Completed milestones'),
42
+ unfinished: section(text, 'In progress'),
43
+ risks: section(text, 'Open issues / risks'),
44
+ verification: section(text, 'Verification'),
45
+ next: section(text, 'Immediate next steps'),
46
+ },
47
+ };
48
+ } catch (error) {
49
+ if (error.code === 'ENOENT') return { state: 'missing' };
50
+ throw error;
51
+ }
52
+ }
53
+
54
+ function section(text, title) {
55
+ const escaped = title.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
56
+ const match = text.match(new RegExp(`^##\\s+${escaped}\\s*\\r?\\n([\\s\\S]*?)(?=^##\\s+|\\s*$)`, 'm'));
57
+ if (!match) return [];
58
+ return match[1].split(/\r?\n/).map(line => line.trim()).filter(line => line && !/^<!--/.test(line)).slice(0, 6).map(line => scrub(line));
59
+ }
60
+
61
+ function git(root, args) {
62
+ try {
63
+ return execFileSync('git', args, { cwd: root, encoding: 'utf8', stdio: ['ignore', 'pipe', 'ignore'], timeout: 3000 }).trim();
64
+ } catch { return null; }
65
+ }
66
+
67
+ function currentGit(root) {
68
+ const branch = git(root, ['symbolic-ref', '--short', '-q', 'HEAD']) ?? (git(root, ['rev-parse', '--short', 'HEAD']) ? 'detached HEAD' : null);
69
+ const status = git(root, ['status', '--short', '--untracked-files=normal']);
70
+ const commitDate = git(root, ['log', '-1', '--format=%cs']);
71
+ const changed = (status ?? '').split(/\r?\n/).filter(Boolean);
72
+ const safeChanged = changed.filter(line => !/(^|\s)(?:\.env(?:\.|\s|$)|\.dev\.vars(?:\s|$)|.*(?:secret|credential|private[_-]?key|id_rsa|id_ed25519|\.pem|\.key|\.netrc|\.npmrc|\.pypirc).*)/i.test(line));
73
+ return { branch, status, changed: safeChanged.slice(0, 8), count: changed.length, commitDate };
74
+ }
75
+
76
+ function relevantDocs(text, root) {
77
+ const topics = [
78
+ ['PRODUCT.md', /product|workflow|scope|user-facing|feature/i],
79
+ ['DESIGN.md', /ui|ux|design|layout|visual|accessibility/i],
80
+ ['ARCHITECTURE.md', /architecture|runtime|data flow|integration|database|storage|deploy/i],
81
+ ['SECURITY.md', /auth|security|permission|secret|tenant|trust|privacy/i],
82
+ ['ROADMAP.md', /roadmap|plan|milestone|later|defer/i],
83
+ ];
84
+ const matches = [];
85
+ for (const [name, pattern] of topics) {
86
+ if (!pattern.test(text)) continue;
87
+ for (const file of [path.join(root, name), path.join(root, 'docs', name)]) {
88
+ try {
89
+ if (fs.lstatSync(file).isFile() && !fs.lstatSync(file).isSymbolicLink()) { matches.push(path.relative(root, file)); break; }
90
+ } catch (error) { if (error.code !== 'ENOENT') throw error; }
91
+ }
92
+ }
93
+ return [...new Set(matches)].slice(0, 3);
94
+ }
95
+
96
+ function printLines(label, lines, fallback) {
97
+ console.log(`${label}:`);
98
+ if (!lines.length) console.log(` ${fallback}`);
99
+ else lines.forEach(line => console.log(` ${line}`));
100
+ }
101
+
102
+ export function resumeProject(root) {
103
+ root = path.resolve(root);
104
+ const handoff = readHandoff(root);
105
+ const gitState = currentGit(root);
106
+ let status = handoff.state;
107
+ let reason = handoff.reason;
108
+ const recordedBranch = handoff.state === 'valid' ? handoff.text.match(/^(?:current\s+)?branch:\s*([^\s]+)/im)?.[1] : null;
109
+ if (recordedBranch && gitState.branch) {
110
+ if (recordedBranch !== gitState.branch) { status = 'possibly outdated'; reason = `recorded branch ${recordedBranch} differs from current branch`; }
111
+ }
112
+ const today = new Date();
113
+ const todayDate = `${today.getFullYear()}-${String(today.getMonth() + 1).padStart(2, '0')}-${String(today.getDate()).padStart(2, '0')}`;
114
+ if (handoff.state === 'valid' && handoff.updated && handoff.updated > todayDate) {
115
+ status = 'possibly outdated';
116
+ reason = 'handoff date is in the future';
117
+ }
118
+ if (handoff.state === 'valid' && gitState.commitDate && handoff.updated && gitState.commitDate > handoff.updated) {
119
+ status = 'possibly outdated';
120
+ reason = `Git has a commit dated ${gitState.commitDate}, after the handoff date`;
121
+ }
122
+
123
+ console.log('Orbit Resume (read-only)');
124
+ console.log(`Project: ${scrub(path.basename(root))}`);
125
+ console.log(`Handoff: ${status}${reason ? ` — ${scrub(reason)}` : ''}`);
126
+ if (handoff.state === 'valid') {
127
+ const usable = status === 'valid';
128
+ printLines('Objective', usable ? handoff.fields.objective : [], usable ? 'Not recorded.' : 'Treat the handoff as a lead; current repository evidence takes precedence.');
129
+ printLines('Completed milestones', usable ? handoff.fields.completed : [], 'No verified milestones recorded.');
130
+ printLines('Unfinished work', usable ? handoff.fields.unfinished : [], 'No in-progress work recorded.');
131
+ printLines('Risks', usable ? handoff.fields.risks : [], 'No risks recorded.');
132
+ printLines('Verification', usable ? handoff.fields.verification : [], 'No verification recorded.');
133
+ } else {
134
+ printLines('Objective', [], 'Unknown; do not infer it from an absent or invalid handoff.');
135
+ printLines('Completed milestones', [], 'No reliable handoff evidence.');
136
+ printLines('Unfinished work', [], 'Check the current task and Git changes before proceeding.');
137
+ printLines('Risks', [], handoff.state === 'invalid' ? 'Handoff was not used because it is invalid.' : 'No handoff exists yet.');
138
+ printLines('Verification', [], 'No reliable handoff evidence.');
139
+ }
140
+
141
+ console.log('Git status:');
142
+ if (!gitState.branch && gitState.status === null) console.log(' Git repository unavailable.');
143
+ else {
144
+ console.log(` Branch: ${scrub(gitState.branch ?? 'unknown')}`);
145
+ console.log(` Working tree: ${gitState.count ? `dirty (${gitState.count} change${gitState.count === 1 ? '' : 's'})` : 'clean'}`);
146
+ gitState.changed.forEach(line => console.log(` ${scrub(line)}`));
147
+ if (gitState.count > gitState.changed.length) console.log(` ${gitState.count - gitState.changed.length} sensitive-looking path(s) omitted.`);
148
+ }
149
+
150
+ const trustedNext = handoff.state === 'valid' && status === 'valid' ? handoff.fields.next : [];
151
+ const docs = relevantDocs([...(trustedNext.length ? trustedNext : []), ...(handoff.state === 'valid' ? handoff.fields.objective : [])].join(' '), root);
152
+ printLines('Next steps', trustedNext, handoff.state === 'valid' && status === 'valid' ? 'No next step recorded; inspect current changes and choose one from repository evidence.' : 'Inspect current Git changes, then identify the next action from the user request and tracked project docs.');
153
+ printLines('Relevant living docs', docs, 'None identified from the handoff; load a living doc only if the next action needs it.');
154
+ console.log('Keep unfinished working changes. Do not reset or clean the repository. Current Git and tracked docs override stale handoff details.');
155
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "orbit-thread",
3
- "version": "1.1.0",
3
+ "version": "1.2.0",
4
4
  "description": "Token-efficient project setup, checkpoints and coding-session continuity for Codex and Claude Code.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -14,7 +14,7 @@
14
14
  "repository": { "type": "git", "url": "git+https://github.com/shab1h-gh/orbit-thread.git" },
15
15
  "homepage": "https://github.com/shab1h-gh/orbit-thread#readme",
16
16
  "bugs": { "url": "https://github.com/shab1h-gh/orbit-thread/issues" },
17
- "keywords": ["codex", "claude-code", "agent-skills", "continuity", "project-setup", "handoff", "context-efficiency"],
17
+ "keywords": ["codex", "claude-code", "agent-skills", "continuity", "project-setup", "handoff", "resume", "context-efficiency"],
18
18
  "files": ["bin/", "lib/", "plugin/", "docs/", "README.md", "LICENSE", "SECURITY.md", "PRIVACY.md", "CONTRIBUTING.md", "CHANGELOG.md"],
19
19
  "scripts": {
20
20
  "test": "node --test",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "orbit-thread",
3
3
  "displayName": "Orbit Thread",
4
- "version": "1.1.0",
4
+ "version": "1.2.0",
5
5
  "description": "Token-efficient project setup, checkpoints and coding-session continuity.",
6
6
  "author": { "name": "Shabih Anwar", "url": "https://github.com/shab1h-gh" },
7
7
  "homepage": "https://github.com/shab1h-gh/orbit-thread",
@@ -11,6 +11,6 @@
11
11
  "documentationUrl": "https://github.com/shab1h-gh/orbit-thread#readme",
12
12
  "supportUrl": "https://github.com/shab1h-gh/orbit-thread/issues",
13
13
  "privacyPolicyUrl": "https://github.com/shab1h-gh/orbit-thread/blob/main/PRIVACY.md",
14
- "keywords": ["continuity", "handoff", "project-setup", "developer-tools"],
14
+ "keywords": ["continuity", "handoff", "resume", "project-setup", "developer-tools"],
15
15
  "skills": "./skills/"
16
16
  }
package/plugin/README.md CHANGED
@@ -1,25 +1,27 @@
1
1
  # Orbit Thread
2
2
 
3
- Orbit Thread provides two local coding skills:
3
+ Orbit Thread provides three local coding skills:
4
4
 
5
5
  - **Orbit Setup** prepares a project with lightweight living docs, selective context rules and configurable subagent preferences.
6
6
  - **Handoff** overwrites a compact, evidence-only `HANDOFF-STATE.md` so a fresh coding session can resume from Git + current project truth rather than a large old conversation.
7
+ - **Resume** reconstructs concise project context from the latest usable handoff, current Git state and task-relevant living docs.
7
8
 
8
9
  Standalone commands:
9
10
 
10
- - Codex: `$orbit-setup` and `$handoff`
11
- - Claude Code: `/orbit-setup` and `/handoff`
11
+ - Codex: `$orbit-setup`, `$handoff` and `$orbit-resume`
12
+ - Claude Code: `/orbit-setup`, `/handoff` and `/orbit-resume`
12
13
 
13
14
  Claude plugin commands:
14
15
 
15
16
  - `/orbit-thread:orbit-setup`
16
17
  - `/orbit-thread:handoff`
18
+ - `/orbit-thread:orbit-resume`
17
19
 
18
20
  Setup creates only missing PRODUCT, DESIGN, ARCHITECTURE, SECURITY and ROADMAP templates, preserves existing equivalents, manages a concise Orbit Thread section in AGENTS.md/CLAUDE.md, and keeps local handoff/tool state Git-ignored.
19
21
 
20
- The project rules update living docs in place, load only relevant context, default to no subagents with a maximum of two, and request Handoff after meaningful verified milestones/completed coding tasks.
22
+ Start each coding task in a fresh chat and run Resume once at session start, automatically where supported or manually as a fallback. The project rules update living docs in place, load only relevant context, default to no subagents with a maximum of two, and request Handoff after meaningful verified milestones/completed coding tasks.
21
23
 
22
- Handoff is overwrite-only, capped at 50 lines, secret-checked before atomic replacement and makes no network calls or Git mutations.
24
+ Handoff is overwrite-only, capped at 50 lines, secret-checked before atomic replacement and makes no network calls or Git mutations. Resume and `npx orbit-thread resume` are read-only and preserve unfinished work.
23
25
 
24
26
  There is no MCP server, telemetry or external account.
25
27
 
@@ -1,26 +1,26 @@
1
1
  {
2
2
  "$schema": "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json",
3
3
  "name": "orbit-thread",
4
- "version": "1.1.0",
4
+ "version": "1.2.0",
5
5
  "description": "Token-efficient project setup, checkpoints and coding-session continuity.",
6
6
  "author": { "name": "Shabih Anwar", "url": "https://github.com/shab1h-gh" },
7
7
  "homepage": "https://github.com/shab1h-gh/orbit-thread",
8
8
  "repository": "https://github.com/shab1h-gh/orbit-thread",
9
9
  "license": "MIT",
10
- "keywords": ["handoff", "codex", "claude-code", "continuity", "project-setup", "developer-tools"],
10
+ "keywords": ["handoff", "resume", "codex", "claude-code", "continuity", "project-setup", "developer-tools"],
11
11
  "extensions": {
12
12
  "com.openai": {
13
13
  "interface": {
14
14
  "displayName": "Orbit Thread",
15
15
  "shortDescription": "Lean coding continuity",
16
- "longDescription": "Orbit Thread gives coding agents a small, durable continuity layer. Orbit Setup creates only missing PRODUCT, DESIGN, ARCHITECTURE, SECURITY and ROADMAP living docs, adds selective context-loading and bounded-subagent rules, and keeps local execution state separate from tracked project truth. Handoff then overwrites a compact HANDOFF-STATE.md at meaningful verified checkpoints and completed coding tasks so a fresh session can resume from Git, current docs and the exact next action instead of carrying a large chat history. Handoffs are capped at 50 lines, validated before atomic replacement, and the writer makes no network calls or Git mutations. Existing project docs and unrelated instructions are preserved.",
16
+ "longDescription": "Orbit Thread gives coding agents a small, durable continuity layer. Orbit Setup creates only missing PRODUCT, DESIGN, ARCHITECTURE, SECURITY and ROADMAP living docs, adds selective context-loading and bounded-subagent rules, and keeps local execution state separate from tracked project truth. Handoff overwrites a compact HANDOFF-STATE.md at verified checkpoints. Resume starts a fresh chat from the current handoff, read-only Git state and only the living docs needed for the task, reducing repeated context while preserving unfinished changes. Handoffs are capped at 50 lines, validated before atomic replacement, and the writer makes no network calls or Git mutations. Existing project docs and unrelated instructions are preserved.",
17
17
  "developerName": "Shabih Anwar",
18
18
  "category": "Developer Tools",
19
- "capabilities": ["Prepare project continuity", "Save verified coding checkpoints"],
19
+ "capabilities": ["Prepare project continuity", "Save verified coding checkpoints", "Resume coding sessions"],
20
20
  "websiteURL": "https://github.com/shab1h-gh/orbit-thread",
21
21
  "supportURL": "https://github.com/shab1h-gh/orbit-thread/issues",
22
22
  "privacyPolicyURL": "https://github.com/shab1h-gh/orbit-thread/blob/main/PRIVACY.md",
23
- "defaultPrompt": ["Prepare this coding project for efficient continuity, or save verified current state at a meaningful checkpoint."],
23
+ "defaultPrompt": ["Prepare this coding project for efficient continuity, resume a fresh coding session, or save verified current state at a meaningful checkpoint."],
24
24
  "brandColor": "#4338CA",
25
25
  "composerIcon": "./assets/icon.png",
26
26
  "logo": "./assets/icon.png"
@@ -41,6 +41,7 @@ Omit empty sections. Aim for about 30 lines; hard cap 50. State each fact once.
41
41
  - Evidence only. Never claim a test, deployment, commit, push or external action happened without evidence.
42
42
  - Never include secrets, credentials, tokens, private keys, recovery codes, `.env`/`.dev.vars` values, personal data or sensitive production data.
43
43
  - Do not record the current HEAD SHA; it becomes stale easily. Exact SHAs are allowed only for immutable earlier revisions such as releases, deployments or rollback points.
44
+ - When Git is available, record the current branch as `Branch: <name>` under `Current state` so a later Resume can detect a branch change. Never record the current HEAD SHA.
44
45
  - `HANDOFF-STATE.md` is local current state, intended to be Git-ignored. Never append history or make committing it a next step.
45
46
  - Durable product, design, architecture, security or roadmap truth belongs in tracked living docs. Handoff does not replace those files.
46
47
  - At an intermediate checkpoint, do not stop merely because the handoff was written.
@@ -0,0 +1,25 @@
1
+ ---
2
+ name: orbit-resume
3
+ description: Recover essential project context at the start of a fresh Codex or Claude Code conversation from the latest usable handoff, current Git state and only the living docs needed for the current task. Use once per new coding session, or when the user explicitly asks to resume project work.
4
+ ---
5
+
6
+ # Orbit Thread Resume
7
+
8
+ Recover the current project state once at the beginning of a fresh coding conversation. Keep the context small and preserve unfinished changes.
9
+
10
+ ## Workflow
11
+
12
+ 1. If the user already supplied output from `npx orbit-thread resume` in this conversation, use it. Otherwise inspect `HANDOFF-STATE.md` once if it exists, then run read-only `git status --short --branch`, `git diff --stat HEAD`, and `git log -1 --oneline` from the project root. Do not invoke npm, install tools, or search the repository broadly.
13
+ 2. Treat the handoff as a lead. Current Git state and tracked project docs override stale or conflicting handoff details. A missing or malformed handoff is not a reason to invent the objective or completed work; use the user's current request and state what remains unknown.
14
+ 3. Preserve all dirty and untracked work. Never reset, clean, stash, stage, commit, checkout, deploy, or otherwise change repository state.
15
+ 4. Read only the living doc that directly informs the current requested task: PRODUCT for scope or behaviour, DESIGN for UI, ARCHITECTURE for runtime/data flow, SECURITY for trust/auth/secrets, ROADMAP for planning. Use its existing root or `docs/` location. Do not load unrelated docs or repeat facts already clear from the handoff.
16
+ 5. Give the user a compact summary of the objective, verified milestones, unfinished work, risks, verification, Git state, and immediate next action. Separate facts from unknowns. End with one clear next action grounded in the current request and repository evidence.
17
+
18
+ Run this skill once per fresh conversation. Do not repeat it during the same session unless the user asks for a fresh recovery. If the host cannot invoke it automatically, the reliable fallback is `$orbit-resume` in Codex, `/orbit-resume` in Claude Code, or `/orbit-thread:orbit-resume` from the Claude marketplace plugin.
19
+
20
+ ## Safety
21
+
22
+ - Read only the handoff, Git summaries, and task-relevant living docs. Never read `.env`, `.dev.vars`, credentials, private keys, or unrelated files.
23
+ - Do not echo secret-looking values or sensitive local file paths. Keep the user's unfinished work intact.
24
+ - The `npx orbit-thread resume` CLI command is read-only and can be run by the developer for a concise terminal summary. Do not run `npx` from this skill because it can download packages when the CLI is unavailable.
25
+ - Do not claim a check, test, deployment, commit, or external action unless current evidence confirms it.
@@ -0,0 +1,6 @@
1
+ interface:
2
+ display_name: "Orbit Thread Resume"
3
+ short_description: "Recover concise project context"
4
+ default_prompt: "Use $orbit-resume once to recover the verified project state and next action for this fresh coding session."
5
+ policy:
6
+ allow_implicit_invocation: true
@@ -28,8 +28,9 @@ const agentsBlock = config => `${begin}
28
28
  - Inspect only source files needed for the task. Do not broadly scan generated, vendor, dependency, build, coverage or cache directories, and do not reread unchanged context without a reason.
29
29
  - Living docs describe CURRENT truth. After verified work changes that truth, update affected existing sections in place during the same milestone. Never append session diaries or duplicate superseded sections; Git is history. Never rewrite an applied migration.
30
30
  - Run the smallest relevant verification before claiming a milestone or task complete. Never claim a test, deployment, commit, push or external action that did not run.
31
+ - Start each new coding task in a fresh chat and invoke \`$orbit-resume\` once at session start. Do this automatically where the host supports it; otherwise the reliable fallback is to invoke it manually. Do not repeat Resume in the same session unless the user asks for a fresh recovery.
31
32
  - Run the installed \`handoff\` skill after a meaningful verified milestone that changed repository state or durable project truth, and after each completed coding task with such changes before the final reply. Also checkpoint before \`/clear\`, session end, or a usage/context stop when warning is available. Skip read-only questions and trivial edits. Intermediate checkpoints must not stop unfinished work.
32
- - Each checkpoint overwrites \`HANDOFF-STATE.md\`. After a fresh/cleared/recovered session: read the handoff once if present, inspect branch/status/diff/recent log, read only relevant living docs, then inspect only source needed for the exact next action. Do not reconstruct old conversation history or repeat completed work.
33
+ - Each checkpoint overwrites \`HANDOFF-STATE.md\`. Resume reads the handoff once if present, checks current Git state, then reads only task-relevant living docs and source. Do not reconstruct old conversation history or repeat completed work.
33
34
  ${renderSubagentBlock(config)}
34
35
  - Read-only Git inspection is allowed. Commit, push, merge, rebase, reset, branch deletion or other Git writes require explicit authority in the current request. Never force-push or destructively clean without explicit authority.
35
36
  - Never place secrets, credentials, environment values, private keys, recovery codes, personal data or sensitive production data in living docs or \`HANDOFF-STATE.md\`.
@@ -39,7 +40,7 @@ ${end}
39
40
  const claudeBlock = `${begin}
40
41
  ## Orbit Thread
41
42
 
42
- Read and follow \`AGENTS.md\` for project workflow, selective context loading, subagents and checkpoints. On a fresh or recovered session, resume from \`HANDOFF-STATE.md\` + current Git state + only the relevant living docs instead of reconstructing old conversation history.
43
+ Read and follow \`AGENTS.md\` for project workflow, selective context loading, subagents and checkpoints. Start each new coding task in a fresh chat and invoke \`/orbit-resume\` once at session start, automatically where supported. If automatic invocation is unavailable, manually run \`/orbit-resume\` (or \`/orbit-thread:orbit-resume\` from the marketplace plugin). Do not repeat Resume in the same session unless the user asks for a fresh recovery.
43
44
  ${end}
44
45
  `;
45
46
  const templates = {