@ritualai/cli 0.36.42 → 0.36.44

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.
@@ -0,0 +1,300 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.materializeCommand = materializeCommand;
7
+ const node_child_process_1 = require("node:child_process");
8
+ const node_fs_1 = __importDefault(require("node:fs"));
9
+ const node_path_1 = __importDefault(require("node:path"));
10
+ const api_client_1 = require("../lib/api-client");
11
+ const config_1 = require("../lib/config");
12
+ const project_config_1 = require("../lib/project-config");
13
+ const colors_1 = require("../lib/colors");
14
+ const gitignore_update_1 = require("../lib/gitignore-update");
15
+ const okf_knowledge_1 = require("../lib/okf-knowledge");
16
+ function repoRoot() {
17
+ try {
18
+ return (0, node_child_process_1.execSync)('git rev-parse --show-toplevel', { stdio: 'pipe', encoding: 'utf8' }).trim();
19
+ }
20
+ catch {
21
+ return process.cwd();
22
+ }
23
+ }
24
+ const MATERIALIZE_STATE = 'materialize.json';
25
+ async function materializeCommand(opts) {
26
+ const token = await (0, config_1.getValidAccessToken)();
27
+ if (token.kind === 'not-signed-in') {
28
+ console.error(' ✗ Not signed in. Run `ritual login` first.');
29
+ process.exitCode = 1;
30
+ return;
31
+ }
32
+ if (token.kind === 're-auth-required') {
33
+ console.error(` ✗ Session expired (${token.reason}). Run \`ritual login\` to re-auth.`);
34
+ process.exitCode = 1;
35
+ return;
36
+ }
37
+ const root = repoRoot();
38
+ const project = (0, project_config_1.loadProjectConfig)(root);
39
+ if (!project) {
40
+ console.error(' ✗ No `.ritual/config.json` in this repo. Run `ritual init` to bind a workspace first.');
41
+ process.exitCode = 1;
42
+ return;
43
+ }
44
+ const api = new api_client_1.ApiClient({ issuer: token.creds.issuer, accessToken: token.accessToken });
45
+ const base = node_path_1.default.resolve(opts.out ?? root);
46
+ const ritualDir = node_path_1.default.join(base, '.ritual');
47
+ const knowledgeDir = opts.snapshot
48
+ ? node_path_1.default.join(base, 'knowledge', '_snapshots', new Date().toISOString().replace(/[:.]/g, '-'))
49
+ : node_path_1.default.join(base, 'knowledge');
50
+ // 1. Enumerate the workspace's explorations.
51
+ let listed;
52
+ try {
53
+ listed = await api.get(`/explorations?workspaceId=${encodeURIComponent(project.workspaceId)}`);
54
+ }
55
+ catch (err) {
56
+ console.error(` ✗ Couldn't list explorations: ${err.message}`);
57
+ process.exitCode = 1;
58
+ return;
59
+ }
60
+ // 2. Filter to DELIVERABLE-BEARING: recommendationsStatus === 'ready',
61
+ // exclude archived / failed / empty / draft. (Status is read live —
62
+ // never inferred from a stale count.)
63
+ const ready = [];
64
+ for (const e of listed ?? []) {
65
+ try {
66
+ const s = await api.get(`/explorations/${encodeURIComponent(e.id)}/status`);
67
+ if (s.recommendationsStatus === 'ready' && !s.isArchived) {
68
+ ready.push({ status: s });
69
+ }
70
+ }
71
+ catch {
72
+ /* skip explorations whose status won't load — never block the sweep */
73
+ }
74
+ }
75
+ if (ready.length === 0) {
76
+ console.log('');
77
+ console.log(` ${(0, colors_1.dim)('No deliverable-bearing explorations to materialize yet.')}`);
78
+ console.log(` ${(0, colors_1.dim)('(An exploration qualifies once its recommendations are ready.)')}`);
79
+ console.log('');
80
+ return;
81
+ }
82
+ // 3. Load the prior resolver (for conflict + prune bookkeeping).
83
+ const resolverPath = node_path_1.default.join(ritualDir, 'resolver.json');
84
+ const prior = readResolver(resolverPath);
85
+ const priorByExpId = new Map(prior.entries.map((en) => [en.explorationId, en]));
86
+ // 4. Build each agnostic doc + resolver entry.
87
+ const entries = [];
88
+ const writes = [];
89
+ for (const { status } of ready) {
90
+ const detail = await fetchDetail(api, status.id);
91
+ const exploration = {
92
+ id: status.id,
93
+ name: status.name ?? detail.name,
94
+ jtbd: status.jtbd,
95
+ workItemLabel: status.workItemLabel,
96
+ problemStatement: detail.problemStatement,
97
+ recommendationsStatus: status.recommendationsStatus,
98
+ driftWatermark: status.recommendationsCompletedAt ?? status.recommendationsGeneratedAt ?? null,
99
+ };
100
+ const doc = (0, okf_knowledge_1.renderKnowledgeDoc)({
101
+ exploration,
102
+ briefContent: detail.briefContent,
103
+ scopeContract: detail.scopeContract,
104
+ recommendations: detail.recommendations,
105
+ });
106
+ // Belt + suspenders: never write a leaking agnostic file.
107
+ const leak = (0, okf_knowledge_1.findKnowledgeLeak)(doc);
108
+ if (leak) {
109
+ console.error(` ✗ Refusing to write a leaking knowledge doc for ${exploration.name} (found "${leak}"). Skipped.`);
110
+ continue;
111
+ }
112
+ const fileName = (0, okf_knowledge_1.knowledgeFileName)(exploration);
113
+ const relFile = node_path_1.default.join('knowledge', fileName);
114
+ const destPath = node_path_1.default.join(knowledgeDir, fileName);
115
+ const action = classifyWrite(destPath, doc, priorByExpId.get(status.id), opts.force);
116
+ writes.push({ file: relFile, content: doc, action });
117
+ entries.push((0, okf_knowledge_1.buildResolverEntry)({ exploration, recommendations: detail.recommendations }, relFile, doc));
118
+ }
119
+ // 5. Dry-run: report and stop.
120
+ if (opts.dryRun) {
121
+ printPlan(writes, knowledgeDir);
122
+ console.log(` ${(0, colors_1.dim)('(--dry-run — nothing written)')}`);
123
+ console.log('');
124
+ return;
125
+ }
126
+ // 6. Write knowledge docs (honoring conflict policy).
127
+ node_fs_1.default.mkdirSync(knowledgeDir, { recursive: true });
128
+ for (const w of writes) {
129
+ const full = node_path_1.default.join(base, w.file);
130
+ if (w.action === 'unchanged')
131
+ continue;
132
+ if (w.action === 'conflict') {
133
+ // User-edited since last materialize and no --force → don't clobber.
134
+ node_fs_1.default.writeFileSync(`${full}.new`, w.content);
135
+ }
136
+ else {
137
+ node_fs_1.default.writeFileSync(full, w.content);
138
+ }
139
+ }
140
+ // 7. Prune: knowledge files we generated previously but no longer produce.
141
+ const pruned = [];
142
+ if (opts.prune && !opts.snapshot) {
143
+ const liveFiles = new Set(writes.map((w) => node_path_1.default.basename(w.file)));
144
+ for (const en of prior.entries) {
145
+ const baseName = node_path_1.default.basename(en.file);
146
+ if (!liveFiles.has(baseName)) {
147
+ const full = node_path_1.default.join(base, en.file);
148
+ if (node_fs_1.default.existsSync(full)) {
149
+ node_fs_1.default.rmSync(full);
150
+ pruned.push(en.file);
151
+ }
152
+ }
153
+ }
154
+ }
155
+ // 8. Write the local resolver (always gitignored).
156
+ const resolver = { version: 1, generatedAt: new Date().toISOString(), entries };
157
+ node_fs_1.default.mkdirSync(ritualDir, { recursive: true });
158
+ node_fs_1.default.writeFileSync(resolverPath, JSON.stringify(resolver, null, 2) + '\n');
159
+ node_fs_1.default.writeFileSync(node_path_1.default.join(ritualDir, 'index.md'), (0, okf_knowledge_1.renderResolverIndex)(resolver) + '\n');
160
+ // 9. Persist the share opt-in (local), and ensure gitignore.
161
+ const statePath = node_path_1.default.join(ritualDir, MATERIALIZE_STATE);
162
+ const state = readState(statePath);
163
+ if (opts.share)
164
+ state.shareKnowledge = true;
165
+ node_fs_1.default.writeFileSync(statePath, JSON.stringify(state, null, 2) + '\n');
166
+ (0, gitignore_update_1.ensureMaterializeGitignore)(base);
167
+ // 10. Stage (force-add past the ignore rule) on --stage. Never commits.
168
+ let staged = false;
169
+ if (opts.stage) {
170
+ staged = tryStage(base);
171
+ }
172
+ printResult(writes, pruned, resolver.entries.length, knowledgeDir, {
173
+ share: state.shareKnowledge === true,
174
+ staged,
175
+ wantedStage: opts.stage === true,
176
+ });
177
+ }
178
+ async function fetchDetail(api, id) {
179
+ const enc = encodeURIComponent(id);
180
+ const [full, brief, recs] = await Promise.all([
181
+ api
182
+ .get(`/explorations/${enc}`)
183
+ .catch(() => ({})),
184
+ api
185
+ .get(`/explorations/${enc}/build-brief`)
186
+ .catch(() => ({})),
187
+ api.get(`/explorations/${enc}/recommendations`).catch(() => []),
188
+ ]);
189
+ return {
190
+ name: full.name,
191
+ problemStatement: full.problemStatement,
192
+ briefContent: brief.content ?? null,
193
+ scopeContract: brief.scopeContractResolved ?? null,
194
+ recommendations: recs ?? [],
195
+ };
196
+ }
197
+ /** Decide how a knowledge file should be written, honoring the conflict policy. */
198
+ function classifyWrite(destPath, newContent, priorEntry, force) {
199
+ if (!node_fs_1.default.existsSync(destPath))
200
+ return 'create';
201
+ const current = node_fs_1.default.readFileSync(destPath, 'utf8');
202
+ if (current === newContent)
203
+ return 'unchanged';
204
+ if (force)
205
+ return 'update';
206
+ // Edited since last materialize? Compare on-disk hash to the recorded watermark.
207
+ const currentHash = (0, okf_knowledge_1.cyrb53)(current);
208
+ if (priorEntry && currentHash === priorEntry.sourceHash)
209
+ return 'update'; // ours, safe to refresh
210
+ return 'conflict'; // user (or unknown) edits — write .new, don't clobber
211
+ }
212
+ function readResolver(p) {
213
+ try {
214
+ const parsed = JSON.parse(node_fs_1.default.readFileSync(p, 'utf8'));
215
+ if (parsed.version === 1 && Array.isArray(parsed.entries))
216
+ return parsed;
217
+ }
218
+ catch {
219
+ /* absent or malformed → empty */
220
+ }
221
+ return { version: 1, generatedAt: '', entries: [] };
222
+ }
223
+ function readState(p) {
224
+ try {
225
+ return JSON.parse(node_fs_1.default.readFileSync(p, 'utf8'));
226
+ }
227
+ catch {
228
+ return {};
229
+ }
230
+ }
231
+ function tryStage(base) {
232
+ try {
233
+ // Knowledge must land in its OWN commit → its own PR — never bundled with
234
+ // code a maintainer reviews for correctness (ritual-knowledge-loop: a build
235
+ // PR never includes knowledge; knowledge gets a deliberate reasoning review).
236
+ // So refuse to stage if anything ELSE is already staged.
237
+ const staged = (0, node_child_process_1.execSync)('git diff --cached --name-only', { cwd: base, stdio: 'pipe', encoding: 'utf8' })
238
+ .split('\n')
239
+ .map((s) => s.trim())
240
+ .filter(Boolean);
241
+ const others = staged.filter((f) => !f.startsWith('knowledge/'));
242
+ if (others.length > 0) {
243
+ console.log('');
244
+ console.log(` ${(0, colors_1.dim)(`Not staging — knowledge belongs in its own PR, and you have ${others.length} other staged change(s).`)}`);
245
+ console.log(` ${(0, colors_1.dim)('Commit or stash those first, then run')} ritual materialize --stage ${(0, colors_1.dim)('on a clean index.')}`);
246
+ return false;
247
+ }
248
+ (0, node_child_process_1.execSync)('git add -f knowledge', { cwd: base, stdio: 'pipe' });
249
+ return true;
250
+ }
251
+ catch {
252
+ console.log('');
253
+ console.log(` ${(0, colors_1.dim)('Could not stage automatically. Run this when ready:')}`);
254
+ console.log(` git add -f knowledge`);
255
+ return false;
256
+ }
257
+ }
258
+ function printPlan(writes, knowledgeDir) {
259
+ console.log('');
260
+ console.log(` ${(0, colors_1.dim)('Would materialize')} ${(0, colors_1.boldColor)(colors_1.RITUAL_TEAL, String(writes.length))} ${(0, colors_1.dim)('knowledge doc(s) →')} ${(0, colors_1.dim)(knowledgeDir)}`);
261
+ for (const w of writes) {
262
+ console.log(` ${(0, colors_1.dim)(symbolFor(w.action))} ${w.file}`);
263
+ }
264
+ console.log('');
265
+ }
266
+ function printResult(writes, pruned, count, knowledgeDir, share) {
267
+ console.log('');
268
+ console.log(` ${(0, colors_1.boldColor)(colors_1.RITUAL_TEAL, 'Materialized')} ${count} ${(0, colors_1.dim)('exploration(s) →')} ${(0, colors_1.dim)(knowledgeDir)}`);
269
+ for (const w of writes) {
270
+ if (w.action === 'unchanged')
271
+ continue;
272
+ console.log(` ${(0, colors_1.dim)(symbolFor(w.action))} ${w.file}${w.action === 'conflict' ? (0, colors_1.dim)(' (wrote .new — your edits kept; --force to overwrite)') : ''}`);
273
+ }
274
+ for (const p of pruned)
275
+ console.log(` ${(0, colors_1.dim)('✗')} ${p} ${(0, colors_1.dim)('(pruned)')}`);
276
+ console.log('');
277
+ if (share.share && !share.staged) {
278
+ console.log(` ${(0, colors_1.dim)('Knowledge is shareable but local. Run')} ritual materialize --stage ${(0, colors_1.dim)('to stage for commit.')}`);
279
+ }
280
+ else if (share.staged) {
281
+ console.log(` ${(0, colors_1.dim)('Staged knowledge/ for commit (git add -f). Review and commit when ready.')}`);
282
+ }
283
+ else if (!share.share) {
284
+ console.log(` ${(0, colors_1.dim)('Local only. Run')} ritual materialize --share ${(0, colors_1.dim)('to mark it shareable with your team.')}`);
285
+ }
286
+ console.log('');
287
+ }
288
+ function symbolFor(action) {
289
+ switch (action) {
290
+ case 'create':
291
+ return '+';
292
+ case 'update':
293
+ return '~';
294
+ case 'conflict':
295
+ return '!';
296
+ default:
297
+ return '·';
298
+ }
299
+ }
300
+ //# sourceMappingURL=materialize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"materialize.js","sourceRoot":"","sources":["../../src/commands/materialize.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -44,6 +44,7 @@ const init_1 = require("./commands/init");
44
44
  const build_1 = require("./commands/build");
45
45
  const lite_1 = require("./commands/lite");
46
46
  const project_1 = require("./commands/project");
47
+ const materialize_1 = require("./commands/materialize");
47
48
  const doctor_1 = require("./commands/doctor");
48
49
  const uninstall_1 = require("./commands/uninstall");
49
50
  // 2026-05-15 (PR D) — `ritual status [--watch]` instant snapshot of
@@ -175,6 +176,21 @@ program
175
176
  .description('Project an exploration’s reasoning into a local .ritual/ tree (build brief, scope contract, recommendations)')
176
177
  .option('--out <dir>', 'Output directory (default: <repo>/.ritual)')
177
178
  .action(project_1.projectCommand);
179
+ // `ritual materialize` — workspace-wide, idempotent sync of deliverable-bearing
180
+ // knowledge to durable local OKF files (agnostic `knowledge/`) + a local
181
+ // resolver index (`.ritual/`). LOCAL by default; --share marks it shareable and
182
+ // --stage force-adds it for commit (never edits .gitignore, never `git commit`).
183
+ program
184
+ .command('materialize')
185
+ .description('Write the workspace’s explored knowledge to local OKF files (knowledge/ + a local index)')
186
+ .option('--share', 'Mark the agnostic knowledge/ docs as shareable with your team (persists locally; does not stage)')
187
+ .option('--stage', 'git add -f knowledge/ so it’s staged for commit (never edits .gitignore, never commits)')
188
+ .option('--snapshot', 'Write a timestamped point-in-time copy instead of syncing in place')
189
+ .option('--prune', 'Remove previously-materialized knowledge files that are no longer produced')
190
+ .option('--dry-run', 'Show what would change without writing anything')
191
+ .option('--force', 'Overwrite locally-edited knowledge files instead of writing a .new sibling')
192
+ .option('--out <dir>', 'Output base directory (default: repo root)')
193
+ .action((opts) => (0, materialize_1.materializeCommand)(opts));
178
194
  const loginCmd = program
179
195
  .command('login')
180
196
  .description('Authenticate with Ritual via your browser')
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.updateProjectGitignore = updateProjectGitignore;
4
+ exports.ensureMaterializeGitignore = ensureMaterializeGitignore;
4
5
  const node_fs_1 = require("node:fs");
5
6
  const node_path_1 = require("node:path");
6
7
  /**
@@ -123,4 +124,52 @@ function updateProjectGitignore(projectRoot, scaffoldedProviders, extraEntries =
123
124
  (0, node_fs_1.writeFileSync)(gitignorePath, nextBody, 'utf8');
124
125
  return { gitignorePath, preExisting, entries, changed: true };
125
126
  }
127
+ /**
128
+ * Marker block for `ritual materialize` (ritual-knowledge-loop, 2026-06-21).
129
+ *
130
+ * The materialized OKF output is LOCAL by default — only the explicit
131
+ * `--share` + `--stage` flow commits the agnostic `knowledge/` docs (via
132
+ * `git add -f`, which force-adds past this ignore rule WITHOUT rewriting it).
133
+ *
134
+ * What's ignored:
135
+ * - `.ritual/*` — the local resolver (resolver.json, index.md,
136
+ * materialize.json). NAMES Ritual (ids, mcp links),
137
+ * so it never belongs in the committed repo.
138
+ * - `!.ritual/config.json` — the ONE sanctioned committed Ritual reference
139
+ * (the repo→workspace binding, #868). Re-include it.
140
+ * - `knowledge/` — agnostic docs; committed only via `git add -f`.
141
+ */
142
+ const MATERIALIZE_BEGIN = '# Begin: ritual materialize — local OKF knowledge + resolver (not committed by default)';
143
+ const MATERIALIZE_END = '# End: ritual materialize';
144
+ const MATERIALIZE_ENTRIES = ['.ritual/*', '!.ritual/config.json', 'knowledge/'];
145
+ /**
146
+ * Ensure the project `.gitignore` keeps `ritual materialize` output out of git
147
+ * by default. Idempotent (marker-bracketed block, like the init block). Creates
148
+ * the file if absent. Returns the result for the caller to log.
149
+ */
150
+ function ensureMaterializeGitignore(projectRoot) {
151
+ const gitignorePath = (0, node_path_1.join)(projectRoot, '.gitignore');
152
+ const preExisting = (0, node_fs_1.existsSync)(gitignorePath);
153
+ const currentBody = preExisting ? (0, node_fs_1.readFileSync)(gitignorePath, 'utf8') : '';
154
+ const block = `${MATERIALIZE_BEGIN}\n${MATERIALIZE_ENTRIES.join('\n')}\n${MATERIALIZE_END}`;
155
+ const nextBody = replaceOrAppendNamedBlock(currentBody, MATERIALIZE_BEGIN, MATERIALIZE_END, block);
156
+ if (nextBody === currentBody) {
157
+ return { gitignorePath, preExisting, entries: MATERIALIZE_ENTRIES, changed: false };
158
+ }
159
+ (0, node_fs_1.writeFileSync)(gitignorePath, nextBody, 'utf8');
160
+ return { gitignorePath, preExisting, entries: MATERIALIZE_ENTRIES, changed: true };
161
+ }
162
+ /** Generalized marker-block replace/append (parameterized markers). */
163
+ function replaceOrAppendNamedBlock(body, beginMarker, endMarker, newBlock) {
164
+ const beginIdx = body.indexOf(beginMarker);
165
+ const endIdx = body.indexOf(endMarker);
166
+ if (beginIdx >= 0 && endIdx > beginIdx) {
167
+ const endLineEnd = endIdx + endMarker.length;
168
+ return body.slice(0, beginIdx) + newBlock + body.slice(endLineEnd);
169
+ }
170
+ const trimmed = body.replace(/\s+$/, '');
171
+ if (trimmed.length === 0)
172
+ return `${newBlock}\n`;
173
+ return `${trimmed}\n\n${newBlock}\n`;
174
+ }
126
175
  //# sourceMappingURL=gitignore-update.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"gitignore-update.js","sourceRoot":"","sources":["../../src/lib/gitignore-update.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"gitignore-update.js","sourceRoot":"","sources":["../../src/lib/gitignore-update.ts"],"names":[],"mappings":";;AAqHA,wDAiCC;AA0BD,gEAYC;AA5LD,qCAAkE;AAClE,yCAAiC;AAIjC;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH;;;;GAIG;AACH,MAAM,YAAY,GAAG,0EAA0E,CAAC;AAChG,MAAM,UAAU,GAAG,oBAAoB,CAAC;AAaxC;;;;;GAKG;AACH,SAAS,gBAAgB,CAAC,QAAuB;IAChD,+DAA+D;IAC/D,4DAA4D;IAC5D,wDAAwD;IACxD,IAAI,CAAC,QAAQ,CAAC,eAAe;QAAE,OAAO,IAAI,CAAC;IAC3C,OAAO,GAAG,QAAQ,CAAC,eAAe,UAAU,CAAC;AAC9C,CAAC;AAED;;;;GAIG;AACH,SAAS,UAAU,CAAC,OAAiB;IACpC,OAAO,GAAG,YAAY,KAAK,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,UAAU,EAAE,CAAC;AAChE,CAAC;AAED;;;;;;;;;GASG;AACH,SAAS,oBAAoB,CAAC,IAAY,EAAE,QAAgB;IAC3D,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAExC,IAAI,QAAQ,IAAI,CAAC,IAAI,MAAM,GAAG,QAAQ,EAAE,CAAC;QACxC,iEAAiE;QACjE,+DAA+D;QAC/D,eAAe;QACf,MAAM,UAAU,GAAG,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC;QAC9C,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,GAAG,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IACpE,CAAC;IAED,iEAAiE;IACjE,4DAA4D;IAC5D,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACzC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,GAAG,QAAQ,IAAI,CAAC;IACjD,OAAO,GAAG,OAAO,OAAO,QAAQ,IAAI,CAAC;AACtC,CAAC;AAED;;;;;;;;;;GAUG;AACH,SAAgB,sBAAsB,CACrC,WAAmB,EACnB,mBAAoC,EACpC,eAAyB,EAAE;IAE3B,MAAM,aAAa,GAAG,IAAA,gBAAI,EAAC,WAAW,EAAE,YAAY,CAAC,CAAC;IACtD,MAAM,WAAW,GAAG,IAAA,oBAAU,EAAC,aAAa,CAAC,CAAC;IAC9C,sEAAsE;IACtE,sEAAsE;IACtE,gDAAgD;IAChD,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CACzB,IAAI,GAAG,CAAS;QACf,GAAG,mBAAmB,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC;QACnF,GAAG,YAAY;KACf,CAAC,CACF,CAAC,IAAI,EAAE,CAAC;IAET,sCAAsC;IACtC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAChE,CAAC;IAED,MAAM,WAAW,GAAG,WAAW,CAAC,CAAC,CAAC,IAAA,sBAAY,EAAC,aAAa,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3E,MAAM,QAAQ,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;IACrC,MAAM,QAAQ,GAAG,oBAAoB,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;IAE7D,IAAI,QAAQ,KAAK,WAAW,EAAE,CAAC;QAC9B,qDAAqD;QACrD,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAChE,CAAC;IAED,IAAA,uBAAa,EAAC,aAAa,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC/C,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAC/D,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,iBAAiB,GAAG,yFAAyF,CAAC;AACpH,MAAM,eAAe,GAAG,2BAA2B,CAAC;AACpD,MAAM,mBAAmB,GAAG,CAAC,WAAW,EAAE,sBAAsB,EAAE,YAAY,CAAC,CAAC;AAEhF;;;;GAIG;AACH,SAAgB,0BAA0B,CAAC,WAAmB;IAC7D,MAAM,aAAa,GAAG,IAAA,gBAAI,EAAC,WAAW,EAAE,YAAY,CAAC,CAAC;IACtD,MAAM,WAAW,GAAG,IAAA,oBAAU,EAAC,aAAa,CAAC,CAAC;IAC9C,MAAM,WAAW,GAAG,WAAW,CAAC,CAAC,CAAC,IAAA,sBAAY,EAAC,aAAa,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3E,MAAM,KAAK,GAAG,GAAG,iBAAiB,KAAK,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,eAAe,EAAE,CAAC;IAC5F,MAAM,QAAQ,GAAG,yBAAyB,CAAC,WAAW,EAAE,iBAAiB,EAAE,eAAe,EAAE,KAAK,CAAC,CAAC;IAEnG,IAAI,QAAQ,KAAK,WAAW,EAAE,CAAC;QAC9B,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,OAAO,EAAE,mBAAmB,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IACrF,CAAC;IACD,IAAA,uBAAa,EAAC,aAAa,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC/C,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,OAAO,EAAE,mBAAmB,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AACpF,CAAC;AAED,uEAAuE;AACvE,SAAS,yBAAyB,CACjC,IAAY,EACZ,WAAmB,EACnB,SAAiB,EACjB,QAAgB;IAEhB,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAC3C,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACvC,IAAI,QAAQ,IAAI,CAAC,IAAI,MAAM,GAAG,QAAQ,EAAE,CAAC;QACxC,MAAM,UAAU,GAAG,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC;QAC7C,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,GAAG,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IACpE,CAAC;IACD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACzC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,GAAG,QAAQ,IAAI,CAAC;IACjD,OAAO,GAAG,OAAO,OAAO,QAAQ,IAAI,CAAC;AACtC,CAAC"}
@@ -0,0 +1,201 @@
1
+ "use strict";
2
+ /**
3
+ * OKF knowledge materialization (ritual-knowledge-loop, 2026-06-21).
4
+ *
5
+ * Two-layer split — the load-bearing principle of `ritual materialize`:
6
+ *
7
+ * 1. KNOWLEDGE (committable, Ritual-AGNOSTIC) — `knowledge/<slug>-<hash>.md`.
8
+ * Problem framing, scope, recommendations-as-prose. Reads as plain project
9
+ * documentation. NEVER contains the brand word "Ritual", a ritualId, or an
10
+ * `mcp://` link. A teammate who never opted into Ritual just sees good docs.
11
+ *
12
+ * 2. RESOLVER (local-only, NAMES Ritual) — `.ritual/resolver.json` + index.md.
13
+ * Maps each agnostic file back to its explorationId / recommendationIds /
14
+ * live `mcp://` re-ground link / drift watermark / source hash. This is the
15
+ * grep target for "does an exploration already exist?" and it stays
16
+ * gitignored.
17
+ *
18
+ * Litmus (enforced by okf-knowledge.spec + the CI leak guard): grep a committed
19
+ * knowledge file for `Ritual` / `ritualId` / `mcp://` → if found, it leaked.
20
+ *
21
+ * The renderers are pure (unit-tested); the fs writes live in
22
+ * commands/materialize.ts.
23
+ */
24
+ Object.defineProperty(exports, "__esModule", { value: true });
25
+ exports.FORBIDDEN_KNOWLEDGE_TOKENS = exports.AGNOSTIC_MARKER = void 0;
26
+ exports.cyrb53 = cyrb53;
27
+ exports.slugify = slugify;
28
+ exports.knowledgeFileName = knowledgeFileName;
29
+ exports.renderKnowledgeDoc = renderKnowledgeDoc;
30
+ exports.findKnowledgeLeak = findKnowledgeLeak;
31
+ exports.liveLink = liveLink;
32
+ exports.buildResolverEntry = buildResolverEntry;
33
+ exports.renderResolverIndex = renderResolverIndex;
34
+ /** Neutral provenance marker — deliberately does NOT name Ritual (it's committed). */
35
+ exports.AGNOSTIC_MARKER = '<!-- Auto-generated — edits may be overwritten. -->';
36
+ /** Tokens that must NEVER appear in committed agnostic knowledge. Mirror in the CI guard. */
37
+ exports.FORBIDDEN_KNOWLEDGE_TOKENS = [
38
+ 'ritualId',
39
+ 'explorationId',
40
+ 'recommendationId',
41
+ 'workspaceId',
42
+ 'mcp://',
43
+ 'Generated by Ritual',
44
+ ];
45
+ /**
46
+ * cyrb53 — small, fast, dependency-free string hash (browser/node-safe, no
47
+ * `Math.random`/`Date.now`). Used for (a) stable short slugs and (b) the
48
+ * source-hash conflict watermark. Same impl family as shared-types' package
49
+ * hash so behavior is familiar.
50
+ */
51
+ function cyrb53(str, seed = 0) {
52
+ let h1 = 0xdeadbeef ^ seed;
53
+ let h2 = 0x41c6ce57 ^ seed;
54
+ for (let i = 0; i < str.length; i++) {
55
+ const ch = str.charCodeAt(i);
56
+ h1 = Math.imul(h1 ^ ch, 2654435761);
57
+ h2 = Math.imul(h2 ^ ch, 1597334677);
58
+ }
59
+ h1 = Math.imul(h1 ^ (h1 >>> 16), 2246822507) ^ Math.imul(h2 ^ (h2 >>> 13), 3266489909);
60
+ h2 = Math.imul(h2 ^ (h2 >>> 16), 2246822507) ^ Math.imul(h1 ^ (h1 >>> 13), 3266489909);
61
+ const n = 4294967296 * (2097151 & h2) + (h1 >>> 0);
62
+ return n.toString(36);
63
+ }
64
+ /** Slug from a display name: lowercase, non-alnum → '-', collapsed, capped. */
65
+ function slugify(name) {
66
+ const s = (name || 'exploration')
67
+ .toLowerCase()
68
+ .replace(/[^a-z0-9]+/g, '-')
69
+ .replace(/^-+|-+$/g, '')
70
+ .slice(0, 48)
71
+ .replace(/-+$/g, '');
72
+ return s || 'exploration';
73
+ }
74
+ /**
75
+ * Stable, rerun-safe knowledge filename. Embeds a short hash of the
76
+ * explorationId so two explorations that normalize to the same slug never
77
+ * collide, and the same exploration always maps to the same file.
78
+ */
79
+ function knowledgeFileName(exp) {
80
+ const short = cyrb53(exp.id).slice(0, 6);
81
+ return `${slugify(exp.name ?? '')}-${short}.md`;
82
+ }
83
+ /**
84
+ * Drop a leading markdown H1 from brief content. The build-brief renderer
85
+ * prepends a branded title ("# Ritual Build Brief") to every brief — injected
86
+ * boilerplate, not the developer's words. We embed the brief under our own
87
+ * "## Implementation brief" heading, so the brief's own title is redundant AND
88
+ * would leak the brand word into committed agnostic docs. Strip exactly the
89
+ * first H1 line (and a following blank line), leave the body intact.
90
+ */
91
+ function stripLeadingH1(text) {
92
+ const lines = text.split('\n');
93
+ let i = 0;
94
+ while (i < lines.length && lines[i].trim() === '')
95
+ i++;
96
+ if (i < lines.length && /^#\s+/.test(lines[i])) {
97
+ lines.splice(0, i + 1);
98
+ if (lines.length > 0 && lines[0].trim() === '')
99
+ lines.shift();
100
+ return lines.join('\n').trim();
101
+ }
102
+ return text;
103
+ }
104
+ function scopeList(title, items) {
105
+ if (!items || items.length === 0)
106
+ return [`### ${title}`, '', '_(none)_', ''];
107
+ // Text ONLY — never the `id` (those are Ritual identifiers → would leak).
108
+ const lines = items.map((i) => `- ${(i.text ?? '').trim()}`).filter((l) => l !== '- ');
109
+ return [`### ${title}`, '', ...lines, ''];
110
+ }
111
+ /**
112
+ * Render the agnostic knowledge doc for one exploration. Pure. The output is
113
+ * committable: no Ritual brand, no ids, no mcp links — just the reasoning as
114
+ * plain markdown. Recommendation/scope ids are deliberately dropped here and
115
+ * preserved only in the (local) resolver.
116
+ */
117
+ function renderKnowledgeDoc(input) {
118
+ const e = input.exploration;
119
+ const out = [exports.AGNOSTIC_MARKER, '', `# ${e.name ?? 'Exploration'}`, ''];
120
+ if (e.workItemLabel || e.jtbd) {
121
+ out.push(`_${e.workItemLabel ?? e.jtbd}_`, '');
122
+ }
123
+ const problem = (e.problemStatement ?? '').trim();
124
+ if (problem) {
125
+ out.push('## Problem', '', problem, '');
126
+ }
127
+ const s = input.scopeContract;
128
+ if (s && (s.inScope?.length || s.deferred?.length || s.discoveryGates?.length || s.antiGoals?.length)) {
129
+ out.push('## Scope', '');
130
+ out.push(...scopeList('In scope', s.inScope));
131
+ out.push(...scopeList('Discovery gates', s.discoveryGates));
132
+ out.push(...scopeList('Deferred', s.deferred));
133
+ out.push(...scopeList('Anti-goals', s.antiGoals));
134
+ }
135
+ const recs = input.recommendations ?? [];
136
+ if (recs.length > 0) {
137
+ out.push('## Recommendations', '');
138
+ for (const r of recs) {
139
+ const status = r.status ? ` _(${r.status})_` : '';
140
+ out.push(`### ${r.title ?? 'Recommendation'}${status}`, '');
141
+ const body = (r.summary ?? r.content ?? '').trim();
142
+ out.push(body || '_(no summary)_', '');
143
+ }
144
+ }
145
+ const brief = stripLeadingH1((input.briefContent ?? '').trim());
146
+ if (brief) {
147
+ out.push('## Implementation brief', '', brief, '');
148
+ }
149
+ return out.join('\n').replace(/\n{3,}/g, '\n\n').trimEnd() + '\n';
150
+ }
151
+ /** Returns the first forbidden token found in `content`, or null if clean. */
152
+ function findKnowledgeLeak(content) {
153
+ for (const tok of exports.FORBIDDEN_KNOWLEDGE_TOKENS) {
154
+ if (content.includes(tok))
155
+ return tok;
156
+ }
157
+ // Brand word as a whole word, case-sensitive (lowercase "ritual" is allowed —
158
+ // avoids false-positives like "team ritual"). Identifiers above are exact.
159
+ if (/\bRitual\b/.test(content))
160
+ return 'Ritual';
161
+ return null;
162
+ }
163
+ /** Build the `mcp://` re-ground link for an exploration (resolver-only, never committed). */
164
+ function liveLink(explorationId) {
165
+ return `mcp://ritual/get_exploration_status?id=${explorationId}`;
166
+ }
167
+ /** Assemble a resolver entry for one materialized exploration. */
168
+ function buildResolverEntry(input, file, docContent) {
169
+ const e = input.exploration;
170
+ return {
171
+ title: e.name ?? 'Exploration',
172
+ file,
173
+ explorationId: e.id,
174
+ recommendationIds: (input.recommendations ?? [])
175
+ .map((r) => r.id)
176
+ .filter((id) => typeof id === 'string'),
177
+ recommendationsStatus: e.recommendationsStatus ?? null,
178
+ driftWatermark: e.driftWatermark ?? null,
179
+ live: liveLink(e.id),
180
+ sourceHash: cyrb53(docContent),
181
+ };
182
+ }
183
+ /** Render the local human-readable roster (`.ritual/index.md`). Names Ritual — local only. */
184
+ function renderResolverIndex(resolver) {
185
+ const out = [
186
+ '<!-- Local Ritual resolver — gitignored. Maps agnostic knowledge/ docs back to the live graph. -->',
187
+ '',
188
+ '# Ritual knowledge index (local)',
189
+ '',
190
+ `Materialized ${resolver.generatedAt}. ${resolver.entries.length} exploration(s).`,
191
+ '',
192
+ '| Knowledge file | Exploration | Recs | Status |',
193
+ '| --- | --- | --- | --- |',
194
+ ];
195
+ for (const en of resolver.entries) {
196
+ out.push(`| [\`${en.file}\`](../${en.file}) | \`${en.explorationId}\` | ${en.recommendationIds.length} | ${en.recommendationsStatus ?? '—'} |`);
197
+ }
198
+ out.push('', 'Re-ground any row via its `live` link in `resolver.json`.', '');
199
+ return out.join('\n');
200
+ }
201
+ //# sourceMappingURL=okf-knowledge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"okf-knowledge.js","sourceRoot":"","sources":["../../src/lib/okf-knowledge.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.42",
3
+ "version": "0.36.44",
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.42",
3
- "builtAt": "2026-06-21T23:52:03.528Z",
2
+ "cliVersion": "0.36.44",
3
+ "builtAt": "2026-06-22T01:57:48.029Z",
4
4
  "skillsHash": "020ff37f037f"
5
5
  }
@@ -4,7 +4,7 @@ description: "Use when an engineer wants a coding agent to plan or build a featu
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
6
  stamp: 020ff37f037f
7
- cli_version: 0.36.42
7
+ cli_version: 0.36.44
8
8
  ---
9
9
 
10
10
  # /ritual
@@ -1,5 +1,5 @@
1
1
  {
2
- "cliVersion": "0.36.42",
3
- "builtAt": "2026-06-21T23:52:03.528Z",
2
+ "cliVersion": "0.36.44",
3
+ "builtAt": "2026-06-22T01:57:48.029Z",
4
4
  "skillsHash": "020ff37f037f"
5
5
  }
@@ -4,7 +4,7 @@ description: "Use when an engineer wants a coding agent to plan or build a featu
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
6
  stamp: 020ff37f037f
7
- cli_version: 0.36.42
7
+ cli_version: 0.36.44
8
8
  ---
9
9
 
10
10
  # /ritual
@@ -1,5 +1,5 @@
1
1
  {
2
- "cliVersion": "0.36.42",
3
- "builtAt": "2026-06-21T23:52:03.528Z",
2
+ "cliVersion": "0.36.44",
3
+ "builtAt": "2026-06-22T01:57:48.029Z",
4
4
  "skillsHash": "020ff37f037f"
5
5
  }
@@ -4,7 +4,7 @@ description: "Use when an engineer wants a coding agent to plan or build a featu
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
6
  stamp: 020ff37f037f
7
- cli_version: 0.36.42
7
+ cli_version: 0.36.44
8
8
  ---
9
9
 
10
10
  # /ritual
@@ -1,5 +1,5 @@
1
1
  {
2
- "cliVersion": "0.36.42",
3
- "builtAt": "2026-06-21T23:52:03.528Z",
2
+ "cliVersion": "0.36.44",
3
+ "builtAt": "2026-06-22T01:57:48.029Z",
4
4
  "skillsHash": "020ff37f037f"
5
5
  }
@@ -4,7 +4,7 @@ description: "Use when an engineer wants a coding agent to plan or build a featu
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
6
  stamp: 020ff37f037f
7
- cli_version: 0.36.42
7
+ cli_version: 0.36.44
8
8
  ---
9
9
 
10
10
  # /ritual
@@ -1,5 +1,5 @@
1
1
  {
2
- "cliVersion": "0.36.42",
3
- "builtAt": "2026-06-21T23:52:03.528Z",
2
+ "cliVersion": "0.36.44",
3
+ "builtAt": "2026-06-22T01:57:48.029Z",
4
4
  "skillsHash": "020ff37f037f"
5
5
  }
@@ -4,7 +4,7 @@ description: "Use when an engineer wants a coding agent to plan or build a featu
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
6
  stamp: 020ff37f037f
7
- cli_version: 0.36.42
7
+ cli_version: 0.36.44
8
8
  ---
9
9
 
10
10
  # /ritual
@@ -1,5 +1,5 @@
1
1
  {
2
- "cliVersion": "0.36.42",
3
- "builtAt": "2026-06-21T23:52:03.528Z",
2
+ "cliVersion": "0.36.44",
3
+ "builtAt": "2026-06-22T01:57:48.029Z",
4
4
  "skillsHash": "020ff37f037f"
5
5
  }
@@ -4,7 +4,7 @@ description: "Use when an engineer wants a coding agent to plan or build a featu
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
6
  stamp: 020ff37f037f
7
- cli_version: 0.36.42
7
+ cli_version: 0.36.44
8
8
  ---
9
9
 
10
10
  # /ritual