@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.
- package/dist/commands/build.js +42 -3
- package/dist/commands/build.js.map +1 -1
- package/dist/commands/init.js +11 -0
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/login.js +43 -0
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/telemetry.js +35 -0
- package/dist/commands/telemetry.js.map +1 -0
- package/dist/index.js +74 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/config.js +1 -0
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/telemetry.js +234 -0
- package/dist/lib/telemetry.js.map +1 -0
- package/package.json +1 -1
- package/skills/claude-code/ritual/.ritual-bundle.json +3 -3
- package/skills/claude-code/ritual/SKILL.md +2 -2
- package/skills/claude-code/ritual/references/build-flow.md +5 -5
- package/skills/claude-code/ritual/references/lite-flow.md +6 -6
- package/skills/codex/ritual/.ritual-bundle.json +3 -3
- package/skills/codex/ritual/SKILL.md +2 -2
- package/skills/codex/ritual/references/build-flow.md +5 -5
- package/skills/codex/ritual/references/lite-flow.md +6 -6
- package/skills/cursor/ritual/.ritual-bundle.json +3 -3
- package/skills/cursor/ritual/SKILL.md +2 -2
- package/skills/cursor/ritual/references/build-flow.md +5 -5
- package/skills/cursor/ritual/references/lite-flow.md +6 -6
- package/skills/gemini/ritual/.ritual-bundle.json +3 -3
- package/skills/gemini/ritual/SKILL.md +2 -2
- package/skills/gemini/ritual/references/build-flow.md +5 -5
- package/skills/gemini/ritual/references/lite-flow.md +6 -6
- package/skills/kiro/ritual/.ritual-bundle.json +3 -3
- package/skills/kiro/ritual/SKILL.md +2 -2
- package/skills/kiro/ritual/references/build-flow.md +5 -5
- package/skills/kiro/ritual/references/lite-flow.md +6 -6
- package/skills/vscode/ritual/.ritual-bundle.json +3 -3
- package/skills/vscode/ritual/SKILL.md +2 -2
- package/skills/vscode/ritual/references/build-flow.md +5 -5
- 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.
|
|
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",
|
|
@@ -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:
|
|
7
|
-
cli_version: 0.36.
|
|
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}.
|
|
625
|
-
• `discover <nums>` —
|
|
626
|
-
|
|
627
|
-
• `
|
|
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:
|
|
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}.
|
|
717
|
-
• `discover <nums>` —
|
|
718
|
-
|
|
719
|
-
• `
|
|
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:
|
|
@@ -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:
|
|
7
|
-
cli_version: 0.36.
|
|
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}.
|
|
625
|
-
• `discover <nums>` —
|
|
626
|
-
|
|
627
|
-
• `
|
|
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:
|
|
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}.
|
|
717
|
-
• `discover <nums>` —
|
|
718
|
-
|
|
719
|
-
• `
|
|
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:
|
|
@@ -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:
|
|
7
|
-
cli_version: 0.36.
|
|
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}.
|
|
625
|
-
• `discover <nums>` —
|
|
626
|
-
|
|
627
|
-
• `
|
|
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:
|
|
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}.
|
|
717
|
-
• `discover <nums>` —
|
|
718
|
-
|
|
719
|
-
• `
|
|
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:
|
|
@@ -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:
|
|
7
|
-
cli_version: 0.36.
|
|
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}.
|
|
625
|
-
• `discover <nums>` —
|
|
626
|
-
|
|
627
|
-
• `
|
|
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:
|
|
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}.
|
|
717
|
-
• `discover <nums>` —
|
|
718
|
-
|
|
719
|
-
• `
|
|
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:
|
|
@@ -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:
|
|
7
|
-
cli_version: 0.36.
|
|
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}.
|
|
625
|
-
• `discover <nums>` —
|
|
626
|
-
|
|
627
|
-
• `
|
|
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:
|
|
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}.
|
|
717
|
-
• `discover <nums>` —
|
|
718
|
-
|
|
719
|
-
• `
|
|
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:
|