@gotgenes/pi-subagents 1.0.1 → 2.0.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 +29 -0
- package/README.md +0 -35
- package/docs/architecture/architecture.md +4 -8
- package/docs/decisions/0001-deferred-patches.md +7 -4
- package/docs/plans/0051-update-adr-0001-hard-fork.md +74 -0
- package/docs/plans/0052-remove-scheduled-subagents.md +131 -0
- package/docs/retro/0051-update-adr-0001-hard-fork.md +33 -0
- package/package.json +1 -2
- package/src/agent-manager.ts +2 -2
- package/src/index.ts +2 -135
- package/src/settings.ts +0 -14
- package/src/types.ts +0 -43
- package/src/schedule-store.ts +0 -143
- package/src/schedule.ts +0 -365
- package/src/ui/schedule-menu.ts +0 -104
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,35 @@ All notable changes to this project will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [2.0.0](https://github.com/gotgenes/pi-packages/compare/pi-subagents-v1.0.2...pi-subagents-v2.0.0) (2026-05-17)
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
### ⚠ BREAKING CHANGES
|
|
12
|
+
|
|
13
|
+
* the `schedule` parameter is removed from the Agent tool. The `subagents:scheduled` and `subagents:scheduler_ready` events are no longer emitted. The `/agents → Settings → Scheduling` toggle is removed.
|
|
14
|
+
* the `schedule` parameter is removed from the Agent tool and the `subagents:scheduled` / `subagents:scheduler_ready` events are no longer emitted. System cron (or launchd) invoking `pi` directly is the recommended replacement for recurring/delayed agent tasks.
|
|
15
|
+
|
|
16
|
+
### Features
|
|
17
|
+
|
|
18
|
+
* remove scheduled subagents source and tests ([860a03f](https://github.com/gotgenes/pi-packages/commit/860a03f08a6dbd418b437a72c2fd05ea416abacb))
|
|
19
|
+
* remove scheduler wiring, types, and settings ([d5184e8](https://github.com/gotgenes/pi-packages/commit/d5184e88b181e60809b7fecc6a0971a18723bb9d))
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
### Documentation
|
|
23
|
+
|
|
24
|
+
* correct Module-Level Changes table in plan [#52](https://github.com/gotgenes/pi-packages/issues/52) (AGENTS.md → SKILL.md) ([93337e2](https://github.com/gotgenes/pi-packages/commit/93337e2a6b0424dc64e0adaf7a5c6ae6913c5991))
|
|
25
|
+
* plan remove in-process scheduled subagents ([#52](https://github.com/gotgenes/pi-packages/issues/52)) ([bc548a4](https://github.com/gotgenes/pi-packages/commit/bc548a4dc6be4c5f810e9e33abcc76bc0d84f0da))
|
|
26
|
+
* remove scheduling from README, architecture doc, and skill ([b2f16f2](https://github.com/gotgenes/pi-packages/commit/b2f16f2a53674a6a2675024dfc038c4243edd299))
|
|
27
|
+
* **retro:** add retro notes for issue [#51](https://github.com/gotgenes/pi-packages/issues/51) ([0f741de](https://github.com/gotgenes/pi-packages/commit/0f741dedbe4a8e26fd1e39098fb153e4511082b9))
|
|
28
|
+
|
|
29
|
+
## [1.0.2](https://github.com/gotgenes/pi-packages/compare/pi-subagents-v1.0.1...pi-subagents-v1.0.2) (2026-05-17)
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
### Documentation
|
|
33
|
+
|
|
34
|
+
* plan update ADR 0001 to reflect hard-fork decision ([#51](https://github.com/gotgenes/pi-packages/issues/51)) ([bd4899a](https://github.com/gotgenes/pi-packages/commit/bd4899a0d7e72c43b80c3c07c07ccc32dc0df8ed))
|
|
35
|
+
* update ADR 0001 to reflect hard-fork decision ([#51](https://github.com/gotgenes/pi-packages/issues/51)) ([387e0ad](https://github.com/gotgenes/pi-packages/commit/387e0ad06ec1cf015c1d3d1d9852a1be015fc283))
|
|
36
|
+
|
|
8
37
|
## [1.0.1](https://github.com/gotgenes/pi-packages/compare/pi-subagents-v1.0.0...pi-subagents-v1.0.1) (2026-05-17)
|
|
9
38
|
|
|
10
39
|
|
package/README.md
CHANGED
|
@@ -34,7 +34,6 @@ https://github.com/user-attachments/assets/8685261b-9338-4fea-8dfe-1c590d5df543
|
|
|
34
34
|
- **Styled completion notifications** — background agent results render as themed, compact notification boxes (icon, stats, result preview) instead of raw XML. Expandable to show full output. Group completions render each agent individually
|
|
35
35
|
- **Event bus** — lifecycle events (`subagents:created`, `started`, `completed`, `failed`, `steered`, `compacted`) emitted via `pi.events`, enabling other extensions to react to sub-agent activity
|
|
36
36
|
- **Cross-extension RPC** — other pi extensions can spawn and stop subagents via the `pi.events` event bus (`subagents:rpc:ping`, `subagents:rpc:spawn`, `subagents:rpc:stop`). Standardized reply envelopes with protocol versioning. Emits `subagents:ready` on load
|
|
37
|
-
- **Schedule subagents** — pass `schedule` to the `Agent` tool to fire on cron / interval / one-shot. Session-scoped jobs with PID-locked persistence; results land via the same `subagent-notification` followUp path as manual background completions; manage via `/agents → Scheduled jobs`
|
|
38
37
|
|
|
39
38
|
## Install
|
|
40
39
|
|
|
@@ -63,38 +62,6 @@ Agent({
|
|
|
63
62
|
|
|
64
63
|
Foreground agents block until complete and return results inline. Background agents return an ID immediately and notify you on completion.
|
|
65
64
|
|
|
66
|
-
### Scheduling
|
|
67
|
-
|
|
68
|
-
Add a `schedule` field to register the agent to fire later instead of running now:
|
|
69
|
-
|
|
70
|
-
```
|
|
71
|
-
Agent({
|
|
72
|
-
subagent_type: "Explore",
|
|
73
|
-
prompt: "Look at recent commits and summarize what changed since last week",
|
|
74
|
-
description: "Weekly commit review",
|
|
75
|
-
schedule: "0 0 9 * * 1", // 9am every Monday (6-field cron)
|
|
76
|
-
})
|
|
77
|
-
```
|
|
78
|
-
|
|
79
|
-
Schedule formats:
|
|
80
|
-
|
|
81
|
-
- **Cron** — 6-field (`second minute hour day-of-month month day-of-week`), e.g. `"0 0 9 * * 1"` for 9am every Monday, `"0 */15 * * * *"` for every 15 minutes.
|
|
82
|
-
- **Interval** — `"5m"`, `"1h"`, `"30s"`, `"2d"`. Fires repeatedly at that interval.
|
|
83
|
-
- **One-shot relative** — `"+10m"`, `"+2h"`, `"+1d"`. Fires once at that future time.
|
|
84
|
-
- **One-shot absolute** — full ISO timestamp, e.g. `"2026-12-25T09:00:00.000Z"`.
|
|
85
|
-
|
|
86
|
-
When a schedule fires, the spawn runs in background and its completion notification arrives in the conversation through the same `subagent-notification` followUp path as a manually-spawned background agent — your parent agent reasons about the result the same way.
|
|
87
|
-
|
|
88
|
-
Schedules are **session-scoped**: they reset on `/new` and restore on `/resume`. List and cancel via `/agents → Scheduled jobs` (creation is the `Agent` tool's job — there is no parallel manual-create wizard). Storage at `<cwd>/.pi/subagent-schedules/<sessionId>.json` with PID-based file locking for cross-instance safety.
|
|
89
|
-
|
|
90
|
-
**Disable the feature entirely**: `/agents → Settings → Scheduling → disabled` removes `schedule` from the `Agent` tool spec (no LLM-context cost), hides the menu entry, and stops any active scheduler. The schema-level removal takes effect on the next pi session; the runtime kill is immediate. Re-enable from the same menu.
|
|
91
|
-
|
|
92
|
-
Restrictions:
|
|
93
|
-
- `schedule` cannot be combined with `inherit_context` (no parent conversation exists at fire time) or `resume` (schedules create fresh agents).
|
|
94
|
-
- `run_in_background` is forced to `true`.
|
|
95
|
-
- Scheduled fires bypass the `maxConcurrent` queue so a 5-minute interval cannot be deferred behind long-running manual agents.
|
|
96
|
-
- **Headless `pi -p` doesn't wait for scheduled subagents.**
|
|
97
|
-
|
|
98
65
|
## UI
|
|
99
66
|
|
|
100
67
|
The extension renders a persistent widget above the editor showing all active agents:
|
|
@@ -351,8 +318,6 @@ Agent lifecycle events are emitted via `pi.events.emit()` so other extensions ca
|
|
|
351
318
|
| `subagents:failed` | Agent errored, stopped, or aborted | same as completed + `error`, `status` |
|
|
352
319
|
| `subagents:steered` | Steering message sent | `id`, `message` |
|
|
353
320
|
| `subagents:compacted` | Agent's session successfully compacted | `id`, `type`, `description`, `reason` (`"manual"` / `"threshold"` / `"overflow"`), `tokensBefore`, `compactionCount` |
|
|
354
|
-
| `subagents:scheduled` | Schedule lifecycle change | `{ type: "added" \| "removed" \| "updated" \| "fired" \| "error", … }` (job/agentId/error fields per type) |
|
|
355
|
-
| `subagents:scheduler_ready` | Scheduler bound to session, enabled jobs armed | `sessionId`, `jobCount` |
|
|
356
321
|
| `subagents:ready` | Extension loaded and RPC handlers registered | — |
|
|
357
322
|
| `subagents:settings_loaded` | Persisted settings applied at extension init | `settings` (merged global + project) |
|
|
358
323
|
| `subagents:settings_changed` | `/agents` → Settings mutation was applied | `settings`, `persisted` (`boolean` — `false` on write failure) |
|
|
@@ -48,14 +48,11 @@ invocation-config.ts — merge tool params with agent config
|
|
|
48
48
|
output-file.ts — JSONL transcript streaming
|
|
49
49
|
settings.ts — persistent operational settings
|
|
50
50
|
|
|
51
|
-
schedule.ts — cron/interval/one-shot job dispatch ← removing
|
|
52
|
-
schedule-store.ts — file-backed schedule persistence ← removing
|
|
53
51
|
cross-extension-rpc.ts — RPC over pi.events ← replacing
|
|
54
52
|
group-join.ts — batch completion notifications
|
|
55
53
|
|
|
56
54
|
ui/agent-widget.ts — above-editor live status widget
|
|
57
55
|
ui/conversation-viewer.ts — scrollable session overlay
|
|
58
|
-
ui/schedule-menu.ts — /agents schedule submenu ← removing
|
|
59
56
|
```
|
|
60
57
|
|
|
61
58
|
### Coupling today
|
|
@@ -63,8 +60,7 @@ ui/schedule-menu.ts — /agents schedule submenu ← removing
|
|
|
63
60
|
The widget reads agent state by holding a direct reference to
|
|
64
61
|
`AgentManager` and polling a shared mutable `Map<string, AgentActivity>`
|
|
65
62
|
every 80 ms. The conversation viewer subscribes directly to `AgentSession`
|
|
66
|
-
objects.
|
|
67
|
-
`manager.spawn()`.
|
|
63
|
+
objects.
|
|
68
64
|
|
|
69
65
|
Cross-extension consumers use an ad-hoc RPC layer over `pi.events`
|
|
70
66
|
(`subagents:rpc:spawn`, `subagents:rpc:stop`, `subagents:rpc:ping`) with
|
|
@@ -342,10 +338,10 @@ Add the `SubagentsAPI` interface, serializable types, and `Symbol.for()`
|
|
|
342
338
|
accessor functions as public exports of this package. No behavioral
|
|
343
339
|
changes to the core yet.
|
|
344
340
|
|
|
345
|
-
### Phase 2: Remove scheduling
|
|
341
|
+
### Phase 2: Remove scheduling ✓ (done — issue #52)
|
|
346
342
|
|
|
347
|
-
|
|
348
|
-
the `schedule` parameter from the `Agent` tool schema.
|
|
343
|
+
Deleted `schedule.ts`, `schedule-store.ts`, `ui/schedule-menu.ts`. Removed
|
|
344
|
+
the `schedule` parameter from the `Agent` tool schema. Removed scheduler
|
|
349
345
|
setup and lifecycle hooks from `index.ts`.
|
|
350
346
|
|
|
351
347
|
### Phase 3: Remove group-join, output-file, ad-hoc RPC
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
status:
|
|
2
|
+
status: superseded
|
|
3
3
|
date: 2026-05-11
|
|
4
4
|
---
|
|
5
5
|
|
|
@@ -7,7 +7,8 @@ date: 2026-05-11
|
|
|
7
7
|
|
|
8
8
|
## Status
|
|
9
9
|
|
|
10
|
-
|
|
10
|
+
Superseded by [`docs/architecture/architecture.md`](../architecture/architecture.md), which commits to a hard fork with material scope reduction (scheduling removal, `SubagentsAPI` boundary, `index.ts` decomposition).
|
|
11
|
+
The original rationale below remains useful context.
|
|
11
12
|
|
|
12
13
|
## Context
|
|
13
14
|
|
|
@@ -51,7 +52,8 @@ All three divergences now have upstream PRs, opened after production validation
|
|
|
51
52
|
2. **Post-bind re-filter** — [tintinweb/pi-subagents#72](https://github.com/tintinweb/pi-subagents/pull/72) (`fix(agent-runner): re-filter active tools after bindExtensions so extension tools land in child`)
|
|
52
53
|
3. **Active-agent tag** — [tintinweb/pi-subagents#73](https://github.com/tintinweb/pi-subagents/pull/73) (`feat(prompts): inject <active_agent name="..."/> tag for permission resolution`)
|
|
53
54
|
|
|
54
|
-
|
|
55
|
+
If these land upstream, upstream gains the peer-dep fix and the two RepOne patches.
|
|
56
|
+
However, the fork now diverges intentionally beyond those patches — see [`docs/architecture/architecture.md`](../architecture/architecture.md) for the full scope of planned changes.
|
|
55
57
|
|
|
56
58
|
## Consequences
|
|
57
59
|
|
|
@@ -67,5 +69,6 @@ Once these land upstream, the fork's divergence reduces to package naming and to
|
|
|
67
69
|
|
|
68
70
|
### Operational
|
|
69
71
|
|
|
70
|
-
- Upstream PRs are open and linked above.
|
|
72
|
+
- Upstream PRs are open and linked above. If merged, upstream gains the three patches, but the fork continues independently with broader architectural changes per [`docs/architecture/architecture.md`](../architecture/architecture.md).
|
|
73
|
+
- The architecture document governs the fork's direction going forward; this ADR's original "thin-patch" framing no longer describes the fork's trajectory.
|
|
71
74
|
- When Patch 1 is eventually added, it should be a separate ADR in `docs/decisions/` with its own follow-up.
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
---
|
|
2
|
+
issue: 51
|
|
3
|
+
issue_title: "docs: update ADR 0001 to reflect hard-fork decision"
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Update ADR 0001 to reflect hard-fork decision
|
|
7
|
+
|
|
8
|
+
## Problem Statement
|
|
9
|
+
|
|
10
|
+
ADR 0001 (`docs/decisions/0001-deferred-patches.md`) was written when the fork was a thin-patch layer over `tintinweb/pi-subagents`.
|
|
11
|
+
The new architecture document (`docs/architecture/architecture.md`) commits to a hard fork with material scope reduction — scheduling removal, a `SubagentsAPI` boundary, `index.ts` decomposition, and more.
|
|
12
|
+
|
|
13
|
+
Several claims in ADR 0001 are now outdated:
|
|
14
|
+
|
|
15
|
+
1. The status is "accepted" but the decision has been superseded by the architecture doc.
|
|
16
|
+
2. The Upstream PRs section states "the fork's divergence reduces to package naming and tooling," which is no longer true.
|
|
17
|
+
3. The Consequences → Operational section implies that merging the upstream PRs eliminates behavioral divergence, which no longer holds.
|
|
18
|
+
|
|
19
|
+
## Goals
|
|
20
|
+
|
|
21
|
+
- Add a supersession note to ADR 0001 pointing to `docs/architecture/architecture.md`.
|
|
22
|
+
- Update the "Upstream PRs are open" subsection so the "divergence reduces to…" claim reflects reality.
|
|
23
|
+
- Update the Consequences → Operational section to note intentional divergence per the architecture document.
|
|
24
|
+
- Preserve all existing rationale — no information is removed.
|
|
25
|
+
|
|
26
|
+
## Non-Goals
|
|
27
|
+
|
|
28
|
+
- Rewriting the ADR from scratch — the original context is still useful.
|
|
29
|
+
- Updating the architecture document itself.
|
|
30
|
+
- Any code changes.
|
|
31
|
+
|
|
32
|
+
## Background
|
|
33
|
+
|
|
34
|
+
ADR 0001 has YAML frontmatter (`status: accepted`, `date: 2026-05-11`) and follows a standard ADR structure: Status, Context, Decision, Consequences.
|
|
35
|
+
|
|
36
|
+
The architecture document (`docs/architecture/architecture.md`) describes a six-phase plan that materially diverges from upstream: scheduling removal, ad-hoc RPC replacement, group-join and output-file removal, a typed `SubagentsAPI` boundary, and `index.ts` decomposition.
|
|
37
|
+
|
|
38
|
+
The three upstream PRs (#71, #72, #73) are still open and factually accurate — that section just needs the concluding sentence revised.
|
|
39
|
+
|
|
40
|
+
## Design Overview
|
|
41
|
+
|
|
42
|
+
The update touches three areas of the ADR:
|
|
43
|
+
|
|
44
|
+
1. **Frontmatter + Status section** — change `status: accepted` to `status: superseded` in frontmatter, and update the Status section body to read "Superseded" with a pointer to `docs/architecture/architecture.md`.
|
|
45
|
+
2. **"Upstream PRs are open" subsection** — keep the PR list and factual statements intact; revise the final sentence ("Once these land upstream, the fork's divergence reduces to package naming and tooling.") to note that the fork now diverges intentionally beyond those patches, per the architecture document.
|
|
46
|
+
3. **Consequences → Operational** — add a sentence noting that the fork diverges intentionally beyond patches, and that the architecture document governs the fork's direction going forward. Keep the existing bullet about upstream PRs.
|
|
47
|
+
|
|
48
|
+
No structural changes (new sections, removed sections, reordered content).
|
|
49
|
+
|
|
50
|
+
## Module-Level Changes
|
|
51
|
+
|
|
52
|
+
| File | Change |
|
|
53
|
+
| ----------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
54
|
+
| `docs/decisions/0001-deferred-patches.md` | Update frontmatter `status` from `accepted` to `superseded`; revise Status section; revise closing sentence in "Upstream PRs are open"; add divergence note to Consequences → Operational |
|
|
55
|
+
|
|
56
|
+
## Test Impact Analysis
|
|
57
|
+
|
|
58
|
+
No tests are affected — this is a docs-only change.
|
|
59
|
+
|
|
60
|
+
## TDD Order
|
|
61
|
+
|
|
62
|
+
1. Update ADR 0001 with all four edits described above.
|
|
63
|
+
Commit: `docs: update ADR 0001 to reflect hard-fork decision (#51)`
|
|
64
|
+
|
|
65
|
+
## Risks and Mitigations
|
|
66
|
+
|
|
67
|
+
| Risk | Mitigation |
|
|
68
|
+
| ---------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- |
|
|
69
|
+
| Supersession note makes the ADR look stale | Keep all original rationale intact; the note clarifies evolution, not obsolescence |
|
|
70
|
+
| Wording drift between ADR and architecture doc | Use a direct pointer (`docs/architecture/architecture.md`) rather than paraphrasing the architecture doc's decisions |
|
|
71
|
+
|
|
72
|
+
## Open Questions
|
|
73
|
+
|
|
74
|
+
None — the issue's acceptance criteria are unambiguous.
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
---
|
|
2
|
+
issue: 52
|
|
3
|
+
issue_title: "feat: remove in-process scheduled subagents"
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Remove in-process scheduled subagents
|
|
7
|
+
|
|
8
|
+
## Problem Statement
|
|
9
|
+
|
|
10
|
+
The scheduling subsystem reimplements OS-level cron inside a process that is not designed to be a long-lived daemon.
|
|
11
|
+
System cron (or launchd) invoking `pi` directly is strictly superior: it survives crashes and reboots, is inspectable via `crontab -l`, and adds zero lines of code to this extension.
|
|
12
|
+
The current implementation weighs ~610 source lines plus ~820 test lines, a `croner` dependency, PID-locked file persistence, and scheduler lifecycle wiring scattered across `index.ts`.
|
|
13
|
+
|
|
14
|
+
## Goals
|
|
15
|
+
|
|
16
|
+
- Delete the three scheduling source files (`schedule.ts`, `schedule-store.ts`, `ui/schedule-menu.ts`).
|
|
17
|
+
- Delete the three scheduling test files (`schedule.test.ts`, `schedule-store.test.ts`, `schedule-e2e.test.ts`).
|
|
18
|
+
- Remove all scheduler wiring from `index.ts` (~200 lines of imports, lifecycle hooks, tool-schema gates, and menu routing).
|
|
19
|
+
- Remove `ScheduledSubagent` and `ScheduleStoreData` interfaces from `types.ts`.
|
|
20
|
+
- Remove `schedulingEnabled` from `SubagentsSettings`, `SettingsAppliers`, and related sanitize/apply logic in `settings.ts`.
|
|
21
|
+
- Remove the `croner` dependency from `package.json`.
|
|
22
|
+
- Update `README.md` (remove "Scheduling" section and events-table rows) and package `AGENTS.md` (remove scheduling modules from architecture diagram and tables).
|
|
23
|
+
- This is a **breaking change** (`feat!:`) — the `schedule` parameter is removed from the `Agent` tool, and the `subagents:scheduled` / `subagents:scheduler_ready` events are no longer emitted.
|
|
24
|
+
|
|
25
|
+
## Non-Goals
|
|
26
|
+
|
|
27
|
+
- Removing `bypassQueue` from `SpawnOptions` in `agent-manager.ts` — it remains useful for cross-extension RPC callers.
|
|
28
|
+
- Removing other subsystems slated for removal in the architecture doc (output-file, cross-extension-rpc, group-join) — those are separate issues.
|
|
29
|
+
- Providing a migration path or compatibility shim — no known consumers depend on the scheduling events.
|
|
30
|
+
|
|
31
|
+
## Background
|
|
32
|
+
|
|
33
|
+
The architecture doc (`docs/architecture/architecture.md`) already marks `schedule.ts`, `schedule-store.ts`, and `ui/schedule-menu.ts` as `← removing`.
|
|
34
|
+
This issue executes that plan.
|
|
35
|
+
|
|
36
|
+
The scheduling code touches `index.ts` in several distinct regions:
|
|
37
|
+
|
|
38
|
+
1. Imports (lines 27–28, 46)
|
|
39
|
+
2. Scheduler instance creation and `startScheduler()` helper (lines 445–462)
|
|
40
|
+
3. Lifecycle hooks: `session_start`, `session_before_switch`, `session_shutdown` (lines 470–496)
|
|
41
|
+
4. The `schedule` tool-schema param shape, conditional inclusion, and guideline string (lines 621–640, 666, 719)
|
|
42
|
+
5. Schedule execution path in the Agent tool handler (lines 880–918)
|
|
43
|
+
6. `/agents` menu: "Scheduled jobs" entry and routing (lines 1297–1327)
|
|
44
|
+
7. `/agents → Settings → Scheduling` toggle (lines 1855–1867)
|
|
45
|
+
|
|
46
|
+
The `settings.ts` module has `schedulingEnabled` woven into `SubagentsSettings`, `SettingsAppliers`, `sanitize()`, and `applySettings()`.
|
|
47
|
+
|
|
48
|
+
`types.ts` carries `ScheduledSubagent` (30 lines) and `ScheduleStoreData` (5 lines) — both are only consumed by the scheduling subsystem.
|
|
49
|
+
|
|
50
|
+
## Design Overview
|
|
51
|
+
|
|
52
|
+
This is a pure deletion change with no new abstractions.
|
|
53
|
+
The approach is inside-out: delete leaf modules first (no dependents), then remove references from the wiring layer (`index.ts`, `settings.ts`, `types.ts`), then clean up docs.
|
|
54
|
+
|
|
55
|
+
The `bypassQueue` option on `SpawnOptions` stays — its JSDoc comment mentioning "scheduler" should be updated to a generic description since the scheduler is the only current user but the option is architecturally useful for any caller that needs to skip the concurrency queue.
|
|
56
|
+
|
|
57
|
+
## Module-Level Changes
|
|
58
|
+
|
|
59
|
+
### Delete
|
|
60
|
+
|
|
61
|
+
| File | Lines |
|
|
62
|
+
| ----------------------------- | ----- |
|
|
63
|
+
| `src/schedule.ts` | 365 |
|
|
64
|
+
| `src/schedule-store.ts` | 143 |
|
|
65
|
+
| `src/ui/schedule-menu.ts` | 104 |
|
|
66
|
+
| `test/schedule.test.ts` | 429 |
|
|
67
|
+
| `test/schedule-store.test.ts` | 154 |
|
|
68
|
+
| `test/schedule-e2e.test.ts` | 237 |
|
|
69
|
+
|
|
70
|
+
### Modify
|
|
71
|
+
|
|
72
|
+
| File | Change |
|
|
73
|
+
| ------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
74
|
+
| `src/index.ts` | Remove scheduler imports, instance creation, `startScheduler()`, lifecycle hooks, `scheduleParamShape`/`scheduleParam`/`scheduleGuideline`, schedule execution path in Agent handler, "Scheduled jobs" menu entry + routing, "Scheduling" settings toggle. |
|
|
75
|
+
| `src/types.ts` | Remove `ScheduledSubagent` interface and `ScheduleStoreData` interface. |
|
|
76
|
+
| `src/settings.ts` | Remove `schedulingEnabled` from `SubagentsSettings` and `SettingsAppliers`. Remove sanitize clause and `applySettings` clause for `schedulingEnabled`. |
|
|
77
|
+
| `src/agent-manager.ts` | Update `bypassQueue` JSDoc to remove scheduler-specific language. |
|
|
78
|
+
| `package.json` | Remove `"croner": "^10.0.1"` from dependencies. |
|
|
79
|
+
| `README.md` | Remove "Scheduling" feature bullet, "Scheduling" subsection (lines 66–96), and `subagents:scheduled` / `subagents:scheduler_ready` rows from the events table. |
|
|
80
|
+
| `.pi/skills/package-pi-subagents/SKILL.md` | Remove `schedule.ts`, `schedule-store.ts`, `ui/schedule-menu.ts` from the architecture diagram and module tables. Update `index.ts` description to drop scheduler mention. (`packages/pi-subagents/AGENTS.md` is a stub — the architecture content lives in the skill file.) |
|
|
81
|
+
|
|
82
|
+
## Test Impact Analysis
|
|
83
|
+
|
|
84
|
+
1. No new unit tests are needed — this is pure deletion.
|
|
85
|
+
2. All three scheduling test files (`schedule.test.ts`, `schedule-store.test.ts`, `schedule-e2e.test.ts`) become entirely redundant and are deleted.
|
|
86
|
+
3. Existing tests for `agent-manager`, `agent-runner`, `settings`, and other modules stay as-is. The `settings.test.ts` file (if it exists) may need minor updates to remove `schedulingEnabled` from fixture data.
|
|
87
|
+
|
|
88
|
+
## TDD Order
|
|
89
|
+
|
|
90
|
+
Since this is a removal (not a feature), the order is deletion-first with a single validation pass.
|
|
91
|
+
|
|
92
|
+
1. **Delete scheduling source files.**
|
|
93
|
+
Delete `src/schedule.ts`, `src/schedule-store.ts`, `src/ui/schedule-menu.ts`.
|
|
94
|
+
Delete `test/schedule.test.ts`, `test/schedule-store.test.ts`, `test/schedule-e2e.test.ts`.
|
|
95
|
+
Commit: `feat!: remove scheduled subagents source and tests`
|
|
96
|
+
|
|
97
|
+
2. **Remove scheduler wiring from `index.ts`.**
|
|
98
|
+
Remove imports, scheduler instance, `startScheduler()`, lifecycle hooks, schedule-related tool schema params and guideline, schedule execution path in Agent handler, "Scheduled jobs" menu entry/routing, and "Scheduling" settings toggle.
|
|
99
|
+
Commit: `feat!: remove scheduler wiring from index.ts`
|
|
100
|
+
|
|
101
|
+
3. **Clean up types and settings.**
|
|
102
|
+
Remove `ScheduledSubagent` and `ScheduleStoreData` from `types.ts`.
|
|
103
|
+
Remove `schedulingEnabled` from `SubagentsSettings`, `SettingsAppliers`, `sanitize()`, and `applySettings()` in `settings.ts`.
|
|
104
|
+
Update `bypassQueue` JSDoc in `agent-manager.ts`.
|
|
105
|
+
Commit: `feat!: remove scheduling types and settings`
|
|
106
|
+
|
|
107
|
+
4. **Remove `croner` dependency.**
|
|
108
|
+
Remove from `package.json`, run `pnpm install` to update lockfile.
|
|
109
|
+
Commit: `build: remove croner dependency`
|
|
110
|
+
|
|
111
|
+
5. **Verify all tests pass.**
|
|
112
|
+
Run `pnpm vitest run` in the package. Fix any test fixtures that reference `schedulingEnabled` or scheduling types.
|
|
113
|
+
Commit (if fixes needed): `test: remove scheduling references from test fixtures`
|
|
114
|
+
|
|
115
|
+
6. **Update documentation.**
|
|
116
|
+
Update `README.md`: remove scheduling feature bullet, "Scheduling" subsection, and event-table rows.
|
|
117
|
+
Update package `AGENTS.md`: remove scheduling modules from architecture diagram and module tables, update `index.ts` description.
|
|
118
|
+
Commit: `docs: remove scheduling from README and AGENTS`
|
|
119
|
+
|
|
120
|
+
## Risks and Mitigations
|
|
121
|
+
|
|
122
|
+
| Risk | Mitigation |
|
|
123
|
+
| ------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------- |
|
|
124
|
+
| Missed scheduling reference causes compile error | `grep -rn 'schedule\|Schedule\|croner' src/` after each step to catch stragglers. TypeScript `noEmit` check catches import errors. |
|
|
125
|
+
| Test fixtures reference `schedulingEnabled` | Step 5 explicitly scans for and fixes these. |
|
|
126
|
+
| `bypassQueue` removal mistakenly included | Explicitly excluded in Non-Goals; plan preserves the option and only updates its JSDoc. |
|
|
127
|
+
| Breaking change not communicated | `feat!:` commit prefix triggers a major version bump via release-please. |
|
|
128
|
+
|
|
129
|
+
## Open Questions
|
|
130
|
+
|
|
131
|
+
None — the issue scope is fully specified and the architecture doc already ratified this removal.
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
---
|
|
2
|
+
issue: 51
|
|
3
|
+
issue_title: "docs: update ADR 0001 to reflect hard-fork decision"
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Retro: #51 — docs: update ADR 0001 to reflect hard-fork decision
|
|
7
|
+
|
|
8
|
+
## Final Retrospective (2026-05-16)
|
|
9
|
+
|
|
10
|
+
### Session summary
|
|
11
|
+
|
|
12
|
+
Updated ADR 0001 (`docs/decisions/0001-deferred-patches.md`) to reflect the hard-fork decision documented in `docs/architecture/architecture.md`.
|
|
13
|
+
The change was planned, implemented, shipped, and released as `pi-subagents-v1.0.2` in a single clean pass with no rework.
|
|
14
|
+
|
|
15
|
+
### Observations
|
|
16
|
+
|
|
17
|
+
#### What went well
|
|
18
|
+
|
|
19
|
+
- The entire plan→build→ship pipeline completed with zero corrections, zero CI failures, and zero user interventions.
|
|
20
|
+
- Parallel context gathering (issue body, `AGENTS.md`, ADR file, architecture doc, two skill files) in one tool call made the planning phase efficient.
|
|
21
|
+
- The 4-edit approach (`Edit` with a single call containing four `edits[]` entries) was well-matched to the task — each edit was small, unique, and non-overlapping.
|
|
22
|
+
|
|
23
|
+
#### What caused friction (agent side)
|
|
24
|
+
|
|
25
|
+
- No friction observed. The task was unambiguous and the tooling well-suited.
|
|
26
|
+
|
|
27
|
+
#### What caused friction (user side)
|
|
28
|
+
|
|
29
|
+
- No friction observed. The session required no user input beyond invoking the three slash commands.
|
|
30
|
+
|
|
31
|
+
### Follow-ups identified
|
|
32
|
+
|
|
33
|
+
- The `package-pi-subagents` skill (`.pi/skills/package-pi-subagents/SKILL.md`) still frames the fork as "a friendly fork… carrying a small number of patches" with priorities like "stays as close to upstream as possible." This framing is now stale given the hard-fork commitment. A separate issue should update the skill to reflect the architecture document's posture.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gotgenes/pi-subagents",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "2.0.0",
|
|
4
4
|
"description": "A pi extension that brings Claude Code-style autonomous sub-agents to pi. Friendly fork of @tintinweb/pi-subagents.",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Chris Lasher"
|
|
@@ -33,7 +33,6 @@
|
|
|
33
33
|
},
|
|
34
34
|
"dependencies": {
|
|
35
35
|
"@sinclair/typebox": "^0.34.49",
|
|
36
|
-
"croner": "^10.0.1",
|
|
37
36
|
"nanoid": "^5.0.0"
|
|
38
37
|
},
|
|
39
38
|
"engines": {
|
package/src/agent-manager.ts
CHANGED
|
@@ -40,8 +40,8 @@ interface SpawnOptions {
|
|
|
40
40
|
isBackground?: boolean;
|
|
41
41
|
/**
|
|
42
42
|
* Skip the maxConcurrent queue check for this spawn — start immediately even
|
|
43
|
-
* if the configured concurrency limit would otherwise queue it.
|
|
44
|
-
*
|
|
43
|
+
* if the configured concurrency limit would otherwise queue it. Useful for
|
|
44
|
+
* callers (e.g. cross-extension RPC) that must not be deferred by the queue.
|
|
45
45
|
*/
|
|
46
46
|
bypassQueue?: boolean;
|
|
47
47
|
/** Isolation mode — "worktree" creates a temp git worktree for the agent. */
|