gsd-opencode 1.10.2 → 1.20.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/agents/gsd-codebase-mapper.md +29 -3
- package/agents/gsd-debugger.md +19 -21
- package/agents/gsd-executor.md +213 -528
- package/agents/gsd-integration-checker.md +20 -0
- package/agents/gsd-phase-researcher.md +189 -267
- package/agents/gsd-plan-checker.md +278 -279
- package/agents/gsd-planner.md +299 -490
- package/agents/gsd-project-researcher.md +103 -345
- package/agents/gsd-research-synthesizer.md +5 -22
- package/agents/gsd-roadmapper.md +43 -6
- package/agents/gsd-verifier.md +158 -377
- package/{lib → bin/dm/lib}/constants.js +10 -3
- package/{src → bin/dm/src}/commands/install.js +5 -4
- package/{src → bin/dm/src}/commands/uninstall.js +3 -1
- package/{src → bin/dm/src}/services/backup-manager.js +1 -1
- package/{src → bin/dm/src}/services/config.js +1 -1
- package/{src → bin/dm/src}/services/file-ops.js +20 -4
- package/{src → bin/dm/src}/services/health-checker.js +3 -1
- package/{src → bin/dm/src}/services/repair-service.js +3 -1
- package/{src → bin/dm/src}/services/settings.js +1 -1
- package/{src → bin/dm/src}/services/update-service.js +2 -2
- package/bin/gsd-install.js +0 -0
- package/bin/gsd.js +9 -9
- package/commands/gsd/gsd-add-phase.md +43 -0
- package/commands/gsd/gsd-add-todo.md +47 -0
- package/commands/gsd/gsd-audit-milestone.md +36 -0
- package/commands/gsd/gsd-check-todos.md +45 -0
- package/commands/gsd/gsd-cleanup.md +18 -0
- package/commands/gsd/{complete-milestone.md → gsd-complete-milestone.md} +1 -1
- package/commands/gsd/{debug.md → gsd-debug.md} +16 -21
- package/commands/gsd/{discuss-phase.md → gsd-discuss-phase.md} +6 -9
- package/commands/gsd/gsd-execute-phase.md +41 -0
- package/commands/gsd/gsd-health.md +22 -0
- package/commands/gsd/gsd-help.md +22 -0
- package/commands/gsd/gsd-insert-phase.md +32 -0
- package/commands/gsd/gsd-join-discord.md +18 -0
- package/commands/gsd/{list-phase-assumptions.md → gsd-list-phase-assumptions.md} +3 -7
- package/commands/gsd/{map-codebase.md → gsd-map-codebase.md} +3 -3
- package/commands/gsd/gsd-new-milestone.md +44 -0
- package/commands/gsd/gsd-new-project.md +42 -0
- package/commands/gsd/gsd-pause-work.md +38 -0
- package/commands/gsd/gsd-plan-milestone-gaps.md +34 -0
- package/commands/gsd/gsd-plan-phase.md +44 -0
- package/commands/gsd/gsd-progress.md +24 -0
- package/commands/gsd/gsd-quick.md +41 -0
- package/commands/gsd/gsd-reapply-patches.md +119 -0
- package/commands/gsd/gsd-remove-phase.md +31 -0
- package/commands/gsd/{research-phase.md → gsd-research-phase.md} +38 -49
- package/commands/gsd/{resume-work.md → gsd-resume-work.md} +2 -2
- package/commands/gsd/gsd-set-profile.md +34 -0
- package/commands/gsd/gsd-settings.md +36 -0
- package/commands/gsd/gsd-update.md +37 -0
- package/commands/gsd/gsd-verify-work.md +38 -0
- package/get-shit-done/bin/gsd-tools.cjs +553 -0
- package/get-shit-done/bin/gsd-tools.test.cjs +2346 -0
- package/get-shit-done/bin/lib/commands.cjs +556 -0
- package/get-shit-done/bin/lib/config.cjs +162 -0
- package/get-shit-done/bin/lib/core.cjs +377 -0
- package/get-shit-done/bin/lib/frontmatter.cjs +299 -0
- package/get-shit-done/bin/lib/init.cjs +694 -0
- package/get-shit-done/bin/lib/milestone.cjs +215 -0
- package/get-shit-done/bin/lib/phase.cjs +877 -0
- package/get-shit-done/bin/lib/roadmap.cjs +298 -0
- package/get-shit-done/bin/lib/state.cjs +490 -0
- package/get-shit-done/bin/lib/template.cjs +222 -0
- package/get-shit-done/bin/lib/verify.cjs +772 -0
- package/get-shit-done/references/checkpoints.md +62 -364
- package/get-shit-done/references/decimal-phase-calculation.md +65 -0
- package/get-shit-done/references/git-integration.md +10 -16
- package/get-shit-done/references/git-planning-commit.md +38 -0
- package/get-shit-done/references/model-profile-resolution.md +34 -0
- package/get-shit-done/references/model-profiles.md +54 -66
- package/get-shit-done/references/phase-argument-parsing.md +61 -0
- package/get-shit-done/references/planning-config.md +112 -10
- package/get-shit-done/references/questioning.md +4 -0
- package/get-shit-done/references/ui-brand.md +1 -1
- package/get-shit-done/templates/UAT.md +1 -1
- package/get-shit-done/templates/VALIDATION.md +104 -0
- package/get-shit-done/templates/codebase/structure.md +6 -6
- package/get-shit-done/templates/config.json +37 -0
- package/get-shit-done/templates/context.md +2 -10
- package/get-shit-done/templates/continue-here.md +6 -6
- package/get-shit-done/templates/debug-subagent-prompt.md +2 -2
- package/get-shit-done/templates/discovery.md +6 -6
- package/get-shit-done/templates/milestone-archive.md +3 -3
- package/get-shit-done/templates/phase-prompt.md +9 -7
- package/get-shit-done/templates/planner-subagent-prompt.md +6 -6
- package/get-shit-done/templates/research-project/ARCHITECTURE.md +1 -1
- package/get-shit-done/templates/research.md +29 -6
- package/get-shit-done/templates/roadmap.md +1 -1
- package/get-shit-done/templates/state.md +0 -30
- package/get-shit-done/templates/summary-complex.md +59 -0
- package/get-shit-done/templates/summary-minimal.md +41 -0
- package/get-shit-done/templates/summary-standard.md +48 -0
- package/get-shit-done/templates/summary.md +16 -37
- package/get-shit-done/templates/user-setup.md +1 -13
- package/get-shit-done/templates/verification-report.md +5 -5
- package/get-shit-done/workflows/add-phase.md +111 -0
- package/{commands/gsd → get-shit-done/workflows}/add-todo.md +24 -60
- package/{commands/gsd → get-shit-done/workflows}/audit-milestone.md +83 -63
- package/{commands/gsd → get-shit-done/workflows}/check-todos.md +21 -73
- package/get-shit-done/workflows/cleanup.md +152 -0
- package/get-shit-done/workflows/complete-milestone.md +251 -312
- package/get-shit-done/workflows/diagnose-issues.md +6 -31
- package/get-shit-done/workflows/discovery-phase.md +11 -11
- package/get-shit-done/workflows/discuss-phase.md +156 -49
- package/get-shit-done/workflows/execute-phase.md +238 -396
- package/get-shit-done/workflows/execute-plan.md +180 -1609
- package/get-shit-done/workflows/health.md +156 -0
- package/{commands/gsd → get-shit-done/workflows}/help.md +33 -35
- package/get-shit-done/workflows/insert-phase.md +129 -0
- package/get-shit-done/workflows/list-phase-assumptions.md +3 -3
- package/get-shit-done/workflows/map-codebase.md +73 -80
- package/get-shit-done/workflows/new-milestone.md +382 -0
- package/{commands/gsd → get-shit-done/workflows}/new-project.md +281 -234
- package/get-shit-done/workflows/oc-set-profile.md +320 -0
- package/{commands/gsd → get-shit-done/workflows}/pause-work.md +31 -43
- package/{commands/gsd → get-shit-done/workflows}/plan-milestone-gaps.md +29 -50
- package/get-shit-done/workflows/plan-phase.md +478 -0
- package/{commands/gsd → get-shit-done/workflows}/progress.md +64 -47
- package/get-shit-done/workflows/quick.md +453 -0
- package/get-shit-done/workflows/remove-phase.md +154 -0
- package/get-shit-done/workflows/research-phase.md +73 -0
- package/get-shit-done/workflows/resume-project.md +17 -26
- package/get-shit-done/workflows/set-profile.md +80 -0
- package/get-shit-done/workflows/settings.md +213 -0
- package/get-shit-done/workflows/transition.md +84 -104
- package/{commands/gsd → get-shit-done/workflows}/update.md +70 -28
- package/get-shit-done/workflows/verify-phase.md +106 -492
- package/get-shit-done/workflows/verify-work.md +26 -53
- package/package.json +7 -4
- package/rules/gsd-oc-work-hard.md +36 -0
- package/skills/gsd-oc-select-model/SKILL.md +348 -0
- package/skills/gsd-oc-select-model/scripts/select-models.cjs +268 -0
- package/agents/gsd-set-model.md +0 -287
- package/agents/gsd-set-profile.md +0 -239
- package/agents/gsd-settings.md +0 -749
- package/bin/install.js +0 -323
- package/commands/gsd/add-phase.md +0 -207
- package/commands/gsd/execute-phase.md +0 -339
- package/commands/gsd/insert-phase.md +0 -227
- package/commands/gsd/new-milestone.md +0 -721
- package/commands/gsd/plan-phase.md +0 -525
- package/commands/gsd/quick.md +0 -309
- package/commands/gsd/remove-phase.md +0 -349
- package/commands/gsd/set-model.md +0 -77
- package/commands/gsd/set-profile.md +0 -46
- package/commands/gsd/settings.md +0 -33
- package/commands/gsd/verify-work.md +0 -219
- package/commands/gsd/whats-new.md +0 -124
- /package/{src → bin/dm/src}/commands/check.js +0 -0
- /package/{src → bin/dm/src}/commands/config.js +0 -0
- /package/{src → bin/dm/src}/commands/list.js +0 -0
- /package/{src → bin/dm/src}/commands/repair.js +0 -0
- /package/{src → bin/dm/src}/commands/update.js +0 -0
- /package/{src → bin/dm/src}/services/manifest-manager.js +0 -0
- /package/{src → bin/dm/src}/services/migration-service.js +0 -0
- /package/{src → bin/dm/src}/services/scope-manager.js +0 -0
- /package/{src → bin/dm/src}/services/structure-detector.js +0 -0
- /package/{src → bin/dm/src}/utils/hash.js +0 -0
- /package/{src → bin/dm/src}/utils/interactive.js +0 -0
- /package/{src → bin/dm/src}/utils/logger.js +0 -0
- /package/{src → bin/dm/src}/utils/npm-registry.js +0 -0
- /package/{src → bin/dm/src}/utils/path-resolver.js +0 -0
|
@@ -20,23 +20,14 @@ No Pass/Fail buttons. No severity questions. Just: "Here's what should happen. D
|
|
|
20
20
|
|
|
21
21
|
<process>
|
|
22
22
|
|
|
23
|
-
<step name="
|
|
24
|
-
|
|
23
|
+
<step name="initialize" priority="first">
|
|
24
|
+
If $ARGUMENTS contains a phase number, load context:
|
|
25
25
|
|
|
26
26
|
```bash
|
|
27
|
-
|
|
27
|
+
INIT=$(node ~/.config/opencode/get-shit-done/bin/gsd-tools.cjs init verify-work "${PHASE_ARG}")
|
|
28
28
|
```
|
|
29
29
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
**Model lookup table:**
|
|
33
|
-
|
|
34
|
-
| Agent | quality | balanced | budget |
|
|
35
|
-
|-------|---------|----------|--------|
|
|
36
|
-
| gsd-planner | opus | opus | sonnet |
|
|
37
|
-
| gsd-plan-checker | sonnet | sonnet | haiku |
|
|
38
|
-
|
|
39
|
-
Store resolved models for use in Task calls below.
|
|
30
|
+
Parse JSON for: `planner_model`, `checker_model`, `commit_docs`, `phase_found`, `phase_dir`, `phase_number`, `phase_name`, `has_verification`.
|
|
40
31
|
</step>
|
|
41
32
|
|
|
42
33
|
<step name="check_active_session">
|
|
@@ -46,7 +37,7 @@ Store resolved models for use in Task calls below.
|
|
|
46
37
|
find .planning/phases -name "*-UAT.md" -type f 2>/dev/null | head -5
|
|
47
38
|
```
|
|
48
39
|
|
|
49
|
-
**If active sessions exist AND no
|
|
40
|
+
**If active sessions exist AND no $ARGUMENTS provided:**
|
|
50
41
|
|
|
51
42
|
read each file's frontmatter (status, phase) and Current Test section.
|
|
52
43
|
|
|
@@ -68,12 +59,12 @@ Wait for user response.
|
|
|
68
59
|
- If user replies with number (1, 2) → Load that file, go to `resume_from_file`
|
|
69
60
|
- If user replies with phase number → Treat as new session, go to `create_uat_file`
|
|
70
61
|
|
|
71
|
-
**If active sessions exist AND
|
|
62
|
+
**If active sessions exist AND $ARGUMENTS provided:**
|
|
72
63
|
|
|
73
64
|
Check if session exists for that phase. If yes, offer to resume or restart.
|
|
74
65
|
If no, continue to `create_uat_file`.
|
|
75
66
|
|
|
76
|
-
**If no active sessions AND no
|
|
67
|
+
**If no active sessions AND no $ARGUMENTS:**
|
|
77
68
|
|
|
78
69
|
```
|
|
79
70
|
No active UAT sessions.
|
|
@@ -81,7 +72,7 @@ No active UAT sessions.
|
|
|
81
72
|
Provide a phase number to start testing (e.g., /gsd-verify-work 4)
|
|
82
73
|
```
|
|
83
74
|
|
|
84
|
-
**If no active sessions AND
|
|
75
|
+
**If no active sessions AND $ARGUMENTS provided:**
|
|
85
76
|
|
|
86
77
|
Continue to `create_uat_file`.
|
|
87
78
|
</step>
|
|
@@ -89,15 +80,10 @@ Continue to `create_uat_file`.
|
|
|
89
80
|
<step name="find_summaries">
|
|
90
81
|
**Find what to test:**
|
|
91
82
|
|
|
92
|
-
|
|
83
|
+
Use `phase_dir` from init (or run init if not already done).
|
|
93
84
|
|
|
94
85
|
```bash
|
|
95
|
-
|
|
96
|
-
PADDED_PHASE=$(printf "%02d" ${PHASE_ARG} 2>/dev/null || echo "${PHASE_ARG}")
|
|
97
|
-
PHASE_DIR=$(ls -d .planning/phases/${PADDED_PHASE}-* .planning/phases/${PHASE_ARG}-* 2>/dev/null | head -1)
|
|
98
|
-
|
|
99
|
-
# Find SUMMARY files
|
|
100
|
-
ls "$PHASE_DIR"/*-SUMMARY.md 2>/dev/null
|
|
86
|
+
ls "$phase_dir"/*-SUMMARY.md 2>/dev/null
|
|
101
87
|
```
|
|
102
88
|
|
|
103
89
|
read each SUMMARY.md to extract testable deliverables.
|
|
@@ -178,7 +164,7 @@ skipped: 0
|
|
|
178
164
|
[none yet]
|
|
179
165
|
```
|
|
180
166
|
|
|
181
|
-
write to `.planning/phases/XX-name/{
|
|
167
|
+
write to `.planning/phases/XX-name/{phase_num}-UAT.md`
|
|
182
168
|
|
|
183
169
|
Proceed to `present_test`.
|
|
184
170
|
</step>
|
|
@@ -304,21 +290,9 @@ Clear Current Test section:
|
|
|
304
290
|
[testing complete]
|
|
305
291
|
```
|
|
306
292
|
|
|
307
|
-
**Check planning config:**
|
|
308
|
-
|
|
309
|
-
```bash
|
|
310
|
-
COMMIT_PLANNING_DOCS=$(cat .planning/config.json 2>/dev/null | grep -o '"commit_docs"[[:space:]]*:[[:space:]]*[^,}]*' | grep -o 'true\|false' || echo "true")
|
|
311
|
-
git check-ignore -q .planning 2>/dev/null && COMMIT_PLANNING_DOCS=false
|
|
312
|
-
```
|
|
313
|
-
|
|
314
|
-
**If `COMMIT_PLANNING_DOCS=false`:** Skip git operations
|
|
315
|
-
|
|
316
|
-
**If `COMMIT_PLANNING_DOCS=true` (default):**
|
|
317
|
-
|
|
318
293
|
Commit the UAT file:
|
|
319
294
|
```bash
|
|
320
|
-
|
|
321
|
-
git commit -m "test({phase}): complete UAT - {passed} passed, {issues} issues"
|
|
295
|
+
node ~/.config/opencode/get-shit-done/bin/gsd-tools.cjs commit "test({phase_num}): complete UAT - {passed} passed, {issues} issues" --files ".planning/phases/XX-name/{phase_num}-UAT.md"
|
|
322
296
|
```
|
|
323
297
|
|
|
324
298
|
Present summary:
|
|
@@ -384,21 +358,18 @@ Display:
|
|
|
384
358
|
Spawn gsd-planner in --gaps mode:
|
|
385
359
|
|
|
386
360
|
```
|
|
387
|
-
|
|
361
|
+
task(
|
|
388
362
|
prompt="""
|
|
389
363
|
<planning_context>
|
|
390
364
|
|
|
391
365
|
**Phase:** {phase_number}
|
|
392
366
|
**Mode:** gap_closure
|
|
393
367
|
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
**Roadmap:**
|
|
401
|
-
@.planning/ROADMAP.md
|
|
368
|
+
<files_to_read>
|
|
369
|
+
- {phase_dir}/{phase_num}-UAT.md (UAT with diagnoses)
|
|
370
|
+
- .planning/STATE.md (Project State)
|
|
371
|
+
- .planning/ROADMAP.md (Roadmap)
|
|
372
|
+
</files_to_read>
|
|
402
373
|
|
|
403
374
|
</planning_context>
|
|
404
375
|
|
|
@@ -435,15 +406,16 @@ Initialize: `iteration_count = 1`
|
|
|
435
406
|
Spawn gsd-plan-checker:
|
|
436
407
|
|
|
437
408
|
```
|
|
438
|
-
|
|
409
|
+
task(
|
|
439
410
|
prompt="""
|
|
440
411
|
<verification_context>
|
|
441
412
|
|
|
442
413
|
**Phase:** {phase_number}
|
|
443
414
|
**Phase Goal:** Close diagnosed gaps from UAT
|
|
444
415
|
|
|
445
|
-
|
|
446
|
-
|
|
416
|
+
<files_to_read>
|
|
417
|
+
- {phase_dir}/*-PLAN.md (Plans to verify)
|
|
418
|
+
</files_to_read>
|
|
447
419
|
|
|
448
420
|
</verification_context>
|
|
449
421
|
|
|
@@ -474,15 +446,16 @@ Display: `Sending back to planner for revision... (iteration {N}/3)`
|
|
|
474
446
|
Spawn gsd-planner with revision context:
|
|
475
447
|
|
|
476
448
|
```
|
|
477
|
-
|
|
449
|
+
task(
|
|
478
450
|
prompt="""
|
|
479
451
|
<revision_context>
|
|
480
452
|
|
|
481
453
|
**Phase:** {phase_number}
|
|
482
454
|
**Mode:** revision
|
|
483
455
|
|
|
484
|
-
|
|
485
|
-
|
|
456
|
+
<files_to_read>
|
|
457
|
+
- {phase_dir}/*-PLAN.md (Existing plans)
|
|
458
|
+
</files_to_read>
|
|
486
459
|
|
|
487
460
|
**Checker issues:**
|
|
488
461
|
{structured_issues_from_checker}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "gsd-opencode",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.20.0",
|
|
4
4
|
"description": "GSD-OpenCode distribution manager - install, verify, and maintain your GSD-OpenCode installation",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "bin/gsd.js",
|
|
@@ -31,11 +31,14 @@
|
|
|
31
31
|
"license": "MIT",
|
|
32
32
|
"files": [
|
|
33
33
|
"agents",
|
|
34
|
-
"bin",
|
|
34
|
+
"bin/gsd.js",
|
|
35
|
+
"bin/gsd-install.js",
|
|
36
|
+
"bin/dm/lib",
|
|
37
|
+
"bin/dm/src",
|
|
35
38
|
"commands",
|
|
36
39
|
"get-shit-done",
|
|
37
|
-
"
|
|
38
|
-
"
|
|
40
|
+
"rules",
|
|
41
|
+
"skills"
|
|
39
42
|
],
|
|
40
43
|
"engines": {
|
|
41
44
|
"node": ">=18.0.0"
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
### CRITICAL: Execute, Don't Describe
|
|
2
|
+
|
|
3
|
+
You MUST actually call tools. Never describe or simulate what you would do.
|
|
4
|
+
|
|
5
|
+
❌ FORBIDDEN (faking tool use):
|
|
6
|
+
|
|
7
|
+
- "Here's the code you need:" followed by a code block
|
|
8
|
+
- "I've created the file with..." without calling write_file
|
|
9
|
+
- "The file now contains..." without calling edit_file
|
|
10
|
+
- "Running the command would show..." without calling shell
|
|
11
|
+
- Showing example output instead of real output
|
|
12
|
+
- Describing what a tool call would return
|
|
13
|
+
|
|
14
|
+
✅ REQUIRED (real tool use):
|
|
15
|
+
|
|
16
|
+
- Call write to create files, then show tool result
|
|
17
|
+
- Call edit to modify code, then show tool result
|
|
18
|
+
- Call bash to run commands, then show actual output
|
|
19
|
+
- Call read to see contents, then quote from result
|
|
20
|
+
- Call grep to search file contents using regular expressions
|
|
21
|
+
- Call glob to find files by pattern matching
|
|
22
|
+
- Call list to list files and directories in a given path
|
|
23
|
+
- Call lsp to interact with your configured LSP servers to get code intelligence features like definitions, references, hover info, and call hierarchy
|
|
24
|
+
- Call patch to apply patches to files
|
|
25
|
+
- Call todowrite to manage todo lists during coding sessions
|
|
26
|
+
- Call todoread to read existing todo lists
|
|
27
|
+
- Call webfetch to fetch web content
|
|
28
|
+
- Call question to ask the user questions during execution
|
|
29
|
+
|
|
30
|
+
If you describe code without calling tools, you are lying about doing work.
|
|
31
|
+
|
|
32
|
+
Self-check before responding:
|
|
33
|
+
|
|
34
|
+
- Did I CALL tools or just DESCRIBE what I would do?
|
|
35
|
+
- Is there a code block that should be a write/edit call?
|
|
36
|
+
- Am I showing real tool output or imagined output?
|
|
@@ -0,0 +1,348 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: gsd-oc-select-model
|
|
3
|
+
description: Interactive model selection workflow with paginated navigation. Use when users want to select a model interactively - guides them through provider selection then model selection using the question tool with pagination support for large lists.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Select Model skill
|
|
7
|
+
|
|
8
|
+
Interactive workflow to select an AI model from opencode's available providers and models.
|
|
9
|
+
|
|
10
|
+
## Script Location
|
|
11
|
+
|
|
12
|
+
The script is bundled with this skill at:
|
|
13
|
+
```
|
|
14
|
+
scripts/select-models.cjs
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
Run with:
|
|
18
|
+
```bash
|
|
19
|
+
node <skill-dir>/scripts/select-models.cjs [options]
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
Where `<skill-dir>` is the installation directory of this skill.
|
|
23
|
+
|
|
24
|
+
## Workflow
|
|
25
|
+
|
|
26
|
+
### Step 1: Get Providers
|
|
27
|
+
|
|
28
|
+
Run the script with `--providers-only` to get the list of providers:
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
node <skill-dir>/scripts/select-models.cjs --providers-only
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
Returns JSON:
|
|
35
|
+
```json
|
|
36
|
+
{
|
|
37
|
+
"provider_count": N,
|
|
38
|
+
"providers": [
|
|
39
|
+
{"name": "...", "model_count": N, "sample_models": "...", "has_sub_providers": true|false}
|
|
40
|
+
]
|
|
41
|
+
}
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
**Key field:** `has_sub_providers` - indicates if this provider has a hierarchical structure (3-level) or flat structure (2-level).
|
|
45
|
+
|
|
46
|
+
### Step 2: Ask User to Select Provider (with Pagination)
|
|
47
|
+
|
|
48
|
+
Use the question tool with paginated options. **Show 10 providers per page.**
|
|
49
|
+
|
|
50
|
+
**Pagination pattern:**
|
|
51
|
+
- For each page, include navigation options as needed:
|
|
52
|
+
- `"→ Next"` - to go to next page (include when not on last page)
|
|
53
|
+
- `"← Previous"` - to go to previous page (include when not on first page)
|
|
54
|
+
- Track current page index (0-based)
|
|
55
|
+
- Label the provider options clearly: show name and model count
|
|
56
|
+
|
|
57
|
+
**Example for page 0 (first 10 providers):**
|
|
58
|
+
```
|
|
59
|
+
question: "Select a provider (page 1/N, showing 1-10 of M):"
|
|
60
|
+
Options:
|
|
61
|
+
- "google (28 models)"
|
|
62
|
+
- "google-vertex (27 models)"
|
|
63
|
+
- ...
|
|
64
|
+
- "→ Next"
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
**When user selects "→ Next":**
|
|
68
|
+
- Increment page index
|
|
69
|
+
- Call question tool again with next 10 providers
|
|
70
|
+
|
|
71
|
+
**When user selects "← Previous":**
|
|
72
|
+
- Decrement page index
|
|
73
|
+
- Call question tool again with previous 10 providers
|
|
74
|
+
|
|
75
|
+
**When user selects a provider:**
|
|
76
|
+
- Save the selected provider name
|
|
77
|
+
- Save `has_sub_providers` flag from the provider data
|
|
78
|
+
- Proceed to Step 3
|
|
79
|
+
|
|
80
|
+
### Step 3: Check Provider Hierarchy
|
|
81
|
+
|
|
82
|
+
After provider selection, run the script to check if the provider has sub-providers:
|
|
83
|
+
|
|
84
|
+
```bash
|
|
85
|
+
node <skill-dir>/scripts/select-models.cjs --provider "provider-name"
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
**Returns one of two JSON structures:**
|
|
89
|
+
|
|
90
|
+
**A. For flat providers (2-level flow):**
|
|
91
|
+
```json
|
|
92
|
+
{
|
|
93
|
+
"provider": "openai",
|
|
94
|
+
"model_count": 5,
|
|
95
|
+
"models": ["gpt-4", "gpt-3.5-turbo", ...]
|
|
96
|
+
}
|
|
97
|
+
```
|
|
98
|
+
- `models` array present → Proceed to Step 5 (2-level flow)
|
|
99
|
+
|
|
100
|
+
**B. For hierarchical providers (3-level flow):**
|
|
101
|
+
```json
|
|
102
|
+
{
|
|
103
|
+
"provider": "synthetic",
|
|
104
|
+
"has_sub_providers": true,
|
|
105
|
+
"sub_provider_count": 3,
|
|
106
|
+
"sub_providers": [
|
|
107
|
+
{"name": "deepseek-ai", "model_count": 5, "sample_models": "..."},
|
|
108
|
+
{"name": "nvidia", "model_count": 4, "sample_models": "..."},
|
|
109
|
+
...
|
|
110
|
+
]
|
|
111
|
+
}
|
|
112
|
+
```
|
|
113
|
+
- `has_sub_providers: true` → Proceed to Step 4 (3-level flow)
|
|
114
|
+
- Save the `sub_providers` array for the next step
|
|
115
|
+
|
|
116
|
+
### Step 4: Sub-Provider Selection (3-level flow only)
|
|
117
|
+
|
|
118
|
+
**Only for hierarchical providers.** Use the question tool with paginated options. **Show 10 sub-providers per page.**
|
|
119
|
+
|
|
120
|
+
**Breadcrumb format:** `Provider: {name} > Select a sub-provider (page X/Y, showing A-B of M)`
|
|
121
|
+
|
|
122
|
+
**Example for page 0:**
|
|
123
|
+
```
|
|
124
|
+
question: "Provider: synthetic > Select a sub-provider (page 1/1, showing 1-3 of 3):"
|
|
125
|
+
Options:
|
|
126
|
+
- "deepseek-ai (5 models)"
|
|
127
|
+
- "nvidia (4 models)"
|
|
128
|
+
- "perplexity-ai (3 models)"
|
|
129
|
+
- "← Back"
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
**Navigation:**
|
|
133
|
+
- `"→ Next"` / `"← Previous"` - standard pagination
|
|
134
|
+
- `"← Back"` - returns to provider selection (Step 2), preserves `provider_page`
|
|
135
|
+
|
|
136
|
+
**When user selects a sub-provider:**
|
|
137
|
+
- Save the selected sub-provider name
|
|
138
|
+
- Proceed to Step 5
|
|
139
|
+
|
|
140
|
+
### Step 5: Model Selection
|
|
141
|
+
|
|
142
|
+
**For 2-level flow:** Use models from Step 3 response
|
|
143
|
+
|
|
144
|
+
**For 3-level flow:** Run the script with both provider and sub-provider:
|
|
145
|
+
|
|
146
|
+
```bash
|
|
147
|
+
node <skill-dir>/scripts/select-models.cjs --provider "provider-name" --sub-provider "sub-provider-name"
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
Returns JSON:
|
|
151
|
+
```json
|
|
152
|
+
{
|
|
153
|
+
"provider": "synthetic",
|
|
154
|
+
"sub_provider": "deepseek-ai",
|
|
155
|
+
"model_count": 5,
|
|
156
|
+
"models": ["DeepSeek-R1", "DeepSeek-V3", ...]
|
|
157
|
+
}
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
**Pagination:** **Show 15 models per page.**
|
|
161
|
+
|
|
162
|
+
**Breadcrumb format varies by flow:**
|
|
163
|
+
- 2-level: `Provider: {name} > Select a model (page X/Y, showing A-B of M)`
|
|
164
|
+
- 3-level: `Provider: {p} > Sub-provider: {sp} > Select a model (page X/Y, showing A-B of M)`
|
|
165
|
+
|
|
166
|
+
**Example for 2-level flow (page 0):**
|
|
167
|
+
```
|
|
168
|
+
question: "Provider: openai > Select a model (page 1/1, showing 1-5 of 5):"
|
|
169
|
+
Options:
|
|
170
|
+
- "gpt-4"
|
|
171
|
+
- "gpt-3.5-turbo"
|
|
172
|
+
- "..."
|
|
173
|
+
- "← Back"
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
**Example for 3-level flow (page 0):**
|
|
177
|
+
```
|
|
178
|
+
question: "Provider: synthetic > Sub-provider: deepseek-ai > Select a model (page 1/1, showing 1-5 of 5):"
|
|
179
|
+
Options:
|
|
180
|
+
- "DeepSeek-R1"
|
|
181
|
+
- "DeepSeek-V3"
|
|
182
|
+
- "..."
|
|
183
|
+
- "← Back"
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
**Navigation:**
|
|
187
|
+
- `"→ Next"` / `"← Previous"` - standard pagination
|
|
188
|
+
- `"← Back"` - returns to provider selection (2-level) or sub-provider selection (3-level)
|
|
189
|
+
|
|
190
|
+
**When user selects a model:**
|
|
191
|
+
- Return the full model ID:
|
|
192
|
+
- 2-level: `provider/model-name`
|
|
193
|
+
- 3-level: `provider/sub-provider/model-name`
|
|
194
|
+
|
|
195
|
+
## Breadcrumb Navigation
|
|
196
|
+
|
|
197
|
+
Breadcrumbs appear in the question header to orient the user at each selection level.
|
|
198
|
+
|
|
199
|
+
### Breadcrumb Formats
|
|
200
|
+
|
|
201
|
+
| Level | Format | Example |
|
|
202
|
+
|-------|--------|---------|
|
|
203
|
+
| Provider selection | `Select a provider (page X/Y, showing A-B of M)` | "Select a provider (page 1/3, showing 1-10 of 25)" |
|
|
204
|
+
| Sub-provider selection (3-level) | `Provider: {name} > Select a sub-provider (page X/Y, showing A-B of M)` | "Provider: synthetic > Select a sub-provider (page 1/2, showing 1-10 of 15)" |
|
|
205
|
+
| Model selection (2-level) | `Provider: {name} > Select a model (page X/Y, showing A-B of M)` | "Provider: openai > Select a model (page 1/1, showing 1-5 of 5)" |
|
|
206
|
+
| Model selection (3-level) | `Provider: {p} > Sub-provider: {sp} > Select a model (page X/Y, showing A-B of M)` | "Provider: synthetic > Sub-provider: deepseek-ai > Select a model (page 1/1, showing 1-5 of 5)" |
|
|
207
|
+
|
|
208
|
+
### Implementation Notes
|
|
209
|
+
|
|
210
|
+
- **Separator:** Use `" > "` (space-angle-space) between levels for readability
|
|
211
|
+
- **Current context:** Always show the selected provider/sub-provider name to orient the user
|
|
212
|
+
- **Page info:** Include `(page X/Y, showing A-B of M)` at the end of the breadcrumb
|
|
213
|
+
- **Internal vs display:** Page indices are 0-based internally, displayed as 1-based to users
|
|
214
|
+
|
|
215
|
+
## Navigation and State Management
|
|
216
|
+
|
|
217
|
+
### "← Back" Navigation
|
|
218
|
+
|
|
219
|
+
The `"← Back"` option allows users to return to previous levels:
|
|
220
|
+
|
|
221
|
+
| Current Level | "← Back" Goes To | State Preserved |
|
|
222
|
+
|---------------|------------------|-----------------|
|
|
223
|
+
| Sub-provider selection | Provider selection | `provider_page` |
|
|
224
|
+
| Model selection (2-level) | Provider selection | `provider_page` |
|
|
225
|
+
| Model selection (3-level) | Sub-provider selection | `sub_provider_page`, `provider_page` |
|
|
226
|
+
|
|
227
|
+
### State Variables to Track
|
|
228
|
+
|
|
229
|
+
Maintain these variables at the conversation level:
|
|
230
|
+
|
|
231
|
+
| Variable | Type | Description |
|
|
232
|
+
|----------|------|-------------|
|
|
233
|
+
| `provider_page` | number (0-based) | Current provider page index |
|
|
234
|
+
| `sub_provider_page` | number (0-based) | Current sub-provider page index (3-level only) |
|
|
235
|
+
| `model_page` | number (0-based) | Current model page index |
|
|
236
|
+
| `selected_provider` | string | Name of the selected provider (for breadcrumbs) |
|
|
237
|
+
| `selected_sub_provider` | string | Name of the selected sub-provider (3-level only) |
|
|
238
|
+
| `has_sub_providers` | boolean | Whether the selected provider is hierarchical |
|
|
239
|
+
|
|
240
|
+
### Pagination State Preservation
|
|
241
|
+
|
|
242
|
+
When navigating back, preserve the page index so the user returns to the same page they were on:
|
|
243
|
+
|
|
244
|
+
- **Sub-provider → Provider:** `provider_page` is preserved; user sees the same provider list page
|
|
245
|
+
- **Models → Sub-provider (3-level):** `sub_provider_page` is preserved; user sees the same sub-provider list page
|
|
246
|
+
- **Models → Provider (2-level):** `provider_page` is preserved; user sees the same provider list page
|
|
247
|
+
|
|
248
|
+
**Implementation:** Store page indices before navigating to the next level, restore when user selects `"← Back"`.
|
|
249
|
+
|
|
250
|
+
## Implementation Notes
|
|
251
|
+
|
|
252
|
+
- **Page size:** 10 for providers/sub-providers, 15 for models
|
|
253
|
+
- **Navigation options:** Always show `"→ Next"` and/or `"← Previous"` at the end of the option list (before `"← Back"` in 3-level flows)
|
|
254
|
+
- **Page info:** Include `(page X/Y, showing A-B of M)` in the question header for orientation
|
|
255
|
+
- **State persistence:** Page indices and selections persist at conversation level
|
|
256
|
+
- **Back option:** `"← Back"` appears as the last option in the question list when not at the top level
|
|
257
|
+
- **Type your own:** The question tool adds a "Type your own answer" option automatically - users can use this to jump to a specific provider/model by name
|
|
258
|
+
- **Return formats:**
|
|
259
|
+
- 2-level: `provider/model` (e.g., `xai/grok-2`)
|
|
260
|
+
- 3-level: `provider/sub-provider/model` (e.g., `synthetic/deepseek-ai/DeepSeek-R1`)
|
|
261
|
+
- **Dependencies:** The script has no external dependencies (self-contained Node.js)
|
|
262
|
+
- **Indices:** Page indices are 0-based internally, displayed as 1-based to users
|
|
263
|
+
|
|
264
|
+
## Example Flows
|
|
265
|
+
|
|
266
|
+
### Example 1: 2-Level Flow (Flat Provider)
|
|
267
|
+
|
|
268
|
+
This is the standard flow for providers without sub-providers (e.g., openai, xai, google).
|
|
269
|
+
|
|
270
|
+
```
|
|
271
|
+
1. LLM: Run select-models --providers-only
|
|
272
|
+
2. LLM: question: "Select a provider (page 1/2, showing 1-10 of 15):"
|
|
273
|
+
Options: [google, google-vertex, ..., → Next]
|
|
274
|
+
3. User: Selects "→ Next"
|
|
275
|
+
4. LLM: question: "Select a provider (page 2/2, showing 11-15 of 15):"
|
|
276
|
+
Options: [← Previous, vercel, xai, zai-coding-plan]
|
|
277
|
+
5. User: Selects "xai (22 models)"
|
|
278
|
+
6. LLM: Run select-models --provider xai
|
|
279
|
+
Response: {"provider": "xai", "model_count": 22, "models": [...]}
|
|
280
|
+
7. LLM: question: "Provider: xai > Select a model (page 1/2, showing 1-15 of 22):"
|
|
281
|
+
Options: [grok-2, grok-2-1212, ..., → Next, ← Back]
|
|
282
|
+
8. User: Selects "grok-2"
|
|
283
|
+
9. LLM: Returns "Selected model: xai/grok-2"
|
|
284
|
+
```
|
|
285
|
+
|
|
286
|
+
### Example 2: 3-Level Flow (Hierarchical Provider) with Back Navigation
|
|
287
|
+
|
|
288
|
+
This flow demonstrates hierarchical provider selection with back navigation (e.g., synthetic).
|
|
289
|
+
|
|
290
|
+
**State tracking:**
|
|
291
|
+
- `provider_page` = 0, `selected_provider` = "synthetic"
|
|
292
|
+
- `sub_provider_page` = 0, `selected_sub_provider` = "deepseek-ai"
|
|
293
|
+
- `model_page` = 0
|
|
294
|
+
|
|
295
|
+
```
|
|
296
|
+
1. LLM: Run select-models --providers-only
|
|
297
|
+
Response includes: {"name": "synthetic", "model_count": 100, "has_sub_providers": true, ...}
|
|
298
|
+
2. LLM: question: "Select a provider (page 1/3, showing 1-10 of 25):"
|
|
299
|
+
Options: [google, synthetic (100 models, 12 sub-providers), ..., → Next]
|
|
300
|
+
3. User: Selects "synthetic"
|
|
301
|
+
State: provider_page = 0, selected_provider = "synthetic", has_sub_providers = true
|
|
302
|
+
4. LLM: Run select-models --provider synthetic
|
|
303
|
+
Response: {"provider": "synthetic", "has_sub_providers": true, "sub_providers": [...]}
|
|
304
|
+
5. LLM: question: "Provider: synthetic > Select a sub-provider (page 1/2, showing 1-10 of 12):"
|
|
305
|
+
Options: [deepseek-ai (5 models), nvidia (4 models), ..., → Next, ← Back]
|
|
306
|
+
6. User: Selects "deepseek-ai"
|
|
307
|
+
State: sub_provider_page = 0, selected_sub_provider = "deepseek-ai"
|
|
308
|
+
7. LLM: Run select-models --provider synthetic --sub-provider deepseek-ai
|
|
309
|
+
Response: {"provider": "synthetic", "sub_provider": "deepseek-ai", "model_count": 5, "models": [...]}
|
|
310
|
+
8. LLM: question: "Provider: synthetic > Sub-provider: deepseek-ai > Select a model (page 1/1, showing 1-5 of 5):"
|
|
311
|
+
Options: [DeepSeek-R1, DeepSeek-V3, ..., ← Back]
|
|
312
|
+
9. User: Selects "← Back" (wants to choose different sub-provider)
|
|
313
|
+
10. LLM: question: "Provider: synthetic > Select a sub-provider (page 1/2, showing 1-10 of 12):"
|
|
314
|
+
Options: [deepseek-ai (5 models), nvidia (4 models), ..., → Next, ← Back]
|
|
315
|
+
(Note: Returns to same page due to preserved sub_provider_page = 0)
|
|
316
|
+
11. User: Selects "nvidia"
|
|
317
|
+
State: sub_provider_page = 0 (preserved), selected_sub_provider = "nvidia"
|
|
318
|
+
12. LLM: Run select-models --provider synthetic --sub-provider nvidia
|
|
319
|
+
13. LLM: question: "Provider: synthetic > Sub-provider: nvidia > Select a model (page 1/1, showing 1-4 of 4):"
|
|
320
|
+
Options: [Llama-3.1-8B, ..., ← Back]
|
|
321
|
+
14. User: Selects "Llama-3.1-8B"
|
|
322
|
+
15. LLM: Returns "Selected model: synthetic/nvidia/Llama-3.1-8B"
|
|
323
|
+
```
|
|
324
|
+
|
|
325
|
+
### Example 3: Back Navigation from Models to Providers (2-Level)
|
|
326
|
+
|
|
327
|
+
Demonstrates state preservation when navigating back in a 2-level flow.
|
|
328
|
+
|
|
329
|
+
```
|
|
330
|
+
1. LLM: Run select-models --providers-only
|
|
331
|
+
2. LLM: question: "Select a provider (page 1/3, showing 1-10 of 28):"
|
|
332
|
+
Options: [google, ..., → Next]
|
|
333
|
+
3. User: Selects "→ Next" (twice) to reach page 3
|
|
334
|
+
4. LLM: question: "Select a provider (page 3/3, showing 21-28 of 28):"
|
|
335
|
+
Options: [← Previous, xai, zai-coding-plan]
|
|
336
|
+
State: provider_page = 2
|
|
337
|
+
5. User: Selects "xai"
|
|
338
|
+
6. LLM: Run select-models --provider xai
|
|
339
|
+
7. LLM: question: "Provider: xai > Select a model (page 1/2, showing 1-15 of 22):"
|
|
340
|
+
Options: [grok-2, ..., → Next, ← Back]
|
|
341
|
+
8. User: Selects "← Back" (wants to choose different provider)
|
|
342
|
+
9. LLM: question: "Select a provider (page 3/3, showing 21-28 of 28):"
|
|
343
|
+
Options: [← Previous, xai, zai-coding-plan]
|
|
344
|
+
(Note: Returns to page 3 due to preserved provider_page = 2)
|
|
345
|
+
10. User: Selects "zai-coding-plan"
|
|
346
|
+
11. LLM: Run select-models --provider zai-coding-plan
|
|
347
|
+
12. LLM: Returns "Selected model: zai-coding-plan/plan-1"
|
|
348
|
+
```
|