@ritualai/cli 0.36.38 → 0.36.39

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.
Files changed (39) hide show
  1. package/dist/commands/build.js +42 -3
  2. package/dist/commands/build.js.map +1 -1
  3. package/dist/commands/init.js +11 -0
  4. package/dist/commands/init.js.map +1 -1
  5. package/dist/commands/login.js +43 -0
  6. package/dist/commands/login.js.map +1 -1
  7. package/dist/commands/telemetry.js +35 -0
  8. package/dist/commands/telemetry.js.map +1 -0
  9. package/dist/index.js +74 -1
  10. package/dist/index.js.map +1 -1
  11. package/dist/lib/config.js +1 -0
  12. package/dist/lib/config.js.map +1 -1
  13. package/dist/lib/telemetry.js +234 -0
  14. package/dist/lib/telemetry.js.map +1 -0
  15. package/package.json +1 -1
  16. package/skills/claude-code/ritual/.ritual-bundle.json +3 -3
  17. package/skills/claude-code/ritual/SKILL.md +2 -2
  18. package/skills/claude-code/ritual/references/build-flow.md +5 -5
  19. package/skills/claude-code/ritual/references/lite-flow.md +6 -6
  20. package/skills/codex/ritual/.ritual-bundle.json +3 -3
  21. package/skills/codex/ritual/SKILL.md +2 -2
  22. package/skills/codex/ritual/references/build-flow.md +5 -5
  23. package/skills/codex/ritual/references/lite-flow.md +6 -6
  24. package/skills/cursor/ritual/.ritual-bundle.json +3 -3
  25. package/skills/cursor/ritual/SKILL.md +2 -2
  26. package/skills/cursor/ritual/references/build-flow.md +5 -5
  27. package/skills/cursor/ritual/references/lite-flow.md +6 -6
  28. package/skills/gemini/ritual/.ritual-bundle.json +3 -3
  29. package/skills/gemini/ritual/SKILL.md +2 -2
  30. package/skills/gemini/ritual/references/build-flow.md +5 -5
  31. package/skills/gemini/ritual/references/lite-flow.md +6 -6
  32. package/skills/kiro/ritual/.ritual-bundle.json +3 -3
  33. package/skills/kiro/ritual/SKILL.md +2 -2
  34. package/skills/kiro/ritual/references/build-flow.md +5 -5
  35. package/skills/kiro/ritual/references/lite-flow.md +6 -6
  36. package/skills/vscode/ritual/.ritual-bundle.json +3 -3
  37. package/skills/vscode/ritual/SKILL.md +2 -2
  38. package/skills/vscode/ritual/references/build-flow.md +5 -5
  39. package/skills/vscode/ritual/references/lite-flow.md +6 -6
@@ -0,0 +1,234 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isFirstRun = isFirstRun;
4
+ exports.isEnabled = isEnabled;
5
+ exports.setOptOut = setOptOut;
6
+ exports.describeStatus = describeStatus;
7
+ exports.capture = capture;
8
+ exports.identify = identify;
9
+ exports.maybeShowFirstRunNotice = maybeShowFirstRunNotice;
10
+ exports.flush = flush;
11
+ const node_fs_1 = require("node:fs");
12
+ const node_os_1 = require("node:os");
13
+ const node_path_1 = require("node:path");
14
+ const node_crypto_1 = require("node:crypto");
15
+ const config_1 = require("./config");
16
+ const credentials_backup_1 = require("./credentials-backup");
17
+ const package_info_1 = require("./package-info");
18
+ /**
19
+ * Anonymous, opt-out usage analytics for the Ritual CLI.
20
+ *
21
+ * Design goals:
22
+ * - Never blocks a command. Every send is fire-and-forget with a hard
23
+ * timeout; failures are swallowed. This is load-bearing for `login`,
24
+ * whose browser-loopback must not wait on a telemetry POST.
25
+ * - Anonymous until you sign in. A random install id (in
26
+ * ~/.config/ritual/telemetry.json) is the distinct_id pre-login; on
27
+ * login we $identify it to the Keycloak `sub` so the pre-login funnel
28
+ * stitches to the account (and to the marketing-site signup, which
29
+ * uses the same PostHog project).
30
+ * - Easy to turn off: DO_NOT_TRACK, RITUAL_TELEMETRY=0, or
31
+ * `ritual telemetry off`. Always skipped in CI.
32
+ *
33
+ * Same PostHog project as ritual.work so the web + CLI funnels are one
34
+ * graph. Key + host are overridable for self-hosters / tests.
35
+ */
36
+ const POSTHOG_HOST = (process.env.RITUAL_POSTHOG_HOST || 'https://us.i.posthog.com').replace(/\/$/, '');
37
+ const POSTHOG_KEY = process.env.RITUAL_POSTHOG_KEY || 'phc_nNH8wifJVxDrCfAUabmwni44genZggRTT52CBdtQS4w4';
38
+ // Hard cap on how long a single send can hang. Reachable PostHog answers in
39
+ // ~100-300ms; this only bites when the host is firewalled/black-holed, and it
40
+ // bounds the worst-case latency a telemetry POST can add to a command's exit.
41
+ const SEND_TIMEOUT_MS = 800;
42
+ function statePath() {
43
+ return (0, node_path_1.join)((0, config_1.configDir)(), 'telemetry.json');
44
+ }
45
+ let cachedState = null;
46
+ const pending = [];
47
+ function isCI() {
48
+ const e = process.env;
49
+ return !!(e.CI ||
50
+ e.CONTINUOUS_INTEGRATION ||
51
+ e.GITHUB_ACTIONS ||
52
+ e.GITLAB_CI ||
53
+ e.CIRCLECI ||
54
+ e.TRAVIS ||
55
+ e.BUILDKITE ||
56
+ e.TF_BUILD ||
57
+ e.JENKINS_URL);
58
+ }
59
+ function envDisabled() {
60
+ const e = process.env;
61
+ if (e.DO_NOT_TRACK === '1' || e.DO_NOT_TRACK === 'true')
62
+ return true;
63
+ const t = (e.RITUAL_TELEMETRY || '').toLowerCase();
64
+ if (t === '0' || t === 'false' || t === 'off' || t === 'no')
65
+ return true;
66
+ return false;
67
+ }
68
+ /** True only the very first time the CLI runs on this machine. */
69
+ function isFirstRun() {
70
+ return !(0, node_fs_1.existsSync)(statePath());
71
+ }
72
+ function readStateRaw() {
73
+ try {
74
+ const parsed = JSON.parse((0, node_fs_1.readFileSync)(statePath(), 'utf-8'));
75
+ if (parsed && typeof parsed.installId === 'string')
76
+ return parsed;
77
+ }
78
+ catch {
79
+ /* missing / corrupt — caller decides */
80
+ }
81
+ return null;
82
+ }
83
+ /** Load (and create on first ever call) the telemetry state. */
84
+ function loadState() {
85
+ if (cachedState)
86
+ return cachedState;
87
+ const existing = readStateRaw();
88
+ if (existing) {
89
+ cachedState = existing;
90
+ return existing;
91
+ }
92
+ const fresh = {
93
+ installId: (0, node_crypto_1.randomUUID)(),
94
+ firstRunAt: new Date().toISOString(),
95
+ };
96
+ saveState(fresh);
97
+ return fresh;
98
+ }
99
+ function saveState(state) {
100
+ cachedState = state;
101
+ try {
102
+ (0, node_fs_1.mkdirSync)((0, config_1.configDir)(), { recursive: true });
103
+ // Same 0600 create-with-mode helper the credentials store uses —
104
+ // the install id is low-sensitivity, but keep it owner-only anyway.
105
+ (0, credentials_backup_1.writeFileMode0600)(statePath(), JSON.stringify(state, null, 2));
106
+ }
107
+ catch {
108
+ /* best-effort */
109
+ }
110
+ }
111
+ /**
112
+ * Is telemetry on? Env / CI checks come first so opted-out and CI users
113
+ * never even get an install id written to disk.
114
+ */
115
+ function isEnabled() {
116
+ if (envDisabled() || isCI())
117
+ return false;
118
+ return !loadState().optedOut;
119
+ }
120
+ /** Persist an explicit opt-in/opt-out (for `ritual telemetry on|off`). */
121
+ function setOptOut(optedOut) {
122
+ saveState({ ...loadState(), optedOut });
123
+ }
124
+ /** Current opt-out posture for `ritual telemetry status`. */
125
+ function describeStatus() {
126
+ if (envDisabled())
127
+ return { enabled: false, reason: 'disabled via DO_NOT_TRACK / RITUAL_TELEMETRY', installId: '—' };
128
+ if (isCI())
129
+ return { enabled: false, reason: 'CI environment detected', installId: '—' };
130
+ const s = loadState();
131
+ return {
132
+ enabled: !s.optedOut,
133
+ reason: s.optedOut ? 'disabled via `ritual telemetry off`' : 'enabled',
134
+ installId: s.installId,
135
+ };
136
+ }
137
+ function baseProps() {
138
+ return {
139
+ $lib: 'ritual-cli',
140
+ cli_version: (0, package_info_1.readPackageVersionSafe)(),
141
+ os: (0, node_os_1.platform)(),
142
+ arch: process.arch,
143
+ node_version: process.version,
144
+ is_ci: isCI(),
145
+ };
146
+ }
147
+ /** sub once signed in (stitched on $identify), else the anonymous install id. */
148
+ function distinctId() {
149
+ try {
150
+ const creds = (0, config_1.loadCredentials)();
151
+ if (creds?.user?.sub)
152
+ return creds.user.sub;
153
+ }
154
+ catch {
155
+ /* ignore */
156
+ }
157
+ return loadState().installId;
158
+ }
159
+ async function send(body) {
160
+ const controller = new AbortController();
161
+ const timer = setTimeout(() => controller.abort(), SEND_TIMEOUT_MS);
162
+ try {
163
+ await fetch(`${POSTHOG_HOST}/capture/`, {
164
+ method: 'POST',
165
+ headers: { 'content-type': 'application/json' },
166
+ body: JSON.stringify(body),
167
+ signal: controller.signal,
168
+ });
169
+ }
170
+ catch {
171
+ /* network down / aborted / blocked — never surface to the user */
172
+ }
173
+ finally {
174
+ clearTimeout(timer);
175
+ }
176
+ }
177
+ /** Fire-and-forget event. No-op when disabled. */
178
+ function capture(event, properties = {}) {
179
+ if (!isEnabled())
180
+ return;
181
+ pending.push(send({
182
+ api_key: POSTHOG_KEY,
183
+ event,
184
+ distinct_id: distinctId(),
185
+ properties: { ...baseProps(), ...properties },
186
+ timestamp: new Date().toISOString(),
187
+ }));
188
+ }
189
+ /**
190
+ * Link the anonymous install id to the signed-in user (Keycloak sub) and
191
+ * set durable person properties. Call once, right after a successful login.
192
+ */
193
+ function identify(sub, person = {}) {
194
+ if (!isEnabled())
195
+ return;
196
+ const installId = loadState().installId;
197
+ if (!sub || sub === installId)
198
+ return;
199
+ pending.push(send({
200
+ api_key: POSTHOG_KEY,
201
+ event: '$identify',
202
+ distinct_id: sub,
203
+ properties: {
204
+ $anon_distinct_id: installId, // merges prior anonymous events into the person
205
+ $set: { ...baseProps(), ...person },
206
+ },
207
+ timestamp: new Date().toISOString(),
208
+ }));
209
+ }
210
+ /**
211
+ * One-time disclosure. Printed to stderr so it never pollutes stdout that
212
+ * a script might parse. No-op in CI / when disabled / after first shown.
213
+ */
214
+ function maybeShowFirstRunNotice() {
215
+ if (envDisabled() || isCI())
216
+ return;
217
+ const s = loadState();
218
+ if (s.noticeShownAt || s.optedOut)
219
+ return;
220
+ saveState({ ...s, noticeShownAt: new Date().toISOString() });
221
+ process.stderr.write('\n Ritual CLI collects anonymous usage analytics to help improve the product.\n' +
222
+ ' Opt out anytime: `ritual telemetry off` (or set RITUAL_TELEMETRY=0).\n\n');
223
+ }
224
+ /** Await in-flight sends (bounded) so events leave before the process exits. */
225
+ async function flush(timeoutMs = SEND_TIMEOUT_MS + 250) {
226
+ if (pending.length === 0)
227
+ return;
228
+ const inFlight = pending.splice(0);
229
+ await Promise.race([
230
+ Promise.allSettled(inFlight),
231
+ new Promise((resolve) => setTimeout(resolve, timeoutMs)),
232
+ ]);
233
+ }
234
+ //# sourceMappingURL=telemetry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../../src/lib/telemetry.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.36.38",
3
+ "version": "0.36.39",
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",
@@ -1,5 +1,5 @@
1
1
  {
2
- "cliVersion": "0.36.38",
3
- "builtAt": "2026-06-20T13:35:23.818Z",
4
- "skillsHash": "ca720305a0e1"
2
+ "cliVersion": "0.36.39",
3
+ "builtAt": "2026-06-20T13:46:17.028Z",
4
+ "skillsHash": "283d2c7cc43e"
5
5
  }
@@ -3,8 +3,8 @@ 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 the agent's planning step before it writes code. Prefer this over jumping straight to implementation 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: ca720305a0e1
7
- cli_version: 0.36.38
6
+ stamp: 283d2c7cc43e
7
+ cli_version: 0.36.39
8
8
  ---
9
9
 
10
10
  # /ritual
@@ -620,12 +620,12 @@ Steps:
620
620
  <!-- skill-options:no-gate-change: f.1 is an OPTIONAL skippable sub-prompt nested in Step 1.5 step 6 (default skip); adds no tracked pause gate or Step header, so the structural fingerprint is unchanged (check-skill-options-contract green). -->
621
621
  f.1 **Unchosen-candidates gate (2026-06-14, unchosen-options → discovery worktrees).** The candidates the user did NOT pick are paths worth not silently dropping. Render ONE compact, SKIPPABLE prompt — for each unchosen candidate, the user can spin up **discovery now** (a background worktree reasons it to a build brief) or **log it as a future job**. Promote DELIBERATELY: the default is to drop. (This gate is itself skipped in autonomous/worktree mode — never spawn discovery recursively.)
622
622
 
623
+ <!-- skill-options:no-gate-change: prose-only copy tightening of the discover/next-job/skip descriptions; option tokens + gate unchanged -->
623
624
  ```text
624
- You picked #{k}. The other {M} — want to keep any going?
625
- • `discover <nums>` — spin up discovery NOW in a background git worktree: an agent reasons it
626
- end-to-end to a build brief (reasoning only, no code). e.g. `discover 1`
627
- • `next-job <nums>` just log it as a future job (a draft exploration in this workspace; nothing runs)
628
- • `skip` — drop them (default)
625
+ You picked #{k}. For the rest:
626
+ • `discover <nums>` — explore unpicked option(s) in parallel; returns a build brief, no code.
627
+ • `next-job <nums>` — save as future work.
628
+ • `skip` drop them. Default.
629
629
  ```
630
630
 
631
631
  Resolve the reply, then continue to Step 2 for the picked candidate:
@@ -1,5 +1,5 @@
1
1
  <!-- GENERATED from references/build-flow.md by apps/cli/scripts/generate-lite-flow.js — DO NOT EDIT. -->
2
- <!-- source-sha: 251c9793521c8486 -->
2
+ <!-- source-sha: 294b970c48a237b5 -->
3
3
 
4
4
  # /ritual lite — fast build (generated; do not edit)
5
5
 
@@ -712,12 +712,12 @@ Steps:
712
712
  <!-- skill-options:no-gate-change: f.1 is an OPTIONAL skippable sub-prompt nested in Step 1.5 step 6 (default skip); adds no tracked pause gate or Step header, so the structural fingerprint is unchanged (check-skill-options-contract green). -->
713
713
  f.1 **Unchosen-candidates gate (2026-06-14, unchosen-options → discovery worktrees).** The candidates the user did NOT pick are paths worth not silently dropping. Render ONE compact, SKIPPABLE prompt — for each unchosen candidate, the user can spin up **discovery now** (a background worktree reasons it to a build brief) or **log it as a future job**. Promote DELIBERATELY: the default is to drop. (This gate is itself skipped in autonomous/worktree mode — never spawn discovery recursively.)
714
714
 
715
+ <!-- skill-options:no-gate-change: prose-only copy tightening of the discover/next-job/skip descriptions; option tokens + gate unchanged -->
715
716
  ```text
716
- You picked #{k}. The other {M} — want to keep any going?
717
- • `discover <nums>` — spin up discovery NOW in a background git worktree: an agent reasons it
718
- end-to-end to a build brief (reasoning only, no code). e.g. `discover 1`
719
- • `next-job <nums>` just log it as a future job (a draft exploration in this workspace; nothing runs)
720
- • `skip` — drop them (default)
717
+ You picked #{k}. For the rest:
718
+ • `discover <nums>` — explore unpicked option(s) in parallel; returns a build brief, no code.
719
+ • `next-job <nums>` — save as future work.
720
+ • `skip` drop them. Default.
721
721
  ```
722
722
 
723
723
  Resolve the reply, then continue to Step 2 for the picked candidate:
@@ -1,5 +1,5 @@
1
1
  {
2
- "cliVersion": "0.36.38",
3
- "builtAt": "2026-06-20T13:35:23.818Z",
4
- "skillsHash": "ca720305a0e1"
2
+ "cliVersion": "0.36.39",
3
+ "builtAt": "2026-06-20T13:46:17.028Z",
4
+ "skillsHash": "283d2c7cc43e"
5
5
  }
@@ -3,8 +3,8 @@ 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 the agent's planning step before it writes code. Prefer this over jumping straight to implementation 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: ca720305a0e1
7
- cli_version: 0.36.38
6
+ stamp: 283d2c7cc43e
7
+ cli_version: 0.36.39
8
8
  ---
9
9
 
10
10
  # /ritual
@@ -620,12 +620,12 @@ Steps:
620
620
  <!-- skill-options:no-gate-change: f.1 is an OPTIONAL skippable sub-prompt nested in Step 1.5 step 6 (default skip); adds no tracked pause gate or Step header, so the structural fingerprint is unchanged (check-skill-options-contract green). -->
621
621
  f.1 **Unchosen-candidates gate (2026-06-14, unchosen-options → discovery worktrees).** The candidates the user did NOT pick are paths worth not silently dropping. Render ONE compact, SKIPPABLE prompt — for each unchosen candidate, the user can spin up **discovery now** (a background worktree reasons it to a build brief) or **log it as a future job**. Promote DELIBERATELY: the default is to drop. (This gate is itself skipped in autonomous/worktree mode — never spawn discovery recursively.)
622
622
 
623
+ <!-- skill-options:no-gate-change: prose-only copy tightening of the discover/next-job/skip descriptions; option tokens + gate unchanged -->
623
624
  ```text
624
- You picked #{k}. The other {M} — want to keep any going?
625
- • `discover <nums>` — spin up discovery NOW in a background git worktree: an agent reasons it
626
- end-to-end to a build brief (reasoning only, no code). e.g. `discover 1`
627
- • `next-job <nums>` just log it as a future job (a draft exploration in this workspace; nothing runs)
628
- • `skip` — drop them (default)
625
+ You picked #{k}. For the rest:
626
+ • `discover <nums>` — explore unpicked option(s) in parallel; returns a build brief, no code.
627
+ • `next-job <nums>` — save as future work.
628
+ • `skip` drop them. Default.
629
629
  ```
630
630
 
631
631
  Resolve the reply, then continue to Step 2 for the picked candidate:
@@ -1,5 +1,5 @@
1
1
  <!-- GENERATED from references/build-flow.md by apps/cli/scripts/generate-lite-flow.js — DO NOT EDIT. -->
2
- <!-- source-sha: 251c9793521c8486 -->
2
+ <!-- source-sha: 294b970c48a237b5 -->
3
3
 
4
4
  # /ritual lite — fast build (generated; do not edit)
5
5
 
@@ -712,12 +712,12 @@ Steps:
712
712
  <!-- skill-options:no-gate-change: f.1 is an OPTIONAL skippable sub-prompt nested in Step 1.5 step 6 (default skip); adds no tracked pause gate or Step header, so the structural fingerprint is unchanged (check-skill-options-contract green). -->
713
713
  f.1 **Unchosen-candidates gate (2026-06-14, unchosen-options → discovery worktrees).** The candidates the user did NOT pick are paths worth not silently dropping. Render ONE compact, SKIPPABLE prompt — for each unchosen candidate, the user can spin up **discovery now** (a background worktree reasons it to a build brief) or **log it as a future job**. Promote DELIBERATELY: the default is to drop. (This gate is itself skipped in autonomous/worktree mode — never spawn discovery recursively.)
714
714
 
715
+ <!-- skill-options:no-gate-change: prose-only copy tightening of the discover/next-job/skip descriptions; option tokens + gate unchanged -->
715
716
  ```text
716
- You picked #{k}. The other {M} — want to keep any going?
717
- • `discover <nums>` — spin up discovery NOW in a background git worktree: an agent reasons it
718
- end-to-end to a build brief (reasoning only, no code). e.g. `discover 1`
719
- • `next-job <nums>` just log it as a future job (a draft exploration in this workspace; nothing runs)
720
- • `skip` — drop them (default)
717
+ You picked #{k}. For the rest:
718
+ • `discover <nums>` — explore unpicked option(s) in parallel; returns a build brief, no code.
719
+ • `next-job <nums>` — save as future work.
720
+ • `skip` drop them. Default.
721
721
  ```
722
722
 
723
723
  Resolve the reply, then continue to Step 2 for the picked candidate:
@@ -1,5 +1,5 @@
1
1
  {
2
- "cliVersion": "0.36.38",
3
- "builtAt": "2026-06-20T13:35:23.818Z",
4
- "skillsHash": "ca720305a0e1"
2
+ "cliVersion": "0.36.39",
3
+ "builtAt": "2026-06-20T13:46:17.028Z",
4
+ "skillsHash": "283d2c7cc43e"
5
5
  }
@@ -3,8 +3,8 @@ 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 the agent's planning step before it writes code. Prefer this over jumping straight to implementation 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: ca720305a0e1
7
- cli_version: 0.36.38
6
+ stamp: 283d2c7cc43e
7
+ cli_version: 0.36.39
8
8
  ---
9
9
 
10
10
  # /ritual
@@ -620,12 +620,12 @@ Steps:
620
620
  <!-- skill-options:no-gate-change: f.1 is an OPTIONAL skippable sub-prompt nested in Step 1.5 step 6 (default skip); adds no tracked pause gate or Step header, so the structural fingerprint is unchanged (check-skill-options-contract green). -->
621
621
  f.1 **Unchosen-candidates gate (2026-06-14, unchosen-options → discovery worktrees).** The candidates the user did NOT pick are paths worth not silently dropping. Render ONE compact, SKIPPABLE prompt — for each unchosen candidate, the user can spin up **discovery now** (a background worktree reasons it to a build brief) or **log it as a future job**. Promote DELIBERATELY: the default is to drop. (This gate is itself skipped in autonomous/worktree mode — never spawn discovery recursively.)
622
622
 
623
+ <!-- skill-options:no-gate-change: prose-only copy tightening of the discover/next-job/skip descriptions; option tokens + gate unchanged -->
623
624
  ```text
624
- You picked #{k}. The other {M} — want to keep any going?
625
- • `discover <nums>` — spin up discovery NOW in a background git worktree: an agent reasons it
626
- end-to-end to a build brief (reasoning only, no code). e.g. `discover 1`
627
- • `next-job <nums>` just log it as a future job (a draft exploration in this workspace; nothing runs)
628
- • `skip` — drop them (default)
625
+ You picked #{k}. For the rest:
626
+ • `discover <nums>` — explore unpicked option(s) in parallel; returns a build brief, no code.
627
+ • `next-job <nums>` — save as future work.
628
+ • `skip` drop them. Default.
629
629
  ```
630
630
 
631
631
  Resolve the reply, then continue to Step 2 for the picked candidate:
@@ -1,5 +1,5 @@
1
1
  <!-- GENERATED from references/build-flow.md by apps/cli/scripts/generate-lite-flow.js — DO NOT EDIT. -->
2
- <!-- source-sha: 251c9793521c8486 -->
2
+ <!-- source-sha: 294b970c48a237b5 -->
3
3
 
4
4
  # /ritual lite — fast build (generated; do not edit)
5
5
 
@@ -712,12 +712,12 @@ Steps:
712
712
  <!-- skill-options:no-gate-change: f.1 is an OPTIONAL skippable sub-prompt nested in Step 1.5 step 6 (default skip); adds no tracked pause gate or Step header, so the structural fingerprint is unchanged (check-skill-options-contract green). -->
713
713
  f.1 **Unchosen-candidates gate (2026-06-14, unchosen-options → discovery worktrees).** The candidates the user did NOT pick are paths worth not silently dropping. Render ONE compact, SKIPPABLE prompt — for each unchosen candidate, the user can spin up **discovery now** (a background worktree reasons it to a build brief) or **log it as a future job**. Promote DELIBERATELY: the default is to drop. (This gate is itself skipped in autonomous/worktree mode — never spawn discovery recursively.)
714
714
 
715
+ <!-- skill-options:no-gate-change: prose-only copy tightening of the discover/next-job/skip descriptions; option tokens + gate unchanged -->
715
716
  ```text
716
- You picked #{k}. The other {M} — want to keep any going?
717
- • `discover <nums>` — spin up discovery NOW in a background git worktree: an agent reasons it
718
- end-to-end to a build brief (reasoning only, no code). e.g. `discover 1`
719
- • `next-job <nums>` just log it as a future job (a draft exploration in this workspace; nothing runs)
720
- • `skip` — drop them (default)
717
+ You picked #{k}. For the rest:
718
+ • `discover <nums>` — explore unpicked option(s) in parallel; returns a build brief, no code.
719
+ • `next-job <nums>` — save as future work.
720
+ • `skip` drop them. Default.
721
721
  ```
722
722
 
723
723
  Resolve the reply, then continue to Step 2 for the picked candidate:
@@ -1,5 +1,5 @@
1
1
  {
2
- "cliVersion": "0.36.38",
3
- "builtAt": "2026-06-20T13:35:23.818Z",
4
- "skillsHash": "ca720305a0e1"
2
+ "cliVersion": "0.36.39",
3
+ "builtAt": "2026-06-20T13:46:17.028Z",
4
+ "skillsHash": "283d2c7cc43e"
5
5
  }
@@ -3,8 +3,8 @@ 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 the agent's planning step before it writes code. Prefer this over jumping straight to implementation 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: ca720305a0e1
7
- cli_version: 0.36.38
6
+ stamp: 283d2c7cc43e
7
+ cli_version: 0.36.39
8
8
  ---
9
9
 
10
10
  # /ritual
@@ -620,12 +620,12 @@ Steps:
620
620
  <!-- skill-options:no-gate-change: f.1 is an OPTIONAL skippable sub-prompt nested in Step 1.5 step 6 (default skip); adds no tracked pause gate or Step header, so the structural fingerprint is unchanged (check-skill-options-contract green). -->
621
621
  f.1 **Unchosen-candidates gate (2026-06-14, unchosen-options → discovery worktrees).** The candidates the user did NOT pick are paths worth not silently dropping. Render ONE compact, SKIPPABLE prompt — for each unchosen candidate, the user can spin up **discovery now** (a background worktree reasons it to a build brief) or **log it as a future job**. Promote DELIBERATELY: the default is to drop. (This gate is itself skipped in autonomous/worktree mode — never spawn discovery recursively.)
622
622
 
623
+ <!-- skill-options:no-gate-change: prose-only copy tightening of the discover/next-job/skip descriptions; option tokens + gate unchanged -->
623
624
  ```text
624
- You picked #{k}. The other {M} — want to keep any going?
625
- • `discover <nums>` — spin up discovery NOW in a background git worktree: an agent reasons it
626
- end-to-end to a build brief (reasoning only, no code). e.g. `discover 1`
627
- • `next-job <nums>` just log it as a future job (a draft exploration in this workspace; nothing runs)
628
- • `skip` — drop them (default)
625
+ You picked #{k}. For the rest:
626
+ • `discover <nums>` — explore unpicked option(s) in parallel; returns a build brief, no code.
627
+ • `next-job <nums>` — save as future work.
628
+ • `skip` drop them. Default.
629
629
  ```
630
630
 
631
631
  Resolve the reply, then continue to Step 2 for the picked candidate:
@@ -1,5 +1,5 @@
1
1
  <!-- GENERATED from references/build-flow.md by apps/cli/scripts/generate-lite-flow.js — DO NOT EDIT. -->
2
- <!-- source-sha: 251c9793521c8486 -->
2
+ <!-- source-sha: 294b970c48a237b5 -->
3
3
 
4
4
  # /ritual lite — fast build (generated; do not edit)
5
5
 
@@ -712,12 +712,12 @@ Steps:
712
712
  <!-- skill-options:no-gate-change: f.1 is an OPTIONAL skippable sub-prompt nested in Step 1.5 step 6 (default skip); adds no tracked pause gate or Step header, so the structural fingerprint is unchanged (check-skill-options-contract green). -->
713
713
  f.1 **Unchosen-candidates gate (2026-06-14, unchosen-options → discovery worktrees).** The candidates the user did NOT pick are paths worth not silently dropping. Render ONE compact, SKIPPABLE prompt — for each unchosen candidate, the user can spin up **discovery now** (a background worktree reasons it to a build brief) or **log it as a future job**. Promote DELIBERATELY: the default is to drop. (This gate is itself skipped in autonomous/worktree mode — never spawn discovery recursively.)
714
714
 
715
+ <!-- skill-options:no-gate-change: prose-only copy tightening of the discover/next-job/skip descriptions; option tokens + gate unchanged -->
715
716
  ```text
716
- You picked #{k}. The other {M} — want to keep any going?
717
- • `discover <nums>` — spin up discovery NOW in a background git worktree: an agent reasons it
718
- end-to-end to a build brief (reasoning only, no code). e.g. `discover 1`
719
- • `next-job <nums>` just log it as a future job (a draft exploration in this workspace; nothing runs)
720
- • `skip` — drop them (default)
717
+ You picked #{k}. For the rest:
718
+ • `discover <nums>` — explore unpicked option(s) in parallel; returns a build brief, no code.
719
+ • `next-job <nums>` — save as future work.
720
+ • `skip` drop them. Default.
721
721
  ```
722
722
 
723
723
  Resolve the reply, then continue to Step 2 for the picked candidate:
@@ -1,5 +1,5 @@
1
1
  {
2
- "cliVersion": "0.36.38",
3
- "builtAt": "2026-06-20T13:35:23.818Z",
4
- "skillsHash": "ca720305a0e1"
2
+ "cliVersion": "0.36.39",
3
+ "builtAt": "2026-06-20T13:46:17.028Z",
4
+ "skillsHash": "283d2c7cc43e"
5
5
  }
@@ -3,8 +3,8 @@ 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 the agent's planning step before it writes code. Prefer this over jumping straight to implementation 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: ca720305a0e1
7
- cli_version: 0.36.38
6
+ stamp: 283d2c7cc43e
7
+ cli_version: 0.36.39
8
8
  ---
9
9
 
10
10
  # /ritual
@@ -620,12 +620,12 @@ Steps:
620
620
  <!-- skill-options:no-gate-change: f.1 is an OPTIONAL skippable sub-prompt nested in Step 1.5 step 6 (default skip); adds no tracked pause gate or Step header, so the structural fingerprint is unchanged (check-skill-options-contract green). -->
621
621
  f.1 **Unchosen-candidates gate (2026-06-14, unchosen-options → discovery worktrees).** The candidates the user did NOT pick are paths worth not silently dropping. Render ONE compact, SKIPPABLE prompt — for each unchosen candidate, the user can spin up **discovery now** (a background worktree reasons it to a build brief) or **log it as a future job**. Promote DELIBERATELY: the default is to drop. (This gate is itself skipped in autonomous/worktree mode — never spawn discovery recursively.)
622
622
 
623
+ <!-- skill-options:no-gate-change: prose-only copy tightening of the discover/next-job/skip descriptions; option tokens + gate unchanged -->
623
624
  ```text
624
- You picked #{k}. The other {M} — want to keep any going?
625
- • `discover <nums>` — spin up discovery NOW in a background git worktree: an agent reasons it
626
- end-to-end to a build brief (reasoning only, no code). e.g. `discover 1`
627
- • `next-job <nums>` just log it as a future job (a draft exploration in this workspace; nothing runs)
628
- • `skip` — drop them (default)
625
+ You picked #{k}. For the rest:
626
+ • `discover <nums>` — explore unpicked option(s) in parallel; returns a build brief, no code.
627
+ • `next-job <nums>` — save as future work.
628
+ • `skip` drop them. Default.
629
629
  ```
630
630
 
631
631
  Resolve the reply, then continue to Step 2 for the picked candidate:
@@ -1,5 +1,5 @@
1
1
  <!-- GENERATED from references/build-flow.md by apps/cli/scripts/generate-lite-flow.js — DO NOT EDIT. -->
2
- <!-- source-sha: 251c9793521c8486 -->
2
+ <!-- source-sha: 294b970c48a237b5 -->
3
3
 
4
4
  # /ritual lite — fast build (generated; do not edit)
5
5
 
@@ -712,12 +712,12 @@ Steps:
712
712
  <!-- skill-options:no-gate-change: f.1 is an OPTIONAL skippable sub-prompt nested in Step 1.5 step 6 (default skip); adds no tracked pause gate or Step header, so the structural fingerprint is unchanged (check-skill-options-contract green). -->
713
713
  f.1 **Unchosen-candidates gate (2026-06-14, unchosen-options → discovery worktrees).** The candidates the user did NOT pick are paths worth not silently dropping. Render ONE compact, SKIPPABLE prompt — for each unchosen candidate, the user can spin up **discovery now** (a background worktree reasons it to a build brief) or **log it as a future job**. Promote DELIBERATELY: the default is to drop. (This gate is itself skipped in autonomous/worktree mode — never spawn discovery recursively.)
714
714
 
715
+ <!-- skill-options:no-gate-change: prose-only copy tightening of the discover/next-job/skip descriptions; option tokens + gate unchanged -->
715
716
  ```text
716
- You picked #{k}. The other {M} — want to keep any going?
717
- • `discover <nums>` — spin up discovery NOW in a background git worktree: an agent reasons it
718
- end-to-end to a build brief (reasoning only, no code). e.g. `discover 1`
719
- • `next-job <nums>` just log it as a future job (a draft exploration in this workspace; nothing runs)
720
- • `skip` — drop them (default)
717
+ You picked #{k}. For the rest:
718
+ • `discover <nums>` — explore unpicked option(s) in parallel; returns a build brief, no code.
719
+ • `next-job <nums>` — save as future work.
720
+ • `skip` drop them. Default.
721
721
  ```
722
722
 
723
723
  Resolve the reply, then continue to Step 2 for the picked candidate:
@@ -1,5 +1,5 @@
1
1
  {
2
- "cliVersion": "0.36.38",
3
- "builtAt": "2026-06-20T13:35:23.818Z",
4
- "skillsHash": "ca720305a0e1"
2
+ "cliVersion": "0.36.39",
3
+ "builtAt": "2026-06-20T13:46:17.028Z",
4
+ "skillsHash": "283d2c7cc43e"
5
5
  }