@ritualai/cli 0.7.3 → 0.7.6

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 (68) hide show
  1. package/README.md +36 -1
  2. package/dist/commands/init.js +174 -43
  3. package/dist/commands/init.js.map +1 -1
  4. package/dist/commands/login.js +120 -13
  5. package/dist/commands/login.js.map +1 -1
  6. package/dist/commands/logout.js +55 -8
  7. package/dist/commands/logout.js.map +1 -1
  8. package/dist/index.js +8 -66
  9. package/dist/index.js.map +1 -1
  10. package/dist/lib/auth-flow.js +1 -1
  11. package/dist/lib/auth-flow.js.map +1 -1
  12. package/dist/lib/colors.js +182 -0
  13. package/dist/lib/colors.js.map +1 -0
  14. package/dist/lib/config.js +30 -17
  15. package/dist/lib/config.js.map +1 -1
  16. package/dist/lib/credentials-backup.js +282 -0
  17. package/dist/lib/credentials-backup.js.map +1 -0
  18. package/dist/lib/identity-banner.js +88 -0
  19. package/dist/lib/identity-banner.js.map +1 -0
  20. package/dist/lib/oidc.js +55 -0
  21. package/dist/lib/oidc.js.map +1 -1
  22. package/dist/lib/package-info.js +76 -0
  23. package/dist/lib/package-info.js.map +1 -0
  24. package/dist/lib/welcome-banner.js +290 -0
  25. package/dist/lib/welcome-banner.js.map +1 -0
  26. package/package.json +1 -1
  27. package/skills/claude-code/ritual/agents/openai.yaml +2 -2
  28. package/skills/claude-code/ritual/manifest.json +57 -0
  29. package/skills/claude-code/ritual/references/build-flow.md +174 -105
  30. package/skills/claude-code/ritual/references/cli-output-contract.md +89 -0
  31. package/skills/claude-code/ritual/references/context-pulse-flow.md +1 -1
  32. package/skills/claude-code/ritual/references/lineage-flow.md +7 -6
  33. package/skills/claude-code/ritual/references/resume-flow.md +4 -4
  34. package/skills/codex/ritual/agents/openai.yaml +2 -2
  35. package/skills/codex/ritual/manifest.json +57 -0
  36. package/skills/codex/ritual/references/build-flow.md +174 -105
  37. package/skills/codex/ritual/references/cli-output-contract.md +89 -0
  38. package/skills/codex/ritual/references/context-pulse-flow.md +1 -1
  39. package/skills/codex/ritual/references/lineage-flow.md +7 -6
  40. package/skills/codex/ritual/references/resume-flow.md +4 -4
  41. package/skills/cursor/ritual/agents/openai.yaml +2 -2
  42. package/skills/cursor/ritual/manifest.json +57 -0
  43. package/skills/cursor/ritual/references/build-flow.md +174 -105
  44. package/skills/cursor/ritual/references/cli-output-contract.md +89 -0
  45. package/skills/cursor/ritual/references/context-pulse-flow.md +1 -1
  46. package/skills/cursor/ritual/references/lineage-flow.md +7 -6
  47. package/skills/cursor/ritual/references/resume-flow.md +4 -4
  48. package/skills/gemini/ritual/agents/openai.yaml +2 -2
  49. package/skills/gemini/ritual/manifest.json +57 -0
  50. package/skills/gemini/ritual/references/build-flow.md +174 -105
  51. package/skills/gemini/ritual/references/cli-output-contract.md +89 -0
  52. package/skills/gemini/ritual/references/context-pulse-flow.md +1 -1
  53. package/skills/gemini/ritual/references/lineage-flow.md +7 -6
  54. package/skills/gemini/ritual/references/resume-flow.md +4 -4
  55. package/skills/kiro/ritual/agents/openai.yaml +2 -2
  56. package/skills/kiro/ritual/manifest.json +57 -0
  57. package/skills/kiro/ritual/references/build-flow.md +174 -105
  58. package/skills/kiro/ritual/references/cli-output-contract.md +89 -0
  59. package/skills/kiro/ritual/references/context-pulse-flow.md +1 -1
  60. package/skills/kiro/ritual/references/lineage-flow.md +7 -6
  61. package/skills/kiro/ritual/references/resume-flow.md +4 -4
  62. package/skills/vscode/ritual/agents/openai.yaml +2 -2
  63. package/skills/vscode/ritual/manifest.json +57 -0
  64. package/skills/vscode/ritual/references/build-flow.md +174 -105
  65. package/skills/vscode/ritual/references/cli-output-contract.md +89 -0
  66. package/skills/vscode/ritual/references/context-pulse-flow.md +1 -1
  67. package/skills/vscode/ritual/references/lineage-flow.md +7 -6
  68. package/skills/vscode/ritual/references/resume-flow.md +4 -4
@@ -1 +1 @@
1
- {"version":3,"file":"logout.js","sourceRoot":"","sources":["../../src/commands/logout.ts"],"names":[],"mappings":";;AAQA,sCAYC;AApBD,0CAAsF;AAEtF;;;;;GAKG;AACI,KAAK,UAAU,aAAa;IAClC,MAAM,GAAG,GAAG,IAAA,wBAAe,GAAE,CAAC;IAC9B,IAAA,yBAAgB,GAAE,CAAC;IACnB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,IAAI,GAAG,EAAE,CAAC;QACT,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,KAAK,IAAI,GAAG,CAAC,IAAI,EAAE,GAAG,IAAI,SAAS,CAAC;QAC9D,OAAO,CAAC,GAAG,CAAC,mBAAmB,OAAO,IAAI,CAAC,CAAC;IAC7C,CAAC;SAAM,CAAC;QACP,OAAO,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC;IACxD,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,uBAAuB,IAAA,2BAAkB,GAAE,EAAE,CAAC,CAAC;IAC3D,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AACjB,CAAC"}
1
+ {"version":3,"file":"logout.js","sourceRoot":"","sources":["../../src/commands/logout.ts"],"names":[],"mappings":";;;;;AA6BA,sCAwDC;AArFD,gDAAwB;AACxB,0CAAsF;AACtF,sCAA6C;AAkB7C;;;;;;;;GAQG;AACI,KAAK,UAAU,aAAa,CAAC,UAAyB,EAAE;IAC9D,MAAM,GAAG,GAAG,IAAA,wBAAe,GAAE,CAAC;IAC9B,MAAM,OAAO,GAAG,GAAG,EAAE,IAAI,EAAE,KAAK,IAAI,GAAG,EAAE,IAAI,EAAE,GAAG,IAAI,SAAS,CAAC;IAEhE,IAAA,yBAAgB,GAAE,CAAC;IAEnB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,IAAI,GAAG,EAAE,CAAC;QACT,OAAO,CAAC,GAAG,CAAC,kCAAkC,OAAO,IAAI,CAAC,CAAC;IAC5D,CAAC;SAAM,CAAC;QACP,OAAO,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC;IAChE,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,uBAAuB,IAAA,2BAAkB,GAAE,EAAE,CAAC,CAAC;IAE3D,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;QACjB,IAAI,CAAC,GAAG,EAAE,CAAC;YACV,qDAAqD;YACrD,6CAA6C;YAC7C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,gEAAgE,CAAC,CAAC;YAC9E,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO;QACR,CAAC;QAED,6DAA6D;QAC7D,8DAA8D;QAC9D,0DAA0D;QAC1D,6DAA6D;QAC7D,4DAA4D;QAC5D,2DAA2D;QAC3D,4DAA4D;QAC5D,MAAM,GAAG,GAAG,IAAA,qBAAc,EAAC;YAC1B,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,QAAQ,EAAE,GAAG,CAAC,QAAQ;YACtB,OAAO,EAAE,GAAG,CAAC,QAAQ,CAAC,QAAQ;SAC9B,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAC;QAC9D,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;QACtD,OAAO,CAAC,GAAG,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;QAC1B,IAAI,CAAC;YACJ,MAAM,IAAA,cAAI,EAAC,GAAG,CAAC,CAAC;QACjB,CAAC;QAAC,MAAM,CAAC;YACR,0DAA0D;QAC3D,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;QACjD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,6EAA6E,CAAC,CAAC;QAC3F,OAAO,CAAC,GAAG,CAAC,oFAAoF,CAAC,CAAC;QAClG,OAAO,CAAC,GAAG,CAAC,iFAAiF,CAAC,CAAC;QAC/F,OAAO,CAAC,GAAG,CAAC,qEAAqE,CAAC,CAAC;IACpF,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AACjB,CAAC"}
package/dist/index.js CHANGED
@@ -1,42 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  "use strict";
3
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
- if (k2 === undefined) k2 = k;
5
- var desc = Object.getOwnPropertyDescriptor(m, k);
6
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
- desc = { enumerable: true, get: function() { return m[k]; } };
8
- }
9
- Object.defineProperty(o, k2, desc);
10
- }) : (function(o, m, k, k2) {
11
- if (k2 === undefined) k2 = k;
12
- o[k2] = m[k];
13
- }));
14
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
15
- Object.defineProperty(o, "default", { enumerable: true, value: v });
16
- }) : function(o, v) {
17
- o["default"] = v;
18
- });
19
- var __importStar = (this && this.__importStar) || (function () {
20
- var ownKeys = function(o) {
21
- ownKeys = Object.getOwnPropertyNames || function (o) {
22
- var ar = [];
23
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
24
- return ar;
25
- };
26
- return ownKeys(o);
27
- };
28
- return function (mod) {
29
- if (mod && mod.__esModule) return mod;
30
- var result = {};
31
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
32
- __setModuleDefault(result, mod);
33
- return result;
34
- };
35
- })();
36
3
  Object.defineProperty(exports, "__esModule", { value: true });
37
4
  const commander_1 = require("commander");
38
- const fs = __importStar(require("node:fs"));
39
- const path = __importStar(require("node:path"));
40
5
  const login_1 = require("./commands/login");
41
6
  const logout_1 = require("./commands/logout");
42
7
  const whoami_1 = require("./commands/whoami");
@@ -44,41 +9,13 @@ const refresh_1 = require("./commands/refresh");
44
9
  const init_1 = require("./commands/init");
45
10
  const doctor_1 = require("./commands/doctor");
46
11
  const graph_1 = require("./commands/graph");
47
- /**
48
- * Read the package version at runtime so `ritual --version` always
49
- * matches the installed package, instead of drifting from a hardcoded
50
- * literal (we hit this from 0.5.0 → 0.7.2: every published version
51
- * still reported `0.5.0`). After build the CLI ships as
52
- * `dist/index.js`, which sits one level below `package.json` — so
53
- * `__dirname/../package.json` resolves correctly both for the
54
- * published package (`dist/`) and for `pnpm dev` (where `tsx` runs
55
- * from `src/`).
56
- */
57
- function readPackageVersion() {
58
- const candidates = [
59
- path.join(__dirname, '..', 'package.json'),
60
- path.join(__dirname, '..', '..', 'package.json'),
61
- ];
62
- for (const candidate of candidates) {
63
- try {
64
- const raw = fs.readFileSync(candidate, 'utf-8');
65
- const parsed = JSON.parse(raw);
66
- if (typeof parsed.version === 'string' && parsed.version.length > 0) {
67
- return parsed.version;
68
- }
69
- }
70
- catch {
71
- // try next candidate
72
- }
73
- }
74
- return '0.0.0-unknown';
75
- }
12
+ const package_info_1 = require("./lib/package-info");
76
13
  const program = new commander_1.Command();
77
14
  program
78
15
  .name('ritual')
79
16
  .description('Ritual CLI — connect AI coding agents to Ritual Cloud. ' +
80
17
  'Scaffold skills, register MCP servers, manage sessions.')
81
- .version(readPackageVersion());
18
+ .version((0, package_info_1.readPackageVersionSafe)());
82
19
  // `init` is the headline command: scaffold + register against every
83
20
  // detected agent. Listed first so `ritual --help` surfaces it.
84
21
  program
@@ -90,6 +27,8 @@ program
90
27
  .option('--client-id <id>', 'OIDC client id (defaults to "ritual-cli")')
91
28
  .option('--dev', '[internal] shortcut for --issuer https://auth.dev.ritualapp.cloud/realms/ritual')
92
29
  .option('--no-workspace', 'Skip the "create a workspace for this repo?" prompt. Useful for CI or when you want to bind a workspace by hand later.')
30
+ .option('--switch-account', 'Force a fresh sign-in even if you already have valid local credentials. Uses OIDC prompt=login so Keycloak ignores its SSO cookie. Atomic — your previous session is restored if anything fails.')
31
+ .option('--yes', 'Skip interactive confirmation prompts (required for --switch-account in non-TTY mode).')
93
32
  .action(init_1.initCommand);
94
33
  program
95
34
  .command('login')
@@ -97,10 +36,13 @@ program
97
36
  .option('--issuer <url>', 'OIDC issuer (defaults to https://auth.ritualapp.cloud/realms/ritual or RITUAL_KEYCLOAK_URL env)')
98
37
  .option('--client-id <id>', 'OIDC client id (defaults to "ritual-cli" or RITUAL_KEYCLOAK_CLIENT_ID env)')
99
38
  .option('--dev', '[internal] shortcut for --issuer https://auth.dev.ritualapp.cloud/realms/ritual')
39
+ .option('--switch-account', 'Force a fresh sign-in even if you already have valid local credentials. Uses OIDC prompt=login so Keycloak ignores its SSO cookie.')
40
+ .option('--yes', 'Skip interactive confirmation prompts (required for --switch-account in non-TTY mode).')
100
41
  .action(login_1.loginCommand);
101
42
  program
102
43
  .command('logout')
103
- .description('Clear local credentials')
44
+ .description('Clear local credentials. With --all, also end the Keycloak browser SSO session.')
45
+ .option('--all', 'Also open the browser to end your Keycloak SSO session (so the next sign-in shows the form instead of auto-re-using your previous account).')
104
46
  .action(logout_1.logoutCommand);
105
47
  program
106
48
  .command('whoami')
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":";;;AAEA,yCAAoC;AACpC,4CAAgD;AAChD,8CAAkD;AAClD,8CAAkD;AAClD,gDAAoD;AACpD,0CAA8C;AAC9C,8CAAkD;AAClD,4CAAsD;AACtD,qDAA4D;AAE5D,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,OAAO;KACL,IAAI,CAAC,QAAQ,CAAC;KACd,WAAW,CACX,yDAAyD;IACxD,yDAAyD,CAC1D;KACA,OAAO,CAAC,IAAA,qCAAsB,GAAE,CAAC,CAAC;AAEpC,oEAAoE;AACpE,+DAA+D;AAC/D,OAAO;KACL,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,kFAAkF,CAAC;KAC/F,MAAM,CAAC,cAAc,EAAE,wDAAwD,CAAC;KAChF,MAAM,CAAC,QAAQ,EAAE,4BAA4B,CAAC;KAC9C,MAAM,CACN,gBAAgB,EAChB,kFAAkF,CAClF;KACA,MAAM,CAAC,kBAAkB,EAAE,2CAA2C,CAAC;KACvE,MAAM,CAAC,OAAO,EAAE,iFAAiF,CAAC;KAClG,MAAM,CACN,gBAAgB,EAChB,wHAAwH,CACxH;KACA,MAAM,CACN,kBAAkB,EAClB,kMAAkM,CAClM;KACA,MAAM,CACN,OAAO,EACP,wFAAwF,CACxF;KACA,MAAM,CAAC,kBAAW,CAAC,CAAC;AAEtB,OAAO;KACL,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,2CAA2C,CAAC;KACxD,MAAM,CACN,gBAAgB,EAChB,iGAAiG,CACjG;KACA,MAAM,CACN,kBAAkB,EAClB,4EAA4E,CAC5E;KACA,MAAM,CAAC,OAAO,EAAE,iFAAiF,CAAC;KAClG,MAAM,CACN,kBAAkB,EAClB,oIAAoI,CACpI;KACA,MAAM,CACN,OAAO,EACP,wFAAwF,CACxF;KACA,MAAM,CAAC,oBAAY,CAAC,CAAC;AAEvB,OAAO;KACL,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,iFAAiF,CAAC;KAC9F,MAAM,CACN,OAAO,EACP,6IAA6I,CAC7I;KACA,MAAM,CAAC,sBAAa,CAAC,CAAC;AAExB,OAAO;KACL,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,6DAA6D,CAAC;KAC1E,MAAM,CAAC,sBAAa,CAAC,CAAC;AAExB,OAAO;KACL,OAAO,CAAC,SAAS,CAAC;KAClB,WAAW,CAAC,sEAAsE,CAAC;KACnF,MAAM,CAAC,wBAAc,CAAC,CAAC;AAEzB,OAAO;KACL,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,2EAA2E,CAAC;KACxF,MAAM,CAAC,sBAAa,CAAC,CAAC;AAExB,iEAAiE;AACjE,+DAA+D;AAC/D,kDAAkD;AAClD,MAAM,KAAK,GAAG,OAAO;KACnB,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,oEAAoE,CAAC,CAAC;AAEpF,KAAK;KACH,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,mEAAmE,CAAC;KAChF,MAAM,CACN,kBAAkB,EAClB,0FAA0F,CAC1F;KACA,MAAM,CAAC,aAAa,EAAE,8DAA8D,CAAC;KACrF,MAAM,CAAC,0BAAkB,CAAC,CAAC;AAE7B,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,GAAU,EAAE,EAAE;IACrD,OAAO,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,OAAO,IAAI,CAAC,CAAC;IACxC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACjB,CAAC,CAAC,CAAC"}
@@ -39,7 +39,7 @@ async function runBrowserLoginAndSave(opts = {}) {
39
39
  const issuer = opts.issuer ?? exports.DEFAULT_ISSUER;
40
40
  const clientId = opts.clientId ?? exports.DEFAULT_CLIENT_ID;
41
41
  const onMessage = opts.onMessage ?? ((msg) => console.log(` ${msg}`));
42
- const tokenSet = await (0, oidc_1.performLoginFlow)({ issuer, clientId, scope: exports.DEFAULT_SCOPE }, (url) => (0, open_1.default)(url), onMessage);
42
+ const tokenSet = await (0, oidc_1.performLoginFlow)({ issuer, clientId, scope: exports.DEFAULT_SCOPE, forceLogin: opts.forceLogin }, (url) => (0, open_1.default)(url), onMessage);
43
43
  const claims = (0, oidc_1.decodeJwtPayloadUnsafe)(tokenSet.access_token);
44
44
  const creds = {
45
45
  version: 1,
@@ -1 +1 @@
1
- {"version":3,"file":"auth-flow.js","sourceRoot":"","sources":["../../src/lib/auth-flow.ts"],"names":[],"mappings":";;;;;;AA8CA,wDAoCC;AAlFD,gDAAwB;AACxB,iCAAkE;AAClE,qCAAgE;AAEhE;;;;;;;;;GASG;AAEU,QAAA,cAAc,GAC1B,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,4CAA4C,CAAC;AACpE,QAAA,iBAAiB,GAAG,OAAO,CAAC,GAAG,CAAC,yBAAyB,IAAI,YAAY,CAAC;AAC1E,QAAA,aAAa,GAAG,+CAA+C,CAAC;AAc7E;;;;;;;;;;;;;GAaG;AACI,KAAK,UAAU,sBAAsB,CAC3C,OAA4B,EAAE;IAE9B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,sBAAc,CAAC;IAC7C,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,yBAAiB,CAAC;IACpD,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,CAAC,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC,CAAC;IAE/E,MAAM,QAAQ,GAAG,MAAM,IAAA,uBAAgB,EACtC,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,qBAAa,EAAE,EAC1C,CAAC,GAAG,EAAE,EAAE,CAAC,IAAA,cAAI,EAAC,GAAG,CAAC,EAClB,SAAS,CACT,CAAC;IAEF,MAAM,MAAM,GAAG,IAAA,6BAAsB,EAIlC,QAAQ,CAAC,YAAY,CAAC,CAAC;IAE1B,MAAM,KAAK,GAAmB;QAC7B,OAAO,EAAE,CAAC;QACV,MAAM;QACN,QAAQ;QACR,QAAQ,EAAE;YACT,YAAY,EAAE,QAAQ,CAAC,YAAY;YACnC,aAAa,EAAE,QAAQ,CAAC,aAAa;YACrC,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,QAAQ,CAAC,UAAU;YAC/D,QAAQ,EAAE,QAAQ,CAAC,QAAQ;YAC3B,KAAK,EAAE,QAAQ,CAAC,KAAK;SACrB;QACD,IAAI,EAAE,MAAM;YACX,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,kBAAkB,EAAE;YACvE,CAAC,CAAC,SAAS;KACZ,CAAC;IACF,IAAA,wBAAe,EAAC,KAAK,CAAC,CAAC;IACvB,OAAO,KAAK,CAAC;AACd,CAAC"}
1
+ {"version":3,"file":"auth-flow.js","sourceRoot":"","sources":["../../src/lib/auth-flow.ts"],"names":[],"mappings":";;;;;;AAqDA,wDAoCC;AAzFD,gDAAwB;AACxB,iCAAkE;AAClE,qCAAgE;AAEhE;;;;;;;;;GASG;AAEU,QAAA,cAAc,GAC1B,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,4CAA4C,CAAC;AACpE,QAAA,iBAAiB,GAAG,OAAO,CAAC,GAAG,CAAC,yBAAyB,IAAI,YAAY,CAAC;AAC1E,QAAA,aAAa,GAAG,+CAA+C,CAAC;AAqB7E;;;;;;;;;;;;;GAaG;AACI,KAAK,UAAU,sBAAsB,CAC3C,OAA4B,EAAE;IAE9B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,sBAAc,CAAC;IAC7C,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,yBAAiB,CAAC;IACpD,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,CAAC,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC,CAAC;IAE/E,MAAM,QAAQ,GAAG,MAAM,IAAA,uBAAgB,EACtC,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,qBAAa,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,EACvE,CAAC,GAAG,EAAE,EAAE,CAAC,IAAA,cAAI,EAAC,GAAG,CAAC,EAClB,SAAS,CACT,CAAC;IAEF,MAAM,MAAM,GAAG,IAAA,6BAAsB,EAIlC,QAAQ,CAAC,YAAY,CAAC,CAAC;IAE1B,MAAM,KAAK,GAAmB;QAC7B,OAAO,EAAE,CAAC;QACV,MAAM;QACN,QAAQ;QACR,QAAQ,EAAE;YACT,YAAY,EAAE,QAAQ,CAAC,YAAY;YACnC,aAAa,EAAE,QAAQ,CAAC,aAAa;YACrC,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,QAAQ,CAAC,UAAU;YAC/D,QAAQ,EAAE,QAAQ,CAAC,QAAQ;YAC3B,KAAK,EAAE,QAAQ,CAAC,KAAK;SACrB;QACD,IAAI,EAAE,MAAM;YACX,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,kBAAkB,EAAE;YACvE,CAAC,CAAC,SAAS;KACZ,CAAC;IACF,IAAA,wBAAe,EAAC,KAAK,CAAC,CAAC;IACvB,OAAO,KAAK,CAAC;AACd,CAAC"}
@@ -0,0 +1,182 @@
1
+ "use strict";
2
+ /**
3
+ * Tiny ANSI color helper. Zero dependencies — we hand-roll the
4
+ * escape codes so the CLI install footprint stays minimal.
5
+ *
6
+ * Capabilities:
7
+ *
8
+ * - **Truecolor (24-bit)** when the terminal advertises it
9
+ * (`COLORTERM=truecolor|24bit`) — used to render Ritual's exact
10
+ * brand teal `#1FAF9F` faithfully.
11
+ * - **256-color (8-bit) fallback** for terminals that only
12
+ * advertise 256 colors — quantized to the nearest 256-color slot
13
+ * so brand identity survives.
14
+ * - **No color at all** when the user has set `NO_COLOR` (see
15
+ * <https://no-color.org/>), is piping output to a non-TTY, or is
16
+ * on a terminal that doesn't claim color support.
17
+ *
18
+ * Detection precedence (highest to lowest):
19
+ *
20
+ * 1. `process.env.NO_COLOR` set → strip all color
21
+ * 2. Not a TTY (`!process.stdout.isTTY`) → strip all color
22
+ * 3. `process.env.FORCE_COLOR=1|2|3` → force on (debug, screenshots)
23
+ * 4. `process.env.COLORTERM=truecolor|24bit` → 24-bit
24
+ * 5. `process.env.TERM` includes `256color` → 8-bit
25
+ * 6. Anything else → 4-bit (16 colors) basic ANSI
26
+ */
27
+ Object.defineProperty(exports, "__esModule", { value: true });
28
+ exports.RITUAL_TEAL = exports.DIM = exports.BOLD = exports.RESET = void 0;
29
+ exports.detectColorMode = detectColorMode;
30
+ exports.fg = fg;
31
+ exports.color = color;
32
+ exports.boldColor = boldColor;
33
+ exports.dim = dim;
34
+ /**
35
+ * Detect the highest color tier we can use on this terminal. Cached
36
+ * after first call since env vars don't change mid-process for
37
+ * practical terminal sessions. Re-exported as a function (not a
38
+ * constant) so tests can `jest.resetModules()` and re-detect.
39
+ */
40
+ function detectColorMode() {
41
+ if (process.env.NO_COLOR !== undefined)
42
+ return 'none';
43
+ if (!process.stdout.isTTY && process.env.FORCE_COLOR === undefined)
44
+ return 'none';
45
+ if (process.env.FORCE_COLOR === '3')
46
+ return 'truecolor';
47
+ const colorterm = (process.env.COLORTERM ?? '').toLowerCase();
48
+ if (colorterm === 'truecolor' || colorterm === '24bit')
49
+ return 'truecolor';
50
+ const term = (process.env.TERM ?? '').toLowerCase();
51
+ if (term.includes('256color'))
52
+ return 'ansi256';
53
+ if (term && term !== 'dumb')
54
+ return 'ansi16';
55
+ return process.env.FORCE_COLOR !== undefined ? 'ansi16' : 'none';
56
+ }
57
+ /** Reset all formatting. */
58
+ exports.RESET = '\x1b[0m';
59
+ /** Bold. */
60
+ exports.BOLD = '\x1b[1m';
61
+ /** Dim. Used for secondary text in the welcome box. */
62
+ exports.DIM = '\x1b[2m';
63
+ /**
64
+ * Build a foreground-color escape sequence for the given RGB triple,
65
+ * downgraded according to the terminal's color tier.
66
+ *
67
+ * - `truecolor` → `\x1b[38;2;R;G;Bm`
68
+ * - `ansi256` → `\x1b[38;5;Nm` (quantized to nearest 256-color slot)
69
+ * - `ansi16` → `\x1b[36m` (nearest base color — for teal/cyan we
70
+ * pick cyan; same for any cool color)
71
+ * - `none` → empty string
72
+ */
73
+ function fg(rgb, mode = detectColorMode()) {
74
+ if (mode === 'none')
75
+ return '';
76
+ if (mode === 'truecolor') {
77
+ return `\x1b[38;2;${rgb[0]};${rgb[1]};${rgb[2]}m`;
78
+ }
79
+ if (mode === 'ansi256') {
80
+ return `\x1b[38;5;${rgbToAnsi256(rgb)}m`;
81
+ }
82
+ // ansi16: pick the closest of the 16 base colors. We classify by
83
+ // hue rather than by Euclidean distance — for brand teal that
84
+ // means "cyan-ish" not "green-ish."
85
+ return `\x1b[${rgbToBase16Fg(rgb)}m`;
86
+ }
87
+ /**
88
+ * Convenience: Ritual brand teal. Pulled from the canonical SVG icon
89
+ * at `apps/cli/assets/...` (`fill="#1FAF9F"`). One place to change
90
+ * if the brand ever shifts.
91
+ */
92
+ exports.RITUAL_TEAL = [0x1f, 0xaf, 0x9f]; // #1FAF9F
93
+ /**
94
+ * Convenience helper to wrap text in foreground color + reset.
95
+ *
96
+ * color(RITUAL_TEAL, 'Hello') → '\x1b[38;2;31;175;159mHello\x1b[0m'
97
+ *
98
+ * Safe when color mode is `none` — returns the text untouched (no
99
+ * empty escape sequences in the output).
100
+ */
101
+ function color(rgb, text) {
102
+ const mode = detectColorMode();
103
+ if (mode === 'none')
104
+ return text;
105
+ return `${fg(rgb, mode)}${text}${exports.RESET}`;
106
+ }
107
+ /**
108
+ * Bold-and-colored variant. Used for the brand wordmark in the
109
+ * welcome box header.
110
+ */
111
+ function boldColor(rgb, text) {
112
+ const mode = detectColorMode();
113
+ if (mode === 'none')
114
+ return text;
115
+ return `${exports.BOLD}${fg(rgb, mode)}${text}${exports.RESET}`;
116
+ }
117
+ /** Wrap text in dim. Used for secondary info inside the welcome box. */
118
+ function dim(text) {
119
+ const mode = detectColorMode();
120
+ if (mode === 'none')
121
+ return text;
122
+ return `${exports.DIM}${text}${exports.RESET}`;
123
+ }
124
+ // ─── internal: color-space conversions ──────────────────────────────────────
125
+ /**
126
+ * Map an RGB triple to its nearest 256-color (xterm 256) slot.
127
+ *
128
+ * The 256-color palette is structured as:
129
+ * - 0–15: the 16 base ANSI colors (varies by terminal theme)
130
+ * - 16–231: a 6×6×6 RGB cube (each channel ∈ {0,95,135,175,215,255})
131
+ * - 232–255: a 24-step grayscale ramp
132
+ *
133
+ * For brand fidelity we map into the 6×6×6 cube — the base 16 are
134
+ * user-themeable and unreliable for "exact" colors.
135
+ */
136
+ function rgbToAnsi256(rgb) {
137
+ const cubeAxis = (c) => {
138
+ // 6×6×6 cube quantization: 0, 95, 135, 175, 215, 255.
139
+ if (c < 48)
140
+ return 0;
141
+ if (c < 115)
142
+ return 1;
143
+ return Math.floor((c - 35) / 40);
144
+ };
145
+ const r = cubeAxis(rgb[0]);
146
+ const g = cubeAxis(rgb[1]);
147
+ const b = cubeAxis(rgb[2]);
148
+ return 16 + 36 * r + 6 * g + b;
149
+ }
150
+ /**
151
+ * Map an RGB triple to the nearest of the 8 standard ANSI foreground
152
+ * codes (30–37). We extend to bright variants (90–97) when the input
153
+ * is bright enough — `#1FAF9F` is mid-saturation cyan so it lands on
154
+ * 36 (cyan) cleanly.
155
+ */
156
+ function rgbToBase16Fg(rgb) {
157
+ const [r, g, b] = rgb;
158
+ const max = Math.max(r, g, b);
159
+ const min = Math.min(r, g, b);
160
+ const bright = max > 170;
161
+ // Grayscale-ish (low saturation): default to white if bright, else neutral.
162
+ if (max - min < 30) {
163
+ return bright ? 97 : 37;
164
+ }
165
+ // Color classification by dominant channel(s):
166
+ // - High green + high blue → cyan
167
+ // - High red + high blue → magenta
168
+ // - High red + high green → yellow
169
+ // - High red → red, high green → green, high blue → blue
170
+ if (g > 80 && b > 80 && g + b > r * 1.5)
171
+ return bright ? 96 : 36; // cyan
172
+ if (r > 80 && b > 80 && r + b > g * 1.5)
173
+ return bright ? 95 : 35; // magenta
174
+ if (r > 80 && g > 80 && r + g > b * 1.5)
175
+ return bright ? 93 : 33; // yellow
176
+ if (r >= g && r >= b)
177
+ return bright ? 91 : 31; // red
178
+ if (g >= r && g >= b)
179
+ return bright ? 92 : 32; // green
180
+ return bright ? 94 : 34; // blue
181
+ }
182
+ //# sourceMappingURL=colors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"colors.js","sourceRoot":"","sources":["../../src/lib/colors.ts"],"names":[],"mappings":"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"}
@@ -10,6 +10,7 @@ const node_fs_1 = require("node:fs");
10
10
  const node_os_1 = require("node:os");
11
11
  const node_path_1 = require("node:path");
12
12
  const oidc_1 = require("./oidc");
13
+ const credentials_backup_1 = require("./credentials-backup");
13
14
  /**
14
15
  * Local credentials store for the Ritual CLI.
15
16
  *
@@ -41,16 +42,32 @@ const oidc_1 = require("./oidc");
41
42
  * CLIs reading an older file run a tiny migration. We're at v1 so this
42
43
  * is theoretical until v2.
43
44
  */
44
- const CONFIG_DIR = (0, node_path_1.join)((0, node_os_1.homedir)(), '.config', 'ritual');
45
- const CREDS_PATH = (0, node_path_1.join)(CONFIG_DIR, 'credentials.json');
45
+ /**
46
+ * Resolve the directory we store CLI state in. Honors XDG by way of
47
+ * `XDG_CONFIG_HOME` — both a standard Linux convention for users who
48
+ * relocate dotfiles AND a clean override seam for tests (Jest
49
+ * snapshots `$HOME` at worker boot on macOS, so a test setting HOME
50
+ * mid-run doesn't change what `os.homedir()` returns).
51
+ *
52
+ * Evaluated lazily on every call so test harnesses can change env vars
53
+ * between sub-tests without resetting the module cache.
54
+ */
55
+ function configDir() {
56
+ const xdg = process.env.XDG_CONFIG_HOME;
57
+ const base = xdg && xdg.length > 0 ? xdg : (0, node_path_1.join)((0, node_os_1.homedir)(), '.config');
58
+ return (0, node_path_1.join)(base, 'ritual');
59
+ }
60
+ function credsPath() {
61
+ return (0, node_path_1.join)(configDir(), 'credentials.json');
62
+ }
46
63
  function getCredentialsPath() {
47
- return CREDS_PATH;
64
+ return credsPath();
48
65
  }
49
66
  function loadCredentials() {
50
- if (!(0, node_fs_1.existsSync)(CREDS_PATH))
67
+ if (!(0, node_fs_1.existsSync)(credsPath()))
51
68
  return null;
52
69
  try {
53
- const raw = (0, node_fs_1.readFileSync)(CREDS_PATH, 'utf-8');
70
+ const raw = (0, node_fs_1.readFileSync)(credsPath(), 'utf-8');
54
71
  const parsed = JSON.parse(raw);
55
72
  if (parsed.version !== 1)
56
73
  return null;
@@ -62,21 +79,17 @@ function loadCredentials() {
62
79
  }
63
80
  }
64
81
  function saveCredentials(creds) {
65
- (0, node_fs_1.mkdirSync)((0, node_path_1.dirname)(CREDS_PATH), { recursive: true });
66
- (0, node_fs_1.writeFileSync)(CREDS_PATH, JSON.stringify(creds, null, 2), 'utf-8');
67
- // chmod 0600 owner read/write only. No-op on Windows but
68
- // harmless. Best-effort; some FS (e.g. on CI) may not honor it.
69
- try {
70
- (0, node_fs_1.chmodSync)(CREDS_PATH, 0o600);
71
- }
72
- catch {
73
- /* ignore */
74
- }
82
+ (0, node_fs_1.mkdirSync)((0, node_path_1.dirname)(credsPath()), { recursive: true });
83
+ // Create-with-mode 0o600 (not chmod-after) eliminates the
84
+ // permission-race window where another process on a shared
85
+ // machine could read the file in the gap between create and
86
+ // chmod. See `writeFileMode0600` in ./credentials-backup.ts.
87
+ (0, credentials_backup_1.writeFileMode0600)(credsPath(), JSON.stringify(creds, null, 2));
75
88
  }
76
89
  function clearCredentials() {
77
- if ((0, node_fs_1.existsSync)(CREDS_PATH)) {
90
+ if ((0, node_fs_1.existsSync)(credsPath())) {
78
91
  try {
79
- (0, node_fs_1.unlinkSync)(CREDS_PATH);
92
+ (0, node_fs_1.unlinkSync)(credsPath());
80
93
  }
81
94
  catch {
82
95
  /* ignore */
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"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"}