ramstack 0.1.0 → 0.1.1

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 CHANGED
@@ -1,29 +1,43 @@
1
- # rstack
1
+ # ramstack
2
2
 
3
- rstack is a set of agent skills for Claude Code, Codex, and [pi](https://github.com/badlogic/pi-mono). It is a port of [pstack](https://github.com/cursor/plugins/tree/main/pstack) by [Lauren Tan](https://x.com/poteto).
3
+ ramstack is a set of agent skills for Claude Code, Codex, and [pi](https://github.com/badlogic/pi-mono). It is a port of [pstack](https://github.com/cursor/plugins/tree/main/pstack) by [Lauren Tan](https://x.com/poteto).
4
4
 
5
- New to the repo? Follow [Get rstack running](docs/tutorials/get-started.md).
5
+ ## Quick start
6
+
7
+ Install the skills into every host on your machine:
8
+
9
+ ```bash
10
+ npx ramstack install
11
+ ```
12
+
13
+ You need Node.js 18 or newer. The installer detects your hosts, shows the plan, and links the skills after you confirm. Then open a host and run:
14
+
15
+ ```
16
+ /setup-ramstack
17
+ ```
18
+
19
+ That writes the model config. You are ready. To try it on a real task, follow [Your first ramstack task](docs/tutorials/get-started.md). For other install paths (a clone, or a single host), see [How to install ramstack](docs/how-to/install.md).
6
20
 
7
21
  ## Tutorials
8
22
 
9
23
  Learn by doing.
10
24
 
11
- - [Get rstack running](docs/tutorials/get-started.md)
25
+ - [Your first ramstack task](docs/tutorials/get-started.md)
12
26
 
13
27
  ## How-to guides
14
28
 
15
29
  Do a job you already understand.
16
30
 
17
- - [How to install rstack](docs/how-to/install.md)
31
+ - [How to install ramstack](docs/how-to/install.md)
18
32
  - [How to configure models](docs/how-to/configure-models.md)
19
- - [How to update rstack](docs/how-to/update.md)
20
- - [How to uninstall rstack](docs/how-to/uninstall.md)
33
+ - [How to update ramstack](docs/how-to/update.md)
34
+ - [How to uninstall ramstack](docs/how-to/uninstall.md)
21
35
 
22
36
  ## Explanation
23
37
 
24
38
  Understand the design.
25
39
 
26
- - [About rstack](docs/explanation/about-rstack.md)
40
+ - [About ramstack](docs/explanation/about-ramstack.md)
27
41
  - [About the pstack port](docs/explanation/about-the-pstack-port.md)
28
42
  - [About model routing](docs/explanation/about-model-routing.md)
29
43
  - [About poteto-mode](docs/explanation/about-poteto-mode.md)
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- // The rstack installer. Links the skills and agents into host discovery
2
+ // The ramstack installer. Links the skills and agents into host discovery
3
3
  // directories, so one install serves every host. Two modes: run from a git
4
4
  // clone and links point into the clone (update pulls it); run from the npm
5
5
  // package (npx ramstack) and the payload copies to ~/.ramstack first, so the
@@ -14,7 +14,7 @@ import { fileURLToPath } from 'node:url';
14
14
  import readline from 'node:readline/promises';
15
15
 
16
16
  const REPO = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..');
17
- const CONFIG_PATH = path.join(REPO, '.rstack', 'config.local.json');
17
+ const CONFIG_PATH = path.join(REPO, '.ramstack', 'config.local.json');
18
18
 
19
19
  // Package mode stores its payload copy and saved choices here, so links
20
20
  // never point into the npm cache.
@@ -37,11 +37,11 @@ const HOSTS = {
37
37
  const HOST_NAMES = Object.keys(HOSTS);
38
38
  const SCOPES = ['global', 'project'];
39
39
 
40
- const USAGE = `usage: rstack [install|update|uninstall] [options]
40
+ const USAGE = `usage: ramstack [install|update|uninstall] [options]
41
41
 
42
42
  commands
43
- install Link this clone's skills and agents into host directories (default)
44
- update Pull this clone, then link any new skills
43
+ install Link the skills and agents into host directories (default)
44
+ update Fetch new files (git pull or npm package), then link again
45
45
  uninstall Remove only the links this installer owns
46
46
 
47
47
  options
@@ -162,7 +162,7 @@ function saveConfig(clone, config) {
162
162
  const file = configPath(clone);
163
163
  fs.mkdirSync(path.dirname(file), { recursive: true });
164
164
  fs.writeFileSync(file, `${JSON.stringify(config, null, 2)}\n`);
165
- say('save', clone ? '.rstack/config.local.json' : file);
165
+ say('save', clone ? '.ramstack/config.local.json' : file);
166
166
  }
167
167
 
168
168
  function plan(hosts, base) {
@@ -415,7 +415,7 @@ async function main() {
415
415
  if (command === 'install') {
416
416
  if (wizard) {
417
417
  stageTotal = 2 + (hosts ? 0 : 1) + (scope ? 0 : 1);
418
- await banner('rstack install');
418
+ await banner('ramstack install');
419
419
  if (!hosts) {
420
420
  stage('Hosts');
421
421
  hosts = await promptHosts(saved?.hosts ?? detectedOrAll());
@@ -442,7 +442,7 @@ async function main() {
442
442
  ...(counts.skip > 0
443
443
  ? [`${counts.skip} name(s) skipped. Rename or remove the real files, then run install again.`]
444
444
  : []),
445
- 'next: run /setup-rstack in each host to configure models',
445
+ 'next: run /setup-ramstack in each host to configure models',
446
446
  ]);
447
447
  return;
448
448
  }
@@ -457,7 +457,7 @@ async function main() {
457
457
  if (counts.skip > 0) {
458
458
  say('note', `${counts.skip} name(s) skipped. Rename or remove the real files, then run install again.`);
459
459
  }
460
- say('next', 'run /setup-rstack in each host to configure models');
460
+ say('next', 'run /setup-ramstack in each host to configure models');
461
461
  return;
462
462
  }
463
463
 
@@ -467,7 +467,7 @@ async function main() {
467
467
  const base = resolveBase(scope, values['project-dir'] ?? saved?.projectDir);
468
468
  if (wizard) {
469
469
  stageTotal = clone && !values['no-pull'] ? 3 : 2;
470
- await banner('rstack update');
470
+ await banner('ramstack update');
471
471
  stage('Review');
472
472
  showPlan(hosts, scope, base, clone);
473
473
  note(
@@ -507,7 +507,7 @@ async function main() {
507
507
  const base = resolveBase(scope, values['project-dir'] ?? saved?.projectDir);
508
508
  if (wizard) {
509
509
  stageTotal = 2;
510
- await banner('rstack uninstall');
510
+ await banner('ramstack uninstall');
511
511
  stage('Review');
512
512
  showPlan(hosts, scope, base, clone);
513
513
  note(
@@ -520,7 +520,7 @@ async function main() {
520
520
  runUnlink(hosts, base, src);
521
521
  finish(`links removed for ${hosts.join(', ')} (${scope})`, [
522
522
  clone
523
- ? 'the clone, .rstack/config.local.json, and core.hooksPath stay'
523
+ ? 'the clone, .ramstack/config.local.json, and core.hooksPath stay'
524
524
  : `the store at ${STORE} stays; delete it to remove the copied skills`,
525
525
  ]);
526
526
  return;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ramstack",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "Agent skills for Claude Code, Codex, and pi",
5
5
  "author": "Justin Ramos <justinramos@outlook.com>",
6
6
  "license": "MIT",
@@ -16,7 +16,7 @@
16
16
  "skills"
17
17
  ],
18
18
  "bin": {
19
- "rstack": "cli/rstack.mjs"
19
+ "ramstack": "cli/ramstack.mjs"
20
20
  },
21
21
  "engines": {
22
22
  "node": ">=18"
@@ -25,7 +25,7 @@ The N candidates will receive the same prompt, so the prompt is the contract. Ge
25
25
 
26
26
  1. State the artifact each candidate is producing.
27
27
  2. Derive the rubric. State what success looks like for *this* task, then turn it into 3-6 concrete gradeable criteria. Concrete: `Adds a --dry-run flag that skips writes`. Vague: `code is correct`. The rubric is the picker's tool in Phase D; candidates only see the task.
28
- 3. Pick the runners. Use `arena runners` from your host's `## <host>` section of `~/.agents/rstack-models.md` when present. Otherwise default to one each on `fable`, `opus`, `sonnet`. Spawn more when the arena covers multiple design directions. Same model N times when the work is generation-bound rather than judgment-sensitive.
28
+ 3. Pick the runners. Use `arena runners` from your host's `## <host>` section of `~/.agents/ramstack-models.md` when present. Otherwise default to one each on `fable`, `opus`, `sonnet`. Spawn more when the arena covers multiple design directions. Same model N times when the work is generation-bound rather than judgment-sensitive.
29
29
  4. Assign output paths. Each candidate writes to its own location (a git worktree where possible, otherwise `/tmp/arena-<slug>/candidate-<n>/`). N candidates writing to the same path is shared mutable state and fails the the **separate-before-serializing-shared-state** principle skill test.
30
30
 
31
31
  ## Phase B: Fan out
@@ -38,7 +38,7 @@ If a candidate fails to produce output, proceed with N-1 and note the dropout in
38
38
 
39
39
  ## Phase C: Cross-judge
40
40
 
41
- After all Phase B candidates complete, choose one model from the `arena cross-judge pool` in your host's `## <host>` section of `~/.agents/rstack-models.md` when present. Otherwise use `fable`, `opus`, `sonnet`. Prefer a different model family from the parent's. Spawn one readonly judge subagent on that model. It sees the rubric and the candidates by path label, scores each criterion, and recommends a base with rationale. It runs in parallel with the parent's reading in Phase D, not with the candidates themselves. Spawning while candidates are still writing means the judge sees partial or empty outputs and reports them as dropouts.
41
+ After all Phase B candidates complete, choose one model from the `arena cross-judge pool` in your host's `## <host>` section of `~/.agents/ramstack-models.md` when present. Otherwise use `fable`, `opus`, `sonnet`. Prefer a different model family from the parent's. Spawn one readonly judge subagent on that model. It sees the rubric and the candidates by path label, scores each criterion, and recommends a base with rationale. It runs in parallel with the parent's reading in Phase D, not with the candidates themselves. Spawning while candidates are still writing means the judge sees partial or empty outputs and reports them as dropouts.
42
42
 
43
43
  ## Phase D: Pick a base
44
44
 
@@ -33,7 +33,7 @@ Write one clear paragraph. Reviewers challenge whether the work achieves the int
33
33
 
34
34
  ## Step 3, Spawn Reviewers
35
35
 
36
- Launch all reviewers in a single message using the subagent tool. Use the `interrogate reviewers` list from your host's `## <host>` section of `~/.agents/rstack-models.md` when present, one reviewer per entry, extending or shrinking the Reviewer A/B/C labels below to the configured entry count; otherwise use the table defaults.
36
+ Launch all reviewers in a single message using the subagent tool. Use the `interrogate reviewers` list from your host's `## <host>` section of `~/.agents/ramstack-models.md` when present, one reviewer per entry, extending or shrinking the Reviewer A/B/C labels below to the configured entry count; otherwise use the table defaults.
37
37
 
38
38
  | Subagent | Default model |
39
39
  |----------|---------------|
@@ -88,7 +88,7 @@ Read the leaf skill in full for any principle you apply. Each entry names when i
88
88
 
89
89
  **Use `subagent_type: "poteto-agent"` for any subagent you spawn inside a playbook step** (code-writing delegates, ad-hoc helpers). `/poteto-mode` and `poteto-agent` route through the same wrapper. Routed workflow skills (`how`, `why`, `interrogate`, `reflect`, `swarm`) set their own `subagent_type` for diverse-model review; respect what the skill prescribes, don't override to `poteto-agent`.
90
90
 
91
- **Defaults for every subagent call.** Run in the background when the host supports it, file pointers not inlined context, explicit model per role (configurable via `/setup-rstack`; defaults `sonnet` for code, `fable` for prose and judgment). Code delegates tier by difficulty. The hardest changes (cross-cutting design, gnarly concurrency, subtle algorithms) go to your strongest judgment model (`fable`) when the task needs judgment or the intent is vague, and to your strongest instruction-following model (`opus`) when the work is a precisely specified sequence of steps to execute to the letter; trivial mechanical edits go to your fast code model. Per-role lines in your host's section of the `/setup-rstack` config (`~/.agents/rstack-models.md`) override these defaults and the model choices in the routed skills (`how`, `why`, `arena`, `swarm`, `architect`, `interrogate`, `reflect`); a role with no line keeps its default, and a role line of `inherit-parent` or `auto` runs that role on the parent chat model (omit the subagent `model` param).
91
+ **Defaults for every subagent call.** Run in the background when the host supports it, file pointers not inlined context, explicit model per role (configurable via `/setup-ramstack`; defaults `sonnet` for code, `fable` for prose and judgment). Code delegates tier by difficulty. The hardest changes (cross-cutting design, gnarly concurrency, subtle algorithms) go to your strongest judgment model (`fable`) when the task needs judgment or the intent is vague, and to your strongest instruction-following model (`opus`) when the work is a precisely specified sequence of steps to execute to the letter; trivial mechanical edits go to your fast code model. Per-role lines in your host's section of the `/setup-ramstack` config (`~/.agents/ramstack-models.md`) override these defaults and the model choices in the routed skills (`how`, `why`, `arena`, `swarm`, `architect`, `interrogate`, `reflect`); a role with no line keeps its default, and a role line of `inherit-parent` or `auto` runs that role on the parent chat model (omit the subagent `model` param).
92
92
 
93
93
  You own every subagent's work. Review the diff and write your own summary, don't pass through what it said. Interrupt-chained resumes silently drop directives, so fire a fresh subagent with consolidated scope rather than trusting a "done" summary. A second opinion is the same prompt against a different model. Agreement is high-signal.
94
94
 
@@ -3,7 +3,7 @@
3
3
  **You own the exit condition. Define done, then drive to it without stopping.** For "going to bed" / "run until done" / "/loop until X".
4
4
 
5
5
  1. State the exit condition as a checkable predicate before the first iteration (tests green, repro fixed, all N PRs merged, pixel-diff zero). A vague goal stalls; a predicate lets you stop.
6
- 2. Pick the wake mechanism using the host's `/loop` command when it has one (a built-in, not a rstack skill). An event to watch (CI, a merge, a ref advancing) gets a watcher subagent that wakes you on the event, with a long time-based heartbeat as fallback. No event gets a fixed-interval heartbeat sized to when the result is worth re-checking.
6
+ 2. Pick the wake mechanism using the host's `/loop` command when it has one (a built-in, not a ramstack skill). An event to watch (CI, a merge, a ref advancing) gets a watcher subagent that wakes you on the event, with a long time-based heartbeat as fallback. No event gets a fixed-interval heartbeat sized to when the result is worth re-checking.
7
7
  3. Each iteration makes the smallest change the evidence justifies, verifies it against the predicate, commits if it advanced, discards changes that didn't help. Belt-and-suspenders that "might help" gets reverted, not left to ride.
8
8
  Sequence the work via the **sequence-verifiable-units** principle skill, verifying each unit before the next instead of batching checks at the end.
9
9
  4. Mid-run discoveries are yours. Address broken skills, related bugs, flaky verifiers, review noise, tooling failures, orphaned follow-ups, and fixable drift yourself via poteto-mode. Put out-of-band fixes in their own PR. Do not park reversible work for the human or use `AskUserQuestion`. Surface only irreversible actions, genuine product or preference calls no experiment can settle, or a real dead end. Keep the predicate as the main drive, and return to it after each side fix.
@@ -1,5 +1,5 @@
1
1
  {
2
- "name": "@rstack/poteto-mode-tools",
2
+ "name": "@ramstack/poteto-mode-tools",
3
3
  "private": true,
4
4
  "type": "module",
5
5
  "scripts": {
@@ -1,16 +1,16 @@
1
- # Setup rstack
1
+ # Setup ramstack
2
2
 
3
- Write the current host's section of `~/.agents/rstack-models.md`, the config file that sets a model per role for rstack skills.
3
+ Write the current host's section of `~/.agents/ramstack-models.md`, the config file that sets a model per role for ramstack skills.
4
4
 
5
5
  ## When to use
6
6
 
7
- - `/setup-rstack` or "configure rstack models"
8
- - After installing rstack on a new host
7
+ - `/setup-ramstack` or "configure ramstack models"
8
+ - After installing ramstack on a new host
9
9
  - After model availability changes
10
10
 
11
11
  ## What it produces
12
12
 
13
- A `## <host>` section in `~/.agents/rstack-models.md` with one line per role. Other host sections in the file stay unchanged. Creates the file with a header comment if it does not exist.
13
+ A `## <host>` section in `~/.agents/ramstack-models.md` with one line per role. Other host sections in the file stay unchanged. Creates the file with a header comment if it does not exist.
14
14
 
15
15
  ## How it works
16
16
 
@@ -1,11 +1,11 @@
1
1
  ---
2
- name: setup-rstack
3
- description: Configure which models rstack uses per role, for the host you're running in (Claude Code, Codex, or pi). Detects your available models and writes your host's section of the shared config file. Use for /setup-rstack, "configure rstack models", or changing rstack's model choices.
2
+ name: setup-ramstack
3
+ description: Configure which models ramstack uses per role, for the host you're running in (Claude Code, Codex, or pi). Detects your available models and writes your host's section of the shared config file. Use for /setup-ramstack, "configure ramstack models", or changing ramstack's model choices.
4
4
  ---
5
5
 
6
- # Setup rstack
6
+ # Setup ramstack
7
7
 
8
- Write your host's section of `~/.agents/rstack-models.md`, a config file that sets rstack's model per role. The skills read it at run time and fall back to their inline defaults when a section or line is absent, so this is an override layer, not a requirement.
8
+ Write your host's section of `~/.agents/ramstack-models.md`, a config file that sets ramstack's model per role. The skills read it at run time and fall back to their inline defaults when a section or line is absent, so this is an override layer, not a requirement.
9
9
 
10
10
  The file is shared across hosts on purpose. Model slugs differ per host (`sonnet` means something in Claude Code and nothing in Codex or pi), so the file holds one `## <host>` section per tool, and every skill reads only the section for the host it is running in. Someone who switches between Claude Code, Codex, and pi runs this skill once in each and the tools stop stepping on each other.
11
11
 
@@ -25,7 +25,7 @@ If the host has a models API or CLI that lists the user's entitled models, prefe
25
25
 
26
26
  ### 2. Load current state
27
27
 
28
- If `~/.agents/rstack-models.md` exists and has a section for this host, read it and treat its values as the current choices. Otherwise start from the defaults in step 5. Never treat another host's section as current state; its slugs are not valid here.
28
+ If `~/.agents/ramstack-models.md` exists and has a section for this host, read it and treat its values as the current choices. Otherwise start from the defaults in step 5. Never treat another host's section as current state; its slugs are not valid here.
29
29
 
30
30
  ### 3. Map and confirm
31
31
 
@@ -37,12 +37,12 @@ Every real slug written must be in the detected set; `inherit-parent` and `auto`
37
37
 
38
38
  ### 5. Write the config
39
39
 
40
- Rewrite this host's `## <host>` section of `~/.agents/rstack-models.md` with one line per role, using the same labels poteto-mode uses. Preserve every other host's section byte for byte; create the file with the header comment below if it doesn't exist. Re-runs stay idempotent by replacing the whole section.
40
+ Rewrite this host's `## <host>` section of `~/.agents/ramstack-models.md` with one line per role, using the same labels poteto-mode uses. Preserve every other host's section byte for byte; create the file with the header comment below if it doesn't exist. Re-runs stay idempotent by replacing the whole section.
41
41
 
42
42
  Shape, with the Claude Code defaults filled in (another host substitutes its own detected slugs under its own heading, keeping the same roles):
43
43
 
44
44
  ```
45
- # rstack model configuration. One `## <host>` section per tool; skills read only
45
+ # ramstack model configuration. One `## <host>` section per tool; skills read only
46
46
  # the section for the host they run in. One line per role. Delete a line (or a
47
47
  # section) to fall back to the skill defaults.
48
48
  # `inherit-parent` or `auto` as a value: the role runs on the parent chat model
@@ -74,8 +74,8 @@ The role split follows the upstream design: fast mechanical code goes to the fas
74
74
 
75
75
  ### 6. Confirm
76
76
 
77
- Tell the user which host section was written and that skills read it on their next run. If the file has sections for other hosts, say so; if it doesn't, suggest running `/setup-rstack` inside each other tool they use so every host gets valid slugs.
77
+ Tell the user which host section was written and that skills read it on their next run. If the file has sections for other hosts, say so; if it doesn't, suggest running `/setup-ramstack` inside each other tool they use so every host gets valid slugs.
78
78
 
79
79
  ### 7. Offer a verification skill (optional)
80
80
 
81
- Check whether the project has a way to drive the real app for proof (a `verify-*` skill, or an existing harness). If not, offer once: "want a project-local verification skill, so agents can drive the app the way a user does and prove changes work? I can generate one with /create-verification-skill." On yes, invoke `/create-verification-skill` (resolves wherever rstack is installed — workspace, user, or plugin). On no, move on without pushing.
81
+ Check whether the project has a way to drive the real app for proof (a `verify-*` skill, or an existing harness). If not, offer once: "want a project-local verification skill, so agents can drive the app the way a user does and prove changes work? I can generate one with /create-verification-skill." On yes, invoke `/create-verification-skill` (resolves wherever ramstack is installed — workspace, user, or plugin). On no, move on without pushing.
@@ -0,0 +1,3 @@
1
+ interface:
2
+ display_name: "Setup ramstack"
3
+ short_description: "Configure ramstack models per host"
@@ -22,7 +22,7 @@ Open a todolist with one entry per phase before launching anything.
22
22
  1. State the done predicate and the artifact or report the swarm must return.
23
23
  2. Choose the shape. Partition into slices, race N workers on identical briefs, or mix both. For a race or mixed shape, declare `first pass`, `rank all`, or `best-of` before spawning.
24
24
  3. Set N from the user or derive it from the shape. N is total workers, not the cloud concurrency limit.
25
- 4. Pick the worker model from `swarm workers` in your host's `## <host>` section of `~/.agents/rstack-models.md` when present. Otherwise use `sonnet`. For a model race, name each arm's model up front.
25
+ 4. Pick the worker model from `swarm workers` in your host's `## <host>` section of `~/.agents/ramstack-models.md` when present. Otherwise use `sonnet`. For a model race, name each arm's model up front.
26
26
  5. Give each worker its own writable output when it writes. Use a worktree, branch, or `/tmp/swarm-<slug>/worker-<n>/`.
27
27
 
28
28
  ## Phase B: Fan out
@@ -1,3 +0,0 @@
1
- interface:
2
- display_name: "Setup rstack"
3
- short_description: "Configure rstack models per host"