preclaim 0.2.9 → 0.3.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/dist/commands/init.js +7 -3
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/install-hooks.d.ts.map +1 -1
- package/dist/commands/install-hooks.js +0 -8
- package/dist/commands/install-hooks.js.map +1 -1
- package/dist/commands/logs.d.ts +2 -0
- package/dist/commands/logs.d.ts.map +1 -0
- package/dist/commands/logs.js +13 -0
- package/dist/commands/logs.js.map +1 -0
- package/dist/commands/sessions.d.ts +2 -0
- package/dist/commands/sessions.d.ts.map +1 -0
- package/dist/commands/sessions.js +12 -0
- package/dist/commands/sessions.js.map +1 -0
- package/dist/commands/whoami.d.ts.map +1 -1
- package/dist/commands/whoami.js +28 -5
- package/dist/commands/whoami.js.map +1 -1
- package/dist/hooks/heartbeat-daemon.js +32 -2
- package/dist/hooks/heartbeat-daemon.js.map +1 -1
- package/dist/hooks/pre-tool-use.js +9 -1
- package/dist/hooks/pre-tool-use.js.map +1 -1
- package/dist/hooks/session-start.js +8 -0
- package/dist/hooks/session-start.js.map +1 -1
- package/dist/hooks/stop.js +8 -34
- package/dist/hooks/stop.js.map +1 -1
- package/dist/index.js +11 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/hook-io.d.ts +2 -1
- package/dist/lib/hook-io.d.ts.map +1 -1
- package/dist/lib/hook-io.js +20 -2
- package/dist/lib/hook-io.js.map +1 -1
- package/dist/lib/output.d.ts +6 -1
- package/dist/lib/output.d.ts.map +1 -1
- package/dist/lib/output.js +55 -0
- package/dist/lib/output.js.map +1 -1
- package/package.json +2 -2
package/dist/commands/init.js
CHANGED
|
@@ -19,7 +19,7 @@ export async function initCommand(opts) {
|
|
|
19
19
|
const config = defaultConfig(opts.projectId, backend);
|
|
20
20
|
await writeFile(configPath, JSON.stringify(config, null, 2) + '\n');
|
|
21
21
|
console.log(`Created .preclaim.json (project: ${opts.projectId})`);
|
|
22
|
-
printNextSteps();
|
|
22
|
+
printNextSteps(backend);
|
|
23
23
|
return;
|
|
24
24
|
}
|
|
25
25
|
// Check if logged in, if not: login first
|
|
@@ -72,13 +72,17 @@ export async function initCommand(opts) {
|
|
|
72
72
|
const config = defaultConfig(data.project_id, backend);
|
|
73
73
|
await writeFile(configPath, JSON.stringify(config, null, 2) + '\n');
|
|
74
74
|
console.log(`\nCreated .preclaim.json`);
|
|
75
|
-
printNextSteps();
|
|
75
|
+
printNextSteps(backend);
|
|
76
76
|
}
|
|
77
|
-
function printNextSteps() {
|
|
77
|
+
function printNextSteps(backend) {
|
|
78
|
+
const dashboardUrl = backend.replace(/\/api\/v1$/, '').replace(/\/$/, '');
|
|
78
79
|
console.log('');
|
|
79
80
|
console.log('Next steps:');
|
|
80
81
|
console.log(' 1. preclaim install-hooks');
|
|
81
82
|
console.log(' 2. Commit .preclaim.json to your repo');
|
|
82
83
|
console.log(' 3. Open multiple Claude Code terminals — locks are automatic');
|
|
84
|
+
console.log('');
|
|
85
|
+
console.log(`Dashboard: ${dashboardUrl}/dashboard`);
|
|
86
|
+
console.log('View your locks and activity in real-time.');
|
|
83
87
|
}
|
|
84
88
|
//# sourceMappingURL=init.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjF,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1C,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAA6C;IAC7E,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,gBAAgB,CAAC,CAAC;IAEzD,0BAA0B;IAC1B,IAAI,CAAC;QACH,MAAM,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QACpC,OAAO,CAAC,GAAG,CAAC,iEAAiE,CAAC,CAAC;QAC/E,OAAO;IACT,CAAC;IAAC,MAAM,CAAC;QACP,8BAA8B;IAChC,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;IAE7B,mDAAmD;IACnD,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;QACnB,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QACtD,MAAM,SAAS,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;QACpE,OAAO,CAAC,GAAG,CAAC,oCAAoC,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC;QACnE,cAAc,
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install-hooks.d.ts","sourceRoot":"","sources":["../../src/commands/install-hooks.ts"],"names":[],"mappings":"AAaA,wBAAsB,mBAAmB,
|
|
1
|
+
{"version":3,"file":"install-hooks.d.ts","sourceRoot":"","sources":["../../src/commands/install-hooks.ts"],"names":[],"mappings":"AAaA,wBAAsB,mBAAmB,kBAgDxC"}
|
|
@@ -29,13 +29,6 @@ export async function installHooksCommand() {
|
|
|
29
29
|
command: 'preclaim hook post-tool-use',
|
|
30
30
|
}],
|
|
31
31
|
}],
|
|
32
|
-
Stop: [{
|
|
33
|
-
matcher: '',
|
|
34
|
-
hooks: [{
|
|
35
|
-
type: 'command',
|
|
36
|
-
command: 'preclaim hook stop',
|
|
37
|
-
}],
|
|
38
|
-
}],
|
|
39
32
|
SessionStart: [{
|
|
40
33
|
matcher: '',
|
|
41
34
|
hooks: [{
|
|
@@ -51,7 +44,6 @@ export async function installHooksCommand() {
|
|
|
51
44
|
console.log('Hooks configured:');
|
|
52
45
|
console.log(' - PreToolUse: file lock gatekeeper');
|
|
53
46
|
console.log(' - PostToolUse: commit detection → release locks');
|
|
54
|
-
console.log(' - Stop: session cleanup');
|
|
55
47
|
console.log(' - SessionStart: session registration + heartbeat');
|
|
56
48
|
}
|
|
57
49
|
//# sourceMappingURL=install-hooks.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install-hooks.js","sourceRoot":"","sources":["../../src/commands/install-hooks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAYjC,MAAM,CAAC,KAAK,UAAU,mBAAmB;IACvC,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,CAAC,CAAC;IACnD,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC;IAExD,uCAAuC;IACvC,IAAI,QAAQ,GAAmB,EAAE,CAAC;IAClC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QAClD,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,qBAAqB;IACvB,CAAC;IAED,oEAAoE;IACpE,uDAAuD;IACvD,QAAQ,CAAC,KAAK,GAAG;QACf,UAAU,EAAE,CAAC;gBACX,OAAO,EAAE,EAAE;gBACX,KAAK,EAAE,CAAC;wBACN,IAAI,EAAE,SAAS;wBACf,OAAO,EAAE,4BAA4B;qBACtC,CAAC;aACH,CAAC;QACF,WAAW,EAAE,CAAC;gBACZ,OAAO,EAAE,EAAE;gBACX,KAAK,EAAE,CAAC;wBACN,IAAI,EAAE,SAAS;wBACf,OAAO,EAAE,6BAA6B;qBACvC,CAAC;aACH,CAAC;QACF,
|
|
1
|
+
{"version":3,"file":"install-hooks.js","sourceRoot":"","sources":["../../src/commands/install-hooks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAYjC,MAAM,CAAC,KAAK,UAAU,mBAAmB;IACvC,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,CAAC,CAAC;IACnD,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC;IAExD,uCAAuC;IACvC,IAAI,QAAQ,GAAmB,EAAE,CAAC;IAClC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QAClD,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,qBAAqB;IACvB,CAAC;IAED,oEAAoE;IACpE,uDAAuD;IACvD,QAAQ,CAAC,KAAK,GAAG;QACf,UAAU,EAAE,CAAC;gBACX,OAAO,EAAE,EAAE;gBACX,KAAK,EAAE,CAAC;wBACN,IAAI,EAAE,SAAS;wBACf,OAAO,EAAE,4BAA4B;qBACtC,CAAC;aACH,CAAC;QACF,WAAW,EAAE,CAAC;gBACZ,OAAO,EAAE,EAAE;gBACX,KAAK,EAAE,CAAC;wBACN,IAAI,EAAE,SAAS;wBACf,OAAO,EAAE,6BAA6B;qBACvC,CAAC;aACH,CAAC;QACF,YAAY,EAAE,CAAC;gBACb,OAAO,EAAE,EAAE;gBACX,KAAK,EAAE,CAAC;wBACN,IAAI,EAAE,SAAS;wBACf,OAAO,EAAE,6BAA6B;qBACvC,CAAC;aACH,CAAC;KACH,CAAC;IAEF,MAAM,KAAK,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9C,MAAM,SAAS,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAExE,OAAO,CAAC,GAAG,CAAC,sDAAsD,CAAC,CAAC;IACpE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;IACjC,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;IACpD,OAAO,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAC;IACjE,OAAO,CAAC,GAAG,CAAC,oDAAoD,CAAC,CAAC;AACpE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logs.d.ts","sourceRoot":"","sources":["../../src/commands/logs.ts"],"names":[],"mappings":"AAGA,wBAAsB,WAAW,kBAYhC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { resolveContext } from '../lib/client-factory.js';
|
|
2
|
+
import { formatActivityTable } from '../lib/output.js';
|
|
3
|
+
export async function logsCommand() {
|
|
4
|
+
const { client, config } = await resolveContext();
|
|
5
|
+
const result = await client.listActivity(config.projectId);
|
|
6
|
+
if (result.error) {
|
|
7
|
+
console.error(`Failed to fetch logs: ${result.error}`);
|
|
8
|
+
process.exit(1);
|
|
9
|
+
}
|
|
10
|
+
const entries = result.data.slice(0, 20);
|
|
11
|
+
console.log(formatActivityTable(entries));
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=logs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logs.js","sourceRoot":"","sources":["../../src/commands/logs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAEvD,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,cAAc,EAAE,CAAC;IAElD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAE3D,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,OAAO,CAAC,KAAK,CAAC,yBAAyB,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QACvD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,CAAC,IAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC1C,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,CAAC;AAC5C,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sessions.d.ts","sourceRoot":"","sources":["../../src/commands/sessions.ts"],"names":[],"mappings":"AAGA,wBAAsB,eAAe,kBAWpC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { resolveContext } from '../lib/client-factory.js';
|
|
2
|
+
import { formatSessionTable } from '../lib/output.js';
|
|
3
|
+
export async function sessionsCommand() {
|
|
4
|
+
const { client, config } = await resolveContext();
|
|
5
|
+
const result = await client.listSessions(config.projectId);
|
|
6
|
+
if (result.error) {
|
|
7
|
+
console.error(`Failed to fetch sessions: ${result.error}`);
|
|
8
|
+
process.exit(1);
|
|
9
|
+
}
|
|
10
|
+
console.log(formatSessionTable(result.data));
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=sessions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sessions.js","sourceRoot":"","sources":["../../src/commands/sessions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAEtD,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,cAAc,EAAE,CAAC;IAElD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAE3D,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,OAAO,CAAC,KAAK,CAAC,6BAA6B,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QAC3D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,MAAM,CAAC,IAAK,CAAC,CAAC,CAAC;AAChD,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"whoami.d.ts","sourceRoot":"","sources":["../../src/commands/whoami.ts"],"names":[],"mappings":"AAEA,wBAAsB,aAAa,
|
|
1
|
+
{"version":3,"file":"whoami.d.ts","sourceRoot":"","sources":["../../src/commands/whoami.ts"],"names":[],"mappings":"AAEA,wBAAsB,aAAa,kBAuClC"}
|
package/dist/commands/whoami.js
CHANGED
|
@@ -1,13 +1,36 @@
|
|
|
1
|
-
import { loadCredentials } from '@preclaim/core';
|
|
1
|
+
import { PreclaimClient, loadCredentials, findConfig } from '@preclaim/core';
|
|
2
2
|
export async function whoamiCommand() {
|
|
3
3
|
const creds = await loadCredentials();
|
|
4
4
|
if (!creds) {
|
|
5
5
|
console.log('Not logged in. Run `preclaim login` to authenticate.');
|
|
6
|
+
process.exit(1);
|
|
7
|
+
}
|
|
8
|
+
const found = await findConfig();
|
|
9
|
+
const baseUrl = found?.config.backend ?? 'https://preclaim.dev';
|
|
10
|
+
const client = new PreclaimClient({
|
|
11
|
+
baseUrl,
|
|
12
|
+
accessToken: creds.accessToken,
|
|
13
|
+
timeoutMs: 5000,
|
|
14
|
+
});
|
|
15
|
+
const { data, error } = await client.getMe();
|
|
16
|
+
if (error || !data) {
|
|
17
|
+
// Fallback to local credentials if API is unreachable
|
|
18
|
+
console.log(`Email: ${creds.user.email}`);
|
|
19
|
+
console.log(`User: ${creds.user.id}`);
|
|
20
|
+
console.log(`Org: ${creds.user.orgId ?? 'none'}`);
|
|
6
21
|
return;
|
|
7
22
|
}
|
|
8
|
-
console.log(`Email: ${
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
23
|
+
console.log(`Email: ${data.user.email}`);
|
|
24
|
+
if (data.user.name) {
|
|
25
|
+
console.log(`Name: ${data.user.name}`);
|
|
26
|
+
}
|
|
27
|
+
console.log(`User: ${data.user.id}`);
|
|
28
|
+
console.log(`Role: ${data.user.role}`);
|
|
29
|
+
if (data.org) {
|
|
30
|
+
console.log(`Org: ${data.org.name} (${data.org.slug})`);
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
console.log(`Org: none`);
|
|
34
|
+
}
|
|
12
35
|
}
|
|
13
36
|
//# sourceMappingURL=whoami.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"whoami.js","sourceRoot":"","sources":["../../src/commands/whoami.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"whoami.js","sourceRoot":"","sources":["../../src/commands/whoami.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAE7E,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,MAAM,KAAK,GAAG,MAAM,eAAe,EAAE,CAAC;IAEtC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,GAAG,CAAC,sDAAsD,CAAC,CAAC;QACpE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,UAAU,EAAE,CAAC;IACjC,MAAM,OAAO,GAAG,KAAK,EAAE,MAAM,CAAC,OAAO,IAAI,sBAAsB,CAAC;IAEhE,MAAM,MAAM,GAAG,IAAI,cAAc,CAAC;QAChC,OAAO;QACP,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,SAAS,EAAE,IAAI;KAChB,CAAC,CAAC;IAEH,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;IAE7C,IAAI,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC;QACnB,sDAAsD;QACtD,OAAO,CAAC,GAAG,CAAC,WAAW,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;QAC3C,OAAO,CAAC,GAAG,CAAC,WAAW,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;QACxC,OAAO,CAAC,GAAG,CAAC,WAAW,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,MAAM,EAAE,CAAC,CAAC;QACrD,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;IAC1C,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACnB,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IAC3C,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;IACvC,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IAEzC,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,CAAC,GAAG,CAAC,IAAI,KAAK,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC;IAC7D,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAC9B,CAAC;AACH,CAAC"}
|
|
@@ -1,10 +1,14 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
// Heartbeat daemon — runs as detached background process
|
|
3
|
-
// Extends TTL on all session locks every 60s
|
|
3
|
+
// Extends TTL on all session locks every 60s, but only when the session is active.
|
|
4
|
+
// Stops heartbeating when idle, exits after prolonged inactivity.
|
|
5
|
+
import { readFile } from 'node:fs/promises';
|
|
6
|
+
import { join } from 'node:path';
|
|
4
7
|
import { PreclaimClient } from '@preclaim/core';
|
|
5
8
|
const sessionId = process.env.PRECLAIM_SESSION_ID;
|
|
6
9
|
const backend = process.env.PRECLAIM_BACKEND;
|
|
7
10
|
const accessToken = process.env.PRECLAIM_ACCESS_TOKEN;
|
|
11
|
+
const idleTimeoutMinutes = parseInt(process.env.PRECLAIM_IDLE_TIMEOUT ?? '15', 10);
|
|
8
12
|
if (!sessionId || !backend || !accessToken) {
|
|
9
13
|
process.exit(1);
|
|
10
14
|
}
|
|
@@ -15,10 +19,21 @@ const client = new PreclaimClient({
|
|
|
15
19
|
});
|
|
16
20
|
const INTERVAL_MS = 60_000;
|
|
17
21
|
const MAX_FAILURES = 5;
|
|
22
|
+
const MAX_IDLE_TICKS = 30; // 30 ticks × 60s = 30 min without activity → daemon exits
|
|
18
23
|
let failures = 0;
|
|
24
|
+
let idleTicks = 0;
|
|
25
|
+
const activityFile = join(process.cwd(), '.preclaim.activity');
|
|
26
|
+
async function getLastActivity() {
|
|
27
|
+
try {
|
|
28
|
+
const raw = await readFile(activityFile, 'utf-8');
|
|
29
|
+
return parseInt(raw.trim(), 10);
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
return 0;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
19
35
|
async function heartbeat() {
|
|
20
36
|
// Check if access token has likely expired (JWT default: 1 hour)
|
|
21
|
-
// If daemon has been running > 55 min, count it as a failure
|
|
22
37
|
const uptimeMs = Date.now() - startTime;
|
|
23
38
|
if (uptimeMs > 55 * 60 * 1000) {
|
|
24
39
|
failures++;
|
|
@@ -27,6 +42,21 @@ async function heartbeat() {
|
|
|
27
42
|
}
|
|
28
43
|
return;
|
|
29
44
|
}
|
|
45
|
+
// Check activity
|
|
46
|
+
const lastActivity = await getLastActivity();
|
|
47
|
+
const idleMs = Date.now() - lastActivity;
|
|
48
|
+
const idleMinutes = idleMs / 60_000;
|
|
49
|
+
if (lastActivity === 0 || idleMinutes >= idleTimeoutMinutes) {
|
|
50
|
+
// Session is idle — skip heartbeat, let locks expire via server TTL
|
|
51
|
+
idleTicks++;
|
|
52
|
+
if (idleTicks >= MAX_IDLE_TICKS) {
|
|
53
|
+
// Prolonged inactivity — self-cleanup
|
|
54
|
+
process.exit(0);
|
|
55
|
+
}
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
// Session is active — reset idle counter and send heartbeat
|
|
59
|
+
idleTicks = 0;
|
|
30
60
|
const result = await client.heartbeat({ session_id: sessionId });
|
|
31
61
|
if (result.error) {
|
|
32
62
|
failures++;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"heartbeat-daemon.js","sourceRoot":"","sources":["../../src/hooks/heartbeat-daemon.ts"],"names":[],"mappings":";AACA,yDAAyD;AACzD,
|
|
1
|
+
{"version":3,"file":"heartbeat-daemon.js","sourceRoot":"","sources":["../../src/hooks/heartbeat-daemon.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
// PreToolUse hook — the gatekeeper
|
|
3
3
|
// Intercepts Edit/Write/MultiEdit tool calls, claims file locks
|
|
4
|
-
import { resolve, relative, dirname } from 'node:path';
|
|
4
|
+
import { resolve, relative, dirname, join } from 'node:path';
|
|
5
|
+
import { writeFile } from 'node:fs/promises';
|
|
5
6
|
import { PreclaimClient, findConfig, loadCredentials, refreshCredentials } from '@preclaim/core';
|
|
6
7
|
import { readHookInput, writeHookOutput } from '../lib/hook-io.js';
|
|
7
8
|
import { minimatch } from 'minimatch';
|
|
@@ -9,6 +10,13 @@ const WRITE_TOOLS = new Set(['Edit', 'Write', 'MultiEdit']);
|
|
|
9
10
|
async function main() {
|
|
10
11
|
try {
|
|
11
12
|
const input = await readHookInput();
|
|
13
|
+
// Update activity timestamp on every tool call (not just writes)
|
|
14
|
+
try {
|
|
15
|
+
await writeFile(join(process.cwd(), '.preclaim.activity'), String(Date.now()));
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
// Non-critical — don't block on activity tracking
|
|
19
|
+
}
|
|
12
20
|
// Only intercept file-writing tools
|
|
13
21
|
if (!input.tool_name || !WRITE_TOOLS.has(input.tool_name)) {
|
|
14
22
|
return; // No output = allow
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pre-tool-use.js","sourceRoot":"","sources":["../../src/hooks/pre-tool-use.ts"],"names":[],"mappings":";AACA,mCAAmC;AACnC,gEAAgE;AAEhE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"pre-tool-use.js","sourceRoot":"","sources":["../../src/hooks/pre-tool-use.ts"],"names":[],"mappings":";AACA,mCAAmC;AACnC,gEAAgE;AAEhE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC7D,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACjG,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACnE,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC;AAE5D,KAAK,UAAU,IAAI;IACjB,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,aAAa,EAAE,CAAC;QAEpC,iEAAiE;QACjE,IAAI,CAAC;YACH,MAAM,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,oBAAoB,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACjF,CAAC;QAAC,MAAM,CAAC;YACP,kDAAkD;QACpD,CAAC;QAED,oCAAoC;QACpC,IAAI,CAAC,KAAK,CAAC,SAAS,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;YAC1D,OAAO,CAAC,oBAAoB;QAC9B,CAAC;QAED,oCAAoC;QACpC,MAAM,QAAQ,GAAG,KAAK,CAAC,UAAU,EAAE,SAA+B,CAAC;QACnE,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,CAAC,uBAAuB;QACjC,CAAC;QAED,cAAc;QACd,MAAM,KAAK,GAAG,MAAM,UAAU,EAAE,CAAC;QACjC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,6CAA6C;QACvD,CAAC;QAED,kDAAkD;QAClD,sEAAsE;QACtE,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAC9C,MAAM,YAAY,GAAG,OAAO,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;QACpD,MAAM,YAAY,GAAG,QAAQ,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;QAEzD,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,SAAS,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC;YAC1E,OAAO,CAAC,uBAAuB;QACjC,CAAC;QAED,uCAAuC;QACvC,IAAI,KAAK,GAAG,MAAM,eAAe,EAAE,CAAC;QACpC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,IAAI,KAAK,CAAC,MAAM,CAAC,QAAQ;gBAAE,OAAO;YAClC,eAAe,CAAC;gBACd,kBAAkB,EAAE,MAAM;gBAC1B,MAAM,EAAE,oDAAoD;aAC7D,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QAED,wCAAwC;QACxC,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC;QACtD,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,SAAS,GAAG,MAAM,EAAE,CAAC;YACrC,MAAM,SAAS,GAAG,MAAM,kBAAkB,EAAE,CAAC;YAC7C,IAAI,SAAS,EAAE,CAAC;gBACd,KAAK,GAAG,SAAS,CAAC;YACpB,CAAC;YACD,8CAA8C;QAChD,CAAC;QAED,aAAa;QACb,MAAM,MAAM,GAAG,IAAI,cAAc,CAAC;YAChC,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,OAAO;YAC7B,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9B,SAAS,EAAE,IAAI,EAAE,eAAe;SACjC,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC;YACpC,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC,SAAS;YAClC,SAAS,EAAE,YAAY;YACvB,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,WAAW,EAAE,KAAK,CAAC,MAAM,CAAC,GAAG;SAC9B,CAAC,CAAC;QAEH,4BAA4B;QAC5B,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YACjB,IAAI,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;gBAC1B,eAAe,CAAC;oBACd,kBAAkB,EAAE,OAAO;oBAC3B,aAAa,EAAE,+CAA+C,MAAM,CAAC,KAAK,6BAA6B;iBACxG,CAAC,CAAC;gBACH,OAAO;YACT,CAAC;YACD,eAAe,CAAC;gBACd,kBAAkB,EAAE,MAAM;gBAC1B,MAAM,EAAE,4BAA4B,MAAM,CAAC,KAAK,EAAE;aACnD,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,CAAC,IAAK,CAAC;QAE1B,IAAI,IAAI,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;YAC/B,eAAe,CAAC;gBACd,kBAAkB,EAAE,OAAO;gBAC3B,aAAa,EAAE,sBAAsB,YAAY,cAAc,IAAI,CAAC,UAAU,GAAG;aAClF,CAAC,CAAC;QACL,CAAC;aAAM,IAAI,IAAI,CAAC,MAAM,KAAK,cAAc,EAAE,CAAC;YAC1C,eAAe,CAAC;gBACd,kBAAkB,EAAE,OAAO;gBAC3B,aAAa,EAAE,6BAA6B,YAAY,cAAc,IAAI,CAAC,UAAU,GAAG;aACzF,CAAC,CAAC;QACL,CAAC;aAAM,IAAI,IAAI,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;YACtC,eAAe,CAAC;gBACd,kBAAkB,EAAE,MAAM;gBAC1B,MAAM,EAAE;oBACN,aAAa,YAAY,gCAAgC;oBACzD,cAAc,IAAI,CAAC,MAAO,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG;oBACpD,YAAY,IAAI,IAAI,CAAC,IAAI,CAAC,MAAO,CAAC,WAAW,CAAC,CAAC,kBAAkB,EAAE,EAAE;oBACrE,cAAc,IAAI,IAAI,CAAC,IAAI,CAAC,MAAO,CAAC,UAAU,CAAC,CAAC,kBAAkB,EAAE,EAAE;oBACtE,EAAE;oBACF,0DAA0D;iBAC3D,CAAC,IAAI,CAAC,IAAI,CAAC;aACb,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,sCAAsC;QACtC,OAAO;IACT,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC"}
|
|
@@ -46,7 +46,14 @@ async function main() {
|
|
|
46
46
|
});
|
|
47
47
|
return;
|
|
48
48
|
}
|
|
49
|
+
writeHookOutput({
|
|
50
|
+
systemMessage: `[Preclaim] Error: could not register session (${result.error}). File locking disabled.`,
|
|
51
|
+
});
|
|
52
|
+
return;
|
|
49
53
|
}
|
|
54
|
+
// Write initial activity timestamp
|
|
55
|
+
const activityFile = join(process.cwd(), '.preclaim.activity');
|
|
56
|
+
await writeFile(activityFile, String(Date.now()));
|
|
50
57
|
// Start heartbeat daemon
|
|
51
58
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
52
59
|
const heartbeatScript = join(__dirname, 'heartbeat-daemon.js');
|
|
@@ -58,6 +65,7 @@ async function main() {
|
|
|
58
65
|
PRECLAIM_SESSION_ID: input.session_id,
|
|
59
66
|
PRECLAIM_BACKEND: found.config.backend,
|
|
60
67
|
PRECLAIM_ACCESS_TOKEN: creds.accessToken,
|
|
68
|
+
PRECLAIM_IDLE_TIMEOUT: String(found.config.idleTimeoutMinutes ?? 15),
|
|
61
69
|
},
|
|
62
70
|
});
|
|
63
71
|
daemon.unref();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-start.js","sourceRoot":"","sources":["../../src/hooks/session-start.ts"],"names":[],"mappings":";AACA,2BAA2B;AAC3B,qEAAqE;AAErE,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACjG,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEnE,KAAK,UAAU,IAAI;IACjB,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,aAAa,EAAE,CAAC;QAEpC,MAAM,KAAK,GAAG,MAAM,UAAU,EAAE,CAAC;QACjC,IAAI,CAAC,KAAK;YAAE,OAAO;QAEnB,IAAI,KAAK,GAAG,MAAM,eAAe,EAAE,CAAC;QACpC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,eAAe,CAAC;gBACd,aAAa,EAAE,sFAAsF;aACtG,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QAED,wCAAwC;QACxC,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC;QACtD,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,SAAS,GAAG,MAAM,EAAE,CAAC;YACrC,MAAM,SAAS,GAAG,MAAM,kBAAkB,EAAE,CAAC;YAC7C,IAAI,SAAS,EAAE,CAAC;gBACd,KAAK,GAAG,SAAS,CAAC;YACpB,CAAC;QACH,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,cAAc,CAAC;YAChC,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,OAAO;YAC7B,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9B,SAAS,EAAE,IAAI;SAChB,CAAC,CAAC;QAEH,mBAAmB;QACnB,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC;YAC1C,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC,SAAS;YAClC,QAAQ,EAAE,aAAa;SACxB,CAAC,CAAC;QAEH,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YACjB,IAAI,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;gBAC1B,eAAe,CAAC;oBACd,aAAa,EAAE,mDAAmD,MAAM,CAAC,KAAK,+BAA+B;iBAC9G,CAAC,CAAC;gBACH,OAAO;YACT,CAAC;
|
|
1
|
+
{"version":3,"file":"session-start.js","sourceRoot":"","sources":["../../src/hooks/session-start.ts"],"names":[],"mappings":"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"}
|
package/dist/hooks/stop.js
CHANGED
|
@@ -1,40 +1,14 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
// Stop hook —
|
|
3
|
-
//
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
2
|
+
// Stop hook — no-op
|
|
3
|
+
// Cleanup is handled by:
|
|
4
|
+
// - Activity-aware heartbeat daemon (locks expire when idle)
|
|
5
|
+
// - Server-side cleanup_expired_locks() via pg_cron
|
|
6
|
+
// - Daemon self-exit after prolonged inactivity
|
|
7
7
|
import { readHookInput } from '../lib/hook-io.js';
|
|
8
8
|
async function main() {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
if (!found)
|
|
13
|
-
return;
|
|
14
|
-
const creds = await loadCredentials();
|
|
15
|
-
if (!creds)
|
|
16
|
-
return;
|
|
17
|
-
const client = new PreclaimClient({
|
|
18
|
-
baseUrl: found.config.backend,
|
|
19
|
-
accessToken: creds.accessToken,
|
|
20
|
-
timeoutMs: 3000,
|
|
21
|
-
});
|
|
22
|
-
// End session (releases all locks)
|
|
23
|
-
await client.endSession(input.session_id);
|
|
24
|
-
// Kill heartbeat daemon if running
|
|
25
|
-
const pidFile = join(process.cwd(), '.preclaim.pid');
|
|
26
|
-
try {
|
|
27
|
-
const pid = parseInt(await readFile(pidFile, 'utf-8'), 10);
|
|
28
|
-
process.kill(pid, 'SIGTERM');
|
|
29
|
-
await unlink(pidFile);
|
|
30
|
-
}
|
|
31
|
-
catch {
|
|
32
|
-
// No daemon running or already stopped
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
catch {
|
|
36
|
-
// Silent fail — cleanup is best-effort
|
|
37
|
-
}
|
|
9
|
+
// Consume stdin to satisfy hook protocol
|
|
10
|
+
await readHookInput();
|
|
11
|
+
// No action — intentionally empty
|
|
38
12
|
}
|
|
39
13
|
main();
|
|
40
14
|
//# sourceMappingURL=stop.js.map
|
package/dist/hooks/stop.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stop.js","sourceRoot":"","sources":["../../src/hooks/stop.ts"],"names":[],"mappings":";AACA,
|
|
1
|
+
{"version":3,"file":"stop.js","sourceRoot":"","sources":["../../src/hooks/stop.ts"],"names":[],"mappings":";AACA,oBAAoB;AACpB,yBAAyB;AACzB,6DAA6D;AAC7D,oDAAoD;AACpD,gDAAgD;AAEhD,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAElD,KAAK,UAAU,IAAI;IACjB,yCAAyC;IACzC,MAAM,aAAa,EAAE,CAAC;IACtB,kCAAkC;AACpC,CAAC;AAED,IAAI,EAAE,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -9,11 +9,13 @@ import { checkCommand } from './commands/check.js';
|
|
|
9
9
|
import { whoamiCommand } from './commands/whoami.js';
|
|
10
10
|
import { configCommand } from './commands/config.js';
|
|
11
11
|
import { installHooksCommand } from './commands/install-hooks.js';
|
|
12
|
+
import { logsCommand } from './commands/logs.js';
|
|
13
|
+
import { sessionsCommand } from './commands/sessions.js';
|
|
12
14
|
const program = new Command();
|
|
13
15
|
program
|
|
14
16
|
.name('preclaim')
|
|
15
17
|
.description('AI File Coordination Layer — predictive file locking for AI coding agents')
|
|
16
|
-
.version('0.
|
|
18
|
+
.version('0.3.0');
|
|
17
19
|
program
|
|
18
20
|
.command('init')
|
|
19
21
|
.description('Initialize Preclaim in the current project')
|
|
@@ -54,6 +56,14 @@ program
|
|
|
54
56
|
.option('--get <key>', 'Get a config value')
|
|
55
57
|
.option('--set <key=value>', 'Set a config value')
|
|
56
58
|
.action(configCommand);
|
|
59
|
+
program
|
|
60
|
+
.command('sessions')
|
|
61
|
+
.description('Show active sessions for this project')
|
|
62
|
+
.action(sessionsCommand);
|
|
63
|
+
program
|
|
64
|
+
.command('logs')
|
|
65
|
+
.description('Show recent lock activity for this project')
|
|
66
|
+
.action(logsCommand);
|
|
57
67
|
program
|
|
58
68
|
.command('install-hooks')
|
|
59
69
|
.description('Install Claude Code hooks in the current project')
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/hook-io.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export interface ClaudeHookInput {
|
|
2
2
|
session_id: string;
|
|
3
|
+
hook_event_name?: string;
|
|
3
4
|
tool_name?: string;
|
|
4
5
|
tool_input?: Record<string, unknown>;
|
|
5
6
|
}
|
|
@@ -9,5 +10,5 @@ export interface ClaudeHookOutput {
|
|
|
9
10
|
systemMessage?: string;
|
|
10
11
|
}
|
|
11
12
|
export declare function readHookInput(): Promise<ClaudeHookInput>;
|
|
12
|
-
export declare function writeHookOutput(output: ClaudeHookOutput): void;
|
|
13
|
+
export declare function writeHookOutput(output: ClaudeHookOutput, eventName?: string): void;
|
|
13
14
|
//# sourceMappingURL=hook-io.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hook-io.d.ts","sourceRoot":"","sources":["../../src/lib/hook-io.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACtC;AAED,MAAM,WAAW,gBAAgB;IAC/B,kBAAkB,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IACtC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,wBAAsB,aAAa,IAAI,OAAO,CAAC,eAAe,CAAC,CAiB9D;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"hook-io.d.ts","sourceRoot":"","sources":["../../src/lib/hook-io.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACtC;AAED,MAAM,WAAW,gBAAgB;IAC/B,kBAAkB,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IACtC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,wBAAsB,aAAa,IAAI,OAAO,CAAC,eAAe,CAAC,CAiB9D;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,gBAAgB,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAoBlF"}
|
package/dist/lib/hook-io.js
CHANGED
|
@@ -18,7 +18,25 @@ export async function readHookInput() {
|
|
|
18
18
|
setTimeout(() => reject(new Error('Hook input timeout')), 3000);
|
|
19
19
|
});
|
|
20
20
|
}
|
|
21
|
-
export function writeHookOutput(output) {
|
|
22
|
-
|
|
21
|
+
export function writeHookOutput(output, eventName) {
|
|
22
|
+
const hookEventName = eventName ?? 'PreToolUse';
|
|
23
|
+
if (output.permissionDecision === 'deny') {
|
|
24
|
+
process.stdout.write(JSON.stringify({
|
|
25
|
+
hookSpecificOutput: {
|
|
26
|
+
hookEventName,
|
|
27
|
+
permissionDecision: 'deny',
|
|
28
|
+
permissionDecisionReason: output.reason ?? 'Denied by Preclaim',
|
|
29
|
+
},
|
|
30
|
+
}));
|
|
31
|
+
}
|
|
32
|
+
else if (output.permissionDecision === 'allow') {
|
|
33
|
+
process.stdout.write(JSON.stringify({
|
|
34
|
+
hookSpecificOutput: {
|
|
35
|
+
hookEventName,
|
|
36
|
+
permissionDecision: 'allow',
|
|
37
|
+
...(output.systemMessage ? { permissionDecisionReason: output.systemMessage } : {}),
|
|
38
|
+
},
|
|
39
|
+
}));
|
|
40
|
+
}
|
|
23
41
|
}
|
|
24
42
|
//# sourceMappingURL=hook-io.js.map
|
package/dist/lib/hook-io.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hook-io.js","sourceRoot":"","sources":["../../src/lib/hook-io.ts"],"names":[],"mappings":"AAAA,yCAAyC;AACzC,+DAA+D;
|
|
1
|
+
{"version":3,"file":"hook-io.js","sourceRoot":"","sources":["../../src/lib/hook-io.ts"],"names":[],"mappings":"AAAA,yCAAyC;AACzC,+DAA+D;AAe/D,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,IAAI,IAAI,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QACnC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,GAAG,IAAI,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACxD,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;YAC3B,IAAI,CAAC;gBACH,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;YAC5B,CAAC;YAAC,MAAM,CAAC;gBACP,MAAM,CAAC,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC,CAAC;YAClD,CAAC;QACH,CAAC,CAAC,CAAC;QACH,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAElC,mBAAmB;QACnB,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,MAAwB,EAAE,SAAkB;IAC1E,MAAM,aAAa,GAAG,SAAS,IAAI,YAAY,CAAC;IAEhD,IAAI,MAAM,CAAC,kBAAkB,KAAK,MAAM,EAAE,CAAC;QACzC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC;YAClC,kBAAkB,EAAE;gBAClB,aAAa;gBACb,kBAAkB,EAAE,MAAM;gBAC1B,wBAAwB,EAAE,MAAM,CAAC,MAAM,IAAI,oBAAoB;aAChE;SACF,CAAC,CAAC,CAAC;IACN,CAAC;SAAM,IAAI,MAAM,CAAC,kBAAkB,KAAK,OAAO,EAAE,CAAC;QACjD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC;YAClC,kBAAkB,EAAE;gBAClB,aAAa;gBACb,kBAAkB,EAAE,OAAO;gBAC3B,GAAG,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,wBAAwB,EAAE,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACpF;SACF,CAAC,CAAC,CAAC;IACN,CAAC;AACH,CAAC"}
|
package/dist/lib/output.d.ts
CHANGED
|
@@ -1,4 +1,9 @@
|
|
|
1
|
-
import type { Lock } from '@preclaim/core';
|
|
1
|
+
import type { Lock, ActivityEntry, SessionWithProfile } from '@preclaim/core';
|
|
2
|
+
export declare function formatBytes(bytes: number): string;
|
|
3
|
+
export declare function formatDuration(ms: number): string;
|
|
2
4
|
export declare function formatLock(lock: Lock): string;
|
|
5
|
+
export declare function formatSession(session: SessionWithProfile): string;
|
|
6
|
+
export declare function formatSessionTable(sessions: SessionWithProfile[]): string;
|
|
3
7
|
export declare function formatLockTable(locks: Lock[]): string;
|
|
8
|
+
export declare function formatActivityTable(entries: ActivityEntry[]): string;
|
|
4
9
|
//# sourceMappingURL=output.d.ts.map
|
package/dist/lib/output.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../src/lib/output.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../src/lib/output.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAE9E,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAMjD;AAED,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAQjD;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,CAI7C;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,kBAAkB,GAAG,MAAM,CAKjE;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,kBAAkB,EAAE,GAAG,MAAM,CAWzE;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,MAAM,CAWrD;AASD,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,aAAa,EAAE,GAAG,MAAM,CAcpE"}
|
package/dist/lib/output.js
CHANGED
|
@@ -1,8 +1,43 @@
|
|
|
1
|
+
export function formatBytes(bytes) {
|
|
2
|
+
if (bytes === 0)
|
|
3
|
+
return '0 B';
|
|
4
|
+
const units = ['B', 'KB', 'MB', 'GB', 'TB'];
|
|
5
|
+
const i = Math.min(Math.floor(Math.log(bytes) / Math.log(1024)), units.length - 1);
|
|
6
|
+
const value = bytes / 1024 ** i;
|
|
7
|
+
return `${parseFloat(value.toFixed(1))} ${units[i]}`;
|
|
8
|
+
}
|
|
9
|
+
export function formatDuration(ms) {
|
|
10
|
+
const seconds = Math.floor(ms / 1000);
|
|
11
|
+
const m = Math.floor(seconds / 60);
|
|
12
|
+
const s = seconds % 60;
|
|
13
|
+
if (m === 0)
|
|
14
|
+
return `${s}s`;
|
|
15
|
+
if (s === 0)
|
|
16
|
+
return `${m}m`;
|
|
17
|
+
return `${m}m ${s}s`;
|
|
18
|
+
}
|
|
1
19
|
export function formatLock(lock) {
|
|
2
20
|
const acquired = new Date(lock.acquired_at).toLocaleTimeString();
|
|
3
21
|
const expires = new Date(lock.expires_at).toLocaleTimeString();
|
|
4
22
|
return ` ${lock.file_path} (session: ${lock.session_id.slice(0, 8)}… acquired: ${acquired} expires: ${expires})`;
|
|
5
23
|
}
|
|
24
|
+
export function formatSession(session) {
|
|
25
|
+
const name = session.profiles.name ?? session.profiles.email;
|
|
26
|
+
const started = new Date(session.started_at).toLocaleString();
|
|
27
|
+
const heartbeat = new Date(session.last_heartbeat).toLocaleString();
|
|
28
|
+
return ` ${session.id.slice(0, 8)}… ${name} (provider: ${session.provider} started: ${started} heartbeat: ${heartbeat})`;
|
|
29
|
+
}
|
|
30
|
+
export function formatSessionTable(sessions) {
|
|
31
|
+
if (sessions.length === 0) {
|
|
32
|
+
return 'No active sessions.';
|
|
33
|
+
}
|
|
34
|
+
const lines = ['Active sessions:', ''];
|
|
35
|
+
for (const session of sessions) {
|
|
36
|
+
lines.push(formatSession(session));
|
|
37
|
+
}
|
|
38
|
+
lines.push('', `Total: ${sessions.length} session(s)`);
|
|
39
|
+
return lines.join('\n');
|
|
40
|
+
}
|
|
6
41
|
export function formatLockTable(locks) {
|
|
7
42
|
if (locks.length === 0) {
|
|
8
43
|
return 'No active locks.';
|
|
@@ -14,4 +49,24 @@ export function formatLockTable(locks) {
|
|
|
14
49
|
lines.push('', `Total: ${locks.length} lock(s)`);
|
|
15
50
|
return lines.join('\n');
|
|
16
51
|
}
|
|
52
|
+
const ACTION_LABELS = {
|
|
53
|
+
acquire: 'LOCK',
|
|
54
|
+
release: 'UNLOCK',
|
|
55
|
+
expire: 'EXPIRED',
|
|
56
|
+
force_release: 'FORCE',
|
|
57
|
+
};
|
|
58
|
+
export function formatActivityTable(entries) {
|
|
59
|
+
if (entries.length === 0) {
|
|
60
|
+
return 'No recent activity.';
|
|
61
|
+
}
|
|
62
|
+
const lines = ['Recent activity:', ''];
|
|
63
|
+
for (const entry of entries) {
|
|
64
|
+
const time = new Date(entry.created_at).toLocaleString();
|
|
65
|
+
const label = ACTION_LABELS[entry.action] ?? entry.action;
|
|
66
|
+
const user = entry.profiles.name ?? entry.profiles.email;
|
|
67
|
+
lines.push(` ${label.padEnd(7)} ${entry.file_path} (${user} ${time})`);
|
|
68
|
+
}
|
|
69
|
+
lines.push('', `Showing ${entries.length} entries`);
|
|
70
|
+
return lines.join('\n');
|
|
71
|
+
}
|
|
17
72
|
//# sourceMappingURL=output.js.map
|
package/dist/lib/output.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/lib/output.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,UAAU,CAAC,IAAU;IACnC,MAAM,QAAQ,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,kBAAkB,EAAE,CAAC;IACjE,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,kBAAkB,EAAE,CAAC;IAC/D,OAAO,KAAK,IAAI,CAAC,SAAS,eAAe,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,gBAAgB,QAAQ,cAAc,OAAO,GAAG,CAAC;AACvH,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAAa;IAC3C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,kBAAkB,CAAC;IAC5B,CAAC;IAED,MAAM,KAAK,GAAG,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC;IACpC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;IAC/B,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,UAAU,KAAK,CAAC,MAAM,UAAU,CAAC,CAAC;IACjD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
|
|
1
|
+
{"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/lib/output.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "preclaim",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.1",
|
|
4
4
|
"description": "AI File Coordination Layer — predictive file locking for AI coding agents",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
"dependencies": {
|
|
13
13
|
"commander": "^13.1.0",
|
|
14
14
|
"minimatch": "^10.0.0",
|
|
15
|
-
"@preclaim/core": "0.2.
|
|
15
|
+
"@preclaim/core": "0.2.2"
|
|
16
16
|
},
|
|
17
17
|
"repository": {
|
|
18
18
|
"type": "git",
|