@ritualai/cli 0.7.5 → 0.7.7
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/init.js +48 -25
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/logout.js +1 -1
- package/dist/commands/logout.js.map +1 -1
- package/dist/lib/api-client.js +18 -0
- package/dist/lib/api-client.js.map +1 -1
- package/dist/lib/gitignore-update.js +121 -0
- package/dist/lib/gitignore-update.js.map +1 -0
- package/dist/lib/oidc.js +58 -16
- package/dist/lib/oidc.js.map +1 -1
- package/dist/lib/pat-store.js +146 -14
- package/dist/lib/pat-store.js.map +1 -1
- package/package.json +1 -1
- package/skills/claude-code/ritual/manifest.json +57 -0
- package/skills/claude-code/ritual/references/build-flow.md +174 -105
- package/skills/claude-code/ritual/references/cli-output-contract.md +89 -0
- package/skills/claude-code/ritual/references/context-pulse-flow.md +1 -1
- package/skills/claude-code/ritual/references/lineage-flow.md +7 -6
- package/skills/claude-code/ritual/references/resume-flow.md +4 -4
- package/skills/codex/ritual/manifest.json +57 -0
- package/skills/codex/ritual/references/build-flow.md +174 -105
- package/skills/codex/ritual/references/cli-output-contract.md +89 -0
- package/skills/codex/ritual/references/context-pulse-flow.md +1 -1
- package/skills/codex/ritual/references/lineage-flow.md +7 -6
- package/skills/codex/ritual/references/resume-flow.md +4 -4
- package/skills/cursor/ritual/manifest.json +57 -0
- package/skills/cursor/ritual/references/build-flow.md +174 -105
- package/skills/cursor/ritual/references/cli-output-contract.md +89 -0
- package/skills/cursor/ritual/references/context-pulse-flow.md +1 -1
- package/skills/cursor/ritual/references/lineage-flow.md +7 -6
- package/skills/cursor/ritual/references/resume-flow.md +4 -4
- package/skills/gemini/ritual/manifest.json +57 -0
- package/skills/gemini/ritual/references/build-flow.md +174 -105
- package/skills/gemini/ritual/references/cli-output-contract.md +89 -0
- package/skills/gemini/ritual/references/context-pulse-flow.md +1 -1
- package/skills/gemini/ritual/references/lineage-flow.md +7 -6
- package/skills/gemini/ritual/references/resume-flow.md +4 -4
- package/skills/kiro/ritual/manifest.json +57 -0
- package/skills/kiro/ritual/references/build-flow.md +174 -105
- package/skills/kiro/ritual/references/cli-output-contract.md +89 -0
- package/skills/kiro/ritual/references/context-pulse-flow.md +1 -1
- package/skills/kiro/ritual/references/lineage-flow.md +7 -6
- package/skills/kiro/ritual/references/resume-flow.md +4 -4
- package/skills/vscode/ritual/manifest.json +57 -0
- package/skills/vscode/ritual/references/build-flow.md +174 -105
- package/skills/vscode/ritual/references/cli-output-contract.md +89 -0
- package/skills/vscode/ritual/references/context-pulse-flow.md +1 -1
- package/skills/vscode/ritual/references/lineage-flow.md +7 -6
- package/skills/vscode/ritual/references/resume-flow.md +4 -4
package/dist/lib/pat-store.js
CHANGED
|
@@ -4,32 +4,164 @@ exports.mintAgentPat = mintAgentPat;
|
|
|
4
4
|
exports.defaultAgentTokenName = defaultAgentTokenName;
|
|
5
5
|
const node_os_1 = require("node:os");
|
|
6
6
|
const api_client_1 = require("./api-client");
|
|
7
|
+
const prompt_1 = require("./prompt");
|
|
8
|
+
const DEFAULT_WEB_APP_URL = 'https://app.ritualapp.cloud';
|
|
7
9
|
async function mintAgentPat(opts) {
|
|
8
10
|
const name = opts.nameOverride ?? defaultAgentTokenName();
|
|
9
|
-
|
|
11
|
+
const webAppUrl = opts.webAppUrl ?? DEFAULT_WEB_APP_URL;
|
|
12
|
+
return mintWithCapRecovery(opts, name, webAppUrl);
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Attempt to mint a PAT. On 409 (active-token cap reached — currently
|
|
16
|
+
* 10 per user, enforced in apps/api/src/modules/auth/tokens/pat.service.ts),
|
|
17
|
+
* try to recover automatically:
|
|
18
|
+
*
|
|
19
|
+
* 1. GET /auth/tokens to see what's outstanding.
|
|
20
|
+
* 2. Find existing tokens named for THIS hostname (very likely
|
|
21
|
+
* stale entries from prior `ritual init` runs on this machine).
|
|
22
|
+
* 3. If we find at least one, ask the user once whether we can
|
|
23
|
+
* revoke the oldest such token to free a slot.
|
|
24
|
+
* 4. On Y: revoke, then retry the mint exactly once.
|
|
25
|
+
* 5. On N (or no same-hostname tokens to revoke, or we already
|
|
26
|
+
* retried): re-raise with the corrected /u/tokens URL so the
|
|
27
|
+
* user can clean up manually.
|
|
28
|
+
*
|
|
29
|
+
* Why "same hostname only" rather than the absolute oldest:
|
|
30
|
+
* Tokens for OTHER devices (`Ritual CLI — work-laptop`) should
|
|
31
|
+
* never get auto-revoked by `ritual init` running on a different
|
|
32
|
+
* machine — that would break the user's other agents silently. We
|
|
33
|
+
* only ever rotate THIS machine's own historical tokens.
|
|
34
|
+
*
|
|
35
|
+
* The `retrying` flag prevents an infinite loop if revoke succeeds
|
|
36
|
+
* but a different concurrent caller mints another token before our
|
|
37
|
+
* retry. Single retry is enough; if it fails again, fall back to
|
|
38
|
+
* the manual-cleanup error.
|
|
39
|
+
*/
|
|
40
|
+
async function mintWithCapRecovery(opts, name, webAppUrl, retrying = false) {
|
|
10
41
|
try {
|
|
11
|
-
response = await opts.api.post('/auth/tokens', {
|
|
42
|
+
const response = await opts.api.post('/auth/tokens', {
|
|
12
43
|
name,
|
|
13
44
|
scopes: opts.scopes ?? ['admin'],
|
|
14
45
|
// undefined → service-layer default; null → no expiry.
|
|
15
46
|
expiresInDays: opts.expiresInDays ?? 365,
|
|
16
47
|
});
|
|
48
|
+
return {
|
|
49
|
+
plaintextToken: response.plaintextToken,
|
|
50
|
+
id: response.id,
|
|
51
|
+
name: response.name,
|
|
52
|
+
expiresAt: response.expiresAt,
|
|
53
|
+
};
|
|
17
54
|
}
|
|
18
55
|
catch (err) {
|
|
19
|
-
if (err instanceof api_client_1.ApiError
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
56
|
+
if (!(err instanceof api_client_1.ApiError) || err.status !== 409)
|
|
57
|
+
throw err;
|
|
58
|
+
if (retrying) {
|
|
59
|
+
// Second-time hit on the cap means a concurrent caller is
|
|
60
|
+
// also minting; fall back to manual cleanup rather than
|
|
61
|
+
// looping. Rare; safe.
|
|
62
|
+
throw manualCleanupError(webAppUrl);
|
|
63
|
+
}
|
|
64
|
+
// Try to revoke an old token from THIS machine. Quiet about
|
|
65
|
+
// what we'd do unless we can actually do it (no false promises).
|
|
66
|
+
const candidate = await findOldestRevocableForThisHost(opts.api, name);
|
|
67
|
+
if (!candidate) {
|
|
68
|
+
// All 10 slots are taken by tokens NOT named for this
|
|
69
|
+
// machine — we won't touch them. User has to choose.
|
|
70
|
+
throw manualCleanupError(webAppUrl);
|
|
71
|
+
}
|
|
72
|
+
const accepted = await askToRevoke(candidate);
|
|
73
|
+
if (!accepted)
|
|
74
|
+
throw manualCleanupError(webAppUrl);
|
|
75
|
+
// Defensive: if DELETE fails (network blip, token already
|
|
76
|
+
// revoked by another caller, 5xx), fall back to the manual-
|
|
77
|
+
// cleanup error rather than surfacing a less-helpful ApiError.
|
|
78
|
+
// Behavior is identical to pre-0.7.7 (which couldn't auto-
|
|
79
|
+
// rotate at all) — we just don't make things worse on this
|
|
80
|
+
// edge.
|
|
81
|
+
try {
|
|
82
|
+
await opts.api.delete(`/auth/tokens/${candidate.id}`);
|
|
24
83
|
}
|
|
25
|
-
|
|
84
|
+
catch {
|
|
85
|
+
throw manualCleanupError(webAppUrl);
|
|
86
|
+
}
|
|
87
|
+
console.error(` ✓ Revoked old token "${candidate.name}" (last used ${formatRelative(candidate.lastUsedAt)})`);
|
|
88
|
+
return mintWithCapRecovery(opts, name, webAppUrl, /* retrying */ true);
|
|
26
89
|
}
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Fetch the user's active tokens, filter to ones named for the
|
|
93
|
+
* current host's `defaultAgentTokenName()` shape, and return the
|
|
94
|
+
* oldest. Returns `undefined` when there's nothing safely revocable
|
|
95
|
+
* (any of: GET fails, the response is empty, or no token matches
|
|
96
|
+
* this machine's name).
|
|
97
|
+
*/
|
|
98
|
+
async function findOldestRevocableForThisHost(api, currentName) {
|
|
99
|
+
let list;
|
|
100
|
+
try {
|
|
101
|
+
list = await api.get('/auth/tokens');
|
|
102
|
+
}
|
|
103
|
+
catch {
|
|
104
|
+
// If we can't list, don't try to be clever — let the caller
|
|
105
|
+
// fall back to the manual-cleanup error.
|
|
106
|
+
return undefined;
|
|
107
|
+
}
|
|
108
|
+
const candidates = list.tokens.filter((t) => !t.revokedAt && t.name === currentName);
|
|
109
|
+
if (candidates.length === 0)
|
|
110
|
+
return undefined;
|
|
111
|
+
// Oldest first (createdAt ascending). The server returns
|
|
112
|
+
// createdAt descending; we just re-sort to be explicit.
|
|
113
|
+
candidates.sort((a, b) => a.createdAt.localeCompare(b.createdAt));
|
|
114
|
+
return candidates[0];
|
|
115
|
+
}
|
|
116
|
+
async function askToRevoke(candidate) {
|
|
117
|
+
// CI / piped stdin / non-TTY → don't try to prompt. User has to
|
|
118
|
+
// clean up manually; we surface the same actionable error.
|
|
119
|
+
if (!process.stdin.isTTY)
|
|
120
|
+
return false;
|
|
121
|
+
const created = formatRelative(candidate.createdAt);
|
|
122
|
+
const lastUsed = candidate.lastUsedAt
|
|
123
|
+
? formatRelative(candidate.lastUsedAt)
|
|
124
|
+
: 'never used';
|
|
125
|
+
const answer = (await (0, prompt_1.prompt)(`\n Access-token cap reached (10 active tokens). An older token from this machine\n` +
|
|
126
|
+
` is available to rotate:\n` +
|
|
127
|
+
` "${candidate.name}" · created ${created} · ${lastUsed}\n` +
|
|
128
|
+
` Revoke it and continue? [Y/n]: `))
|
|
129
|
+
.trim()
|
|
130
|
+
.toLowerCase();
|
|
131
|
+
// Default-yes (empty input or 'y' / 'yes'). Anything else = no.
|
|
132
|
+
return answer === '' || answer === 'y' || answer === 'yes';
|
|
133
|
+
}
|
|
134
|
+
function manualCleanupError(webAppUrl) {
|
|
135
|
+
return new Error(`Personal access token limit reached. Revoke an old token at ${webAppUrl}/u/tokens ` +
|
|
136
|
+
'and re-run `ritual init`.');
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Format an ISO 8601 timestamp as "N days ago" / "N hours ago" /
|
|
140
|
+
* "just now". Kept tiny — no dep on date-fns / dayjs.
|
|
141
|
+
*/
|
|
142
|
+
function formatRelative(iso) {
|
|
143
|
+
if (!iso)
|
|
144
|
+
return 'unknown';
|
|
145
|
+
const then = Date.parse(iso);
|
|
146
|
+
if (Number.isNaN(then))
|
|
147
|
+
return iso;
|
|
148
|
+
const diffMs = Date.now() - then;
|
|
149
|
+
const minutes = Math.floor(diffMs / 60_000);
|
|
150
|
+
if (minutes < 1)
|
|
151
|
+
return 'just now';
|
|
152
|
+
if (minutes < 60)
|
|
153
|
+
return `${minutes}m ago`;
|
|
154
|
+
const hours = Math.floor(minutes / 60);
|
|
155
|
+
if (hours < 24)
|
|
156
|
+
return `${hours}h ago`;
|
|
157
|
+
const days = Math.floor(hours / 24);
|
|
158
|
+
if (days < 30)
|
|
159
|
+
return `${days}d ago`;
|
|
160
|
+
const months = Math.floor(days / 30);
|
|
161
|
+
if (months < 12)
|
|
162
|
+
return `${months}mo ago`;
|
|
163
|
+
const years = Math.floor(days / 365);
|
|
164
|
+
return `${years}y ago`;
|
|
33
165
|
}
|
|
34
166
|
/**
|
|
35
167
|
* `Ritual CLI — <hostname>`, truncated to fit the API's 80-char limit
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pat-store.js","sourceRoot":"","sources":["../../src/lib/pat-store.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"pat-store.js","sourceRoot":"","sources":["../../src/lib/pat-store.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.7.
|
|
3
|
+
"version": "0.7.7",
|
|
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",
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
[
|
|
2
|
+
{
|
|
3
|
+
"path": "DESIGN.md",
|
|
4
|
+
"lines": 36,
|
|
5
|
+
"bytes": 2226
|
|
6
|
+
},
|
|
7
|
+
{
|
|
8
|
+
"path": "SKILL.md",
|
|
9
|
+
"lines": 72,
|
|
10
|
+
"bytes": 5915
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
"path": "agents/openai.yaml",
|
|
14
|
+
"lines": 6,
|
|
15
|
+
"bytes": 213
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"path": "references/async-polling.md",
|
|
19
|
+
"lines": 27,
|
|
20
|
+
"bytes": 1197
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
"path": "references/build-flow.md",
|
|
24
|
+
"lines": 1519,
|
|
25
|
+
"bytes": 88142
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
"path": "references/cli-output-contract.md",
|
|
29
|
+
"lines": 225,
|
|
30
|
+
"bytes": 11559
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
"path": "references/context-pulse-flow.md",
|
|
34
|
+
"lines": 357,
|
|
35
|
+
"bytes": 25358
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
"path": "references/discovery-classification.md",
|
|
39
|
+
"lines": 176,
|
|
40
|
+
"bytes": 10275
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
"path": "references/lineage-flow.md",
|
|
44
|
+
"lines": 154,
|
|
45
|
+
"bytes": 8774
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
"path": "references/resume-flow.md",
|
|
49
|
+
"lines": 157,
|
|
50
|
+
"bytes": 9950
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
"path": "references/scoring-fallback.md",
|
|
54
|
+
"lines": 126,
|
|
55
|
+
"bytes": 6494
|
|
56
|
+
}
|
|
57
|
+
]
|