@ritualai/cli 0.25.0 → 0.36.9
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/dist/commands/build.js +89 -0
- package/dist/commands/build.js.map +1 -0
- package/dist/commands/init.js +93 -109
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/uninstall.js +6 -1
- package/dist/commands/uninstall.js.map +1 -1
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/agents/configure-mcp.js +63 -0
- package/dist/lib/agents/configure-mcp.js.map +1 -1
- package/dist/lib/agents/launch.js +70 -0
- package/dist/lib/agents/launch.js.map +1 -0
- package/dist/lib/agents/providers.js +8 -2
- package/dist/lib/agents/providers.js.map +1 -1
- package/dist/lib/final-cta-box.js +22 -10
- package/dist/lib/final-cta-box.js.map +1 -1
- package/dist/lib/help-style.js +65 -0
- package/dist/lib/help-style.js.map +1 -0
- package/dist/lib/onboarding-state.js +9 -8
- package/dist/lib/onboarding-state.js.map +1 -1
- package/dist/lib/uninstall-plan.js +18 -1
- package/dist/lib/uninstall-plan.js.map +1 -1
- package/dist/lib/workspace-explainer.js +42 -111
- package/dist/lib/workspace-explainer.js.map +1 -1
- package/dist/lib/workspace-flow.js +4 -1
- package/dist/lib/workspace-flow.js.map +1 -1
- package/package.json +1 -1
- package/skills/claude-code/ritual/.ritual-bundle.json +3 -2
- package/skills/claude-code/ritual/SKILL.md +11 -0
- package/skills/claude-code/ritual/references/build-flow.md +474 -414
- package/skills/claude-code/ritual/references/cli-output-contract.md +90 -34
- package/skills/claude-code/ritual/references/lite-flow.md +484 -421
- package/skills/codex/ritual/.ritual-bundle.json +3 -2
- package/skills/codex/ritual/SKILL.md +11 -0
- package/skills/codex/ritual/references/build-flow.md +474 -414
- package/skills/codex/ritual/references/cli-output-contract.md +90 -34
- package/skills/codex/ritual/references/lite-flow.md +484 -421
- package/skills/cursor/ritual/.ritual-bundle.json +3 -2
- package/skills/cursor/ritual/SKILL.md +11 -0
- package/skills/cursor/ritual/references/build-flow.md +474 -414
- package/skills/cursor/ritual/references/cli-output-contract.md +90 -34
- package/skills/cursor/ritual/references/lite-flow.md +484 -421
- package/skills/gemini/ritual/.ritual-bundle.json +3 -2
- package/skills/gemini/ritual/SKILL.md +11 -0
- package/skills/gemini/ritual/references/build-flow.md +474 -414
- package/skills/gemini/ritual/references/cli-output-contract.md +90 -34
- package/skills/gemini/ritual/references/lite-flow.md +484 -421
- package/skills/kiro/ritual/.ritual-bundle.json +3 -2
- package/skills/kiro/ritual/SKILL.md +11 -0
- package/skills/kiro/ritual/references/build-flow.md +474 -414
- package/skills/kiro/ritual/references/cli-output-contract.md +90 -34
- package/skills/kiro/ritual/references/lite-flow.md +484 -421
- package/skills/vscode/ritual/.ritual-bundle.json +3 -2
- package/skills/vscode/ritual/SKILL.md +11 -0
- package/skills/vscode/ritual/references/build-flow.md +474 -414
- package/skills/vscode/ritual/references/cli-output-contract.md +90 -34
- package/skills/vscode/ritual/references/lite-flow.md +484 -421
- package/dist/lib/build-flow-explainer.js +0 -226
- package/dist/lib/build-flow-explainer.js.map +0 -1
- package/dist/lib/persona-picker.js +0 -171
- package/dist/lib/persona-picker.js.map +0 -1
|
@@ -3,17 +3,23 @@
|
|
|
3
3
|
* Workspace explainer — onboarding screen #2 of 3.
|
|
4
4
|
*
|
|
5
5
|
* Shown once per machine on first `ritual init` (gated by
|
|
6
|
-
* onboarding-state.ts). Teaches the user the
|
|
6
|
+
* onboarding-state.ts). Teaches the user ONE idea — the memory loop:
|
|
7
7
|
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
8
|
+
* you build a feature → the workspace remembers what it settled
|
|
9
|
+
* (decisions, constraints, what shipped) → your next build starts
|
|
10
|
+
* from there instead of from zero.
|
|
11
|
+
*
|
|
12
|
+
* 2026-06-11 rewrite: the previous version rendered a topology diagram
|
|
13
|
+
* (three exploration cards fanning into a "shared context · knowledge
|
|
14
|
+
* graph" strip) plus the landing-page value-prop line. True, but it
|
|
15
|
+
* explained our architecture when the user needs the BENEFIT. The loop
|
|
16
|
+
* diagram is the whole product in one arrow that bends back; the three
|
|
17
|
+
* memory bullets map to real mechanisms (KG decisions, anti-goals,
|
|
18
|
+
* sync_implementation lineage) spoken in the user's words.
|
|
12
19
|
*
|
|
13
20
|
* Personalized via:
|
|
14
21
|
* - Workspace name (git-remote-detected, falls back to cwd basename)
|
|
15
|
-
* - Persona
|
|
16
|
-
* exploration names from persona-samples.ts
|
|
22
|
+
* - Persona accent color (when a stored/--persona pick exists)
|
|
17
23
|
*
|
|
18
24
|
* Non-TTY fallback: terse 3-line summary printed via printTerse().
|
|
19
25
|
* Caller is expected to check tty + onboarding state before calling
|
|
@@ -39,55 +45,34 @@ function printWorkspaceExplainer(opts) {
|
|
|
39
45
|
const persona = (0, persona_samples_1.findPersona)(opts.personaSlug) ?? persona_samples_1.GENERIC_PERSONA;
|
|
40
46
|
const accent = persona.accent;
|
|
41
47
|
const lines = [];
|
|
42
|
-
// Title bar carries the workspace name + brand-teal accent. The
|
|
43
|
-
// body BELOW it actually teaches what a workspace IS (replaces an
|
|
44
|
-
// earlier draft that just labeled "workspace: foo / you build: bar"
|
|
45
|
-
// without explaining the concept — the visual cards alone weren't
|
|
46
|
-
// enough to land it).
|
|
47
48
|
lines.push(box.top(BOX_WIDTH, (0, colors_1.color)(accent, `─ workspace: "${opts.workspaceName}" `)));
|
|
48
49
|
lines.push(box.padded(BOX_WIDTH, ''));
|
|
49
|
-
//
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
// you'd actually merge"). One bold opener + two dim continuation
|
|
53
|
-
// lines so the eye lands on the verb-noun phrases without the
|
|
54
|
-
// outcome clause getting lost in the wrap.
|
|
55
|
-
lines.push(box.padded(BOX_WIDTH, ` ${(0, colors_1.boldColor)(accent, 'where structured discovery, living specs, and plans with')}`));
|
|
56
|
-
lines.push(box.padded(BOX_WIDTH, ` ${(0, colors_1.boldColor)(accent, 'less guesswork come together —')}`));
|
|
57
|
-
lines.push(box.padded(BOX_WIDTH, ` ${(0, colors_1.dim)('so AI agents land changes you\'d actually merge.')}`));
|
|
50
|
+
// The framing sentence — what I'm about to do, and what it buys.
|
|
51
|
+
lines.push(box.padded(BOX_WIDTH, ` ${(0, colors_1.boldColor)(accent, "Next, I'll link this repo to a workspace — Ritual's memory")}`));
|
|
52
|
+
lines.push(box.padded(BOX_WIDTH, ` ${(0, colors_1.boldColor)(accent, 'for the context and reasoning behind every build.')}`));
|
|
58
53
|
lines.push(box.padded(BOX_WIDTH, ''));
|
|
59
|
-
//
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
const
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
lines.push(box.padded(BOX_WIDTH, '
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
' └' + '─'.repeat(65) + '┘',
|
|
77
|
-
];
|
|
78
|
-
for (const cl of contextLines) {
|
|
79
|
-
lines.push(box.padded(BOX_WIDTH, ' ' + (0, colors_1.dim)('│ ') + (0, colors_1.color)(accent, cl) + (0, colors_1.dim)(' │')));
|
|
80
|
-
}
|
|
81
|
-
lines.push(box.padded(BOX_WIDTH, ' ' + (0, colors_1.dim)('│') + ' '.repeat(BOX_WIDTH - 8) + (0, colors_1.dim)('│')));
|
|
82
|
-
lines.push(box.padded(BOX_WIDTH, ' ' + (0, colors_1.dim)('└' + '─'.repeat(BOX_WIDTH - 8) + '┘')));
|
|
54
|
+
// The memory loop. Hardcoded layout — every line ≤ 62 visible chars,
|
|
55
|
+
// well inside the BOX_WIDTH - 4 inner budget. The accent colors the
|
|
56
|
+
// memory box (the thing the workspace IS); the loop chrome stays dim.
|
|
57
|
+
const A = (s) => (0, colors_1.color)(accent, s);
|
|
58
|
+
const D = (s) => (0, colors_1.dim)(s);
|
|
59
|
+
lines.push(box.padded(BOX_WIDTH, ' ' + D('┌──────────────────┐') + ' ' + A('┌────────────────────────────┐')));
|
|
60
|
+
lines.push(box.padded(BOX_WIDTH, ' ' + D('│') + ' you build a ' + D('│') + D(' ───▶ ') + A('│') + ' the workspace remembers ' + A('│')));
|
|
61
|
+
lines.push(box.padded(BOX_WIDTH, ' ' + D('│') + ' feature ' + D('│') + ' ' + A('│') + ' · decisions you made ' + A('│')));
|
|
62
|
+
lines.push(box.padded(BOX_WIDTH, ' ' + D('└──────────────────┘') + ' ' + A('│') + ' · constraints you set ' + A('│')));
|
|
63
|
+
lines.push(box.padded(BOX_WIDTH, ' ' + D('▲') + ' ' + A('│') + ' · what actually shipped ' + A('│')));
|
|
64
|
+
lines.push(box.padded(BOX_WIDTH, ' ' + D('│') + ' ' + A('└──────────────┬─────────────┘')));
|
|
65
|
+
lines.push(box.padded(BOX_WIDTH, ' ' + D('│') + ' ' + D('│')));
|
|
66
|
+
lines.push(box.padded(BOX_WIDTH, ' ' + D('└──── ') + 'your next build' + D(' ◀─────────┘')));
|
|
67
|
+
lines.push(box.padded(BOX_WIDTH, ' ' + (0, colors_1.dim)('starts from here')));
|
|
68
|
+
lines.push(box.padded(BOX_WIDTH, ''));
|
|
69
|
+
// The payoff, concrete.
|
|
70
|
+
lines.push(box.padded(BOX_WIDTH, ` ${(0, colors_1.boldColor)(accent, 'so build #5 never re-asks what build #1 already settled.')}`));
|
|
83
71
|
lines.push(box.padded(BOX_WIDTH, ''));
|
|
84
72
|
// What you'll do here. Kept short: only commands that exist + are
|
|
85
|
-
// expected to be the first thing the user reaches for.
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
// don't want to teach a command that doesn't work yet.
|
|
89
|
-
lines.push(box.padded(BOX_WIDTH, ` ${(0, colors_1.boldColor)(accent, 'what you\'ll do here:')}`));
|
|
90
|
-
lines.push(box.padded(BOX_WIDTH, ` ${(0, colors_1.dim)('›')} /ritual build <feature> ${(0, colors_1.dim)('create an exploration')}`));
|
|
73
|
+
// expected to be the first thing the user reaches for.
|
|
74
|
+
lines.push(box.padded(BOX_WIDTH, ` ${(0, colors_1.boldColor)(accent, "what you'll do here:")}`));
|
|
75
|
+
lines.push(box.padded(BOX_WIDTH, ` ${(0, colors_1.dim)('›')} /ritual build <feature> ${(0, colors_1.dim)('start a build')}`));
|
|
91
76
|
lines.push(box.padded(BOX_WIDTH, ` ${(0, colors_1.dim)('›')} /ritual resume ${(0, colors_1.dim)('pick up where you left off')}`));
|
|
92
77
|
lines.push(box.padded(BOX_WIDTH, ''));
|
|
93
78
|
lines.push(box.bottom(BOX_WIDTH));
|
|
@@ -97,73 +82,19 @@ function printWorkspaceExplainer(opts) {
|
|
|
97
82
|
}
|
|
98
83
|
/**
|
|
99
84
|
* Terse single-line-per-concept fallback for non-TTY or narrow
|
|
100
|
-
* terminals. No colors, no boxes — just the teaching.
|
|
85
|
+
* terminals. No colors, no boxes — just the teaching, same loop.
|
|
101
86
|
*/
|
|
102
87
|
function printWorkspaceExplainerTerse(opts) {
|
|
103
|
-
|
|
104
|
-
// the framing line was pulled in favor of an actual definition.
|
|
105
|
-
// Persona-specific examples still surface in the rich version.
|
|
106
|
-
void (0, persona_samples_1.findPersona)(opts.personaSlug);
|
|
107
|
-
process.stdout.write(`\n workspace: "${opts.workspaceName}"\n`);
|
|
88
|
+
process.stdout.write(`\n workspace "${opts.workspaceName}" — Ritual's memory for the context and reasoning behind every build.\n`);
|
|
108
89
|
process.stdout.write('\n');
|
|
109
|
-
process.stdout.write('
|
|
110
|
-
process.stdout.write('
|
|
111
|
-
process.stdout.write(' actually merge.\n');
|
|
90
|
+
process.stdout.write(' build a feature -> it remembers (decisions · constraints · what shipped)\n');
|
|
91
|
+
process.stdout.write(' -> your next build starts from there, not from zero.\n');
|
|
112
92
|
process.stdout.write('\n');
|
|
113
|
-
process.stdout.write(' Use /ritual build <feature> to
|
|
114
|
-
process.stdout.write('
|
|
93
|
+
process.stdout.write(' Use /ritual build <feature> to start a build. /ritual resume to pick up\n');
|
|
94
|
+
process.stdout.write(' where you left off.\n');
|
|
115
95
|
process.stdout.write('\n');
|
|
116
96
|
}
|
|
117
97
|
// ─── helpers ────────────────────────────────────────────────────────────────
|
|
118
|
-
/**
|
|
119
|
-
* Render the 3 exploration cards as a single 4-line column-block:
|
|
120
|
-
* top border with the "exploration" label, two title lines (most
|
|
121
|
-
* titles wrap to 2; short ones get a blank second line), bottom
|
|
122
|
-
* border. Lifecycle bullets used to live here; they were dropped
|
|
123
|
-
* because they teach the SAME thing as the build-flow explainer's
|
|
124
|
-
* phase chain (which is the right place for that detail). The
|
|
125
|
-
* workspace explainer should only convey the unit + that multiple
|
|
126
|
-
* units coexist in a workspace.
|
|
127
|
-
*
|
|
128
|
-
* Each card is 18 visible chars wide (`┌─ exploration ──┐`); 3 cards
|
|
129
|
-
* + 2 separators (2 spaces each) = 18*3 + 4 = 58 chars, well within
|
|
130
|
-
* the BOX_WIDTH - 8 = 70 inner budget.
|
|
131
|
-
*/
|
|
132
|
-
function renderExplorationCardsRow(persona) {
|
|
133
|
-
const titles = persona.sampleExplorations;
|
|
134
|
-
// Card body width (inside the side `│ … │` chars). Matches the
|
|
135
|
-
// width of the top/bottom borders so all three rows align cleanly.
|
|
136
|
-
const bodyW = 14;
|
|
137
|
-
// Wrap each title to 2 lines; pad the second line with empty so
|
|
138
|
-
// short titles still occupy the full card height.
|
|
139
|
-
const wrap = (s) => {
|
|
140
|
-
if (s.length <= bodyW)
|
|
141
|
-
return [s, ''];
|
|
142
|
-
const cut = s.slice(0, bodyW).lastIndexOf(' ');
|
|
143
|
-
if (cut <= 0)
|
|
144
|
-
return [s.slice(0, bodyW), s.slice(bodyW, 2 * bodyW)];
|
|
145
|
-
return [s.slice(0, cut), s.slice(cut + 1, cut + 1 + bodyW)];
|
|
146
|
-
};
|
|
147
|
-
const wrapped = titles.map(wrap);
|
|
148
|
-
const pad = (s) => s.padEnd(bodyW, ' ');
|
|
149
|
-
const top = '┌─ exploration ──┐';
|
|
150
|
-
const mid = '│';
|
|
151
|
-
const bot = '└────────────────┘';
|
|
152
|
-
const lines = [];
|
|
153
|
-
// Top border × 3
|
|
154
|
-
lines.push([top, top, top].join(' '));
|
|
155
|
-
// Title line 1 × 3
|
|
156
|
-
lines.push([wrapped[0][0], wrapped[1][0], wrapped[2][0]]
|
|
157
|
-
.map((t) => `${mid} ${pad(t)} ${mid}`)
|
|
158
|
-
.join(' '));
|
|
159
|
-
// Title line 2 × 3 (blank for short titles)
|
|
160
|
-
lines.push([wrapped[0][1], wrapped[1][1], wrapped[2][1]]
|
|
161
|
-
.map((t) => `${mid} ${pad(t)} ${mid}`)
|
|
162
|
-
.join(' '));
|
|
163
|
-
// Bottom border × 3
|
|
164
|
-
lines.push([bot, bot, bot].join(' '));
|
|
165
|
-
return lines;
|
|
166
|
-
}
|
|
167
98
|
/**
|
|
168
99
|
* Minimal box-drawing helpers. Local to this module to keep the
|
|
169
100
|
* file self-contained; if the workspace + build-flow explainers
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workspace-explainer.js","sourceRoot":"","sources":["../../src/lib/workspace-explainer.ts"],"names":[],"mappings":";AAAA
|
|
1
|
+
{"version":3,"file":"workspace-explainer.js","sourceRoot":"","sources":["../../src/lib/workspace-explainer.ts"],"names":[],"mappings":"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"}
|
|
@@ -32,7 +32,10 @@ async function resolveProjectWorkspace(opts) {
|
|
|
32
32
|
console.log('');
|
|
33
33
|
let answer;
|
|
34
34
|
try {
|
|
35
|
-
|
|
35
|
+
// Phrased as the workspace explainer's confirm button — the box
|
|
36
|
+
// above just said "Next, I'll link this repo to a workspace", so
|
|
37
|
+
// this reads as ONE continuous beat, not a new question.
|
|
38
|
+
answer = await (0, prompt_1.prompt)(` › press Enter to create "${detection.name}" — or type a different name (n to skip): `);
|
|
36
39
|
}
|
|
37
40
|
catch {
|
|
38
41
|
// stdin closed / Ctrl-D — treat as skip.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workspace-flow.js","sourceRoot":"","sources":["../../src/lib/workspace-flow.ts"],"names":[],"mappings":";;AAsEA,
|
|
1
|
+
{"version":3,"file":"workspace-flow.js","sourceRoot":"","sources":["../../src/lib/workspace-flow.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ritualai/cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.36.9",
|
|
4
4
|
"description": "Ritual CLI — scaffold AI coding agent skills + register MCP servers. Connects Claude Code, Cursor, Windsurf, Kiro, Gemini CLI, VS Code/Copilot, and Codex to Ritual Cloud.",
|
|
5
5
|
"private": false,
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -3,6 +3,7 @@ name: ritual
|
|
|
3
3
|
description: "Use when an engineer wants a coding agent to plan or build a feature, refactor, or implementation-heavy change that depends on context the agent can't infer on its own — strategic intent, constraints, prior decisions, and trade-offs that live in the user's head. Ritual runs a structured exploration to surface that context through targeted discovery questions, combines it with codebase signals and prior explorations, and delivers a validated build brief (sub-problems, recommendations, dependencies) — additional context to fold into plan mode before the agent writes code. Prefer this over jumping straight to implementation or plan mode when the problem is ambiguous, cross-cutting, or has non-obvious constraints. Subcommands: build (full planning-to-sync cycle — default for new features), resume (continue an in-flight exploration), lineage (file-path KG history — what decisions shaped this code), context-pulse (readiness and context-debt scoring — is this safe to build yet?)."
|
|
4
4
|
argument-hint: "[subcommand] <args> (e.g. 'build Reduce T2 churn in Q3', 'resume', 'lineage src/checkout/views.py', 'context-pulse Add billing export')"
|
|
5
5
|
user-invocable: true
|
|
6
|
+
stamp: 26b50ff4f856
|
|
6
7
|
---
|
|
7
8
|
|
|
8
9
|
# /ritual
|
|
@@ -19,6 +20,16 @@ Before executing any subcommand, read and follow:
|
|
|
19
20
|
|
|
20
21
|
Do not reintroduce `/ritual recon`. Use plain-language repo inspection, `/ritual resume`, or `/ritual lineage` depending on intent.
|
|
21
22
|
|
|
23
|
+
**Ground before you claim (load-bearing).** An exploration's current state — its recommendation count/status, step, requirement/brief status — is **live truth you read, never recall**. Before stating any of it: if unsure *which* exploration, call `list_explorations` (the compact roster) to fix identity by seeing them side by side; before asserting *what's in* one, call `get_exploration_status` (the cheap status card). Memory and prior turns are authoritative only for identity (which exploration, its title); the graph is authoritative for state. Never assert a recommendation count or status from memory, a session summary, or a stale read — that's how sibling explorations get conflated and "0 recs" gets claimed on an exploration that has many. See `documents/architecture/okf-grounding-policy.md`.
|
|
24
|
+
<!-- skill-options:no-gate-change: grounding rule adds no [USER PAUSE] gate or options; read-before-claim discipline only -->
|
|
25
|
+
|
|
26
|
+
**Skill freshness (once per session, silent unless stale):** this file's frontmatter may carry a
|
|
27
|
+
`stamp:` value (injected when the bundle was built — absent on dev/source copies). On the FIRST
|
|
28
|
+
`mcp__ritual__ping` of a session, pass it as `skill_stamp`. If the response says
|
|
29
|
+
`skillFreshness: "stale"`, relay its one-line hint ("Skill update available — run
|
|
30
|
+
`ritual init --skills-only` to refresh") exactly once, no pause, and continue with the current flow.
|
|
31
|
+
No stamp, or `in-sync`/`unknown` → say nothing. Never block on this.
|
|
32
|
+
|
|
22
33
|
## Contract strength — load-bearing for all subcommands
|
|
23
34
|
|
|
24
35
|
Every section in this SKILL or its reference files labeled **load-bearing**, **forbidden behavior**, **anti-pattern**, **rendering contract**, or **fire-on-trigger** is **contract-strength**, not guidance.
|