gsd-pi 0.1.1 → 0.1.3
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 +30 -21
- 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
|
@@ -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
|
|
|
@@ -124,43 +121,55 @@ The wizard is the on-ramp. Auto mode is the highway.
|
|
|
124
121
|
npm install -g gsd-pi
|
|
125
122
|
```
|
|
126
123
|
|
|
127
|
-
|
|
124
|
+
### Use it
|
|
128
125
|
|
|
129
|
-
|
|
126
|
+
Open a terminal in your project and run:
|
|
130
127
|
|
|
131
128
|
```bash
|
|
132
|
-
cd your-project
|
|
133
129
|
gsd
|
|
134
130
|
```
|
|
135
131
|
|
|
136
|
-
|
|
137
|
-
- **Brave Search** — for web research during planning
|
|
138
|
-
- **Context7** — for up-to-date library documentation
|
|
139
|
-
- **Jina** — for web page content extraction
|
|
132
|
+
GSD opens an interactive agent session. From there, you have two ways to work:
|
|
140
133
|
|
|
141
|
-
|
|
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.
|
|
142
135
|
|
|
143
|
-
|
|
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.
|
|
144
137
|
|
|
145
|
-
|
|
138
|
+
### Two terminals, one project
|
|
146
139
|
|
|
147
|
-
|
|
140
|
+
The real workflow: run auto mode in one terminal, steer from another.
|
|
141
|
+
|
|
142
|
+
**Terminal 1 — let it build**
|
|
143
|
+
```bash
|
|
144
|
+
gsd
|
|
148
145
|
/gsd auto
|
|
149
146
|
```
|
|
150
147
|
|
|
151
|
-
|
|
148
|
+
**Terminal 2 — steer while it works**
|
|
149
|
+
```bash
|
|
150
|
+
gsd
|
|
151
|
+
/gsd discuss # talk through architecture decisions
|
|
152
|
+
/gsd status # check progress
|
|
153
|
+
/gsd queue # queue the next milestone
|
|
154
|
+
```
|
|
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.
|
|
157
|
+
|
|
158
|
+
### First launch
|
|
159
|
+
|
|
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.
|
|
152
161
|
|
|
153
162
|
### Commands
|
|
154
163
|
|
|
155
164
|
| Command | What it does |
|
|
156
165
|
|---------|-------------|
|
|
157
|
-
| `/gsd` |
|
|
158
|
-
| `/gsd auto` |
|
|
166
|
+
| `/gsd` | Guided mode — reads project state, walks you through what's next |
|
|
167
|
+
| `/gsd auto` | Autonomous mode — researches, plans, executes, commits, repeats |
|
|
159
168
|
| `/gsd stop` | Stop auto mode gracefully |
|
|
160
|
-
| `/gsd
|
|
169
|
+
| `/gsd discuss` | Discuss architecture and decisions (works alongside auto mode) |
|
|
170
|
+
| `/gsd status` | Progress dashboard |
|
|
161
171
|
| `/gsd queue` | Queue future milestones (safe during auto mode) |
|
|
162
|
-
| `/gsd
|
|
163
|
-
| `/gsd prefs` | Manage skill preferences (global/project) |
|
|
172
|
+
| `/gsd prefs` | Model selection, timeouts, budget ceiling |
|
|
164
173
|
| `/gsd doctor` | Validate `.gsd/` integrity, find and fix issues |
|
|
165
174
|
| `Ctrl+Alt+G` | Toggle dashboard overlay |
|
|
166
175
|
|
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");
|