mdkg 0.1.2 → 0.1.3
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/CHANGELOG.md +25 -0
- package/README.md +22 -7
- package/dist/cli.js +3 -0
- package/dist/commands/archive.js +20 -8
- package/dist/commands/bundle_import.js +18 -6
- package/dist/commands/checkpoint.js +31 -5
- package/dist/commands/doctor.js +46 -9
- package/dist/commands/index.js +12 -23
- package/dist/commands/init.js +7 -1
- package/dist/commands/new.js +33 -7
- package/dist/commands/task.js +20 -6
- package/dist/commands/validate.js +6 -0
- package/dist/commands/work.js +43 -11
- package/dist/core/config.js +15 -0
- package/dist/graph/bundle_imports.js +2 -2
- package/dist/graph/capabilities_index_cache.js +2 -2
- package/dist/graph/index_cache.js +2 -2
- package/dist/graph/reindex.js +46 -0
- package/dist/graph/skills_index_cache.js +2 -2
- package/dist/graph/sqlite_index.js +293 -0
- package/dist/init/AGENT_START.md +3 -0
- package/dist/init/CLI_COMMAND_MATRIX.md +5 -0
- package/dist/init/README.md +11 -2
- package/dist/init/config.json +5 -1
- package/dist/init/core/rule-1-mdkg-conventions.md +2 -1
- package/dist/init/core/rule-3-cli-contract.md +2 -1
- package/dist/init/core/rule-4-repo-safety-and-ignores.md +27 -11
- package/dist/init/core/rule-5-release-and-versioning.md +4 -3
- package/dist/init/init-manifest.json +9 -9
- package/dist/util/atomic.js +44 -0
- package/dist/util/lock.js +72 -0
- package/package.json +8 -5
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.withMutationLock = withMutationLock;
|
|
7
|
+
exports.lockTimeoutFromConfig = lockTimeoutFromConfig;
|
|
8
|
+
const fs_1 = __importDefault(require("fs"));
|
|
9
|
+
const path_1 = __importDefault(require("path"));
|
|
10
|
+
const HELD_LOCKS = new Set();
|
|
11
|
+
function sleepSync(ms) {
|
|
12
|
+
const shared = new SharedArrayBuffer(4);
|
|
13
|
+
const view = new Int32Array(shared);
|
|
14
|
+
Atomics.wait(view, 0, 0, ms);
|
|
15
|
+
}
|
|
16
|
+
function lockDir(root) {
|
|
17
|
+
return path_1.default.resolve(root, ".mdkg", "index", "write.lock");
|
|
18
|
+
}
|
|
19
|
+
function lockOwner() {
|
|
20
|
+
return JSON.stringify({
|
|
21
|
+
pid: process.pid,
|
|
22
|
+
node: process.version,
|
|
23
|
+
created_at: new Date().toISOString(),
|
|
24
|
+
}, null, 2);
|
|
25
|
+
}
|
|
26
|
+
function withMutationLock(root, timeoutMs, fn) {
|
|
27
|
+
const dir = lockDir(root);
|
|
28
|
+
if (HELD_LOCKS.has(dir)) {
|
|
29
|
+
return fn();
|
|
30
|
+
}
|
|
31
|
+
fs_1.default.mkdirSync(path_1.default.dirname(dir), { recursive: true });
|
|
32
|
+
const started = Date.now();
|
|
33
|
+
let lastError;
|
|
34
|
+
while (Date.now() - started <= timeoutMs) {
|
|
35
|
+
try {
|
|
36
|
+
fs_1.default.mkdirSync(dir);
|
|
37
|
+
let acquired = false;
|
|
38
|
+
try {
|
|
39
|
+
fs_1.default.writeFileSync(path_1.default.join(dir, "owner.json"), lockOwner(), "utf8");
|
|
40
|
+
HELD_LOCKS.add(dir);
|
|
41
|
+
acquired = true;
|
|
42
|
+
try {
|
|
43
|
+
return fn();
|
|
44
|
+
}
|
|
45
|
+
finally {
|
|
46
|
+
HELD_LOCKS.delete(dir);
|
|
47
|
+
fs_1.default.rmSync(dir, { recursive: true, force: true });
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
catch (err) {
|
|
51
|
+
if (!acquired) {
|
|
52
|
+
fs_1.default.rmSync(dir, { recursive: true, force: true });
|
|
53
|
+
}
|
|
54
|
+
throw err;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
catch (err) {
|
|
58
|
+
const code = typeof err === "object" && err !== null && "code" in err ? String(err.code) : "";
|
|
59
|
+
if (code !== "EEXIST") {
|
|
60
|
+
throw err;
|
|
61
|
+
}
|
|
62
|
+
lastError = err;
|
|
63
|
+
sleepSync(25);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
const detailPath = path_1.default.join(dir, "owner.json");
|
|
67
|
+
const owner = fs_1.default.existsSync(detailPath) ? fs_1.default.readFileSync(detailPath, "utf8").trim() : "unknown owner";
|
|
68
|
+
throw new Error(`timed out waiting for mdkg mutation lock at ${path_1.default.relative(root, dir)}; owner: ${owner || "unknown"}`);
|
|
69
|
+
}
|
|
70
|
+
function lockTimeoutFromConfig(config) {
|
|
71
|
+
return config.index.lock_timeout_ms;
|
|
72
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mdkg",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.3",
|
|
4
4
|
"description": "Markdown Knowledge Graph",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"bin": {
|
|
@@ -20,14 +20,16 @@
|
|
|
20
20
|
"smoke:bundle": "npm run build && node scripts/smoke-bundle.js",
|
|
21
21
|
"smoke:bundle-import": "npm run build && node scripts/smoke-bundle-import.js",
|
|
22
22
|
"smoke:visibility": "npm run build && node scripts/smoke-visibility.js",
|
|
23
|
+
"smoke:sqlite": "npm run build && node scripts/smoke-sqlite.js",
|
|
24
|
+
"smoke:parallel": "npm run build && node scripts/smoke-parallel.js",
|
|
23
25
|
"cli:snapshot": "npm run build && node scripts/cli_help_snapshot.js",
|
|
24
26
|
"cli:check": "npm run build && node scripts/cli_help_snapshot.js --check",
|
|
25
27
|
"prepack": "npm run build && node scripts/assert-publish-ready.js",
|
|
26
|
-
"prepublishOnly": "npm run test && npm run cli:check && node dist/cli.js validate && npm run smoke:consumer && npm run smoke:matrix && npm run smoke:upgrade && npm run smoke:init && npm run smoke:capabilities && npm run smoke:archive-work && npm run smoke:bundle && npm run smoke:bundle-import && npm run smoke:visibility && node scripts/assert-publish-ready.js",
|
|
28
|
+
"prepublishOnly": "npm run test && npm run cli:check && node dist/cli.js validate && npm run smoke:consumer && npm run smoke:matrix && npm run smoke:upgrade && npm run smoke:init && npm run smoke:capabilities && npm run smoke:archive-work && npm run smoke:bundle && npm run smoke:bundle-import && npm run smoke:visibility && npm run smoke:sqlite && npm run smoke:parallel && node scripts/assert-publish-ready.js",
|
|
27
29
|
"postinstall": "node scripts/postinstall.js"
|
|
28
30
|
},
|
|
29
31
|
"devDependencies": {
|
|
30
|
-
"@types/node": "^
|
|
32
|
+
"@types/node": "^24.0.0",
|
|
31
33
|
"typescript": "^5.4.0"
|
|
32
34
|
},
|
|
33
35
|
"files": [
|
|
@@ -46,7 +48,7 @@
|
|
|
46
48
|
"LICENSE"
|
|
47
49
|
],
|
|
48
50
|
"engines": {
|
|
49
|
-
"node": ">=
|
|
51
|
+
"node": ">=24.15.0"
|
|
50
52
|
},
|
|
51
53
|
"repository": {
|
|
52
54
|
"type": "git",
|
|
@@ -56,5 +58,6 @@
|
|
|
56
58
|
"markdown",
|
|
57
59
|
"knowledge-graph",
|
|
58
60
|
"cli"
|
|
59
|
-
]
|
|
61
|
+
],
|
|
62
|
+
"dependencies": {}
|
|
60
63
|
}
|