gsd-pi 0.1.2 → 0.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +20 -21
- package/dist/loader.js +0 -2
- package/dist/wizard.js +12 -2
- package/package.json +1 -1
- package/src/resources/extensions/search-the-web/index.ts +4 -2
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
<div align="center">
|
|
2
2
|
|
|
3
|
-
# GSD
|
|
3
|
+
# GSD 2
|
|
4
4
|
|
|
5
5
|
**The evolution of [Get Shit Done](https://github.com/glittercowboy/get-shit-done) — now a real coding agent.**
|
|
6
6
|
|
|
@@ -15,10 +15,7 @@ This version is different. GSD is now a standalone CLI built on the [Pi SDK](htt
|
|
|
15
15
|
|
|
16
16
|
One command. Walk away. Come back to a built project with clean git history.
|
|
17
17
|
|
|
18
|
-
|
|
19
|
-
npm install -g gsd-pi
|
|
20
|
-
gsd
|
|
21
|
-
```
|
|
18
|
+
<pre><code>npm install -g gsd-pi</code></pre>
|
|
22
19
|
|
|
23
20
|
</div>
|
|
24
21
|
|
|
@@ -118,27 +115,31 @@ The wizard is the on-ramp. Auto mode is the highway.
|
|
|
118
115
|
|
|
119
116
|
## Getting Started
|
|
120
117
|
|
|
121
|
-
### Install
|
|
118
|
+
### Install
|
|
122
119
|
|
|
123
120
|
```bash
|
|
124
121
|
npm install -g gsd-pi
|
|
125
|
-
cd your-project
|
|
126
|
-
gsd
|
|
127
122
|
```
|
|
128
123
|
|
|
129
|
-
|
|
124
|
+
### Use it
|
|
130
125
|
|
|
126
|
+
Open a terminal in your project and run:
|
|
127
|
+
|
|
128
|
+
```bash
|
|
129
|
+
gsd
|
|
131
130
|
```
|
|
132
|
-
/gsd auto
|
|
133
|
-
```
|
|
134
131
|
|
|
135
|
-
|
|
132
|
+
GSD opens an interactive agent session. From there, you have two ways to work:
|
|
133
|
+
|
|
134
|
+
**`/gsd` — guided mode.** Type `/gsd` and GSD reads your project state and walks you through whatever's next. No project yet? It helps you describe what you want to build. Roadmap exists? It plans the next slice. Mid-task? It resumes. This is the hands-on mode where you work *with* the agent step by step.
|
|
135
|
+
|
|
136
|
+
**`/gsd auto` — autonomous mode.** Type `/gsd auto` and walk away. GSD researches, plans, executes, verifies, commits, and advances through every slice until the milestone is complete. Fresh context window per task. No babysitting.
|
|
136
137
|
|
|
137
|
-
###
|
|
138
|
+
### Two terminals, one project
|
|
138
139
|
|
|
139
|
-
|
|
140
|
+
The real workflow: run auto mode in one terminal, steer from another.
|
|
140
141
|
|
|
141
|
-
**Terminal 1 —
|
|
142
|
+
**Terminal 1 — let it build**
|
|
142
143
|
```bash
|
|
143
144
|
gsd
|
|
144
145
|
/gsd auto
|
|
@@ -152,17 +153,17 @@ gsd
|
|
|
152
153
|
/gsd queue # queue the next milestone
|
|
153
154
|
```
|
|
154
155
|
|
|
155
|
-
|
|
156
|
+
Both terminals read and write the same `.gsd/` files on disk. Your decisions in terminal 2 are picked up automatically at the next phase boundary — no need to stop auto mode.
|
|
156
157
|
|
|
157
158
|
### First launch
|
|
158
159
|
|
|
159
|
-
On first run, GSD prompts for optional API keys (Brave Search, Context7, Jina) for web research and documentation tools. All optional — press Enter to skip
|
|
160
|
+
On first run, GSD prompts for optional API keys (Brave Search, Context7, Jina) for web research and documentation tools. All optional — press Enter to skip any.
|
|
160
161
|
|
|
161
162
|
### Commands
|
|
162
163
|
|
|
163
164
|
| Command | What it does |
|
|
164
165
|
|---------|-------------|
|
|
165
|
-
| `/gsd` |
|
|
166
|
+
| `/gsd` | Guided mode — reads project state, walks you through what's next |
|
|
166
167
|
| `/gsd auto` | Autonomous mode — researches, plans, executes, commits, repeats |
|
|
167
168
|
| `/gsd stop` | Stop auto mode gracefully |
|
|
168
169
|
| `/gsd discuss` | Discuss architecture and decisions (works alongside auto mode) |
|
|
@@ -270,7 +271,7 @@ budget_ceiling: 50.00
|
|
|
270
271
|
|
|
271
272
|
### Bundled Tools
|
|
272
273
|
|
|
273
|
-
GSD ships with
|
|
274
|
+
GSD ships with 9 extensions, all loaded automatically:
|
|
274
275
|
|
|
275
276
|
| Extension | What it provides |
|
|
276
277
|
|-----------|-----------------|
|
|
@@ -280,9 +281,7 @@ GSD ships with 11 extensions, all loaded automatically:
|
|
|
280
281
|
| **Context7** | Up-to-date library/framework documentation |
|
|
281
282
|
| **Background Shell** | Long-running process management with readiness detection |
|
|
282
283
|
| **Subagent** | Delegated tasks with isolated context windows |
|
|
283
|
-
| **Plan Mode** | Structured planning before execution |
|
|
284
284
|
| **Slash Commands** | Custom command creation |
|
|
285
|
-
| **Worktree** | Git worktree management |
|
|
286
285
|
| **Ask User Questions** | Structured user input with single/multi-select |
|
|
287
286
|
| **Secure Env Collect** | Masked secret collection without manual .env editing |
|
|
288
287
|
|
package/dist/loader.js
CHANGED
|
@@ -60,8 +60,6 @@ process.env.GSD_BUNDLED_EXTENSION_PATHS = [
|
|
|
60
60
|
join(agentDir, 'extensions', 'search-the-web', 'index.ts'),
|
|
61
61
|
join(agentDir, 'extensions', 'slash-commands', 'index.ts'),
|
|
62
62
|
join(agentDir, 'extensions', 'subagent', 'index.ts'),
|
|
63
|
-
join(agentDir, 'extensions', 'worktree', 'index.ts'),
|
|
64
|
-
join(agentDir, 'extensions', 'plan-mode', 'index.ts'),
|
|
65
63
|
join(agentDir, 'extensions', 'ask-user-questions.ts'),
|
|
66
64
|
join(agentDir, 'extensions', 'get-secrets-from-user.ts'),
|
|
67
65
|
].join(':');
|
package/dist/wizard.js
CHANGED
|
@@ -61,6 +61,7 @@ async function promptMasked(question) {
|
|
|
61
61
|
export function loadStoredEnvKeys(authStorage) {
|
|
62
62
|
const providers = [
|
|
63
63
|
['brave', 'BRAVE_API_KEY'],
|
|
64
|
+
['brave_answers', 'BRAVE_ANSWERS_KEY'],
|
|
64
65
|
['context7', 'CONTEXT7_API_KEY'],
|
|
65
66
|
['jina', 'JINA_API_KEY'],
|
|
66
67
|
];
|
|
@@ -87,13 +88,15 @@ export function loadStoredEnvKeys(authStorage) {
|
|
|
87
88
|
*/
|
|
88
89
|
export async function runWizardIfNeeded(authStorage) {
|
|
89
90
|
const needsBrave = !authStorage.has('brave') && !process.env.BRAVE_API_KEY;
|
|
91
|
+
const needsBraveAnswers = !authStorage.has('brave_answers') && !process.env.BRAVE_ANSWERS_KEY;
|
|
90
92
|
const needsContext7 = !authStorage.has('context7') && !process.env.CONTEXT7_API_KEY;
|
|
91
93
|
const needsJina = !authStorage.has('jina') && !process.env.JINA_API_KEY;
|
|
92
|
-
if (!needsBrave && !needsContext7 && !needsJina) {
|
|
94
|
+
if (!needsBrave && !needsBraveAnswers && !needsContext7 && !needsJina) {
|
|
93
95
|
return;
|
|
94
96
|
}
|
|
95
97
|
const missing = [
|
|
96
98
|
needsBrave && 'Brave Search',
|
|
99
|
+
needsBraveAnswers && 'Brave Answers',
|
|
97
100
|
needsContext7 && 'Context7',
|
|
98
101
|
needsJina && 'Jina',
|
|
99
102
|
]
|
|
@@ -108,12 +111,19 @@ export async function runWizardIfNeeded(authStorage) {
|
|
|
108
111
|
process.stdout.write(`\n[gsd] Some optional tool API keys are not configured: ${missing}\n`);
|
|
109
112
|
process.stdout.write('[gsd] Press Enter to skip any key you want to set up later.\n\n');
|
|
110
113
|
if (needsBrave) {
|
|
111
|
-
const key = await promptMasked('Brave Search API key (optional): ');
|
|
114
|
+
const key = await promptMasked('Brave Search API key (optional, for web search + LLM context): ');
|
|
112
115
|
if (key) {
|
|
113
116
|
authStorage.set('brave', { type: 'api_key', key });
|
|
114
117
|
process.env.BRAVE_API_KEY = key;
|
|
115
118
|
}
|
|
116
119
|
}
|
|
120
|
+
if (needsBraveAnswers) {
|
|
121
|
+
const key = await promptMasked('Brave Answers API key (optional, for AI-generated answers): ');
|
|
122
|
+
if (key) {
|
|
123
|
+
authStorage.set('brave_answers', { type: 'api_key', key });
|
|
124
|
+
process.env.BRAVE_ANSWERS_KEY = key;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
117
127
|
if (needsContext7) {
|
|
118
128
|
const key = await promptMasked('Context7 API key (optional): ');
|
|
119
129
|
if (key) {
|
package/package.json
CHANGED
|
@@ -49,16 +49,18 @@ export default function (pi: ExtensionAPI) {
|
|
|
49
49
|
pi.on("session_start", async (_event, ctx) => {
|
|
50
50
|
const hasBrave = !!process.env.BRAVE_API_KEY;
|
|
51
51
|
const hasJina = !!process.env.JINA_API_KEY;
|
|
52
|
+
const hasAnswers = !!process.env.BRAVE_ANSWERS_KEY;
|
|
52
53
|
|
|
53
54
|
if (!hasBrave) {
|
|
54
55
|
ctx.ui.notify(
|
|
55
|
-
"Web search: Set BRAVE_API_KEY for web search capability",
|
|
56
|
+
"Web search: Set BRAVE_API_KEY for web search + LLM context capability",
|
|
56
57
|
"warning"
|
|
57
58
|
);
|
|
58
59
|
}
|
|
59
60
|
|
|
60
61
|
const parts: string[] = ["Web search v3 loaded"];
|
|
61
|
-
if (hasBrave) parts.push("
|
|
62
|
+
if (hasBrave) parts.push("Search ✓");
|
|
63
|
+
if (hasAnswers) parts.push("Answers ✓");
|
|
62
64
|
if (hasJina) parts.push("Jina ✓");
|
|
63
65
|
|
|
64
66
|
ctx.ui.notify(parts.join(" · "), "info");
|