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 +10 -0
- package/PRIVACY.md +79 -5
- package/README.md +277 -148
- package/docs/PUBLISHING.md +13 -8
- package/docs/SUBMISSION.md +7 -7
- package/docs/VALIDATION.md +60 -0
- package/lib/cli.mjs +10 -2
- package/lib/resume.mjs +155 -0
- package/package.json +2 -2
- package/plugin/.claude-plugin/plugin.json +2 -2
- package/plugin/README.md +7 -5
- package/plugin/plugin.json +5 -5
- package/plugin/skills/handoff/SKILL.md +1 -0
- package/plugin/skills/orbit-resume/SKILL.md +25 -0
- package/plugin/skills/orbit-resume/agents/openai.yaml +6 -0
- package/plugin/skills/orbit-setup/scripts/setup_project.mjs +3 -2
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
|
-
|
|
3
|
+
Last updated: 7 October 2026
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
## Overview
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
Orbit Thread is a local-first developer tool for project setup, coding-session continuity and verified handoffs.
|
|
8
8
|
|
|
9
|
-
|
|
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
|
-
**
|
|
3
|
+
**Pick up where you left off, without carrying an entire coding conversation into the next session.**
|
|
4
4
|
|
|
5
|
-
[](https://www.npmjs.com/package/orbit-thread)
|
|
6
6
|
[](https://github.com/shab1h-gh/orbit-thread/actions/workflows/ci.yml)
|
|
7
|
+
[](LICENSE)
|
|
7
8
|
|
|
8
|
-
Orbit Thread
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
23
|
+
> 🚀 Run these commands **inside the project** you want to set up.
|
|
18
24
|
|
|
19
|
-
```
|
|
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
|
-
```
|
|
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
|
-
|
|
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
|
-
|
|
36
|
-
|
|
37
|
-
|
|
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
|
-
|
|
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
|
-
|
|
81
|
+
## What setup creates
|
|
44
82
|
|
|
45
|
-
|
|
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 #
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
117
|
+
### When to save a handoff
|
|
103
118
|
|
|
104
|
-
|
|
119
|
+
Handoff is intended for moments that matter:
|
|
105
120
|
|
|
106
|
-
After a
|
|
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
|
-
|
|
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
|
-
|
|
127
|
+
### What gets saved?
|
|
115
128
|
|
|
116
|
-
|
|
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
|
|
137
|
+
- Finish account security settings.
|
|
125
138
|
|
|
126
139
|
## Completed milestones
|
|
127
140
|
- Added the settings route.
|
|
128
|
-
- Connected password
|
|
141
|
+
- Connected password changes and session revocation.
|
|
129
142
|
|
|
130
143
|
## In progress
|
|
131
|
-
- Passkey
|
|
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
|
|
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
|
-
|
|
160
|
+
### Starting a fresh session
|
|
150
161
|
|
|
151
|
-
|
|
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
|
-
|
|
154
|
-
npx orbit-thread configure --agent claude \
|
|
155
|
-
--model "Claude Sonnet 5.5" --effort low
|
|
164
|
+
For a terminal summary, run:
|
|
156
165
|
|
|
157
|
-
|
|
158
|
-
|
|
166
|
+
```bash
|
|
167
|
+
npx orbit-thread resume
|
|
159
168
|
```
|
|
160
169
|
|
|
161
|
-
|
|
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
|
-
|
|
164
|
-
|
|
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
|
-
|
|
196
|
+
**Turn subagents off:**
|
|
168
197
|
|
|
169
|
-
```
|
|
198
|
+
```bash
|
|
170
199
|
npx orbit-thread configure --max-subagents 0
|
|
171
200
|
```
|
|
172
201
|
|
|
173
|
-
|
|
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
|
-
```
|
|
211
|
+
```bash
|
|
176
212
|
npx orbit-thread configure --show
|
|
177
213
|
```
|
|
178
214
|
|
|
179
|
-
Reset
|
|
215
|
+
**Reset one agent's preferences:**
|
|
180
216
|
|
|
181
|
-
```
|
|
217
|
+
```bash
|
|
182
218
|
npx orbit-thread configure --agent claude --reset-subagents
|
|
183
219
|
```
|
|
184
220
|
|
|
185
|
-
|
|
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
|
-
##
|
|
223
|
+
## Check your setup
|
|
188
224
|
|
|
189
|
-
|
|
225
|
+
> 🩺 **Doctor** checks Orbit Thread itself. It does not test whether your application works.
|
|
190
226
|
|
|
191
|
-
|
|
192
|
-
|
|
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
|
-
|
|
233
|
+
Or check each integration separately:
|
|
196
234
|
|
|
197
|
-
|
|
235
|
+
```bash
|
|
236
|
+
npx orbit-thread doctor --agent codex --scope project
|
|
237
|
+
npx orbit-thread doctor --agent claude --scope project
|
|
238
|
+
```
|
|
198
239
|
|
|
199
|
-
|
|
240
|
+
Doctor checks skill versions (including Resume), project configuration, managed instruction blocks, living docs, Git ignore rules and handoff size.
|
|
200
241
|
|
|
201
|
-
|
|
242
|
+
**How do you know it passed?** A successful command exits with status `0`. To print a clear confirmation:
|
|
202
243
|
|
|
203
|
-
|
|
204
|
-
-
|
|
205
|
-
|
|
244
|
+
```bash
|
|
245
|
+
npx orbit-thread doctor --agent both --scope project && echo "Orbit Thread Doctor passed"
|
|
246
|
+
```
|
|
206
247
|
|
|
207
|
-
|
|
248
|
+
A nonzero result means the continuity setup needs attention. It does **not** necessarily mean your app or deployment is broken.
|
|
208
249
|
|
|
209
|
-
|
|
250
|
+
For a quicker check of installed managed skills only:
|
|
210
251
|
|
|
211
|
-
```
|
|
212
|
-
npx orbit-thread
|
|
252
|
+
```bash
|
|
253
|
+
npx orbit-thread check
|
|
213
254
|
```
|
|
214
255
|
|
|
215
|
-
|
|
256
|
+
## Installation options
|
|
257
|
+
|
|
258
|
+
### Requirements
|
|
216
259
|
|
|
217
|
-
|
|
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-
|
|
220
|
-
| Claude Code | `.claude/skills/handoff/` and `.claude/skills/orbit-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
288
|
+
Or use these Terminal commands:
|
|
234
289
|
|
|
235
|
-
```
|
|
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
|
-
|
|
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
|
-
##
|
|
297
|
+
## Command reference
|
|
243
298
|
|
|
244
299
|
| Command | Purpose |
|
|
245
300
|
| --- | --- |
|
|
246
|
-
| `npx orbit-thread install` | Install
|
|
247
|
-
| `npx orbit-thread setup` | Prepare
|
|
248
|
-
| `npx orbit-thread
|
|
249
|
-
| `npx orbit-thread
|
|
250
|
-
| `npx orbit-thread
|
|
251
|
-
| `npx orbit-thread
|
|
252
|
-
| `npx orbit-thread
|
|
253
|
-
| `npx orbit-thread
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
329
|
+
### Moving from Orbit Handoff 1.0.x
|
|
268
330
|
|
|
269
|
-
|
|
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
|
|
339
|
+
The old `orbit-handoff` binary name remains an alias inside the new package. Earlier npm releases remain unchanged.
|
|
276
340
|
|
|
277
|
-
|
|
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
|
-
|
|
343
|
+
## Troubleshooting
|
|
280
344
|
|
|
281
|
-
|
|
282
|
-
|
|
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
|
-
|
|
356
|
+
**Only if those files have no work you need to keep**, restore them and rerun setup:
|
|
286
357
|
|
|
287
|
-
```
|
|
288
|
-
|
|
289
|
-
npx orbit-thread
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
427
|
+
The installer protects unmanaged skills and locally modified managed files. Setup leaves unrelated instructions and existing project documents alone.
|
|
301
428
|
|
|
302
|
-
The
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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)
|
|
449
|
+
[MIT](LICENSE). Created by **Shabih Anwar**.
|
package/docs/PUBLISHING.md
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
# npm publication and releases
|
|
2
2
|
|
|
3
|
-
Orbit Thread v1.
|
|
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
|
-
|
|
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.
|
|
37
|
-
dist/orbit-thread-plugin-1.
|
|
38
|
+
orbit-thread-1.2.0.tgz
|
|
39
|
+
dist/orbit-thread-plugin-1.2.0.zip
|
|
38
40
|
```
|
|
39
41
|
|
|
40
|
-
|
|
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.
|
|
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.
|
|
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
|
|
package/docs/SUBMISSION.md
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
# Directory submission
|
|
2
2
|
|
|
3
|
-
Updated
|
|
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.
|
|
9
|
+
Orbit Thread v1.2.0 is submitted as:
|
|
10
10
|
|
|
11
11
|
```text
|
|
12
|
-
dist/orbit-thread-plugin-1.
|
|
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`,
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
|
package/docs/VALIDATION.md
CHANGED
|
@@ -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.
|
|
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.
|
|
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
|
|
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 `$
|
|
11
|
-
- Claude Code: `/orbit-setup` and `/
|
|
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
|
|
package/plugin/plugin.json
CHANGED
|
@@ -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.
|
|
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
|
|
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\`.
|
|
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.
|
|
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 = {
|