coolhand-cli 0.4.0 → 0.5.1
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/README.md +38 -14
- package/dist/api/last-sync.d.ts +16 -0
- package/dist/api/last-sync.d.ts.map +1 -0
- package/dist/api/last-sync.js +73 -0
- package/dist/api/last-sync.js.map +1 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +21 -7
- package/dist/cli.js.map +1 -1
- package/dist/commands/analyze-claude-sessions.d.ts +3 -0
- package/dist/commands/analyze-claude-sessions.d.ts.map +1 -0
- package/dist/commands/analyze-claude-sessions.js +186 -0
- package/dist/commands/analyze-claude-sessions.js.map +1 -0
- package/dist/commands/claude.d.ts +14 -0
- package/dist/commands/claude.d.ts.map +1 -0
- package/dist/commands/claude.js +84 -0
- package/dist/commands/claude.js.map +1 -0
- package/dist/log-request.d.ts +1 -1
- package/dist/log-request.js +1 -1
- package/dist/sessions/capture-state.d.ts +27 -8
- package/dist/sessions/capture-state.d.ts.map +1 -1
- package/dist/sessions/capture-state.js +63 -13
- package/dist/sessions/capture-state.js.map +1 -1
- package/dist/sessions/claude-scanner.d.ts +12 -0
- package/dist/sessions/claude-scanner.d.ts.map +1 -1
- package/dist/sessions/claude-scanner.js +29 -4
- package/dist/sessions/claude-scanner.js.map +1 -1
- package/dist/sessions/cowork-scanner.d.ts +20 -0
- package/dist/sessions/cowork-scanner.d.ts.map +1 -0
- package/dist/sessions/cowork-scanner.js +76 -0
- package/dist/sessions/cowork-scanner.js.map +1 -0
- package/dist/types.d.ts +5 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/version.d.ts +2 -2
- package/dist/version.js +1 -1
- package/package.json +7 -3
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { spawn } from 'child_process';
|
|
2
|
+
import { createRequire } from 'module';
|
|
3
|
+
import { realpathSync } from 'fs';
|
|
4
|
+
import { ExitCode, CliError } from '../errors.js';
|
|
5
|
+
import { logger, redact } from '../logger.js';
|
|
6
|
+
import { loadConfig, getClient } from '../config.js';
|
|
7
|
+
import { DEFAULT_BASE_URL } from '../types.js';
|
|
8
|
+
/**
|
|
9
|
+
* Locate the coolhand-proxy CLI (`dist/cli.js`, which hosts the `wrap` command).
|
|
10
|
+
* coolhand-proxy ships dist/ and declares no `exports` restriction, so deep
|
|
11
|
+
* subpath resolution works. We resolve a file path and later run it with `node`
|
|
12
|
+
* rather than via the `.bin` shim, which avoids the Windows `.bin` ENOENT gotcha.
|
|
13
|
+
*/
|
|
14
|
+
function defaultResolveProxyCli() {
|
|
15
|
+
// Anchor resolution at the real path of the running CLI entry (dist/bin.js),
|
|
16
|
+
// following any global-install symlink, so we resolve coolhand-proxy from this
|
|
17
|
+
// package's node_modules. Avoids `import.meta` (keeps the ts-jest build happy).
|
|
18
|
+
const anchor = realpathSync(process.argv[1] ?? process.cwd());
|
|
19
|
+
const require = createRequire(anchor);
|
|
20
|
+
return require.resolve('coolhand-proxy/dist/cli.js');
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Build the full ingest endpoint the proxy should post to for a given client.
|
|
24
|
+
* The proxy's `--api-endpoint` wants the full path; the CLI stores only the
|
|
25
|
+
* site base_url, so append the ingest path. Returns undefined for the default
|
|
26
|
+
* base_url (the proxy already targets the right endpoint).
|
|
27
|
+
*/
|
|
28
|
+
function endpointForBaseUrl(baseUrl) {
|
|
29
|
+
if (!baseUrl || baseUrl === DEFAULT_BASE_URL) {
|
|
30
|
+
return undefined;
|
|
31
|
+
}
|
|
32
|
+
return `${baseUrl.replace(/\/+$/, '')}/api/v2/llm_request_logs`;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* `coolhand claude [args...]` — run the Claude CLI behind the Coolhand proxy with
|
|
36
|
+
* the stored API key filled in. Shells out to `coolhand-proxy wrap -- claude ...`
|
|
37
|
+
* so the proxy's battle-tested wrap behavior is reused, not duplicated.
|
|
38
|
+
*/
|
|
39
|
+
export async function run(opts, deps = {}) {
|
|
40
|
+
const spawnFn = deps.spawnFn ?? spawn;
|
|
41
|
+
const resolveProxyCli = deps.resolveProxyCli ?? defaultResolveProxyCli;
|
|
42
|
+
try {
|
|
43
|
+
const cfg = await loadConfig();
|
|
44
|
+
const entry = getClient(cfg, opts.clientId);
|
|
45
|
+
if (!entry) {
|
|
46
|
+
throw new CliError('NOT_CONFIGURED', 'No Coolhand account configured. Run `coolhand login` first.');
|
|
47
|
+
}
|
|
48
|
+
let proxyCli;
|
|
49
|
+
try {
|
|
50
|
+
proxyCli = resolveProxyCli();
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
logger.info('Error: could not locate the coolhand-proxy dependency. Try reinstalling coolhand-cli.');
|
|
54
|
+
return ExitCode.INTERNAL;
|
|
55
|
+
}
|
|
56
|
+
const wrapArgs = ['wrap', '--silent'];
|
|
57
|
+
const endpoint = endpointForBaseUrl(entry.base_url);
|
|
58
|
+
if (endpoint) {
|
|
59
|
+
wrapArgs.push('--api-endpoint', endpoint);
|
|
60
|
+
}
|
|
61
|
+
wrapArgs.push('--', 'claude', ...opts.args);
|
|
62
|
+
return await new Promise((resolve) => {
|
|
63
|
+
const child = spawnFn(process.execPath, [proxyCli, ...wrapArgs], {
|
|
64
|
+
stdio: 'inherit',
|
|
65
|
+
env: { ...process.env, COOLHAND_API_KEY: entry.api_key },
|
|
66
|
+
});
|
|
67
|
+
child.on('error', (err) => {
|
|
68
|
+
logger.info(`Error: failed to start coolhand-proxy: ${redact(err.message)}`);
|
|
69
|
+
resolve(ExitCode.INTERNAL);
|
|
70
|
+
});
|
|
71
|
+
child.on('close', (code) => {
|
|
72
|
+
resolve(code ?? ExitCode.INTERNAL);
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
catch (err) {
|
|
77
|
+
if (err instanceof CliError) {
|
|
78
|
+
logger.info(`Error: ${redact(err.message)} [${err.code}]`);
|
|
79
|
+
return err.exitCode;
|
|
80
|
+
}
|
|
81
|
+
throw err;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=claude.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude.js","sourceRoot":"","sources":["../../src/commands/claude.ts"],"names":[],"mappings":"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"}
|
package/dist/log-request.d.ts
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* deduplicates by the envelope's `response_body.id`, so re-submitting the same turn is harmless.
|
|
7
7
|
*
|
|
8
8
|
* The SDK swallows submission failures and returns `null`; we translate that (and a base_url
|
|
9
|
-
* rejection from the SDK constructor) back into a `CliError` so `
|
|
9
|
+
* rejection from the SDK constructor) back into a `CliError` so `analyze-claude-sessions` keeps its
|
|
10
10
|
* per-session success/failure accounting intact.
|
|
11
11
|
*/
|
|
12
12
|
export declare function logRequest(rawRequest: unknown, opts?: {
|
package/dist/log-request.js
CHANGED
|
@@ -12,7 +12,7 @@ const COLLECTOR = 'coolhand-cli/claude-code';
|
|
|
12
12
|
* deduplicates by the envelope's `response_body.id`, so re-submitting the same turn is harmless.
|
|
13
13
|
*
|
|
14
14
|
* The SDK swallows submission failures and returns `null`; we translate that (and a base_url
|
|
15
|
-
* rejection from the SDK constructor) back into a `CliError` so `
|
|
15
|
+
* rejection from the SDK constructor) back into a `CliError` so `analyze-claude-sessions` keeps its
|
|
16
16
|
* per-session success/failure accounting intact.
|
|
17
17
|
*/
|
|
18
18
|
export async function logRequest(rawRequest, opts = {}) {
|
|
@@ -1,20 +1,39 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Local record of
|
|
3
|
-
* `
|
|
2
|
+
* Local record of how much of each Claude Code session has already been submitted, so re-running
|
|
3
|
+
* `analyze-claude-sessions` does not resend a session unchanged — but DOES resend one whose transcript has
|
|
4
|
+
* grown with new turns since last time.
|
|
4
5
|
*
|
|
5
6
|
* The server cannot deduplicate these logs itself (its dedup runs before a log is classified, and
|
|
6
|
-
* matched logs are never re-checked), so the tool keeps this
|
|
7
|
+
* matched logs are never re-checked), so the tool keeps this record and decides what to (re)send.
|
|
7
8
|
* Keyed per client id, since the same session may legitimately be submitted to more than one client.
|
|
9
|
+
*
|
|
10
|
+
* We store a turn COUNT per session (not a yes/no flag): a chat transcript keeps growing, so a
|
|
11
|
+
* boolean "already submitted?" silently drops later turns. Comparing the current turn count against
|
|
12
|
+
* `turnsSubmitted` is what lets a grown session be re-submitted.
|
|
8
13
|
*/
|
|
14
|
+
export interface SubmittedSession {
|
|
15
|
+
/** Number of assistant turns submitted the last time this session was sent. */
|
|
16
|
+
turnsSubmitted: number;
|
|
17
|
+
}
|
|
9
18
|
export interface CaptureState {
|
|
10
19
|
version: number;
|
|
11
|
-
|
|
20
|
+
/** ISO timestamp of the last Claude Code session sync; mtime cutoff for ~/.claude/projects. */
|
|
21
|
+
lastSyncAt?: string;
|
|
22
|
+
/** ISO timestamp of the last Cowork session sync; mtime cutoff for local-agent-mode-sessions. */
|
|
23
|
+
coworkLastSyncAt?: string;
|
|
24
|
+
submitted: Record<string, Record<string, SubmittedSession>>;
|
|
12
25
|
}
|
|
13
26
|
export declare function captureStatePath(): string;
|
|
27
|
+
/**
|
|
28
|
+
* Sentinel stored for sessions migrated from v1 (where only a boolean "submitted?" was tracked).
|
|
29
|
+
* `run()` treats this as "already submitted, turn count unknown" — it records the actual count
|
|
30
|
+
* without re-submitting, so subsequent runs can detect growth correctly.
|
|
31
|
+
*/
|
|
32
|
+
export declare const V1_MIGRATION_SENTINEL = -1;
|
|
14
33
|
export declare function loadCaptureState(): Promise<CaptureState>;
|
|
15
|
-
/**
|
|
16
|
-
export declare function
|
|
17
|
-
/** Record
|
|
18
|
-
export declare function
|
|
34
|
+
/** Turns already submitted for this session/client, or 0 if it has never been submitted. */
|
|
35
|
+
export declare function getTurnsSubmitted(state: CaptureState, clientId: string, sessionId: string): number;
|
|
36
|
+
/** Record that `turns` turns of this session have now been submitted for this client. */
|
|
37
|
+
export declare function recordSubmission(state: CaptureState, clientId: string, sessionId: string, turns: number): void;
|
|
19
38
|
export declare function saveCaptureState(state: CaptureState): Promise<void>;
|
|
20
39
|
//# sourceMappingURL=capture-state.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"capture-state.d.ts","sourceRoot":"","sources":["../../src/sessions/capture-state.ts"],"names":[],"mappings":"AAMA
|
|
1
|
+
{"version":3,"file":"capture-state.d.ts","sourceRoot":"","sources":["../../src/sessions/capture-state.ts"],"names":[],"mappings":"AAMA;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,gBAAgB;IAC/B,+EAA+E;IAC/E,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,+FAA+F;IAC/F,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iGAAiG;IACjG,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC,CAAC;CAC7D;AAQD,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAMD;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,KAAK,CAAC;AA6CxC,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,YAAY,CAAC,CAyB9D;AAED,4FAA4F;AAC5F,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAElG;AAED,yFAAyF;AACzF,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,YAAY,EACnB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,GACZ,IAAI,CAGN;AAWD,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAmBzE"}
|
|
@@ -3,6 +3,7 @@ import * as path from 'path';
|
|
|
3
3
|
import { randomBytes } from 'crypto';
|
|
4
4
|
import { configDir } from '../config.js';
|
|
5
5
|
import { CliError } from '../errors.js';
|
|
6
|
+
const STATE_VERSION = 2;
|
|
6
7
|
const STATE_FILENAME = 'capture-state.json';
|
|
7
8
|
const DIR_MODE = 0o700;
|
|
8
9
|
const FILE_MODE = 0o600;
|
|
@@ -10,7 +11,57 @@ export function captureStatePath() {
|
|
|
10
11
|
return path.join(configDir(), STATE_FILENAME);
|
|
11
12
|
}
|
|
12
13
|
function emptyState() {
|
|
13
|
-
return { version:
|
|
14
|
+
return { version: STATE_VERSION, submitted: {} };
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Sentinel stored for sessions migrated from v1 (where only a boolean "submitted?" was tracked).
|
|
18
|
+
* `run()` treats this as "already submitted, turn count unknown" — it records the actual count
|
|
19
|
+
* without re-submitting, so subsequent runs can detect growth correctly.
|
|
20
|
+
*/
|
|
21
|
+
export const V1_MIGRATION_SENTINEL = -1;
|
|
22
|
+
/** Read a turn count defensively (hand-edited files may hold garbage). */
|
|
23
|
+
function toTurnCount(value) {
|
|
24
|
+
// Allow the migration sentinel (-1) through; reject everything else outside [0, ∞).
|
|
25
|
+
if (value === V1_MIGRATION_SENTINEL) {
|
|
26
|
+
return V1_MIGRATION_SENTINEL;
|
|
27
|
+
}
|
|
28
|
+
return typeof value === 'number' && Number.isFinite(value) && value >= 0 ? value : 0;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Normalize the on-disk `submitted` map into the v2 shape, migrating v1 as we go.
|
|
32
|
+
*
|
|
33
|
+
* v1 stored `clientId -> sessionId[]` (a yes/no list). v2 stores
|
|
34
|
+
* `clientId -> { sessionId: { turnsSubmitted } }`. Migrating a v1 entry sets `turnsSubmitted`
|
|
35
|
+
* to `V1_MIGRATION_SENTINEL` (-1). On the first v2 run, `run()` treats the sentinel as unchanged —
|
|
36
|
+
* it records the actual current turn count without re-submitting, so previously-submitted sessions
|
|
37
|
+
* are not duplicated on the server.
|
|
38
|
+
*/
|
|
39
|
+
function normalizeSubmitted(raw) {
|
|
40
|
+
if (!raw || typeof raw !== 'object') {
|
|
41
|
+
return {};
|
|
42
|
+
}
|
|
43
|
+
const out = {};
|
|
44
|
+
for (const [clientId, value] of Object.entries(raw)) {
|
|
45
|
+
const sessions = {};
|
|
46
|
+
if (Array.isArray(value)) {
|
|
47
|
+
// v1: a plain list of session ids. Use the migration sentinel so run() can learn the real
|
|
48
|
+
// turn count on the next scan without re-submitting sessions the server already holds.
|
|
49
|
+
for (const sessionId of value) {
|
|
50
|
+
if (typeof sessionId === 'string') {
|
|
51
|
+
sessions[sessionId] = { turnsSubmitted: V1_MIGRATION_SENTINEL };
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
else if (value && typeof value === 'object') {
|
|
56
|
+
// v2: a map of session id → { turnsSubmitted }.
|
|
57
|
+
for (const [sessionId, entry] of Object.entries(value)) {
|
|
58
|
+
const turns = entry?.turnsSubmitted;
|
|
59
|
+
sessions[sessionId] = { turnsSubmitted: toTurnCount(turns) };
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
out[clientId] = sessions;
|
|
63
|
+
}
|
|
64
|
+
return out;
|
|
14
65
|
}
|
|
15
66
|
export async function loadCaptureState() {
|
|
16
67
|
const filePath = captureStatePath();
|
|
@@ -27,25 +78,24 @@ export async function loadCaptureState() {
|
|
|
27
78
|
try {
|
|
28
79
|
const parsed = JSON.parse(raw);
|
|
29
80
|
return {
|
|
30
|
-
version:
|
|
31
|
-
|
|
81
|
+
version: STATE_VERSION,
|
|
82
|
+
lastSyncAt: typeof parsed.lastSyncAt === 'string' ? parsed.lastSyncAt : undefined,
|
|
83
|
+
coworkLastSyncAt: typeof parsed.coworkLastSyncAt === 'string' ? parsed.coworkLastSyncAt : undefined,
|
|
84
|
+
submitted: normalizeSubmitted(parsed.submitted),
|
|
32
85
|
};
|
|
33
86
|
}
|
|
34
87
|
catch (err) {
|
|
35
88
|
throw new CliError('CONFIG_READ_FAILED', `Capture state at ${filePath} is not valid JSON: ${err.message}`);
|
|
36
89
|
}
|
|
37
90
|
}
|
|
38
|
-
/**
|
|
39
|
-
export function
|
|
40
|
-
|
|
41
|
-
return Array.isArray(list) && list.includes(sessionId);
|
|
91
|
+
/** Turns already submitted for this session/client, or 0 if it has never been submitted. */
|
|
92
|
+
export function getTurnsSubmitted(state, clientId, sessionId) {
|
|
93
|
+
return state.submitted[clientId]?.[sessionId]?.turnsSubmitted ?? 0;
|
|
42
94
|
}
|
|
43
|
-
/** Record
|
|
44
|
-
export function
|
|
45
|
-
const
|
|
46
|
-
|
|
47
|
-
list.push(sessionId);
|
|
48
|
-
}
|
|
95
|
+
/** Record that `turns` turns of this session have now been submitted for this client. */
|
|
96
|
+
export function recordSubmission(state, clientId, sessionId, turns) {
|
|
97
|
+
const sessions = state.submitted[clientId] ?? (state.submitted[clientId] = {});
|
|
98
|
+
sessions[sessionId] = { turnsSubmitted: turns };
|
|
49
99
|
}
|
|
50
100
|
async function ensureDir(dir) {
|
|
51
101
|
await fs.mkdir(dir, { recursive: true, mode: DIR_MODE });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"capture-state.js","sourceRoot":"","sources":["../../src/sessions/capture-state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,IAAI,CAAC;AACpC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"capture-state.js","sourceRoot":"","sources":["../../src/sessions/capture-state.ts"],"names":[],"mappings":"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"}
|
|
@@ -26,10 +26,17 @@ export interface CaptureEnvelope {
|
|
|
26
26
|
content: unknown;
|
|
27
27
|
usage?: unknown;
|
|
28
28
|
};
|
|
29
|
+
/** Number of assistant turns in this session — compared against state to detect growth. */
|
|
30
|
+
turnCount: number;
|
|
29
31
|
}
|
|
30
32
|
export interface ScanResult {
|
|
31
33
|
envelopes: CaptureEnvelope[];
|
|
32
34
|
sessionCount: number;
|
|
35
|
+
/** False when the scan directory could not be read and the error was swallowed. The caller must
|
|
36
|
+
* not advance its mtime cutoff in this case — doing so would permanently hide pre-existing files
|
|
37
|
+
* whose mtimes predate the new cutoff, since the turn-count guard never sees them if they are
|
|
38
|
+
* never read. */
|
|
39
|
+
ok: boolean;
|
|
33
40
|
}
|
|
34
41
|
export declare function defaultProjectsDir(): string;
|
|
35
42
|
/**
|
|
@@ -41,9 +48,14 @@ export declare function parseTranscript(content: string, sessionId: string): Cap
|
|
|
41
48
|
/**
|
|
42
49
|
* Find every Claude Code transcript under `projectsDir` (default `~/.claude/projects`) and build one
|
|
43
50
|
* conversation envelope per session. A missing directory simply yields zero sessions.
|
|
51
|
+
*
|
|
52
|
+
* When `sinceTime` is given, files whose last-modified time is older than it are skipped entirely
|
|
53
|
+
* (not even read) — they cannot have grown since the last sync. `sessionCount` therefore counts only
|
|
54
|
+
* the files actually examined this run, so it reflects the work done rather than the whole corpus.
|
|
44
55
|
*/
|
|
45
56
|
export declare function scanSessions(options?: {
|
|
46
57
|
projectsDir?: string;
|
|
58
|
+
sinceTime?: Date;
|
|
47
59
|
}): Promise<ScanResult>;
|
|
48
60
|
/** The session id this envelope represents — used as the local dedup key. */
|
|
49
61
|
export declare function sessionIdOf(envelope: CaptureEnvelope): string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude-scanner.d.ts","sourceRoot":"","sources":["../../src/sessions/claude-scanner.ts"],"names":[],"mappings":"AAIA,qDAAqD;AACrD,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;GAMG;AACH,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE;QACZ,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,mBAAmB,EAAE,CAAC;KACjC,CAAC;IACF,aAAa,EAAE;QACb,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,OAAO,CAAC;QACjB,KAAK,CAAC,EAAE,OAAO,CAAC;KACjB,CAAC;
|
|
1
|
+
{"version":3,"file":"claude-scanner.d.ts","sourceRoot":"","sources":["../../src/sessions/claude-scanner.ts"],"names":[],"mappings":"AAIA,qDAAqD;AACrD,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;GAMG;AACH,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE;QACZ,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,mBAAmB,EAAE,CAAC;KACjC,CAAC;IACF,aAAa,EAAE;QACb,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,OAAO,CAAC;QACjB,KAAK,CAAC,EAAE,OAAO,CAAC;KACjB,CAAC;IACF,2FAA2F;IAC3F,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,eAAe,EAAE,CAAC;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB;;;sBAGkB;IAClB,EAAE,EAAE,OAAO,CAAC;CACb;AAED,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAgCD;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CA6F1F;AAED;;;;;;;GAOG;AACH,wBAAsB,YAAY,CAChC,OAAO,GAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,IAAI,CAAA;CAAO,GACvD,OAAO,CAAC,UAAU,CAAC,CAoDrB;AAED,6EAA6E;AAC7E,wBAAgB,WAAW,CAAC,QAAQ,EAAE,eAAe,GAAG,MAAM,CAG7D"}
|
|
@@ -34,6 +34,7 @@ export function parseTranscript(content, sessionId) {
|
|
|
34
34
|
let sawUsage = false;
|
|
35
35
|
let sessionModel;
|
|
36
36
|
let lastAssistant = null;
|
|
37
|
+
let turnCount = 0;
|
|
37
38
|
for (const line of content.split('\n')) {
|
|
38
39
|
const trimmed = line.trim();
|
|
39
40
|
if (!trimmed) {
|
|
@@ -68,6 +69,7 @@ export function parseTranscript(content, sessionId) {
|
|
|
68
69
|
? message.id
|
|
69
70
|
: undefined;
|
|
70
71
|
messages.push({ role: 'assistant', content: extractText(message.content) });
|
|
72
|
+
turnCount += 1;
|
|
71
73
|
const model = typeof message.model === 'string' ? message.model : undefined;
|
|
72
74
|
if (model) {
|
|
73
75
|
sessionModel = model;
|
|
@@ -106,21 +108,27 @@ export function parseTranscript(content, sessionId) {
|
|
|
106
108
|
content: lastAssistant.content,
|
|
107
109
|
usage: sawUsage ? usage : undefined,
|
|
108
110
|
},
|
|
111
|
+
turnCount,
|
|
109
112
|
};
|
|
110
113
|
}
|
|
111
114
|
/**
|
|
112
115
|
* Find every Claude Code transcript under `projectsDir` (default `~/.claude/projects`) and build one
|
|
113
116
|
* conversation envelope per session. A missing directory simply yields zero sessions.
|
|
117
|
+
*
|
|
118
|
+
* When `sinceTime` is given, files whose last-modified time is older than it are skipped entirely
|
|
119
|
+
* (not even read) — they cannot have grown since the last sync. `sessionCount` therefore counts only
|
|
120
|
+
* the files actually examined this run, so it reflects the work done rather than the whole corpus.
|
|
114
121
|
*/
|
|
115
122
|
export async function scanSessions(options = {}) {
|
|
116
123
|
const dir = options.projectsDir ?? defaultProjectsDir();
|
|
124
|
+
const sinceMs = options.sinceTime?.getTime();
|
|
117
125
|
let names;
|
|
118
126
|
try {
|
|
119
127
|
names = await fs.readdir(dir, { recursive: true });
|
|
120
128
|
}
|
|
121
129
|
catch (err) {
|
|
122
130
|
if (err.code === 'ENOENT') {
|
|
123
|
-
return { envelopes: [], sessionCount: 0 };
|
|
131
|
+
return { envelopes: [], sessionCount: 0, ok: true };
|
|
124
132
|
}
|
|
125
133
|
throw err;
|
|
126
134
|
}
|
|
@@ -128,9 +136,25 @@ export async function scanSessions(options = {}) {
|
|
|
128
136
|
const envelopes = [];
|
|
129
137
|
let sessionCount = 0;
|
|
130
138
|
for (const relativePath of files) {
|
|
139
|
+
const fullPath = path.join(dir, relativePath);
|
|
140
|
+
if (sinceMs !== undefined) {
|
|
141
|
+
let stat;
|
|
142
|
+
try {
|
|
143
|
+
stat = await fs.stat(fullPath);
|
|
144
|
+
}
|
|
145
|
+
catch {
|
|
146
|
+
// Unreadable transcript — skip it rather than failing the whole scan.
|
|
147
|
+
continue;
|
|
148
|
+
}
|
|
149
|
+
// Skip files unchanged since the cutoff. Use `>=` so a file touched exactly at the cutoff
|
|
150
|
+
// is still examined.
|
|
151
|
+
if (stat.mtimeMs < sinceMs) {
|
|
152
|
+
continue;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
131
155
|
let content;
|
|
132
156
|
try {
|
|
133
|
-
content = await fs.readFile(
|
|
157
|
+
content = await fs.readFile(fullPath, 'utf8');
|
|
134
158
|
}
|
|
135
159
|
catch {
|
|
136
160
|
// Unreadable transcript — skip it rather than failing the whole scan.
|
|
@@ -143,10 +167,11 @@ export async function scanSessions(options = {}) {
|
|
|
143
167
|
envelopes.push(envelope);
|
|
144
168
|
}
|
|
145
169
|
}
|
|
146
|
-
return { envelopes, sessionCount };
|
|
170
|
+
return { envelopes, sessionCount, ok: true };
|
|
147
171
|
}
|
|
148
172
|
/** The session id this envelope represents — used as the local dedup key. */
|
|
149
173
|
export function sessionIdOf(envelope) {
|
|
150
|
-
|
|
174
|
+
const m = envelope.url.match(/^[a-z]+:\/\/session\/(.+)$/);
|
|
175
|
+
return m ? m[1] : envelope.url;
|
|
151
176
|
}
|
|
152
177
|
//# sourceMappingURL=claude-scanner.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude-scanner.js","sourceRoot":"","sources":["../../src/sessions/claude-scanner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,IAAI,CAAC;AACpC,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"claude-scanner.js","sourceRoot":"","sources":["../../src/sessions/claude-scanner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { type ScanResult } from './claude-scanner.js';
|
|
2
|
+
export declare function defaultCoworkSessionsDir(): string;
|
|
3
|
+
/**
|
|
4
|
+
* Scan Claude Cowork sessions stored under `~/Library/Application Support/Claude/local-agent-mode-sessions/`.
|
|
5
|
+
*
|
|
6
|
+
* Structure: <workspace-uuid>/<cowork-session-uuid>/local_<session-uuid>/audit.jsonl
|
|
7
|
+
* Each `local_<uuid>` directory represents one agent invocation and maps to one session envelope.
|
|
8
|
+
*
|
|
9
|
+
* The `audit.jsonl` format is compatible with `parseTranscript` — same `user`/`assistant` event
|
|
10
|
+
* shapes. Cowork-only event types (`system`, `rate_limit_event`) have no `message` field and are
|
|
11
|
+
* silently skipped. Sessions use `cowork://session/<uuid>` URLs to distinguish them from Claude Code
|
|
12
|
+
* sessions (`claudecode://session/<id>`).
|
|
13
|
+
*
|
|
14
|
+
* Returns an empty result when the directory is missing (non-macOS systems, first-time setup, etc.).
|
|
15
|
+
*/
|
|
16
|
+
export declare function scanCoworkSessions(options?: {
|
|
17
|
+
sessionsDir?: string;
|
|
18
|
+
sinceTime?: Date;
|
|
19
|
+
}): Promise<ScanResult>;
|
|
20
|
+
//# sourceMappingURL=cowork-scanner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cowork-scanner.d.ts","sourceRoot":"","sources":["../../src/sessions/cowork-scanner.ts"],"names":[],"mappings":"AAGA,OAAO,EAAyC,KAAK,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAE7F,wBAAgB,wBAAwB,IAAI,MAAM,CAQjD;AAQD;;;;;;;;;;;;GAYG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,GAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,IAAI,CAAA;CAAO,GACvD,OAAO,CAAC,UAAU,CAAC,CAoDrB"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { promises as fs } from 'fs';
|
|
2
|
+
import * as os from 'os';
|
|
3
|
+
import * as path from 'path';
|
|
4
|
+
import { parseTranscript } from './claude-scanner.js';
|
|
5
|
+
export function defaultCoworkSessionsDir() {
|
|
6
|
+
return path.join(os.homedir(), 'Library', 'Application Support', 'Claude', 'local-agent-mode-sessions');
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Matches the `local_<uuid>/audit.jsonl` path suffix that identifies one Cowork agent invocation.
|
|
10
|
+
* Captures the UUID portion (group 1) which becomes the session id.
|
|
11
|
+
*/
|
|
12
|
+
const LOCAL_AUDIT_RE = /[/\\]local_([^/\\]+)[/\\]audit\.jsonl$/;
|
|
13
|
+
/**
|
|
14
|
+
* Scan Claude Cowork sessions stored under `~/Library/Application Support/Claude/local-agent-mode-sessions/`.
|
|
15
|
+
*
|
|
16
|
+
* Structure: <workspace-uuid>/<cowork-session-uuid>/local_<session-uuid>/audit.jsonl
|
|
17
|
+
* Each `local_<uuid>` directory represents one agent invocation and maps to one session envelope.
|
|
18
|
+
*
|
|
19
|
+
* The `audit.jsonl` format is compatible with `parseTranscript` — same `user`/`assistant` event
|
|
20
|
+
* shapes. Cowork-only event types (`system`, `rate_limit_event`) have no `message` field and are
|
|
21
|
+
* silently skipped. Sessions use `cowork://session/<uuid>` URLs to distinguish them from Claude Code
|
|
22
|
+
* sessions (`claudecode://session/<id>`).
|
|
23
|
+
*
|
|
24
|
+
* Returns an empty result when the directory is missing (non-macOS systems, first-time setup, etc.).
|
|
25
|
+
*/
|
|
26
|
+
export async function scanCoworkSessions(options = {}) {
|
|
27
|
+
const dir = options.sessionsDir ?? defaultCoworkSessionsDir();
|
|
28
|
+
const sinceMs = options.sinceTime?.getTime();
|
|
29
|
+
let names;
|
|
30
|
+
try {
|
|
31
|
+
names = await fs.readdir(dir, { recursive: true });
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
// Treat any readdir failure (ENOENT, EACCES, ENOTDIR, …) as an empty result. Cowork scanning
|
|
35
|
+
// is best-effort and macOS-only; an error here must not abort the Claude Code capture running
|
|
36
|
+
// in parallel inside Promise.all.
|
|
37
|
+
return { envelopes: [], sessionCount: 0, ok: false };
|
|
38
|
+
}
|
|
39
|
+
const files = names.filter((name) => LOCAL_AUDIT_RE.test(name));
|
|
40
|
+
const envelopes = [];
|
|
41
|
+
let sessionCount = 0;
|
|
42
|
+
for (const relativePath of files) {
|
|
43
|
+
const fullPath = path.join(dir, relativePath);
|
|
44
|
+
if (sinceMs !== undefined) {
|
|
45
|
+
let stat;
|
|
46
|
+
try {
|
|
47
|
+
stat = await fs.stat(fullPath);
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
if (stat.mtimeMs < sinceMs) {
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
let content;
|
|
57
|
+
try {
|
|
58
|
+
content = await fs.readFile(fullPath, 'utf8');
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
const m = relativePath.match(LOCAL_AUDIT_RE);
|
|
64
|
+
if (!m) {
|
|
65
|
+
continue;
|
|
66
|
+
}
|
|
67
|
+
const sessionUuid = m[1];
|
|
68
|
+
sessionCount += 1;
|
|
69
|
+
const envelope = parseTranscript(content, sessionUuid);
|
|
70
|
+
if (envelope) {
|
|
71
|
+
envelopes.push({ ...envelope, url: `cowork://session/${sessionUuid}` });
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return { envelopes, sessionCount, ok: true };
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=cowork-scanner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cowork-scanner.js","sourceRoot":"","sources":["../../src/sessions/cowork-scanner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,IAAI,CAAC;AACpC,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,eAAe,EAAyC,MAAM,qBAAqB,CAAC;AAE7F,MAAM,UAAU,wBAAwB;IACtC,OAAO,IAAI,CAAC,IAAI,CACd,EAAE,CAAC,OAAO,EAAE,EACZ,SAAS,EACT,qBAAqB,EACrB,QAAQ,EACR,2BAA2B,CAC5B,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,cAAc,GAAG,wCAAwC,CAAC;AAEhE;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,UAAsD,EAAE;IAExD,MAAM,GAAG,GAAG,OAAO,CAAC,WAAW,IAAI,wBAAwB,EAAE,CAAC;IAC9D,MAAM,OAAO,GAAG,OAAO,CAAC,SAAS,EAAE,OAAO,EAAE,CAAC;IAE7C,IAAI,KAAe,CAAC;IACpB,IAAI,CAAC;QACH,KAAK,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACrD,CAAC;IAAC,MAAM,CAAC;QACP,6FAA6F;QAC7F,8FAA8F;QAC9F,kCAAkC;QAClC,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,YAAY,EAAE,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC;IACvD,CAAC;IAED,MAAM,KAAK,GAAI,KAAkB,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAC9E,MAAM,SAAS,GAAsB,EAAE,CAAC;IACxC,IAAI,YAAY,GAAG,CAAC,CAAC;IAErB,KAAK,MAAM,YAAY,IAAI,KAAK,EAAE,CAAC;QACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;QAE9C,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC1B,IAAI,IAAI,CAAC;YACT,IAAI,CAAC;gBACH,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACjC,CAAC;YAAC,MAAM,CAAC;gBACP,SAAS;YACX,CAAC;YACD,IAAI,IAAI,CAAC,OAAO,GAAG,OAAO,EAAE,CAAC;gBAC3B,SAAS;YACX,CAAC;QACH,CAAC;QAED,IAAI,OAAe,CAAC;QACpB,IAAI,CAAC;YACH,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAChD,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QAED,MAAM,CAAC,GAAG,YAAY,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;QAC7C,IAAI,CAAC,CAAC,EAAE,CAAC;YAAC,SAAS;QAAC,CAAC;QACrB,MAAM,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACzB,YAAY,IAAI,CAAC,CAAC;QAElB,MAAM,QAAQ,GAAG,eAAe,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QACvD,IAAI,QAAQ,EAAE,CAAC;YACb,SAAS,CAAC,IAAI,CAAC,EAAE,GAAG,QAAQ,EAAE,GAAG,EAAE,oBAAoB,WAAW,EAAE,EAAE,CAAC,CAAC;QAC1E,CAAC;IACH,CAAC;IAED,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;AAC/C,CAAC"}
|
package/dist/types.d.ts
CHANGED
|
@@ -85,7 +85,7 @@ export interface UpdateOptimizationOptions {
|
|
|
85
85
|
json?: boolean;
|
|
86
86
|
clientId?: string;
|
|
87
87
|
}
|
|
88
|
-
export interface
|
|
88
|
+
export interface AnalyzeClaudeSessionsOptions {
|
|
89
89
|
dryRun?: boolean;
|
|
90
90
|
clientId?: string;
|
|
91
91
|
json?: boolean;
|
|
@@ -98,6 +98,10 @@ export interface ComplaintBoxOptions {
|
|
|
98
98
|
json?: boolean;
|
|
99
99
|
clientId?: string;
|
|
100
100
|
}
|
|
101
|
+
export interface ClaudeOptions {
|
|
102
|
+
args: string[];
|
|
103
|
+
clientId?: string;
|
|
104
|
+
}
|
|
101
105
|
export declare const DEFAULT_BASE_URL = "https://coolhandlabs.com";
|
|
102
106
|
export declare const DEFAULT_TIMEOUT_MS: number;
|
|
103
107
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAyHA,MAAM,CAAC,MAAM,gBAAgB,GAAG,0BAA0B,CAAC;AAC3D,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC"}
|
package/dist/version.d.ts
CHANGED
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
* Auto-generated from package.json — do not edit manually.
|
|
3
3
|
* Run `npm run sync-version` or `npm run build` to regenerate.
|
|
4
4
|
*/
|
|
5
|
-
export declare const PACKAGE_VERSION = "0.
|
|
5
|
+
export declare const PACKAGE_VERSION = "0.5.1";
|
|
6
6
|
export declare const PACKAGE_NAME = "coolhand-cli";
|
|
7
7
|
/**
|
|
8
8
|
* Full package identifier
|
|
9
9
|
*/
|
|
10
|
-
export declare const PACKAGE_IDENTIFIER = "coolhand-cli-0.
|
|
10
|
+
export declare const PACKAGE_IDENTIFIER = "coolhand-cli-0.5.1";
|
|
11
11
|
//# sourceMappingURL=version.d.ts.map
|
package/dist/version.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Auto-generated from package.json — do not edit manually.
|
|
3
3
|
* Run `npm run sync-version` or `npm run build` to regenerate.
|
|
4
4
|
*/
|
|
5
|
-
export const PACKAGE_VERSION = '0.
|
|
5
|
+
export const PACKAGE_VERSION = '0.5.1';
|
|
6
6
|
export const PACKAGE_NAME = 'coolhand-cli';
|
|
7
7
|
/**
|
|
8
8
|
* Full package identifier
|