@skillctl/project-state 0.5.0

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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 xFurti, Gabry848
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,3 @@
1
+ export * from './locks.js';
2
+ export * from './state.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,3 @@
1
+ export * from './locks.js';
2
+ export * from './state.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC"}
@@ -0,0 +1,11 @@
1
+ export declare class OperationLockError extends Error {
2
+ readonly code = "E_LOCK_TIMEOUT";
3
+ constructor(path: string, cause?: unknown);
4
+ }
5
+ export interface OperationLockOptions {
6
+ cwd: string;
7
+ store: string;
8
+ timeoutMs?: number;
9
+ }
10
+ export declare function withOperationLocks<T>(options: OperationLockOptions, operation: () => Promise<T>): Promise<T>;
11
+ //# sourceMappingURL=locks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"locks.d.ts","sourceRoot":"","sources":["../src/locks.ts"],"names":[],"mappings":"AAIA,qBAAa,kBAAmB,SAAQ,KAAK;IAC3C,QAAQ,CAAC,IAAI,oBAAoB;gBACrB,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO;CAI1C;AAED,MAAM,WAAW,oBAAoB;IACnC,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAsB,kBAAkB,CAAC,CAAC,EACxC,OAAO,EAAE,oBAAoB,EAC7B,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAC1B,OAAO,CAAC,CAAC,CAAC,CAoBZ"}
package/dist/locks.js ADDED
@@ -0,0 +1,50 @@
1
+ import { mkdir } from 'node:fs/promises';
2
+ import { join } from 'node:path';
3
+ import lockfile from 'proper-lockfile';
4
+ export class OperationLockError extends Error {
5
+ code = 'E_LOCK_TIMEOUT';
6
+ constructor(path, cause) {
7
+ super(`Timed out waiting for skillctl operation lock: ${path}`, { cause });
8
+ this.name = 'OperationLockError';
9
+ }
10
+ }
11
+ export async function withOperationLocks(options, operation) {
12
+ await mkdir(options.cwd, { recursive: true });
13
+ await mkdir(options.store, { recursive: true });
14
+ const timeoutMs = options.timeoutMs ?? 10_000;
15
+ const retries = Math.max(1, Math.ceil(timeoutMs / 250));
16
+ const projectLockPath = join(options.cwd, '.skillctl-operation.lock');
17
+ const storeLockPath = join(options.store, '.skillctl-store.lock');
18
+ let releaseProject;
19
+ let releaseStore;
20
+ try {
21
+ releaseProject = await acquire(options.cwd, projectLockPath, retries);
22
+ releaseStore = await acquire(options.store, storeLockPath, retries);
23
+ return await operation();
24
+ }
25
+ catch (err) {
26
+ if (isLockError(err))
27
+ throw new OperationLockError(!releaseProject ? projectLockPath : storeLockPath, err);
28
+ throw err;
29
+ }
30
+ finally {
31
+ if (releaseStore)
32
+ await releaseStore().catch(() => { });
33
+ if (releaseProject)
34
+ await releaseProject().catch(() => { });
35
+ }
36
+ }
37
+ async function acquire(target, lockfilePath, retries) {
38
+ return lockfile.lock(target, {
39
+ realpath: false,
40
+ lockfilePath,
41
+ stale: 30_000,
42
+ update: 10_000,
43
+ retries: { retries, factor: 1, minTimeout: 250, maxTimeout: 250 },
44
+ });
45
+ }
46
+ function isLockError(err) {
47
+ const code = err?.code;
48
+ return code === 'ELOCKED' || code === 'ENOTACQUIRED';
49
+ }
50
+ //# sourceMappingURL=locks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"locks.js","sourceRoot":"","sources":["../src/locks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,QAAQ,MAAM,iBAAiB,CAAC;AAEvC,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAClC,IAAI,GAAG,gBAAgB,CAAC;IACjC,YAAY,IAAY,EAAE,KAAe;QACvC,KAAK,CAAC,kDAAkD,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;QAC3E,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF;AAQD,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,OAA6B,EAC7B,SAA2B;IAE3B,MAAM,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9C,MAAM,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAChD,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,MAAM,CAAC;IAC9C,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC,CAAC,CAAC;IACxD,MAAM,eAAe,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,0BAA0B,CAAC,CAAC;IACtE,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,sBAAsB,CAAC,CAAC;IAClE,IAAI,cAAiD,CAAC;IACtD,IAAI,YAA+C,CAAC;IACpD,IAAI,CAAC;QACH,cAAc,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,eAAe,EAAE,OAAO,CAAC,CAAC;QACtE,YAAY,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,aAAa,EAAE,OAAO,CAAC,CAAC;QACpE,OAAO,MAAM,SAAS,EAAE,CAAC;IAC3B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,WAAW,CAAC,GAAG,CAAC;YAAE,MAAM,IAAI,kBAAkB,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;QAC3G,MAAM,GAAG,CAAC;IACZ,CAAC;YAAS,CAAC;QACT,IAAI,YAAY;YAAE,MAAM,YAAY,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACvD,IAAI,cAAc;YAAE,MAAM,cAAc,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAC7D,CAAC;AACH,CAAC;AAED,KAAK,UAAU,OAAO,CAAC,MAAc,EAAE,YAAoB,EAAE,OAAe;IAC1E,OAAO,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE;QAC3B,QAAQ,EAAE,KAAK;QACf,YAAY;QACZ,KAAK,EAAE,MAAM;QACb,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,EAAE,GAAG,EAAE;KAClE,CAAC,CAAC;AACL,CAAC;AAED,SAAS,WAAW,CAAC,GAAY;IAC/B,MAAM,IAAI,GAAI,GAA6B,EAAE,IAAI,CAAC;IAClD,OAAO,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,cAAc,CAAC;AACvD,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { type SkillLockfile } from '@skillctl/core';
2
+ import { type AgentSkillsManifest } from '@skillctl/manifest';
3
+ export interface ProjectState {
4
+ manifest: AgentSkillsManifest | null;
5
+ lockfile: SkillLockfile | null;
6
+ }
7
+ export declare function readProjectState(cwd: string): Promise<ProjectState>;
8
+ export declare function updateProjectState<T>(cwd: string, mutator: (state: ProjectState) => Promise<{
9
+ state: ProjectState;
10
+ result: T;
11
+ }> | {
12
+ state: ProjectState;
13
+ result: T;
14
+ }): Promise<T>;
15
+ export declare function recoverProjectState(cwd: string): Promise<boolean>;
16
+ //# sourceMappingURL=state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../src/state.ts"],"names":[],"mappings":"AAEA,OAAO,EAAmB,KAAK,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACrE,OAAO,EAA8B,KAAK,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAK1F,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,mBAAmB,GAAG,IAAI,CAAC;IACrC,QAAQ,EAAE,aAAa,GAAG,IAAI,CAAC;CAChC;AAcD,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAIzE;AAED,wBAAsB,kBAAkB,CAAC,CAAC,EACxC,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,OAAO,CAAC;IAAE,KAAK,EAAE,YAAY,CAAC;IAAC,MAAM,EAAE,CAAC,CAAA;CAAE,CAAC,GAAG;IAAE,KAAK,EAAE,YAAY,CAAC;IAAC,MAAM,EAAE,CAAC,CAAA;CAAE,GACjH,OAAO,CAAC,CAAC,CAAC,CAuCZ;AAED,wBAAsB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAcvE"}
package/dist/state.js ADDED
@@ -0,0 +1,94 @@
1
+ import { readFile, rm } from 'node:fs/promises';
2
+ import { join } from 'node:path';
3
+ import { writeFileAtomic } from '@skillctl/core';
4
+ import { loadManifest, saveManifest } from '@skillctl/manifest';
5
+ import { loadLockfile, saveLockfile } from '@skillctl/lockfile';
6
+ const JOURNAL_NAME = '.skillctl-transaction.json';
7
+ export async function readProjectState(cwd) {
8
+ await recoverProjectState(cwd);
9
+ const [manifest, lockfile] = await Promise.all([loadManifest(cwd), loadLockfile(cwd)]);
10
+ return { manifest, lockfile };
11
+ }
12
+ export async function updateProjectState(cwd, mutator) {
13
+ await recoverProjectState(cwd);
14
+ const current = {
15
+ manifest: await loadManifest(cwd),
16
+ lockfile: await loadLockfile(cwd),
17
+ };
18
+ const next = await mutator(current);
19
+ const manifestPath = join(cwd, 'agent-skills.json');
20
+ const lockPath = join(cwd, 'agent-skills.lock');
21
+ const journalPath = join(cwd, JOURNAL_NAME);
22
+ const journal = {
23
+ version: 1,
24
+ phase: 'prepared',
25
+ manifest: await snapshot(manifestPath),
26
+ lockfile: await snapshot(lockPath),
27
+ };
28
+ await writeJournal(journalPath, journal);
29
+ try {
30
+ if (next.state.manifest)
31
+ await saveManifest(next.state.manifest, cwd);
32
+ else
33
+ await rm(manifestPath, { force: true });
34
+ journal.phase = 'manifest-written';
35
+ await writeJournal(journalPath, journal);
36
+ if (next.state.lockfile)
37
+ await saveLockfile(next.state.lockfile, cwd);
38
+ else
39
+ await rm(lockPath, { force: true });
40
+ await rm(journalPath, { force: true });
41
+ return next.result;
42
+ }
43
+ catch (err) {
44
+ try {
45
+ await restore(manifestPath, journal.manifest);
46
+ await restore(lockPath, journal.lockfile);
47
+ await rm(journalPath, { force: true });
48
+ }
49
+ catch (rollbackError) {
50
+ throw new Error('Project state update and rollback both failed', {
51
+ cause: { updateError: err, rollbackError },
52
+ });
53
+ }
54
+ throw err;
55
+ }
56
+ }
57
+ export async function recoverProjectState(cwd) {
58
+ const journalPath = join(cwd, JOURNAL_NAME);
59
+ let journal;
60
+ try {
61
+ journal = JSON.parse(await readFile(journalPath, 'utf8'));
62
+ }
63
+ catch (err) {
64
+ if (err.code === 'ENOENT')
65
+ return false;
66
+ throw new Error(`Invalid project transaction journal: ${journalPath}`, { cause: err });
67
+ }
68
+ if (journal.version !== 1)
69
+ throw new Error(`Unsupported project transaction journal: ${journal.version}`);
70
+ await restore(join(cwd, 'agent-skills.json'), journal.manifest);
71
+ await restore(join(cwd, 'agent-skills.lock'), journal.lockfile);
72
+ await rm(journalPath, { force: true });
73
+ return true;
74
+ }
75
+ async function snapshot(path) {
76
+ try {
77
+ return { exists: true, content: await readFile(path, 'utf8') };
78
+ }
79
+ catch (err) {
80
+ if (err.code === 'ENOENT')
81
+ return { exists: false };
82
+ throw err;
83
+ }
84
+ }
85
+ async function restore(path, value) {
86
+ if (value.exists)
87
+ await writeFileAtomic(path, value.content || '');
88
+ else
89
+ await rm(path, { force: true });
90
+ }
91
+ async function writeJournal(path, journal) {
92
+ await writeFileAtomic(path, `${JSON.stringify(journal, null, 2)}\n`);
93
+ }
94
+ //# sourceMappingURL=state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.js","sourceRoot":"","sources":["../src/state.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,41 @@
1
+ {
2
+ "name": "@skillctl/project-state",
3
+ "version": "0.5.0",
4
+ "description": "Cross-process locks and transactional project state updates for skillctl",
5
+ "license": "MIT",
6
+ "author": "xFurti & Gabry848",
7
+ "type": "module",
8
+ "main": "./dist/index.js",
9
+ "types": "./dist/index.d.ts",
10
+ "files": [
11
+ "dist",
12
+ "!dist/test",
13
+ "!dist/*.tsbuildinfo"
14
+ ],
15
+ "dependencies": {
16
+ "proper-lockfile": "4.1.2",
17
+ "@skillctl/lockfile": "0.5.0",
18
+ "@skillctl/core": "0.5.0",
19
+ "@skillctl/manifest": "0.5.0"
20
+ },
21
+ "devDependencies": {
22
+ "@types/node": "^20.14.0",
23
+ "@types/proper-lockfile": "^4.1.4",
24
+ "rimraf": "^5.0.7",
25
+ "typescript": "^5.6.3"
26
+ },
27
+ "engines": {
28
+ "node": ">=22.13"
29
+ },
30
+ "repository": {
31
+ "type": "git",
32
+ "url": "https://github.com/xFurti/skillctl.git",
33
+ "directory": "packages/project-state"
34
+ },
35
+ "scripts": {
36
+ "build": "tsc -b",
37
+ "clean": "rimraf dist",
38
+ "lint": "tsc --noEmit",
39
+ "test": "node --test ./dist/test/*.test.js"
40
+ }
41
+ }