@codewithahsan/paperclip-plugin-gsd 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Ahsan Ayaz
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,231 @@
1
+ # @codewithahsan/paperclip-plugin-gsd
2
+
3
+ > Bring your GSD planning workflows into [Paperclip](https://github.com/paperclipai/paperclip) — see phase progress, milestones, and verification status right where you manage your AI agents.
4
+
5
+ ---
6
+
7
+ ## Why this exists
8
+
9
+ If you use [GSD (Get Shit Done)](https://github.com/get-shit-done/get-shit-done) to plan and execute work with AI agents, you already know how powerful it is. Phases, plans, waves, verification — GSD gives your agents real structure.
10
+
11
+ But there's a gap: GSD lives in the terminal. Your `.planning/` directory has all the state, but you can't see it from Paperclip's UI. You can't glance at a dashboard and know which phases are done, which agent is executing, or whether verification passed.
12
+
13
+ This plugin bridges that gap. It reads GSD's `.planning/` files (the single source of truth) and surfaces everything in Paperclip — dashboard widgets, project tabs, issue linking, and more. No reimplementation, no duplication. Just a clean read-only window into what GSD is doing.
14
+
15
+ ## How it works
16
+
17
+ ```mermaid
18
+ flowchart LR
19
+ subgraph Agent Environment
20
+ A[AI Agent] -->|runs| B[GSD Plugin]
21
+ B -->|writes| C[.planning/ directory]
22
+ end
23
+
24
+ subgraph Paperclip
25
+ D[paperclip-plugin-gsd] -->|reads| C
26
+ D -->|syncs state| E[Plugin State Store]
27
+ E --> F[Dashboard Widget]
28
+ E --> G[Project Tab]
29
+ E --> H[Issue Tab]
30
+ E --> I[Settings Page]
31
+ D -->|posts comments| J[Linked Issues]
32
+ end
33
+
34
+ style C fill:#4f46e5,stroke:#4f46e5,color:#fff
35
+ style D fill:#22c55e,stroke:#22c55e,color:#fff
36
+ ```
37
+
38
+ The plugin **never writes** to `.planning/` — it only reads. GSD remains the single source of truth.
39
+
40
+ ### Sync triggers
41
+
42
+ The plugin syncs GSD state in three ways:
43
+
44
+ ```mermaid
45
+ flowchart TD
46
+ A[Agent finishes a run] -->|event: agent.run.finished| S[Sync workspace]
47
+ B[New workspace created] -->|event: project.workspace_created| S
48
+ C[Periodic timer] -->|every N seconds| S
49
+ D[Manual button click] -->|action: sync-project| S
50
+
51
+ S --> P[Parse .planning/]
52
+ P --> U[Update plugin state]
53
+ U --> I[Comment on linked issues]
54
+ ```
55
+
56
+ ### Phase lifecycle
57
+
58
+ GSD phases move through a well-defined lifecycle. The plugin detects where each phase is by analyzing which files exist:
59
+
60
+ ```mermaid
61
+ stateDiagram-v2
62
+ [*] --> NotStarted: Phase directory created
63
+ NotStarted --> Context: CONTEXT.md written
64
+ Context --> Researching: RESEARCH.md written
65
+ Researching --> Planned: PLAN.md files created
66
+ Planned --> Executing: First SUMMARY.md written
67
+ Executing --> Executing: More SUMMARY.md files
68
+ Executing --> Finishing: All SUMMARY.md done (current phase)
69
+ Finishing --> Complete: Verification passed
70
+ Finishing --> Verifying: Gaps found / needs review
71
+ Verifying --> Complete: Gaps resolved
72
+ Executing --> Diagnosed: UAT found issues
73
+ Diagnosed --> Executing: Fix plans added
74
+ ```
75
+
76
+ | Status | What it means | How it's detected |
77
+ |--------|---------------|-------------------|
78
+ | Not Started | Phase directory exists, nothing inside | No CONTEXT, RESEARCH, or PLAN files |
79
+ | Context Gathered | Design vision captured | `CONTEXT.md` present |
80
+ | Researched | Technical research done | `RESEARCH.md` present |
81
+ | Planned | Plans created, ready to execute | `PLAN.md` files exist, no `SUMMARY.md` |
82
+ | Executing | Agent is working through plans | Some plans have `SUMMARY.md` |
83
+ | Finishing | All plans done, post-execution running | All `SUMMARY.md` exist, still current phase |
84
+ | Verifying | Verification found gaps or needs human review | `VERIFICATION.md` status is `gaps_found` or `human_needed` |
85
+ | Complete | Phase fully done | All `SUMMARY.md` + verification passed (or no verification) |
86
+ | Gaps Found | UAT diagnosed issues | `UAT.md` status is `diagnosed` |
87
+
88
+ ## Getting started
89
+
90
+ ### Prerequisites
91
+
92
+ - A running [Paperclip](https://github.com/paperclipai/paperclip) instance
93
+ - [GSD](https://github.com/get-shit-done/get-shit-done) installed in your agent's environment (Claude Code plugin, Gemini CLI skill, etc.)
94
+
95
+ ### Install the plugin
96
+
97
+ From npm:
98
+
99
+ ```bash
100
+ npx paperclipai plugin install @codewithahsan/paperclip-plugin-gsd
101
+ ```
102
+
103
+ From a local clone:
104
+
105
+ ```bash
106
+ git clone https://github.com/AhsanAyaz/paperclip-plugin-gsd.git
107
+ cd paperclip-plugin-gsd
108
+ npm install && npm run build
109
+ npx paperclipai plugin install ./
110
+ ```
111
+
112
+ ### What you'll see
113
+
114
+ Once installed, the plugin adds five UI components to Paperclip:
115
+
116
+ | Component | Where | What it shows |
117
+ |-----------|-------|---------------|
118
+ | **Dashboard Widget** | Main dashboard | Progress overview across all projects |
119
+ | **GSD Tab** | Project detail page | Full phase roadmap with progress bars, artifact badges, and verification status |
120
+ | **GSD Phase Tab** | Issue detail page | Phase details for issues linked to GSD phases |
121
+ | **Sync GSD Button** | Project toolbar | One-click manual sync |
122
+ | **GSD Settings** | Plugin settings | Auto-sync toggle, sync interval, agent compatibility table |
123
+
124
+ ### Configuration
125
+
126
+ Open the GSD Settings page in Paperclip to configure:
127
+
128
+ - **Auto-sync** — Enable/disable periodic syncing (default: enabled)
129
+ - **Sync interval** — How often to check for GSD changes, 10–600 seconds (default: 30s)
130
+
131
+ ### Linking phases to issues
132
+
133
+ You can link GSD phases to Paperclip issues. When a linked phase makes progress (plans complete, verification runs), the plugin posts a comment on the issue automatically.
134
+
135
+ Use the `link-phase` action via the plugin API:
136
+
137
+ ```
138
+ projectId: "your-project-id"
139
+ phaseNumber: "17"
140
+ issueId: "your-issue-id"
141
+ ```
142
+
143
+ ## Architecture
144
+
145
+ ```
146
+ src/
147
+ ├── manifest.ts # Plugin manifest (capabilities, UI slots, config schema)
148
+ ├── worker.ts # Core sync logic, event handlers, data providers, actions
149
+ ├── gsd-parser.ts # Reads and parses .planning/ directory structure
150
+ ├── gsd-types.ts # TypeScript interfaces for all GSD data structures
151
+ ├── adapter-compat.ts # Agent adapter compatibility detection
152
+ ├── constants.ts # Plugin IDs, data keys, action keys
153
+ └── ui/
154
+ └── index.tsx # All 5 UI components (React)
155
+ ```
156
+
157
+ ### Key design decisions
158
+
159
+ - **Read-only** — The plugin never modifies `.planning/` files. GSD is the single source of truth.
160
+ - **File-based detection** — Phase status is inferred from which files exist (CONTEXT.md, RESEARCH.md, PLAN.md, SUMMARY.md, VERIFICATION.md, UAT.md), not from any configuration.
161
+ - **Adapter-aware** — Not all agent adapters support GSD. The plugin detects compatibility and surfaces it clearly in the settings page.
162
+ - **Event-driven + periodic** — Syncs happen on agent run completion, workspace creation, and on a configurable timer. Manual sync is always available.
163
+
164
+ ## Development
165
+
166
+ ```bash
167
+ # Install dependencies
168
+ npm install
169
+
170
+ # Build the plugin (worker + manifest + UI)
171
+ npm run build
172
+
173
+ # Watch mode for development
174
+ npm run build:watch
175
+
176
+ # Run tests
177
+ npm test
178
+
179
+ # Type check
180
+ npm run typecheck
181
+ ```
182
+
183
+ ### Running tests
184
+
185
+ Tests use [Vitest](https://vitest.dev/) and test the GSD parser against fixture files in `tests/fixtures/.planning/`:
186
+
187
+ ```bash
188
+ npm test
189
+ ```
190
+
191
+ ## Contributing
192
+
193
+ Contributions are welcome! Whether it's a bug fix, a new feature, or better docs — we'd love your help.
194
+
195
+ ### How to contribute
196
+
197
+ 1. **Fork** the repo
198
+ 2. **Create a branch** for your change (`git checkout -b feat/my-feature`)
199
+ 3. **Make your changes** — follow the existing code style
200
+ 4. **Add tests** if you're changing parser or worker logic
201
+ 5. **Run `npm test`** to make sure nothing breaks
202
+ 6. **Open a PR** with a clear description of what you changed and why
203
+
204
+ ### Ideas for contributions
205
+
206
+ - Better UI components (charts, timeline views)
207
+ - Support for more agent adapters
208
+ - Phase-to-issue auto-linking based on naming conventions
209
+ - Milestone progress tracking across multiple projects
210
+ - Notifications when phases complete or verification fails
211
+
212
+ ### Code style
213
+
214
+ - TypeScript, strict mode
215
+ - No unnecessary abstractions — keep it simple
216
+ - Tests for parser and worker logic
217
+ - UI components use inline styles with CSS variable fallbacks
218
+
219
+ ## Compatibility
220
+
221
+ - **Paperclip** — tested with the latest version
222
+ - **GSD** — compatible with the GSD `.planning/` directory format
223
+ - **Agents** — works with Claude Code (`claude_local` adapter, full support), process-based agents (partial support). Other adapters will show an informational message.
224
+
225
+ ## License
226
+
227
+ MIT — see [LICENSE](./LICENSE)
228
+
229
+ ---
230
+
231
+ Built with care by [Ahsan Ayaz](https://codewithahsan.dev). If this plugin helps your workflow, give it a star!
@@ -0,0 +1,99 @@
1
+ const manifest = {
2
+ id: "paperclip.gsd",
3
+ apiVersion: 1,
4
+ version: "0.1.0",
5
+ displayName: "GSD \u2014 Get Shit Done",
6
+ description: "Bridges GSD planning workflows with Paperclip. Syncs phases, milestones, and progress from agent workspaces into Paperclip issues and UI.",
7
+ author: "Paperclip",
8
+ categories: ["workspace", "automation"],
9
+ capabilities: [
10
+ "events.subscribe",
11
+ "jobs.schedule",
12
+ "plugin.state.read",
13
+ "plugin.state.write",
14
+ "companies.read",
15
+ "projects.read",
16
+ "project.workspaces.read",
17
+ "issues.read",
18
+ "issues.update",
19
+ "issue.comments.read",
20
+ "issue.comments.create",
21
+ "agents.read",
22
+ "ui.dashboardWidget.register",
23
+ "ui.detailTab.register",
24
+ "ui.action.register",
25
+ "instance.settings.register",
26
+ "activity.log.write"
27
+ ],
28
+ entrypoints: {
29
+ worker: "./dist/worker.js",
30
+ ui: "./dist/ui"
31
+ },
32
+ instanceConfigSchema: {
33
+ type: "object",
34
+ properties: {
35
+ autoSyncEnabled: {
36
+ type: "boolean",
37
+ title: "Enable auto-sync",
38
+ description: "Periodically sync GSD state from project workspaces",
39
+ default: true
40
+ },
41
+ syncIntervalSeconds: {
42
+ type: "number",
43
+ title: "Sync interval (seconds)",
44
+ description: "How often to check for GSD changes (minimum 10)",
45
+ default: 30,
46
+ minimum: 10,
47
+ maximum: 600
48
+ }
49
+ }
50
+ },
51
+ jobs: [
52
+ {
53
+ jobKey: "periodic-sync",
54
+ displayName: "Periodic GSD Sync"
55
+ }
56
+ ],
57
+ ui: {
58
+ slots: [
59
+ {
60
+ type: "dashboardWidget",
61
+ id: "gsd-overview",
62
+ displayName: "GSD Progress",
63
+ exportName: "GsdDashboardWidget"
64
+ },
65
+ {
66
+ type: "detailTab",
67
+ id: "gsd-project-tab",
68
+ displayName: "GSD",
69
+ exportName: "GsdProjectTab",
70
+ entityTypes: ["project"]
71
+ },
72
+ {
73
+ type: "detailTab",
74
+ id: "gsd-issue-tab",
75
+ displayName: "GSD Phase",
76
+ exportName: "GsdIssueTab",
77
+ entityTypes: ["issue"]
78
+ },
79
+ {
80
+ type: "toolbarButton",
81
+ id: "gsd-sync-btn",
82
+ displayName: "Sync GSD",
83
+ exportName: "GsdSyncButton",
84
+ entityTypes: ["project"]
85
+ },
86
+ {
87
+ type: "settingsPage",
88
+ id: "gsd-settings",
89
+ displayName: "GSD Settings",
90
+ exportName: "GsdSettingsPage"
91
+ }
92
+ ]
93
+ }
94
+ };
95
+ var manifest_default = manifest;
96
+ export {
97
+ manifest_default as default
98
+ };
99
+ //# sourceMappingURL=manifest.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/manifest.ts"],
4
+ "sourcesContent": ["import type { PaperclipPluginManifestV1 } from \"@paperclipai/plugin-sdk\";\n\nconst manifest: PaperclipPluginManifestV1 = {\n id: \"paperclip.gsd\",\n apiVersion: 1,\n version: \"0.1.0\",\n displayName: \"GSD \\u2014 Get Shit Done\",\n description:\n \"Bridges GSD planning workflows with Paperclip. Syncs phases, milestones, and progress from agent workspaces into Paperclip issues and UI.\",\n author: \"Paperclip\",\n categories: [\"workspace\", \"automation\"],\n capabilities: [\n \"events.subscribe\",\n \"jobs.schedule\",\n \"plugin.state.read\",\n \"plugin.state.write\",\n \"companies.read\",\n \"projects.read\",\n \"project.workspaces.read\",\n \"issues.read\",\n \"issues.update\",\n \"issue.comments.read\",\n \"issue.comments.create\",\n \"agents.read\",\n \"ui.dashboardWidget.register\",\n \"ui.detailTab.register\",\n \"ui.action.register\",\n \"instance.settings.register\",\n \"activity.log.write\",\n ],\n entrypoints: {\n worker: \"./dist/worker.js\",\n ui: \"./dist/ui\",\n },\n instanceConfigSchema: {\n type: \"object\",\n properties: {\n autoSyncEnabled: {\n type: \"boolean\",\n title: \"Enable auto-sync\",\n description: \"Periodically sync GSD state from project workspaces\",\n default: true,\n },\n syncIntervalSeconds: {\n type: \"number\",\n title: \"Sync interval (seconds)\",\n description: \"How often to check for GSD changes (minimum 10)\",\n default: 30,\n minimum: 10,\n maximum: 600,\n },\n },\n },\n jobs: [\n {\n jobKey: \"periodic-sync\",\n displayName: \"Periodic GSD Sync\",\n },\n ],\n ui: {\n slots: [\n {\n type: \"dashboardWidget\",\n id: \"gsd-overview\",\n displayName: \"GSD Progress\",\n exportName: \"GsdDashboardWidget\",\n },\n {\n type: \"detailTab\",\n id: \"gsd-project-tab\",\n displayName: \"GSD\",\n exportName: \"GsdProjectTab\",\n entityTypes: [\"project\"],\n },\n {\n type: \"detailTab\",\n id: \"gsd-issue-tab\",\n displayName: \"GSD Phase\",\n exportName: \"GsdIssueTab\",\n entityTypes: [\"issue\"],\n },\n {\n type: \"toolbarButton\",\n id: \"gsd-sync-btn\",\n displayName: \"Sync GSD\",\n exportName: \"GsdSyncButton\",\n entityTypes: [\"project\"],\n },\n {\n type: \"settingsPage\",\n id: \"gsd-settings\",\n displayName: \"GSD Settings\",\n exportName: \"GsdSettingsPage\",\n },\n ],\n },\n};\n\nexport default manifest;\n"],
5
+ "mappings": "AAEA,MAAM,WAAsC;AAAA,EAC1C,IAAI;AAAA,EACJ,YAAY;AAAA,EACZ,SAAS;AAAA,EACT,aAAa;AAAA,EACb,aACE;AAAA,EACF,QAAQ;AAAA,EACR,YAAY,CAAC,aAAa,YAAY;AAAA,EACtC,cAAc;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,aAAa;AAAA,IACX,QAAQ;AAAA,IACR,IAAI;AAAA,EACN;AAAA,EACA,sBAAsB;AAAA,IACpB,MAAM;AAAA,IACN,YAAY;AAAA,MACV,iBAAiB;AAAA,QACf,MAAM;AAAA,QACN,OAAO;AAAA,QACP,aAAa;AAAA,QACb,SAAS;AAAA,MACX;AAAA,MACA,qBAAqB;AAAA,QACnB,MAAM;AAAA,QACN,OAAO;AAAA,QACP,aAAa;AAAA,QACb,SAAS;AAAA,QACT,SAAS;AAAA,QACT,SAAS;AAAA,MACX;AAAA,IACF;AAAA,EACF;AAAA,EACA,MAAM;AAAA,IACJ;AAAA,MACE,QAAQ;AAAA,MACR,aAAa;AAAA,IACf;AAAA,EACF;AAAA,EACA,IAAI;AAAA,IACF,OAAO;AAAA,MACL;AAAA,QACE,MAAM;AAAA,QACN,IAAI;AAAA,QACJ,aAAa;AAAA,QACb,YAAY;AAAA,MACd;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,IAAI;AAAA,QACJ,aAAa;AAAA,QACb,YAAY;AAAA,QACZ,aAAa,CAAC,SAAS;AAAA,MACzB;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,IAAI;AAAA,QACJ,aAAa;AAAA,QACb,YAAY;AAAA,QACZ,aAAa,CAAC,OAAO;AAAA,MACvB;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,IAAI;AAAA,QACJ,aAAa;AAAA,QACb,YAAY;AAAA,QACZ,aAAa,CAAC,SAAS;AAAA,MACzB;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,IAAI;AAAA,QACJ,aAAa;AAAA,QACb,YAAY;AAAA,MACd;AAAA,IACF;AAAA,EACF;AACF;AAEA,IAAO,mBAAQ;",
6
+ "names": []
7
+ }