@su-record/vibe 3.2.60 → 3.2.62
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/.claude-plugin/plugin.json +1 -1
- package/.codex-plugin/plugin.json +1 -1
- package/CLAUDE.md +12 -4
- package/README.en.md +1 -1
- package/README.md +1 -1
- package/dist/cli/commands/codex-proxy.d.ts.map +1 -1
- package/dist/cli/commands/codex-proxy.js +8 -7
- package/dist/cli/commands/codex-proxy.js.map +1 -1
- package/dist/cli/commands/config.d.ts.map +1 -1
- package/dist/cli/commands/config.js +19 -18
- package/dist/cli/commands/config.js.map +1 -1
- package/dist/cli/commands/evolution.d.ts.map +1 -1
- package/dist/cli/commands/evolution.js +35 -34
- package/dist/cli/commands/evolution.js.map +1 -1
- package/dist/cli/commands/figma.d.ts.map +1 -1
- package/dist/cli/commands/figma.js +21 -20
- package/dist/cli/commands/figma.js.map +1 -1
- package/dist/cli/commands/info.js +4 -4
- package/dist/cli/commands/info.js.map +1 -1
- package/dist/cli/commands/llm.d.ts.map +1 -1
- package/dist/cli/commands/llm.js +11 -10
- package/dist/cli/commands/llm.js.map +1 -1
- package/dist/cli/commands/remove.js +13 -13
- package/dist/cli/commands/remove.js.map +1 -1
- package/dist/cli/commands/sentinel.d.ts +10 -1
- package/dist/cli/commands/sentinel.d.ts.map +1 -1
- package/dist/cli/commands/sentinel.js +51 -49
- package/dist/cli/commands/sentinel.js.map +1 -1
- package/dist/cli/commands/skills.js +3 -3
- package/dist/cli/commands/skills.js.map +1 -1
- package/dist/cli/commands/slack.d.ts.map +1 -1
- package/dist/cli/commands/slack.js +16 -15
- package/dist/cli/commands/slack.js.map +1 -1
- package/dist/cli/commands/stats.d.ts.map +1 -1
- package/dist/cli/commands/stats.js +30 -29
- package/dist/cli/commands/stats.js.map +1 -1
- package/dist/cli/commands/telegram.d.ts.map +1 -1
- package/dist/cli/commands/telegram.js +26 -25
- package/dist/cli/commands/telegram.js.map +1 -1
- package/dist/cli/postinstall/main.d.ts +11 -0
- package/dist/cli/postinstall/main.d.ts.map +1 -1
- package/dist/cli/postinstall/main.js +29 -0
- package/dist/cli/postinstall/main.js.map +1 -1
- package/dist/infra/lib/browser/launch.d.ts.map +1 -1
- package/dist/infra/lib/browser/launch.js +0 -1
- package/dist/infra/lib/browser/launch.js.map +1 -1
- package/dist/tools/docs/agentsMd.d.ts +45 -0
- package/dist/tools/docs/agentsMd.d.ts.map +1 -0
- package/dist/tools/docs/agentsMd.js +51 -0
- package/dist/tools/docs/agentsMd.js.map +1 -0
- package/dist/tools/docs/cacheSurface.d.ts +37 -0
- package/dist/tools/docs/cacheSurface.d.ts.map +1 -0
- package/dist/tools/docs/cacheSurface.js +98 -0
- package/dist/tools/docs/cacheSurface.js.map +1 -0
- package/dist/tools/memory/getMemoryGraph.d.ts.map +1 -1
- package/dist/tools/memory/getMemoryGraph.js.map +1 -1
- package/dist/tools/spec/index.d.ts +2 -0
- package/dist/tools/spec/index.d.ts.map +1 -1
- package/dist/tools/spec/index.js +2 -0
- package/dist/tools/spec/index.js.map +1 -1
- package/dist/tools/spec/specGenerator.js +3 -5
- package/dist/tools/spec/specGenerator.js.map +1 -1
- package/dist/tools/spec/specLifecycle.d.ts +40 -0
- package/dist/tools/spec/specLifecycle.d.ts.map +1 -0
- package/dist/tools/spec/specLifecycle.js +147 -0
- package/dist/tools/spec/specLifecycle.js.map +1 -0
- package/dist/tools/spec/validateSpecDocument.d.ts.map +1 -1
- package/dist/tools/spec/validateSpecDocument.js +13 -0
- package/dist/tools/spec/validateSpecDocument.js.map +1 -1
- package/hooks/scripts/figma-extract.js +6 -2
- package/hooks/scripts/figma-to-scss.js +10 -3
- package/hooks/scripts/llm-orchestrate.js +2 -2
- package/hooks/scripts/session-start.js +30 -23
- package/hooks/scripts/utils.js +4 -5
- package/package.json +19 -9
- package/skills/vibe.docs/references/agent.md +4 -0
- package/vibe/rules/prefix-cache-surface.md +98 -0
- package/vibe/templates/spec-template.md +16 -1
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import { join } from 'path';
|
|
6
6
|
import { existsSync } from 'fs';
|
|
7
|
+
import { log } from '../utils.js';
|
|
7
8
|
// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
8
9
|
// Helpers
|
|
9
10
|
// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
@@ -34,7 +35,7 @@ function tryLoadStorage() {
|
|
|
34
35
|
export function sentinelStatus() {
|
|
35
36
|
const storage = tryLoadStorage();
|
|
36
37
|
if (!storage) {
|
|
37
|
-
|
|
38
|
+
log('Sentinel: No database found. Run a session first.');
|
|
38
39
|
return;
|
|
39
40
|
}
|
|
40
41
|
const db = storage.getDatabase();
|
|
@@ -65,7 +66,7 @@ export function sentinelStatus() {
|
|
|
65
66
|
catch {
|
|
66
67
|
// Table may not exist
|
|
67
68
|
}
|
|
68
|
-
|
|
69
|
+
log(`
|
|
69
70
|
Security Sentinel Status
|
|
70
71
|
========================
|
|
71
72
|
Policies: ${policyCount} active
|
|
@@ -78,10 +79,11 @@ Security Sentinel Status
|
|
|
78
79
|
Blocked: ${blockedActions}
|
|
79
80
|
`);
|
|
80
81
|
}
|
|
81
|
-
export function sentinelAudit(
|
|
82
|
+
export function sentinelAudit(options = {}) {
|
|
83
|
+
const { type, risk, days, deadLetter, retryId, discardId } = options;
|
|
82
84
|
const storage = tryLoadStorage();
|
|
83
85
|
if (!storage) {
|
|
84
|
-
|
|
86
|
+
log('No audit data found.');
|
|
85
87
|
return;
|
|
86
88
|
}
|
|
87
89
|
const db = storage.getDatabase();
|
|
@@ -89,36 +91,36 @@ export function sentinelAudit(type, risk, days, deadLetter, retryId, discardId)
|
|
|
89
91
|
try {
|
|
90
92
|
const rows = db.prepare('SELECT * FROM dead_letter_events ORDER BY failedAt DESC LIMIT 50').all();
|
|
91
93
|
if (rows.length === 0) {
|
|
92
|
-
|
|
94
|
+
log('No dead letter events.');
|
|
93
95
|
return;
|
|
94
96
|
}
|
|
95
|
-
|
|
97
|
+
log(`Dead Letter Events (${rows.length}):`);
|
|
96
98
|
for (const row of rows) {
|
|
97
|
-
|
|
99
|
+
log(` [${row.id}] ${row.eventType} — retries: ${row.retryCount}, failed: ${row.failedAt}`);
|
|
98
100
|
}
|
|
99
101
|
}
|
|
100
102
|
catch {
|
|
101
|
-
|
|
103
|
+
log('Dead letter table not found.');
|
|
102
104
|
}
|
|
103
105
|
return;
|
|
104
106
|
}
|
|
105
107
|
if (retryId) {
|
|
106
108
|
try {
|
|
107
109
|
db.prepare("UPDATE event_outbox SET status = 'pending', retryCount = 0 WHERE id = ?").run(retryId);
|
|
108
|
-
|
|
110
|
+
log(`Event ${retryId} re-queued for retry.`);
|
|
109
111
|
}
|
|
110
112
|
catch (err) {
|
|
111
|
-
|
|
113
|
+
log(`Failed to retry: ${err.message}`);
|
|
112
114
|
}
|
|
113
115
|
return;
|
|
114
116
|
}
|
|
115
117
|
if (discardId) {
|
|
116
118
|
try {
|
|
117
119
|
db.prepare('DELETE FROM dead_letter_events WHERE id = ?').run(discardId);
|
|
118
|
-
|
|
120
|
+
log(`Dead letter event ${discardId} discarded.`);
|
|
119
121
|
}
|
|
120
122
|
catch (err) {
|
|
121
|
-
|
|
123
|
+
log(`Failed to discard: ${err.message}`);
|
|
122
124
|
}
|
|
123
125
|
return;
|
|
124
126
|
}
|
|
@@ -138,149 +140,149 @@ export function sentinelAudit(type, risk, days, deadLetter, retryId, discardId)
|
|
|
138
140
|
try {
|
|
139
141
|
const rows = db.prepare(query).all(...params);
|
|
140
142
|
if (rows.length === 0) {
|
|
141
|
-
|
|
143
|
+
log('No audit events found.');
|
|
142
144
|
return;
|
|
143
145
|
}
|
|
144
|
-
|
|
146
|
+
log(`Audit Events (${rows.length}):`);
|
|
145
147
|
for (const row of rows) {
|
|
146
148
|
const risk = row.riskLevel ?? '-';
|
|
147
149
|
const outcome = row.outcome ?? '-';
|
|
148
|
-
|
|
150
|
+
log(` [${row.id}] ${row.eventType} | risk=${risk} | outcome=${outcome} | ${row.createdAt}`);
|
|
149
151
|
}
|
|
150
152
|
}
|
|
151
153
|
catch (err) {
|
|
152
|
-
|
|
154
|
+
log(`Query failed: ${err.message}`);
|
|
153
155
|
}
|
|
154
156
|
}
|
|
155
157
|
export function sentinelApprove(id) {
|
|
156
158
|
if (!id) {
|
|
157
|
-
|
|
159
|
+
log('Usage: vibe sentinel approve <confirmation-id>');
|
|
158
160
|
return;
|
|
159
161
|
}
|
|
160
162
|
const storage = tryLoadStorage();
|
|
161
163
|
if (!storage) {
|
|
162
|
-
|
|
164
|
+
log('No database found.');
|
|
163
165
|
return;
|
|
164
166
|
}
|
|
165
167
|
const db = storage.getDatabase();
|
|
166
168
|
try {
|
|
167
169
|
const row = db.prepare('SELECT * FROM confirmations WHERE id = ?').get(id);
|
|
168
170
|
if (!row) {
|
|
169
|
-
|
|
171
|
+
log(`Confirmation ${id} not found.`);
|
|
170
172
|
return;
|
|
171
173
|
}
|
|
172
174
|
if (row.status !== 'pending') {
|
|
173
|
-
|
|
175
|
+
log(`Confirmation ${id} is already ${row.status}.`);
|
|
174
176
|
return;
|
|
175
177
|
}
|
|
176
178
|
db.prepare("UPDATE confirmations SET status = 'approved', ownerResponse = 'CLI approval', resolvedAt = ? WHERE id = ?").run(new Date().toISOString(), id);
|
|
177
|
-
|
|
179
|
+
log(`Confirmation ${id} approved.`);
|
|
178
180
|
}
|
|
179
181
|
catch (err) {
|
|
180
|
-
|
|
182
|
+
log(`Failed: ${err.message}`);
|
|
181
183
|
}
|
|
182
184
|
}
|
|
183
185
|
export function sentinelReject(id) {
|
|
184
186
|
if (!id) {
|
|
185
|
-
|
|
187
|
+
log('Usage: vibe sentinel reject <confirmation-id>');
|
|
186
188
|
return;
|
|
187
189
|
}
|
|
188
190
|
const storage = tryLoadStorage();
|
|
189
191
|
if (!storage) {
|
|
190
|
-
|
|
192
|
+
log('No database found.');
|
|
191
193
|
return;
|
|
192
194
|
}
|
|
193
195
|
const db = storage.getDatabase();
|
|
194
196
|
try {
|
|
195
197
|
const row = db.prepare('SELECT * FROM confirmations WHERE id = ?').get(id);
|
|
196
198
|
if (!row) {
|
|
197
|
-
|
|
199
|
+
log(`Confirmation ${id} not found.`);
|
|
198
200
|
return;
|
|
199
201
|
}
|
|
200
202
|
if (row.status !== 'pending') {
|
|
201
|
-
|
|
203
|
+
log(`Confirmation ${id} is already ${row.status}.`);
|
|
202
204
|
return;
|
|
203
205
|
}
|
|
204
206
|
db.prepare("UPDATE confirmations SET status = 'rejected', ownerResponse = 'CLI rejection', resolvedAt = ? WHERE id = ?").run(new Date().toISOString(), id);
|
|
205
|
-
|
|
207
|
+
log(`Confirmation ${id} rejected.`);
|
|
206
208
|
}
|
|
207
209
|
catch (err) {
|
|
208
|
-
|
|
210
|
+
log(`Failed: ${err.message}`);
|
|
209
211
|
}
|
|
210
212
|
}
|
|
211
213
|
export function sentinelPolicyList() {
|
|
212
214
|
const storage = tryLoadStorage();
|
|
213
215
|
if (!storage) {
|
|
214
|
-
|
|
216
|
+
log('No policies found.');
|
|
215
217
|
return;
|
|
216
218
|
}
|
|
217
219
|
const db = storage.getDatabase();
|
|
218
220
|
try {
|
|
219
221
|
const rows = db.prepare('SELECT name, description, action, priority, enabled FROM policies ORDER BY priority DESC').all();
|
|
220
222
|
if (rows.length === 0) {
|
|
221
|
-
|
|
223
|
+
log('No policies configured.');
|
|
222
224
|
return;
|
|
223
225
|
}
|
|
224
|
-
|
|
226
|
+
log('Sentinel Policies:');
|
|
225
227
|
for (const row of rows) {
|
|
226
228
|
const status = row.enabled ? 'ON' : 'OFF';
|
|
227
|
-
|
|
229
|
+
log(` [${status}] ${row.name} (priority: ${row.priority}, action: ${row.action})`);
|
|
228
230
|
if (row.description)
|
|
229
|
-
|
|
231
|
+
log(` ${row.description}`);
|
|
230
232
|
}
|
|
231
233
|
}
|
|
232
234
|
catch (err) {
|
|
233
|
-
|
|
235
|
+
log(`Failed: ${err.message}`);
|
|
234
236
|
}
|
|
235
237
|
}
|
|
236
238
|
export function sentinelPolicyToggle(name, enable) {
|
|
237
239
|
if (!name) {
|
|
238
|
-
|
|
240
|
+
log(`Usage: vibe sentinel policy ${enable ? 'enable' : 'disable'} <policy-name>`);
|
|
239
241
|
return;
|
|
240
242
|
}
|
|
241
243
|
const storage = tryLoadStorage();
|
|
242
244
|
if (!storage) {
|
|
243
|
-
|
|
245
|
+
log('No database found.');
|
|
244
246
|
return;
|
|
245
247
|
}
|
|
246
248
|
const db = storage.getDatabase();
|
|
247
249
|
try {
|
|
248
250
|
const result = db.prepare('UPDATE policies SET enabled = ?, updatedAt = ? WHERE name = ?').run(enable ? 1 : 0, new Date().toISOString(), name);
|
|
249
251
|
if (result.changes === 0) {
|
|
250
|
-
|
|
252
|
+
log(`Policy '${name}' not found.`);
|
|
251
253
|
}
|
|
252
254
|
else {
|
|
253
|
-
|
|
255
|
+
log(`Policy '${name}' ${enable ? 'enabled' : 'disabled'}.`);
|
|
254
256
|
}
|
|
255
257
|
}
|
|
256
258
|
catch (err) {
|
|
257
|
-
|
|
259
|
+
log(`Failed: ${err.message}`);
|
|
258
260
|
}
|
|
259
261
|
}
|
|
260
262
|
export function sentinelSuggestions(action, id) {
|
|
261
263
|
const storage = tryLoadStorage();
|
|
262
264
|
if (!storage) {
|
|
263
|
-
|
|
265
|
+
log('No suggestions found.');
|
|
264
266
|
return;
|
|
265
267
|
}
|
|
266
268
|
const db = storage.getDatabase();
|
|
267
269
|
if (action === 'accept' && id) {
|
|
268
270
|
try {
|
|
269
271
|
db.prepare("UPDATE suggestions SET status = 'accepted', resolvedAt = ? WHERE id = ?").run(new Date().toISOString(), id);
|
|
270
|
-
|
|
272
|
+
log(`Suggestion ${id} accepted.`);
|
|
271
273
|
}
|
|
272
274
|
catch (err) {
|
|
273
|
-
|
|
275
|
+
log(`Failed: ${err.message}`);
|
|
274
276
|
}
|
|
275
277
|
return;
|
|
276
278
|
}
|
|
277
279
|
if (action === 'dismiss' && id) {
|
|
278
280
|
try {
|
|
279
281
|
db.prepare("UPDATE suggestions SET status = 'dismissed', resolvedAt = ? WHERE id = ?").run(new Date().toISOString(), id);
|
|
280
|
-
|
|
282
|
+
log(`Suggestion ${id} dismissed.`);
|
|
281
283
|
}
|
|
282
284
|
catch (err) {
|
|
283
|
-
|
|
285
|
+
log(`Failed: ${err.message}`);
|
|
284
286
|
}
|
|
285
287
|
return;
|
|
286
288
|
}
|
|
@@ -288,20 +290,20 @@ export function sentinelSuggestions(action, id) {
|
|
|
288
290
|
try {
|
|
289
291
|
const rows = db.prepare("SELECT id, type, title, priority, riskLevel FROM suggestions WHERE status = 'pending' ORDER BY priority ASC LIMIT 20").all();
|
|
290
292
|
if (rows.length === 0) {
|
|
291
|
-
|
|
293
|
+
log('No pending suggestions.');
|
|
292
294
|
return;
|
|
293
295
|
}
|
|
294
|
-
|
|
296
|
+
log(`Pending Suggestions (${rows.length}):`);
|
|
295
297
|
for (const row of rows) {
|
|
296
|
-
|
|
298
|
+
log(` [P${row.priority}] ${row.type}: ${row.title} (risk: ${row.riskLevel}) — id: ${row.id}`);
|
|
297
299
|
}
|
|
298
300
|
}
|
|
299
301
|
catch (err) {
|
|
300
|
-
|
|
302
|
+
log(`Failed: ${err.message}`);
|
|
301
303
|
}
|
|
302
304
|
}
|
|
303
305
|
export function sentinelHelp() {
|
|
304
|
-
|
|
306
|
+
log(`
|
|
305
307
|
Sentinel Commands:
|
|
306
308
|
vibe sentinel status Show sentinel status
|
|
307
309
|
vibe sentinel audit [--type X] [--risk Y] [--days N]
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sentinel.js","sourceRoot":"","sources":["../../../src/cli/commands/sentinel.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAW,IAAI,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,UAAU,EAAgB,MAAM,IAAI,CAAC;AAE9C,yDAAyD;AACzD,UAAU;AACV,yDAAyD;AAEzD,SAAS,cAAc;IACrB,OAAO,OAAO,CAAC,GAAG,EAAE,CAAC;AACvB,CAAC;AAED,SAAS,cAAc;IACrB,OAAO,IAAI,CAAC,cAAc,EAAE,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;AACnD,CAAC;AAED,SAAS,cAAc;IAGrB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,EAAE,EAAE,WAAW,CAAC,CAAC;QACnD,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;YAAE,OAAO,IAAI,CAAC;QACrC,kDAAkD;QAClD,iEAAiE;QACjE,MAAM,QAAQ,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;QAC3C,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QACpD,OAAO,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;IACnC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,yDAAyD;AACzD,WAAW;AACX,yDAAyD;AAEzD,MAAM,UAAU,cAAc;IAC5B,MAAM,OAAO,GAAG,cAAc,EAAE,CAAC;IACjC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,
|
|
1
|
+
{"version":3,"file":"sentinel.js","sourceRoot":"","sources":["../../../src/cli/commands/sentinel.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAW,IAAI,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,UAAU,EAAgB,MAAM,IAAI,CAAC;AAE9C,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAClC,yDAAyD;AACzD,UAAU;AACV,yDAAyD;AAEzD,SAAS,cAAc;IACrB,OAAO,OAAO,CAAC,GAAG,EAAE,CAAC;AACvB,CAAC;AAED,SAAS,cAAc;IACrB,OAAO,IAAI,CAAC,cAAc,EAAE,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;AACnD,CAAC;AAED,SAAS,cAAc;IAGrB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,EAAE,EAAE,WAAW,CAAC,CAAC;QACnD,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;YAAE,OAAO,IAAI,CAAC;QACrC,kDAAkD;QAClD,iEAAiE;QACjE,MAAM,QAAQ,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;QAC3C,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QACpD,OAAO,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;IACnC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,yDAAyD;AACzD,WAAW;AACX,yDAAyD;AAEzD,MAAM,UAAU,cAAc;IAC5B,MAAM,OAAO,GAAG,cAAc,EAAE,CAAC;IACjC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,GAAG,CAAC,mDAAmD,CAAC,CAAC;QACzD,OAAO;IACT,CAAC;IACD,MAAM,EAAE,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAEjC,MAAM,WAAW,GAAI,EAAE,CAAC,OAAO,CAAC,0DAA0D,CAAC,CAAC,GAAG,EAAwB,EAAE,KAAK,IAAI,CAAC,CAAC;IAEpI,IAAI,oBAAoB,GAAG,CAAC,CAAC;IAC7B,IAAI,CAAC;QACH,oBAAoB,GAAI,EAAE,CAAC,OAAO,CAAC,sEAAsE,CAAC,CAAC,GAAG,EAAwB,EAAE,KAAK,IAAI,CAAC,CAAC;IACrJ,CAAC;IAAC,MAAM,CAAC;QACP,0BAA0B;IAC5B,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,UAAU,CAAC,CAAC,WAAW,EAAE,CAAC;IAChE,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,IAAI,cAAc,GAAG,CAAC,CAAC;IACvB,IAAI,cAAc,GAAG,CAAC,CAAC;IAEvB,IAAI,CAAC;QACH,YAAY,GAAI,EAAE,CAAC,OAAO,CAAC,iEAAiE,CAAC,CAAC,GAAG,CAAC,OAAO,CAAuB,EAAE,KAAK,IAAI,CAAC,CAAC;QAC7I,cAAc,GAAI,EAAE,CAAC,OAAO,CAAC,yFAAyF,CAAC,CAAC,GAAG,CAAC,OAAO,CAAuB,EAAE,KAAK,IAAI,CAAC,CAAC;QACvK,cAAc,GAAI,EAAE,CAAC,OAAO,CAAC,yFAAyF,CAAC,CAAC,GAAG,CAAC,OAAO,CAAuB,EAAE,KAAK,IAAI,CAAC,CAAC;IACzK,CAAC;IAAC,MAAM,CAAC;QACP,sBAAsB;IACxB,CAAC;IAED,IAAI,kBAAkB,GAAG,CAAC,CAAC;IAC3B,IAAI,CAAC;QACH,kBAAkB,GAAI,EAAE,CAAC,OAAO,CAAC,oEAAoE,CAAC,CAAC,GAAG,EAAwB,EAAE,KAAK,IAAI,CAAC,CAAC;IACjJ,CAAC;IAAC,MAAM,CAAC;QACP,sBAAsB;IACxB,CAAC;IAED,GAAG,CAAC;;;mBAGa,WAAW;mBACX,oBAAoB;mBACpB,kBAAkB;;;uBAGd,YAAY;uBACZ,cAAc;uBACd,cAAc;GAClC,CAAC,CAAC;AACL,CAAC;AAYD,MAAM,UAAU,aAAa,CAAC,UAAgC,EAAE;IAC9D,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC;IACrE,MAAM,OAAO,GAAG,cAAc,EAAE,CAAC;IACjC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,GAAG,CAAC,sBAAsB,CAAC,CAAC;QAC5B,OAAO;IACT,CAAC;IACD,MAAM,EAAE,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAEjC,IAAI,UAAU,EAAE,CAAC;QACf,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,kEAAkE,CAAC,CAAC,GAAG,EAAoC,CAAC;YACpI,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACtB,GAAG,CAAC,wBAAwB,CAAC,CAAC;gBAC9B,OAAO;YACT,CAAC;YACD,GAAG,CAAC,uBAAuB,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;YAC5C,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;gBACvB,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,SAAS,eAAe,GAAG,CAAC,UAAU,aAAa,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;YAC9F,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,GAAG,CAAC,8BAA8B,CAAC,CAAC;QACtC,CAAC;QACD,OAAO;IACT,CAAC;IAED,IAAI,OAAO,EAAE,CAAC;QACZ,IAAI,CAAC;YACH,EAAE,CAAC,OAAO,CAAC,yEAAyE,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACnG,GAAG,CAAC,SAAS,OAAO,uBAAuB,CAAC,CAAC;QAC/C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,GAAG,CAAC,oBAAqB,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;QACpD,CAAC;QACD,OAAO;IACT,CAAC;IAED,IAAI,SAAS,EAAE,CAAC;QACd,IAAI,CAAC;YACH,EAAE,CAAC,OAAO,CAAC,6CAA6C,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YACzE,GAAG,CAAC,qBAAqB,SAAS,aAAa,CAAC,CAAC;QACnD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,GAAG,CAAC,sBAAuB,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;QACtD,CAAC;QACD,OAAO;IACT,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9C,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,GAAG,UAAU,CAAC,CAAC,WAAW,EAAE,CAAC;IAEzE,IAAI,KAAK,GAAG,iDAAiD,CAAC;IAC9D,MAAM,MAAM,GAAc,CAAC,MAAM,CAAC,CAAC;IAEnC,IAAI,IAAI,EAAE,CAAC;QACT,KAAK,IAAI,oBAAoB,CAAC;QAC9B,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpB,CAAC;IACD,IAAI,IAAI,EAAE,CAAC;QACT,KAAK,IAAI,oBAAoB,CAAC;QAC9B,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;IAClC,CAAC;IAED,KAAK,IAAI,mCAAmC,CAAC;IAE7C,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,CAAmC,CAAC;QAChF,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,GAAG,CAAC,wBAAwB,CAAC,CAAC;YAC9B,OAAO;QACT,CAAC;QACD,GAAG,CAAC,iBAAiB,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;QACtC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,MAAM,IAAI,GAAG,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC;YAClC,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC;YACnC,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,SAAS,WAAW,IAAI,cAAc,OAAO,MAAM,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC;QAC/F,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,GAAG,CAAC,iBAAkB,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;IACjD,CAAC;AACH,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,EAAU;IACxC,IAAI,CAAC,EAAE,EAAE,CAAC;QACR,GAAG,CAAC,gDAAgD,CAAC,CAAC;QACtD,OAAO;IACT,CAAC;IACD,MAAM,OAAO,GAAG,cAAc,EAAE,CAAC;IACjC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,GAAG,CAAC,oBAAoB,CAAC,CAAC;QAC1B,OAAO;IACT,CAAC;IACD,MAAM,EAAE,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAEjC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,0CAA0C,CAAC,CAAC,GAAG,CAAC,EAAE,CAAwC,CAAC;QAClH,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,GAAG,CAAC,gBAAgB,EAAE,aAAa,CAAC,CAAC;YACrC,OAAO;QACT,CAAC;QACD,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC7B,GAAG,CAAC,gBAAgB,EAAE,eAAe,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC;YACpD,OAAO;QACT,CAAC;QACD,EAAE,CAAC,OAAO,CAAC,2GAA2G,CAAC,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,EAAE,CAAC,CAAC;QAC1J,GAAG,CAAC,gBAAgB,EAAE,YAAY,CAAC,CAAC;IACtC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,GAAG,CAAC,WAAY,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;IAC3C,CAAC;AACH,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,EAAU;IACvC,IAAI,CAAC,EAAE,EAAE,CAAC;QACR,GAAG,CAAC,+CAA+C,CAAC,CAAC;QACrD,OAAO;IACT,CAAC;IACD,MAAM,OAAO,GAAG,cAAc,EAAE,CAAC;IACjC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,GAAG,CAAC,oBAAoB,CAAC,CAAC;QAC1B,OAAO;IACT,CAAC;IACD,MAAM,EAAE,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAEjC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,0CAA0C,CAAC,CAAC,GAAG,CAAC,EAAE,CAAwC,CAAC;QAClH,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,GAAG,CAAC,gBAAgB,EAAE,aAAa,CAAC,CAAC;YACrC,OAAO;QACT,CAAC;QACD,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC7B,GAAG,CAAC,gBAAgB,EAAE,eAAe,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC;YACpD,OAAO;QACT,CAAC;QACD,EAAE,CAAC,OAAO,CAAC,4GAA4G,CAAC,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,EAAE,CAAC,CAAC;QAC3J,GAAG,CAAC,gBAAgB,EAAE,YAAY,CAAC,CAAC;IACtC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,GAAG,CAAC,WAAY,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;IAC3C,CAAC;AACH,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,MAAM,OAAO,GAAG,cAAc,EAAE,CAAC;IACjC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,GAAG,CAAC,oBAAoB,CAAC,CAAC;QAC1B,OAAO;IACT,CAAC;IACD,MAAM,EAAE,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAEjC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,0FAA0F,CAAC,CAAC,GAAG,EAMrH,CAAC;QACH,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,GAAG,CAAC,yBAAyB,CAAC,CAAC;YAC/B,OAAO;QACT,CAAC;QACD,GAAG,CAAC,oBAAoB,CAAC,CAAC;QAC1B,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC;YAC1C,GAAG,CAAC,MAAM,MAAM,KAAK,GAAG,CAAC,IAAI,eAAe,GAAG,CAAC,QAAQ,aAAa,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC;YACpF,IAAI,GAAG,CAAC,WAAW;gBAAE,GAAG,CAAC,WAAW,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;QACzD,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,GAAG,CAAC,WAAY,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;IAC3C,CAAC;AACH,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,IAAY,EAAE,MAAe;IAChE,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,GAAG,CAAC,+BAA+B,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,gBAAgB,CAAC,CAAC;QAClF,OAAO;IACT,CAAC;IACD,MAAM,OAAO,GAAG,cAAc,EAAE,CAAC;IACjC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,GAAG,CAAC,oBAAoB,CAAC,CAAC;QAC1B,OAAO;IACT,CAAC;IACD,MAAM,EAAE,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAEjC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CAAC,+DAA+D,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,IAAI,CAAmC,CAAC;QACjL,IAAI,MAAM,CAAC,OAAO,KAAK,CAAC,EAAE,CAAC;YACzB,GAAG,CAAC,WAAW,IAAI,cAAc,CAAC,CAAC;QACrC,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,WAAW,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,GAAG,CAAC,WAAY,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;IAC3C,CAAC;AACH,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,MAAe,EAAE,EAAW;IAC9D,MAAM,OAAO,GAAG,cAAc,EAAE,CAAC;IACjC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,GAAG,CAAC,uBAAuB,CAAC,CAAC;QAC7B,OAAO;IACT,CAAC;IACD,MAAM,EAAE,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAEjC,IAAI,MAAM,KAAK,QAAQ,IAAI,EAAE,EAAE,CAAC;QAC9B,IAAI,CAAC;YACH,EAAE,CAAC,OAAO,CAAC,yEAAyE,CAAC,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,EAAE,CAAC,CAAC;YACxH,GAAG,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC;QACpC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,GAAG,CAAC,WAAY,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;QAC3C,CAAC;QACD,OAAO;IACT,CAAC;IAED,IAAI,MAAM,KAAK,SAAS,IAAI,EAAE,EAAE,CAAC;QAC/B,IAAI,CAAC;YACH,EAAE,CAAC,OAAO,CAAC,0EAA0E,CAAC,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,EAAE,CAAC,CAAC;YACzH,GAAG,CAAC,cAAc,EAAE,aAAa,CAAC,CAAC;QACrC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,GAAG,CAAC,WAAY,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;QAC3C,CAAC;QACD,OAAO;IACT,CAAC;IAED,2BAA2B;IAC3B,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,sHAAsH,CAAC,CAAC,GAAG,EAMjJ,CAAC;QACH,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,GAAG,CAAC,yBAAyB,CAAC,CAAC;YAC/B,OAAO;QACT,CAAC;QACD,GAAG,CAAC,wBAAwB,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;QAC7C,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,GAAG,CAAC,OAAO,GAAG,CAAC,QAAQ,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,KAAK,WAAW,GAAG,CAAC,SAAS,WAAW,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;QACjG,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,GAAG,CAAC,WAAY,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;IAC3C,CAAC;AACH,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,GAAG,CAAC;;;;;;;;;;;;;;;;GAgBH,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -31,7 +31,7 @@ function isValidSkillTarget(target) {
|
|
|
31
31
|
*/
|
|
32
32
|
export function skillsAdd(target) {
|
|
33
33
|
if (!target) {
|
|
34
|
-
|
|
34
|
+
log(`
|
|
35
35
|
Usage: vibe skills add <owner/repo>
|
|
36
36
|
|
|
37
37
|
Install skills from skills.sh ecosystem.
|
|
@@ -46,12 +46,12 @@ Examples:
|
|
|
46
46
|
console.error(`❌ Invalid skill target: "${target}" (expected: owner/repo)`);
|
|
47
47
|
process.exit(1);
|
|
48
48
|
}
|
|
49
|
-
|
|
49
|
+
log(`\nInstalling skill: ${target}...\n`);
|
|
50
50
|
try {
|
|
51
51
|
execSync(`npx skills add ${target} --agent claude-code`, {
|
|
52
52
|
stdio: 'inherit',
|
|
53
53
|
});
|
|
54
|
-
|
|
54
|
+
log(`\n✅ Skill "${target}" installed successfully.`);
|
|
55
55
|
}
|
|
56
56
|
catch {
|
|
57
57
|
console.error(`\n❌ Failed to install skill "${target}".`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skills.js","sourceRoot":"","sources":["../../../src/cli/commands/skills.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AAEpE,OAAO,EACL,oBAAoB,EACpB,qBAAqB,GACtB,MAAM,+CAA+C,CAAC;AAEvD;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,GAAG,MAAM,CAAC,GAAG,CAAA,iCAAiC,CAAC;AAC/D,MAAM,YAAY,GAAG,MAAM,CAAC,GAAG,CAAA,qBAAqB,CAAC;AACrD,MAAM,YAAY,GAAG,IAAI,MAAM,CAC7B,kCAAkC,UAAU,GAAG,YAAY,GAAG,CAC/D,CAAC;AAEF,SAAS,kBAAkB,CAAC,MAAc;IACxC,OAAO,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AACnC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,MAAe;IACvC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,
|
|
1
|
+
{"version":3,"file":"skills.js","sourceRoot":"","sources":["../../../src/cli/commands/skills.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"slack.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/slack.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"slack.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/slack.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAiBH,wBAAgB,UAAU,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAoBrE;AAED,wBAAgB,YAAY,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAuBrD;AAED,wBAAgB,WAAW,IAAI,IAAI,CAelC;AAED,wBAAgB,SAAS,IAAI,IAAI,CAYhC"}
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
* 설정은 ~/.vibe/config.json channels.slack에 통합 저장
|
|
6
6
|
*/
|
|
7
7
|
import { readGlobalConfig, patchGlobalConfig, } from '../../infra/lib/config/GlobalConfigManager.js';
|
|
8
|
+
import { log } from '../utils.js';
|
|
8
9
|
function loadConfig() {
|
|
9
10
|
return readGlobalConfig().channels?.slack ?? null;
|
|
10
11
|
}
|
|
@@ -13,9 +14,9 @@ function saveConfig(config) {
|
|
|
13
14
|
}
|
|
14
15
|
export function slackSetup(botToken, appToken) {
|
|
15
16
|
if (!botToken || !appToken) {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
17
|
+
log('Usage: vibe slack setup <bot-token> <app-token>');
|
|
18
|
+
log(' bot-token: Slack Bot Token (xoxb-...)');
|
|
19
|
+
log(' app-token: Slack App-Level Token (xapp-...)');
|
|
19
20
|
return;
|
|
20
21
|
}
|
|
21
22
|
const existing = loadConfig();
|
|
@@ -25,49 +26,49 @@ export function slackSetup(botToken, appToken) {
|
|
|
25
26
|
allowedChannelIds: existing?.allowedChannelIds || [],
|
|
26
27
|
};
|
|
27
28
|
saveConfig(config);
|
|
28
|
-
|
|
29
|
+
log('Slack tokens saved');
|
|
29
30
|
if ((config.allowedChannelIds ?? []).length === 0) {
|
|
30
|
-
|
|
31
|
+
log('No allowed channels set. Use: vibe slack channel <channel-id>');
|
|
31
32
|
}
|
|
32
33
|
}
|
|
33
34
|
export function slackChannel(channelId) {
|
|
34
35
|
if (!channelId) {
|
|
35
|
-
|
|
36
|
-
|
|
36
|
+
log('Usage: vibe slack channel <channel-id>');
|
|
37
|
+
log(' Add a Slack channel ID to the allow list');
|
|
37
38
|
return;
|
|
38
39
|
}
|
|
39
40
|
const config = loadConfig();
|
|
40
41
|
if (!config) {
|
|
41
|
-
|
|
42
|
+
log('Slack not configured. Run: vibe slack setup <bot-token> <app-token>');
|
|
42
43
|
return;
|
|
43
44
|
}
|
|
44
45
|
const channelIds = config.allowedChannelIds ?? [];
|
|
45
46
|
if (channelIds.includes(channelId)) {
|
|
46
|
-
|
|
47
|
+
log(`Channel ID "${channelId}" is already in the allow list`);
|
|
47
48
|
return;
|
|
48
49
|
}
|
|
49
50
|
channelIds.push(channelId);
|
|
50
51
|
config.allowedChannelIds = channelIds;
|
|
51
52
|
saveConfig(config);
|
|
52
|
-
|
|
53
|
+
log(`Channel ID "${channelId}" added to allow list`);
|
|
53
54
|
}
|
|
54
55
|
export function slackStatus() {
|
|
55
56
|
const config = loadConfig();
|
|
56
57
|
if (!config) {
|
|
57
|
-
|
|
58
|
+
log('Slack: not configured');
|
|
58
59
|
return;
|
|
59
60
|
}
|
|
60
61
|
const bot = config.botToken ?? '';
|
|
61
62
|
const app = config.appToken ?? '';
|
|
62
63
|
const botPreview = bot.slice(0, 8) + '...' + bot.slice(-4);
|
|
63
64
|
const appPreview = app.slice(0, 8) + '...' + app.slice(-4);
|
|
64
|
-
|
|
65
|
-
|
|
65
|
+
log(`Slack Bot Token: configured (${botPreview})`);
|
|
66
|
+
log(`Slack App Token: configured (${appPreview})`);
|
|
66
67
|
const channelIds = config.allowedChannelIds ?? [];
|
|
67
|
-
|
|
68
|
+
log(`Allowed channels: ${channelIds.length > 0 ? channelIds.join(', ') : 'none'}`);
|
|
68
69
|
}
|
|
69
70
|
export function slackHelp() {
|
|
70
|
-
|
|
71
|
+
log(`
|
|
71
72
|
Vibe Slack Commands:
|
|
72
73
|
vibe slack setup <bot-token> <app-token> Set Slack tokens
|
|
73
74
|
vibe slack channel <id> Add allowed channel ID
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"slack.js","sourceRoot":"","sources":["../../../src/cli/commands/slack.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,+CAA+C,CAAC;AAGvD,SAAS,UAAU;IACjB,OAAO,gBAAgB,EAAE,CAAC,QAAQ,EAAE,KAAK,IAAI,IAAI,CAAC;AACpD,CAAC;AAED,SAAS,UAAU,CAAC,MAA0B;IAC5C,iBAAiB,CAAC,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;AACrD,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,QAAiB,EAAE,QAAiB;IAC7D,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC3B,
|
|
1
|
+
{"version":3,"file":"slack.js","sourceRoot":"","sources":["../../../src/cli/commands/slack.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stats.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/stats.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;
|
|
1
|
+
{"version":3,"file":"stats.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/stats.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAoLH,wBAAgB,YAAY,IAAI,IAAI,CASnC;AA4BD,wBAAgB,SAAS,IAAI,IAAI,CAYhC;AAoED,wBAAgB,YAAY,IAAI,IAAI,CASnC;AAMD,wBAAgB,SAAS,IAAI,IAAI,CAQhC"}
|
|
@@ -10,6 +10,7 @@ import fs from 'fs';
|
|
|
10
10
|
import path from 'path';
|
|
11
11
|
import os from 'os';
|
|
12
12
|
import chalk from 'chalk';
|
|
13
|
+
import { log } from '../utils.js';
|
|
13
14
|
// ============================================================================
|
|
14
15
|
// Constants
|
|
15
16
|
// ============================================================================
|
|
@@ -121,9 +122,9 @@ function padRight(str, len) {
|
|
|
121
122
|
return str.length >= len ? str : str + ' '.repeat(len - str.length);
|
|
122
123
|
}
|
|
123
124
|
function printHeader(title) {
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
125
|
+
log('');
|
|
126
|
+
log(chalk.bold(`📊 ${title}`));
|
|
127
|
+
log(DIVIDER);
|
|
127
128
|
}
|
|
128
129
|
// ============================================================================
|
|
129
130
|
// Default stats (all-time summary)
|
|
@@ -136,27 +137,27 @@ function printSummarySection(events, decisions) {
|
|
|
136
137
|
const runsLabel = successRate !== null
|
|
137
138
|
? `${totalRuns} (${successRate}% success)`
|
|
138
139
|
: `${totalRuns}`;
|
|
139
|
-
|
|
140
|
-
|
|
140
|
+
log(`${chalk.white(padRight('Sessions:', 16))} ${chalk.cyan(sessions)}`);
|
|
141
|
+
log(`${chalk.white(padRight('Skill Runs:', 16))} ${chalk.cyan(runsLabel)}`);
|
|
141
142
|
if (avgDuration !== null) {
|
|
142
|
-
|
|
143
|
+
log(`${chalk.white(padRight('Avg Duration:', 16))} ${chalk.cyan(`${avgDuration}s`)}`);
|
|
143
144
|
}
|
|
144
|
-
|
|
145
|
+
log(`${chalk.white(padRight('Total Decisions:', 16))} ${chalk.cyan(decisions.length)}`);
|
|
145
146
|
}
|
|
146
147
|
function printTopSkills(summaries) {
|
|
147
148
|
if (summaries.length === 0) {
|
|
148
|
-
|
|
149
|
+
log(chalk.dim(' No skill data yet.'));
|
|
149
150
|
return;
|
|
150
151
|
}
|
|
151
|
-
|
|
152
|
-
|
|
152
|
+
log('');
|
|
153
|
+
log(chalk.bold('Top Skills:'));
|
|
153
154
|
const top = summaries.slice(0, TOP_SKILLS_COUNT);
|
|
154
155
|
top.forEach((s, i) => {
|
|
155
156
|
const rank = chalk.dim(` ${i + 1}.`);
|
|
156
157
|
const name = chalk.white(padRight(s.skill, 18));
|
|
157
158
|
const runs = chalk.cyan(`${s.count} runs`);
|
|
158
159
|
const rate = formatSuccessRate(s.successCount, s.count);
|
|
159
|
-
|
|
160
|
+
log(`${rank} ${name} ${runs} (${rate})`);
|
|
160
161
|
});
|
|
161
162
|
}
|
|
162
163
|
export function statsDefault() {
|
|
@@ -166,14 +167,14 @@ export function statsDefault() {
|
|
|
166
167
|
printHeader('Vibe Stats');
|
|
167
168
|
printSummarySection(events, decisions);
|
|
168
169
|
printTopSkills(summaries);
|
|
169
|
-
|
|
170
|
+
log('');
|
|
170
171
|
}
|
|
171
172
|
// ============================================================================
|
|
172
173
|
// --week: Last 7 days with day-by-day breakdown
|
|
173
174
|
// ============================================================================
|
|
174
175
|
function printWeeklyBreakdown(events) {
|
|
175
|
-
|
|
176
|
-
|
|
176
|
+
log('');
|
|
177
|
+
log(chalk.bold('Day-by-Day Breakdown:'));
|
|
177
178
|
const today = new Date();
|
|
178
179
|
for (let i = 6; i >= 0; i--) {
|
|
179
180
|
const date = new Date(today);
|
|
@@ -186,7 +187,7 @@ function printWeeklyBreakdown(events) {
|
|
|
186
187
|
const rate = dayEvents.length > 0
|
|
187
188
|
? ` (${formatSuccessRate(successCount, dayEvents.length)})`
|
|
188
189
|
: '';
|
|
189
|
-
|
|
190
|
+
log(` ${label} ${count}${rate}`);
|
|
190
191
|
}
|
|
191
192
|
}
|
|
192
193
|
export function statsWeek() {
|
|
@@ -199,7 +200,7 @@ export function statsWeek() {
|
|
|
199
200
|
printSummarySection(events, decisions);
|
|
200
201
|
printTopSkills(summaries);
|
|
201
202
|
printWeeklyBreakdown(events);
|
|
202
|
-
|
|
203
|
+
log('');
|
|
203
204
|
}
|
|
204
205
|
// ============================================================================
|
|
205
206
|
// --quality: Quality trends
|
|
@@ -207,11 +208,11 @@ export function statsWeek() {
|
|
|
207
208
|
function printReviewStats(spans) {
|
|
208
209
|
const reviewSpans = spans.filter(s => s.type === 'review');
|
|
209
210
|
const p1Spans = reviewSpans.filter(s => s.attributes['p1_count'] !== undefined && Number(s.attributes['p1_count']) > 0);
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
211
|
+
log(chalk.bold('Review Quality:'));
|
|
212
|
+
log(` ${chalk.white(padRight('Review spans:', 20))} ${chalk.cyan(reviewSpans.length)}`);
|
|
213
|
+
log(` ${chalk.white(padRight('With P1 issues:', 20))} ${chalk.red(p1Spans.length)}`);
|
|
213
214
|
const errorSpans = spans.filter(s => s.status === 'error');
|
|
214
|
-
|
|
215
|
+
log(` ${chalk.white(padRight('Error spans:', 20))} ${chalk.yellow(errorSpans.length)}`);
|
|
215
216
|
}
|
|
216
217
|
function printErrorTypes(spans) {
|
|
217
218
|
const errorSpans = spans.filter(s => s.status === 'error');
|
|
@@ -222,20 +223,20 @@ function printErrorTypes(spans) {
|
|
|
222
223
|
const key = `${span.type}/${span.name}`;
|
|
223
224
|
errorMap.set(key, (errorMap.get(key) ?? 0) + 1);
|
|
224
225
|
}
|
|
225
|
-
|
|
226
|
-
|
|
226
|
+
log('');
|
|
227
|
+
log(chalk.bold('Most Common Errors:'));
|
|
227
228
|
[...errorMap.entries()]
|
|
228
229
|
.sort((a, b) => b[1] - a[1])
|
|
229
230
|
.slice(0, 5)
|
|
230
231
|
.forEach(([name, count]) => {
|
|
231
|
-
|
|
232
|
+
log(` ${chalk.red(padRight(name, 30))} ${chalk.white(count)}x`);
|
|
232
233
|
});
|
|
233
234
|
}
|
|
234
235
|
function printDecisionQuality(decisions) {
|
|
235
|
-
|
|
236
|
-
|
|
236
|
+
log('');
|
|
237
|
+
log(chalk.bold('Decision Success Rate by Category:'));
|
|
237
238
|
if (decisions.length === 0) {
|
|
238
|
-
|
|
239
|
+
log(chalk.dim(' No decision data yet.'));
|
|
239
240
|
return;
|
|
240
241
|
}
|
|
241
242
|
const categoryMap = new Map();
|
|
@@ -253,7 +254,7 @@ function printDecisionQuality(decisions) {
|
|
|
253
254
|
const rate = data.withOutcome > 0
|
|
254
255
|
? formatSuccessRate(data.success, data.withOutcome)
|
|
255
256
|
: chalk.dim('no outcome');
|
|
256
|
-
|
|
257
|
+
log(` ${chalk.white(padRight(category, 20))} ${chalk.cyan(`${data.total} decisions`)} ${rate}`);
|
|
257
258
|
}
|
|
258
259
|
}
|
|
259
260
|
export function statsQuality() {
|
|
@@ -263,13 +264,13 @@ export function statsQuality() {
|
|
|
263
264
|
printReviewStats(spans);
|
|
264
265
|
printErrorTypes(spans);
|
|
265
266
|
printDecisionQuality(decisions);
|
|
266
|
-
|
|
267
|
+
log('');
|
|
267
268
|
}
|
|
268
269
|
// ============================================================================
|
|
269
270
|
// Help
|
|
270
271
|
// ============================================================================
|
|
271
272
|
export function statsHelp() {
|
|
272
|
-
|
|
273
|
+
log(`
|
|
273
274
|
Stats Commands:
|
|
274
275
|
vibe stats All-time session summary
|
|
275
276
|
vibe stats --week Last 7 days with daily breakdown
|