@unbrained/pm-cli 2026.3.9
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/.pi/extensions/pm-cli/index.ts +778 -0
- package/AGENTS.md +475 -0
- package/LICENSE +21 -0
- package/PRD.md +1390 -0
- package/README.md +655 -0
- package/dist/cli/commands/activity.d.ts +14 -0
- package/dist/cli/commands/activity.js +80 -0
- package/dist/cli/commands/activity.js.map +1 -0
- package/dist/cli/commands/append.d.ts +13 -0
- package/dist/cli/commands/append.js +46 -0
- package/dist/cli/commands/append.js.map +1 -0
- package/dist/cli/commands/beads.d.ts +15 -0
- package/dist/cli/commands/beads.js +475 -0
- package/dist/cli/commands/beads.js.map +1 -0
- package/dist/cli/commands/claim.d.ts +19 -0
- package/dist/cli/commands/claim.js +79 -0
- package/dist/cli/commands/claim.js.map +1 -0
- package/dist/cli/commands/close.d.ts +12 -0
- package/dist/cli/commands/close.js +58 -0
- package/dist/cli/commands/close.js.map +1 -0
- package/dist/cli/commands/comments.d.ts +15 -0
- package/dist/cli/commands/comments.js +80 -0
- package/dist/cli/commands/comments.js.map +1 -0
- package/dist/cli/commands/completion.d.ts +10 -0
- package/dist/cli/commands/completion.js +469 -0
- package/dist/cli/commands/completion.js.map +1 -0
- package/dist/cli/commands/config.d.ts +15 -0
- package/dist/cli/commands/config.js +72 -0
- package/dist/cli/commands/config.js.map +1 -0
- package/dist/cli/commands/create.d.ts +60 -0
- package/dist/cli/commands/create.js +456 -0
- package/dist/cli/commands/create.js.map +1 -0
- package/dist/cli/commands/delete.d.ts +12 -0
- package/dist/cli/commands/delete.js +33 -0
- package/dist/cli/commands/delete.js.map +1 -0
- package/dist/cli/commands/docs.d.ts +16 -0
- package/dist/cli/commands/docs.js +113 -0
- package/dist/cli/commands/docs.js.map +1 -0
- package/dist/cli/commands/files.d.ts +17 -0
- package/dist/cli/commands/files.js +113 -0
- package/dist/cli/commands/files.js.map +1 -0
- package/dist/cli/commands/gc.d.ts +9 -0
- package/dist/cli/commands/gc.js +80 -0
- package/dist/cli/commands/gc.js.map +1 -0
- package/dist/cli/commands/get.d.ts +12 -0
- package/dist/cli/commands/get.js +28 -0
- package/dist/cli/commands/get.js.map +1 -0
- package/dist/cli/commands/health.d.ts +15 -0
- package/dist/cli/commands/health.js +288 -0
- package/dist/cli/commands/health.js.map +1 -0
- package/dist/cli/commands/history.d.ts +13 -0
- package/dist/cli/commands/history.js +72 -0
- package/dist/cli/commands/history.js.map +1 -0
- package/dist/cli/commands/index.d.ts +26 -0
- package/dist/cli/commands/index.js +27 -0
- package/dist/cli/commands/index.js.map +1 -0
- package/dist/cli/commands/init.d.ts +10 -0
- package/dist/cli/commands/init.js +59 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/install.d.ts +18 -0
- package/dist/cli/commands/install.js +87 -0
- package/dist/cli/commands/install.js.map +1 -0
- package/dist/cli/commands/list.d.ts +21 -0
- package/dist/cli/commands/list.js +137 -0
- package/dist/cli/commands/list.js.map +1 -0
- package/dist/cli/commands/reindex.d.ts +16 -0
- package/dist/cli/commands/reindex.js +154 -0
- package/dist/cli/commands/reindex.js.map +1 -0
- package/dist/cli/commands/restore.d.ts +20 -0
- package/dist/cli/commands/restore.js +208 -0
- package/dist/cli/commands/restore.js.map +1 -0
- package/dist/cli/commands/search.d.ts +45 -0
- package/dist/cli/commands/search.js +531 -0
- package/dist/cli/commands/search.js.map +1 -0
- package/dist/cli/commands/stats.d.ts +13 -0
- package/dist/cli/commands/stats.js +88 -0
- package/dist/cli/commands/stats.js.map +1 -0
- package/dist/cli/commands/test-all.d.ts +30 -0
- package/dist/cli/commands/test-all.js +157 -0
- package/dist/cli/commands/test-all.js.map +1 -0
- package/dist/cli/commands/test.d.ts +29 -0
- package/dist/cli/commands/test.js +492 -0
- package/dist/cli/commands/test.js.map +1 -0
- package/dist/cli/commands/update.d.ts +52 -0
- package/dist/cli/commands/update.js +467 -0
- package/dist/cli/commands/update.js.map +1 -0
- package/dist/cli/extension-command-options.d.ts +1 -0
- package/dist/cli/extension-command-options.js +76 -0
- package/dist/cli/extension-command-options.js.map +1 -0
- package/dist/cli/main.d.ts +2 -0
- package/dist/cli/main.js +1494 -0
- package/dist/cli/main.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +3 -0
- package/dist/cli.js.map +1 -0
- package/dist/command-types.d.ts +1 -0
- package/dist/command-types.js +2 -0
- package/dist/command-types.js.map +1 -0
- package/dist/constants.d.ts +1 -0
- package/dist/constants.js +2 -0
- package/dist/constants.js.map +1 -0
- package/dist/core/extensions/builtins.d.ts +3 -0
- package/dist/core/extensions/builtins.js +47 -0
- package/dist/core/extensions/builtins.js.map +1 -0
- package/dist/core/extensions/index.d.ts +13 -0
- package/dist/core/extensions/index.js +88 -0
- package/dist/core/extensions/index.js.map +1 -0
- package/dist/core/extensions/loader.d.ts +301 -0
- package/dist/core/extensions/loader.js +917 -0
- package/dist/core/extensions/loader.js.map +1 -0
- package/dist/core/fs/fs-utils.d.ts +6 -0
- package/dist/core/fs/fs-utils.js +58 -0
- package/dist/core/fs/fs-utils.js.map +1 -0
- package/dist/core/fs/index.d.ts +1 -0
- package/dist/core/fs/index.js +2 -0
- package/dist/core/fs/index.js.map +1 -0
- package/dist/core/history/history.d.ts +12 -0
- package/dist/core/history/history.js +44 -0
- package/dist/core/history/history.js.map +1 -0
- package/dist/core/history/index.d.ts +1 -0
- package/dist/core/history/index.js +2 -0
- package/dist/core/history/index.js.map +1 -0
- package/dist/core/item/id.d.ts +3 -0
- package/dist/core/item/id.js +54 -0
- package/dist/core/item/id.js.map +1 -0
- package/dist/core/item/index.d.ts +3 -0
- package/dist/core/item/index.js +4 -0
- package/dist/core/item/index.js.map +1 -0
- package/dist/core/item/item-format.d.ts +9 -0
- package/dist/core/item/item-format.js +363 -0
- package/dist/core/item/item-format.js.map +1 -0
- package/dist/core/item/parse.d.ts +3 -0
- package/dist/core/item/parse.js +72 -0
- package/dist/core/item/parse.js.map +1 -0
- package/dist/core/lock/index.d.ts +1 -0
- package/dist/core/lock/index.js +2 -0
- package/dist/core/lock/index.js.map +1 -0
- package/dist/core/lock/lock.d.ts +1 -0
- package/dist/core/lock/lock.js +100 -0
- package/dist/core/lock/lock.js.map +1 -0
- package/dist/core/output/output.d.ts +7 -0
- package/dist/core/output/output.js +79 -0
- package/dist/core/output/output.js.map +1 -0
- package/dist/core/search/cache.d.ts +17 -0
- package/dist/core/search/cache.js +212 -0
- package/dist/core/search/cache.js.map +1 -0
- package/dist/core/search/embedding-batches.d.ts +7 -0
- package/dist/core/search/embedding-batches.js +54 -0
- package/dist/core/search/embedding-batches.js.map +1 -0
- package/dist/core/search/providers.d.ts +59 -0
- package/dist/core/search/providers.js +265 -0
- package/dist/core/search/providers.js.map +1 -0
- package/dist/core/search/vector-stores.d.ts +89 -0
- package/dist/core/search/vector-stores.js +546 -0
- package/dist/core/search/vector-stores.js.map +1 -0
- package/dist/core/shared/command-types.d.ts +7 -0
- package/dist/core/shared/command-types.js +2 -0
- package/dist/core/shared/command-types.js.map +1 -0
- package/dist/core/shared/constants.d.ts +19 -0
- package/dist/core/shared/constants.js +134 -0
- package/dist/core/shared/constants.js.map +1 -0
- package/dist/core/shared/errors.d.ts +4 -0
- package/dist/core/shared/errors.js +9 -0
- package/dist/core/shared/errors.js.map +1 -0
- package/dist/core/shared/index.d.ts +3 -0
- package/dist/core/shared/index.js +4 -0
- package/dist/core/shared/index.js.map +1 -0
- package/dist/core/shared/serialization.d.ts +3 -0
- package/dist/core/shared/serialization.js +70 -0
- package/dist/core/shared/serialization.js.map +1 -0
- package/dist/core/shared/time.d.ts +3 -0
- package/dist/core/shared/time.js +28 -0
- package/dist/core/shared/time.js.map +1 -0
- package/dist/core/store/index.d.ts +3 -0
- package/dist/core/store/index.js +4 -0
- package/dist/core/store/index.js.map +1 -0
- package/dist/core/store/item-store.d.ts +42 -0
- package/dist/core/store/item-store.js +186 -0
- package/dist/core/store/item-store.js.map +1 -0
- package/dist/core/store/paths.d.ts +8 -0
- package/dist/core/store/paths.js +29 -0
- package/dist/core/store/paths.js.map +1 -0
- package/dist/core/store/settings.d.ts +4 -0
- package/dist/core/store/settings.js +148 -0
- package/dist/core/store/settings.js.map +1 -0
- package/dist/errors.d.ts +1 -0
- package/dist/errors.js +2 -0
- package/dist/errors.js.map +1 -0
- package/dist/extensions/builtins/beads/index.d.ts +8 -0
- package/dist/extensions/builtins/beads/index.js +29 -0
- package/dist/extensions/builtins/beads/index.js.map +1 -0
- package/dist/extensions/builtins/todos/import-export.d.ts +26 -0
- package/dist/extensions/builtins/todos/import-export.js +460 -0
- package/dist/extensions/builtins/todos/import-export.js.map +1 -0
- package/dist/extensions/builtins/todos/index.d.ts +8 -0
- package/dist/extensions/builtins/todos/index.js +38 -0
- package/dist/extensions/builtins/todos/index.js.map +1 -0
- package/dist/fs-utils.d.ts +1 -0
- package/dist/fs-utils.js +2 -0
- package/dist/fs-utils.js.map +1 -0
- package/dist/history.d.ts +1 -0
- package/dist/history.js +2 -0
- package/dist/history.js.map +1 -0
- package/dist/id.d.ts +1 -0
- package/dist/id.js +2 -0
- package/dist/id.js.map +1 -0
- package/dist/item-format.d.ts +1 -0
- package/dist/item-format.js +2 -0
- package/dist/item-format.js.map +1 -0
- package/dist/item-store.d.ts +1 -0
- package/dist/item-store.js +2 -0
- package/dist/item-store.js.map +1 -0
- package/dist/lock.d.ts +1 -0
- package/dist/lock.js +2 -0
- package/dist/lock.js.map +1 -0
- package/dist/output.d.ts +1 -0
- package/dist/output.js +2 -0
- package/dist/output.js.map +1 -0
- package/dist/parse.d.ts +1 -0
- package/dist/parse.js +2 -0
- package/dist/parse.js.map +1 -0
- package/dist/paths.d.ts +1 -0
- package/dist/paths.js +2 -0
- package/dist/paths.js.map +1 -0
- package/dist/serialization.d.ts +1 -0
- package/dist/serialization.js +2 -0
- package/dist/serialization.js.map +1 -0
- package/dist/settings.d.ts +1 -0
- package/dist/settings.js +2 -0
- package/dist/settings.js.map +1 -0
- package/dist/time.d.ts +1 -0
- package/dist/time.js +2 -0
- package/dist/time.js.map +1 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types.d.ts +179 -0
- package/dist/types.js +21 -0
- package/dist/types.js.map +1 -0
- package/docs/ARCHITECTURE.md +246 -0
- package/docs/EXTENSIONS.md +329 -0
- package/docs/RELEASING.md +65 -0
- package/package.json +79 -0
- package/scripts/install.ps1 +112 -0
- package/scripts/install.sh +113 -0
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { pathExists } from "../../core/fs/fs-utils.js";
|
|
2
|
+
import { parseCsvKv } from "../../core/item/parse.js";
|
|
3
|
+
import { EXIT_CODE } from "../../core/shared/constants.js";
|
|
4
|
+
import { PmCliError } from "../../core/shared/errors.js";
|
|
5
|
+
import { locateItem, mutateItem, readLocatedItem } from "../../core/store/item-store.js";
|
|
6
|
+
import { getSettingsPath, resolvePmRoot } from "../../core/store/paths.js";
|
|
7
|
+
import { readSettings } from "../../core/store/settings.js";
|
|
8
|
+
import { SCOPE_VALUES } from "../../types/index.js";
|
|
9
|
+
function resolveAuthor(candidate, fallback) {
|
|
10
|
+
const resolved = candidate ?? process.env.PM_AUTHOR ?? fallback;
|
|
11
|
+
const trimmed = resolved.trim();
|
|
12
|
+
return trimmed || "unknown";
|
|
13
|
+
}
|
|
14
|
+
function ensureScope(raw) {
|
|
15
|
+
const value = (raw ?? "project");
|
|
16
|
+
if (!SCOPE_VALUES.includes(value)) {
|
|
17
|
+
throw new PmCliError(`Invalid scope "${raw}"`, EXIT_CODE.USAGE);
|
|
18
|
+
}
|
|
19
|
+
return value;
|
|
20
|
+
}
|
|
21
|
+
function parseAddEntries(raw) {
|
|
22
|
+
if (!raw)
|
|
23
|
+
return [];
|
|
24
|
+
return raw.map((entry) => {
|
|
25
|
+
const kv = parseCsvKv(entry, "--add");
|
|
26
|
+
if (!kv.path) {
|
|
27
|
+
throw new PmCliError("--add requires path=<value>", EXIT_CODE.USAGE);
|
|
28
|
+
}
|
|
29
|
+
return {
|
|
30
|
+
path: kv.path,
|
|
31
|
+
scope: ensureScope(kv.scope),
|
|
32
|
+
note: kv.note?.trim() || undefined,
|
|
33
|
+
};
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
function parseRemoveEntries(raw) {
|
|
37
|
+
if (!raw)
|
|
38
|
+
return [];
|
|
39
|
+
return raw.map((entry) => {
|
|
40
|
+
const trimmed = entry.trim();
|
|
41
|
+
if (!trimmed) {
|
|
42
|
+
throw new PmCliError("--remove requires a path value", EXIT_CODE.USAGE);
|
|
43
|
+
}
|
|
44
|
+
if (trimmed.includes("=")) {
|
|
45
|
+
const kv = parseCsvKv(trimmed, "--remove");
|
|
46
|
+
if (!kv.path) {
|
|
47
|
+
throw new PmCliError("--remove key/value form requires path=<value>", EXIT_CODE.USAGE);
|
|
48
|
+
}
|
|
49
|
+
return kv.path;
|
|
50
|
+
}
|
|
51
|
+
return trimmed;
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
export async function runDocs(id, options, global) {
|
|
55
|
+
const pmRoot = resolvePmRoot(process.cwd(), global.path);
|
|
56
|
+
if (!(await pathExists(getSettingsPath(pmRoot)))) {
|
|
57
|
+
throw new PmCliError(`Tracker is not initialized at ${pmRoot}. Run pm init first.`, EXIT_CODE.NOT_FOUND);
|
|
58
|
+
}
|
|
59
|
+
const settings = await readSettings(pmRoot);
|
|
60
|
+
const adds = parseAddEntries(options.add);
|
|
61
|
+
const removes = parseRemoveEntries(options.remove);
|
|
62
|
+
const shouldMutate = adds.length > 0 || removes.length > 0;
|
|
63
|
+
if (!shouldMutate) {
|
|
64
|
+
const located = await locateItem(pmRoot, id, settings.id_prefix);
|
|
65
|
+
if (!located) {
|
|
66
|
+
throw new PmCliError(`Item ${id} not found`, EXIT_CODE.NOT_FOUND);
|
|
67
|
+
}
|
|
68
|
+
const loaded = await readLocatedItem(located);
|
|
69
|
+
const docs = loaded.document.front_matter.docs ?? [];
|
|
70
|
+
return {
|
|
71
|
+
id: located.id,
|
|
72
|
+
docs,
|
|
73
|
+
changed: false,
|
|
74
|
+
count: docs.length,
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
const author = resolveAuthor(options.author, settings.author_default);
|
|
78
|
+
const result = await mutateItem({
|
|
79
|
+
pmRoot,
|
|
80
|
+
settings,
|
|
81
|
+
id,
|
|
82
|
+
op: "docs_add",
|
|
83
|
+
author,
|
|
84
|
+
message: options.message,
|
|
85
|
+
force: options.force,
|
|
86
|
+
mutate(document) {
|
|
87
|
+
const next = [...(document.front_matter.docs ?? [])];
|
|
88
|
+
for (const add of adds) {
|
|
89
|
+
const exists = next.some((entry) => entry.path === add.path && entry.scope === add.scope);
|
|
90
|
+
if (!exists) {
|
|
91
|
+
next.push(add);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
if (removes.length > 0) {
|
|
95
|
+
for (let i = next.length - 1; i >= 0; i -= 1) {
|
|
96
|
+
if (removes.includes(next[i].path)) {
|
|
97
|
+
next.splice(i, 1);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
document.front_matter.docs = next;
|
|
102
|
+
return { changedFields: ["docs"] };
|
|
103
|
+
},
|
|
104
|
+
});
|
|
105
|
+
const docs = result.item.docs ?? [];
|
|
106
|
+
return {
|
|
107
|
+
id: result.item.id,
|
|
108
|
+
docs,
|
|
109
|
+
changed: true,
|
|
110
|
+
count: docs.length,
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=docs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docs.js","sourceRoot":"","sources":["../../../src/cli/commands/docs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { GlobalOptions } from "../../core/shared/command-types.js";
|
|
2
|
+
import type { LinkedFile } from "../../types/index.js";
|
|
3
|
+
export interface FilesCommandOptions {
|
|
4
|
+
add?: string[];
|
|
5
|
+
remove?: string[];
|
|
6
|
+
list?: boolean;
|
|
7
|
+
author?: string;
|
|
8
|
+
message?: string;
|
|
9
|
+
force?: boolean;
|
|
10
|
+
}
|
|
11
|
+
export interface FilesResult {
|
|
12
|
+
id: string;
|
|
13
|
+
files: LinkedFile[];
|
|
14
|
+
changed: boolean;
|
|
15
|
+
count: number;
|
|
16
|
+
}
|
|
17
|
+
export declare function runFiles(id: string, options: FilesCommandOptions, global: GlobalOptions): Promise<FilesResult>;
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { pathExists } from "../../core/fs/fs-utils.js";
|
|
2
|
+
import { parseCsvKv } from "../../core/item/parse.js";
|
|
3
|
+
import { EXIT_CODE } from "../../core/shared/constants.js";
|
|
4
|
+
import { PmCliError } from "../../core/shared/errors.js";
|
|
5
|
+
import { locateItem, mutateItem, readLocatedItem } from "../../core/store/item-store.js";
|
|
6
|
+
import { getSettingsPath, resolvePmRoot } from "../../core/store/paths.js";
|
|
7
|
+
import { readSettings } from "../../core/store/settings.js";
|
|
8
|
+
import { SCOPE_VALUES } from "../../types/index.js";
|
|
9
|
+
function resolveAuthor(candidate, fallback) {
|
|
10
|
+
const resolved = candidate ?? process.env.PM_AUTHOR ?? fallback;
|
|
11
|
+
const trimmed = resolved.trim();
|
|
12
|
+
return trimmed || "unknown";
|
|
13
|
+
}
|
|
14
|
+
function ensureScope(raw) {
|
|
15
|
+
const value = (raw ?? "project");
|
|
16
|
+
if (!SCOPE_VALUES.includes(value)) {
|
|
17
|
+
throw new PmCliError(`Invalid scope "${raw}"`, EXIT_CODE.USAGE);
|
|
18
|
+
}
|
|
19
|
+
return value;
|
|
20
|
+
}
|
|
21
|
+
function parseAddEntries(raw) {
|
|
22
|
+
if (!raw)
|
|
23
|
+
return [];
|
|
24
|
+
return raw.map((entry) => {
|
|
25
|
+
const kv = parseCsvKv(entry, "--add");
|
|
26
|
+
if (!kv.path) {
|
|
27
|
+
throw new PmCliError("--add requires path=<value>", EXIT_CODE.USAGE);
|
|
28
|
+
}
|
|
29
|
+
return {
|
|
30
|
+
path: kv.path,
|
|
31
|
+
scope: ensureScope(kv.scope),
|
|
32
|
+
note: kv.note?.trim() || undefined,
|
|
33
|
+
};
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
function parseRemoveEntries(raw) {
|
|
37
|
+
if (!raw)
|
|
38
|
+
return [];
|
|
39
|
+
return raw.map((entry) => {
|
|
40
|
+
const trimmed = entry.trim();
|
|
41
|
+
if (!trimmed) {
|
|
42
|
+
throw new PmCliError("--remove requires a path value", EXIT_CODE.USAGE);
|
|
43
|
+
}
|
|
44
|
+
if (trimmed.includes("=")) {
|
|
45
|
+
const kv = parseCsvKv(trimmed, "--remove");
|
|
46
|
+
if (!kv.path) {
|
|
47
|
+
throw new PmCliError("--remove key/value form requires path=<value>", EXIT_CODE.USAGE);
|
|
48
|
+
}
|
|
49
|
+
return kv.path;
|
|
50
|
+
}
|
|
51
|
+
return trimmed;
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
export async function runFiles(id, options, global) {
|
|
55
|
+
const pmRoot = resolvePmRoot(process.cwd(), global.path);
|
|
56
|
+
if (!(await pathExists(getSettingsPath(pmRoot)))) {
|
|
57
|
+
throw new PmCliError(`Tracker is not initialized at ${pmRoot}. Run pm init first.`, EXIT_CODE.NOT_FOUND);
|
|
58
|
+
}
|
|
59
|
+
const settings = await readSettings(pmRoot);
|
|
60
|
+
const adds = parseAddEntries(options.add);
|
|
61
|
+
const removes = parseRemoveEntries(options.remove);
|
|
62
|
+
const shouldMutate = adds.length > 0 || removes.length > 0;
|
|
63
|
+
if (!shouldMutate) {
|
|
64
|
+
const located = await locateItem(pmRoot, id, settings.id_prefix);
|
|
65
|
+
if (!located) {
|
|
66
|
+
throw new PmCliError(`Item ${id} not found`, EXIT_CODE.NOT_FOUND);
|
|
67
|
+
}
|
|
68
|
+
const loaded = await readLocatedItem(located);
|
|
69
|
+
const files = loaded.document.front_matter.files ?? [];
|
|
70
|
+
return {
|
|
71
|
+
id: located.id,
|
|
72
|
+
files,
|
|
73
|
+
changed: false,
|
|
74
|
+
count: files.length,
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
const author = resolveAuthor(options.author, settings.author_default);
|
|
78
|
+
const result = await mutateItem({
|
|
79
|
+
pmRoot,
|
|
80
|
+
settings,
|
|
81
|
+
id,
|
|
82
|
+
op: "files_add",
|
|
83
|
+
author,
|
|
84
|
+
message: options.message,
|
|
85
|
+
force: options.force,
|
|
86
|
+
mutate(document) {
|
|
87
|
+
const next = [...(document.front_matter.files ?? [])];
|
|
88
|
+
for (const add of adds) {
|
|
89
|
+
const exists = next.some((entry) => entry.path === add.path && entry.scope === add.scope);
|
|
90
|
+
if (!exists) {
|
|
91
|
+
next.push(add);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
if (removes.length > 0) {
|
|
95
|
+
for (let i = next.length - 1; i >= 0; i -= 1) {
|
|
96
|
+
if (removes.includes(next[i].path)) {
|
|
97
|
+
next.splice(i, 1);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
document.front_matter.files = next;
|
|
102
|
+
return { changedFields: ["files"] };
|
|
103
|
+
},
|
|
104
|
+
});
|
|
105
|
+
const files = result.item.files ?? [];
|
|
106
|
+
return {
|
|
107
|
+
id: result.item.id,
|
|
108
|
+
files,
|
|
109
|
+
changed: true,
|
|
110
|
+
count: files.length,
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=files.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"files.js","sourceRoot":"","sources":["../../../src/cli/commands/files.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { GlobalOptions } from "../../core/shared/command-types.js";
|
|
2
|
+
export interface GcResult {
|
|
3
|
+
ok: boolean;
|
|
4
|
+
removed: string[];
|
|
5
|
+
retained: string[];
|
|
6
|
+
warnings: string[];
|
|
7
|
+
generated_at: string;
|
|
8
|
+
}
|
|
9
|
+
export declare function runGc(global: GlobalOptions): Promise<GcResult>;
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import fs from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { runActiveOnIndexHooks, runActiveOnReadHooks, runActiveOnWriteHooks } from "../../core/extensions/index.js";
|
|
4
|
+
import { pathExists } from "../../core/fs/fs-utils.js";
|
|
5
|
+
import { EXIT_CODE } from "../../core/shared/constants.js";
|
|
6
|
+
import { PmCliError } from "../../core/shared/errors.js";
|
|
7
|
+
import { nowIso } from "../../core/shared/time.js";
|
|
8
|
+
import { getSettingsPath, resolvePmRoot } from "../../core/store/paths.js";
|
|
9
|
+
import { readSettings } from "../../core/store/settings.js";
|
|
10
|
+
const GC_TARGETS = ["index/manifest.json", "search/embeddings.jsonl"];
|
|
11
|
+
function isErrno(error, code) {
|
|
12
|
+
return typeof error === "object" && error !== null && "code" in error && error.code === code;
|
|
13
|
+
}
|
|
14
|
+
async function removeCacheFile(pmRoot, relativePath) {
|
|
15
|
+
const absolutePath = path.join(pmRoot, relativePath);
|
|
16
|
+
const warnings = await runActiveOnReadHooks({
|
|
17
|
+
path: absolutePath,
|
|
18
|
+
scope: "project",
|
|
19
|
+
});
|
|
20
|
+
try {
|
|
21
|
+
const stats = await fs.stat(absolutePath);
|
|
22
|
+
if (!stats.isFile()) {
|
|
23
|
+
return {
|
|
24
|
+
removed: false,
|
|
25
|
+
warnings: [...warnings, `not_a_file:${relativePath}`],
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
await fs.unlink(absolutePath);
|
|
29
|
+
const writeWarnings = await runActiveOnWriteHooks({
|
|
30
|
+
path: absolutePath,
|
|
31
|
+
scope: "project",
|
|
32
|
+
op: "gc:remove",
|
|
33
|
+
});
|
|
34
|
+
return {
|
|
35
|
+
removed: true,
|
|
36
|
+
warnings: [...warnings, ...writeWarnings],
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
if (isErrno(error, "ENOENT")) {
|
|
41
|
+
return {
|
|
42
|
+
removed: false,
|
|
43
|
+
warnings,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
throw error;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
export async function runGc(global) {
|
|
50
|
+
const pmRoot = resolvePmRoot(process.cwd(), global.path);
|
|
51
|
+
if (!(await pathExists(getSettingsPath(pmRoot)))) {
|
|
52
|
+
throw new PmCliError(`Tracker is not initialized at ${pmRoot}. Run pm init first.`, EXIT_CODE.NOT_FOUND);
|
|
53
|
+
}
|
|
54
|
+
await readSettings(pmRoot);
|
|
55
|
+
const removed = [];
|
|
56
|
+
const retained = [];
|
|
57
|
+
const warnings = [];
|
|
58
|
+
for (const target of GC_TARGETS) {
|
|
59
|
+
const result = await removeCacheFile(pmRoot, target);
|
|
60
|
+
if (result.removed) {
|
|
61
|
+
removed.push(target);
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
retained.push(target);
|
|
65
|
+
}
|
|
66
|
+
warnings.push(...result.warnings);
|
|
67
|
+
}
|
|
68
|
+
warnings.push(...(await runActiveOnIndexHooks({
|
|
69
|
+
mode: "gc",
|
|
70
|
+
total_items: GC_TARGETS.length,
|
|
71
|
+
})));
|
|
72
|
+
return {
|
|
73
|
+
ok: warnings.length === 0,
|
|
74
|
+
removed,
|
|
75
|
+
retained,
|
|
76
|
+
warnings,
|
|
77
|
+
generated_at: nowIso(),
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=gc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gc.js","sourceRoot":"","sources":["../../../src/cli/commands/gc.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { GlobalOptions } from "../../core/shared/command-types.js";
|
|
2
|
+
import type { ItemFrontMatter, LinkedDoc, LinkedFile, LinkedTest } from "../../types/index.js";
|
|
3
|
+
export interface GetResult {
|
|
4
|
+
item: ItemFrontMatter;
|
|
5
|
+
body: string;
|
|
6
|
+
linked: {
|
|
7
|
+
files: LinkedFile[];
|
|
8
|
+
tests: LinkedTest[];
|
|
9
|
+
docs: LinkedDoc[];
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
export declare function runGet(id: string, global: GlobalOptions): Promise<GetResult>;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { pathExists } from "../../core/fs/fs-utils.js";
|
|
2
|
+
import { EXIT_CODE } from "../../core/shared/constants.js";
|
|
3
|
+
import { PmCliError } from "../../core/shared/errors.js";
|
|
4
|
+
import { locateItem, readLocatedItem } from "../../core/store/item-store.js";
|
|
5
|
+
import { getSettingsPath, resolvePmRoot } from "../../core/store/paths.js";
|
|
6
|
+
import { readSettings } from "../../core/store/settings.js";
|
|
7
|
+
export async function runGet(id, global) {
|
|
8
|
+
const pmRoot = resolvePmRoot(process.cwd(), global.path);
|
|
9
|
+
if (!(await pathExists(getSettingsPath(pmRoot)))) {
|
|
10
|
+
throw new PmCliError(`Tracker is not initialized at ${pmRoot}. Run pm init first.`, EXIT_CODE.NOT_FOUND);
|
|
11
|
+
}
|
|
12
|
+
const settings = await readSettings(pmRoot);
|
|
13
|
+
const located = await locateItem(pmRoot, id, settings.id_prefix);
|
|
14
|
+
if (!located) {
|
|
15
|
+
throw new PmCliError(`Item ${id} not found`, EXIT_CODE.NOT_FOUND);
|
|
16
|
+
}
|
|
17
|
+
const loaded = await readLocatedItem(located);
|
|
18
|
+
return {
|
|
19
|
+
item: loaded.document.front_matter,
|
|
20
|
+
body: loaded.document.body,
|
|
21
|
+
linked: {
|
|
22
|
+
files: loaded.document.front_matter.files ?? [],
|
|
23
|
+
tests: loaded.document.front_matter.tests ?? [],
|
|
24
|
+
docs: loaded.document.front_matter.docs ?? [],
|
|
25
|
+
},
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=get.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get.js","sourceRoot":"","sources":["../../../src/cli/commands/get.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,gCAAgC,CAAC;AAE3D,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAC7E,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC3E,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAa5D,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,EAAU,EAAE,MAAqB;IAC5D,MAAM,MAAM,GAAG,aAAa,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;IACzD,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;QACjD,MAAM,IAAI,UAAU,CAAC,iCAAiC,MAAM,sBAAsB,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAC3G,CAAC;IACD,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,MAAM,CAAC,CAAC;IAC5C,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,MAAM,EAAE,EAAE,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC;IACjE,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,UAAU,CAAC,QAAQ,EAAE,YAAY,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IACpE,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,OAAO,CAAC,CAAC;IAC9C,OAAO;QACL,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,YAAY;QAClC,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI;QAC1B,MAAM,EAAE;YACN,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,KAAK,IAAI,EAAE;YAC/C,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,KAAK,IAAI,EAAE;YAC/C,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,IAAI,EAAE;SAC9C;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { GlobalOptions } from "../../core/shared/command-types.js";
|
|
2
|
+
type HealthStatus = "ok" | "warn";
|
|
3
|
+
export interface HealthCheck {
|
|
4
|
+
name: "settings" | "directories" | "settings_values" | "extensions" | "storage";
|
|
5
|
+
status: HealthStatus;
|
|
6
|
+
details: Record<string, unknown>;
|
|
7
|
+
}
|
|
8
|
+
export interface HealthResult {
|
|
9
|
+
ok: boolean;
|
|
10
|
+
checks: HealthCheck[];
|
|
11
|
+
warnings: string[];
|
|
12
|
+
generated_at: string;
|
|
13
|
+
}
|
|
14
|
+
export declare function runHealth(global: GlobalOptions): Promise<HealthResult>;
|
|
15
|
+
export {};
|