@arshdelight/practi 0.9.5 → 0.10.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.
Files changed (56) hide show
  1. package/README.md +51 -14
  2. package/dist/client.js +49 -6
  3. package/dist/client.js.map +1 -1
  4. package/dist/cmd/blob.js +10 -1
  5. package/dist/cmd/blob.js.map +1 -1
  6. package/dist/cmd/clone.js +13 -7
  7. package/dist/cmd/clone.js.map +1 -1
  8. package/dist/cmd/comment.js +50 -15
  9. package/dist/cmd/comment.js.map +1 -1
  10. package/dist/cmd/config.js +1 -1
  11. package/dist/cmd/config.js.map +1 -1
  12. package/dist/cmd/edit.js +80 -8
  13. package/dist/cmd/edit.js.map +1 -1
  14. package/dist/cmd/gc.js +77 -0
  15. package/dist/cmd/gc.js.map +1 -0
  16. package/dist/cmd/lifecycle.js +63 -13
  17. package/dist/cmd/lifecycle.js.map +1 -1
  18. package/dist/cmd/login.js +13 -4
  19. package/dist/cmd/login.js.map +1 -1
  20. package/dist/cmd/ls.js +41 -2
  21. package/dist/cmd/ls.js.map +1 -1
  22. package/dist/cmd/migrate.js +3 -0
  23. package/dist/cmd/migrate.js.map +1 -1
  24. package/dist/cmd/new.js +50 -3
  25. package/dist/cmd/new.js.map +1 -1
  26. package/dist/cmd/note.js +160 -0
  27. package/dist/cmd/note.js.map +1 -0
  28. package/dist/cmd/push.js +6 -1
  29. package/dist/cmd/push.js.map +1 -1
  30. package/dist/cmd/remote.js +15 -8
  31. package/dist/cmd/remote.js.map +1 -1
  32. package/dist/cmd/remove.js +42 -0
  33. package/dist/cmd/remove.js.map +1 -0
  34. package/dist/cmd/repair.js +1 -1
  35. package/dist/cmd/repair.js.map +1 -1
  36. package/dist/cmd/search.js +154 -57
  37. package/dist/cmd/search.js.map +1 -1
  38. package/dist/cmd/show.js +96 -9
  39. package/dist/cmd/show.js.map +1 -1
  40. package/dist/index.js +134 -36
  41. package/dist/index.js.map +1 -1
  42. package/dist/notes.js +121 -0
  43. package/dist/notes.js.map +1 -0
  44. package/dist/oauth.js +3 -0
  45. package/dist/oauth.js.map +1 -1
  46. package/dist/state.js +2 -1
  47. package/dist/state.js.map +1 -1
  48. package/dist/web.js +128 -13
  49. package/dist/web.js.map +1 -1
  50. package/package.json +1 -1
  51. package/skills/use-practi/SKILL.md +49 -14
  52. package/web-default/app.js +2 -2
  53. package/web-default/detail.html +5 -1
  54. package/web-default/detail.js +352 -12
  55. package/web-default/lang.js +16 -4
  56. package/web-default/style.css +59 -7
package/dist/cmd/new.js CHANGED
@@ -2,6 +2,8 @@ import fs from 'node:fs';
2
2
  import { createFromDoc, loadWorkspace, validateWorkspace } from '@arshdelight/pop-sdk';
3
3
  import { claimDirect, defaultDataDir, loadState, saveState } from '../state.js';
4
4
  import { openWorkspace } from '../workspace.js';
5
+ import { runPublish } from './lifecycle.js';
6
+ import { storeDocumentRemote } from '../client.js';
5
7
  function readStdin() {
6
8
  return fs.readFileSync(0, 'utf8');
7
9
  }
@@ -9,8 +11,18 @@ function readStdin() {
9
11
  * Create a POP from a JSON document: --json '<text>', <file.json>, or stdin
10
12
  * (all machine/AI friendly — no editor loop). Validates through the SDK,
11
13
  * persists the content-addressed tree, and registers the root as direct.
14
+ *
15
+ * --remote switches the whole creation to the hub: the authoring JSON goes to
16
+ * the existing POST /api/v1/pop (the hub runs the same SDK parse + hashing),
17
+ * nothing is written locally. --publish additionally submits for review and
18
+ * requires --remote (publishing needs the document on the hub first).
12
19
  */
13
- export function runNew(opts) {
20
+ export async function runNew(opts) {
21
+ // 旗标组合的语义错误先于 IO 报(missing.json --publish 应报 --publish requires --remote 而非 ENOENT)
22
+ if (opts.publish === true && opts.remote !== true) {
23
+ console.error('error: --publish requires --remote — publishing needs the document on the hub first');
24
+ return 1;
25
+ }
14
26
  let text;
15
27
  if (opts.json !== undefined)
16
28
  text = opts.json;
@@ -22,6 +34,7 @@ export function runNew(opts) {
22
34
  text = readStdin();
23
35
  if (text === undefined || text.trim() === '') {
24
36
  console.error('usage: practi new <file.json> | practi new --json \'<json text>\' | practi new < file.json');
37
+ console.error(' [--remote (create on the hub only)] [--publish (submit for review; requires --remote)]');
25
38
  return 1;
26
39
  }
27
40
  let doc;
@@ -33,6 +46,12 @@ export function runNew(opts) {
33
46
  return 1;
34
47
  }
35
48
  const dataDir = opts.dataDir ?? defaultDataDir();
49
+ if (opts.remote === true)
50
+ return remoteNew(opts, dataDir, doc);
51
+ return localNew(dataDir, doc);
52
+ }
53
+ /** 本地默认路:SDK 校验 → 内容寻址落盘 → 注册 direct。 */
54
+ function localNew(dataDir, doc) {
36
55
  const ws = openWorkspace(dataDir);
37
56
  const { root, count } = createFromDoc(ws, doc);
38
57
  const issues = validateWorkspace(loadWorkspace(dataDir));
@@ -47,9 +66,37 @@ export function runNew(opts) {
47
66
  console.error(` ${i.code}: ${i.message}${i.hint ? ` (${i.hint})` : ''}`);
48
67
  }
49
68
  console.error(`warning: stored but NOT registered as direct — ${issues.length} validation issue(s)`);
69
+ return 1; // 存了但没注册成=没办成正事,与 edit 同类失败及 --remote 的服务端 422 对齐
70
+ }
71
+ console.log('status: valid, registered as direct');
72
+ return 0;
73
+ }
74
+ /** --remote:只有远端——创作 JSON 直送现有 POST /api/v1/pop(hub 委托官方 SDK 解析、
75
+ * 规范化、算 root_hash 并认领,默认 PRIVATE),本地零写入,root 由服务端告知。
76
+ * 注意:远端独占的文档下一次 practi pull 会拉回本地(它就是 hub 上你的认领),
77
+ * 本地 ls/show/web/note 也看不见它。--publish 再链 submit 送审。 */
78
+ async function remoteNew(opts, dataDir, doc) {
79
+ const state = loadState(dataDir);
80
+ if (!state.remote) {
81
+ console.error('error: no remote configured — run `practi remote set <url>` first');
82
+ return 1;
83
+ }
84
+ let stored;
85
+ try {
86
+ stored = await storeDocumentRemote(dataDir, state.remote.url, doc);
50
87
  }
51
- else {
52
- console.log('status: valid, registered as direct');
88
+ catch (e) {
89
+ console.error(`error: remote create failed — ${e.message}`);
90
+ return 1;
91
+ }
92
+ console.log(`created: ${stored.rootHash} (on the hub — it parsed and hashed the tree; nothing written locally)`);
93
+ console.log(`status: ${stored.status}, claimed${stored.idempotent ? ' (already existed)' : ''}`);
94
+ if (opts.publish === true) {
95
+ const code = await runPublish({ dataDir, positional: [stored.rootHash] });
96
+ if (code !== 0) {
97
+ console.error('publish: submit failed — the document is created on the hub (PRIVATE); run `practi publish <hash>` after fixing');
98
+ return 1;
99
+ }
53
100
  }
54
101
  return 0;
55
102
  }
@@ -1 +1 @@
1
- {"version":3,"file":"new.js","sourceRoot":"","sources":["../../src/cmd/new.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"new.js","sourceRoot":"","sources":["../../src/cmd/new.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,160 @@
1
+ import { resolveNodeRef } from '@arshdelight/pop-sdk';
2
+ import { defaultDataDir, loadState } from '../state.js';
3
+ import { openWorkspace } from '../workspace.js';
4
+ import { shortHash } from '../render.js';
5
+ import { loadNotes, insertNote, updateNote, removeNote, subtreeHashes } from '../notes.js';
6
+ const USAGE = `usage: practi note add|list|edit|delete
7
+ practi note add <node> -m "<笔记内容>" [--json]
8
+ 把学习/复现笔记钉在节点哈希上(前缀 OK;本地记录,不上传)
9
+ practi note list [hash] [--json]
10
+ 无参=全部笔记(按所属文档分组);hash=只看该节点子树内的笔记
11
+ practi note edit <note-id> -m "<新内容>" [--json]
12
+ practi note delete <note-id>`;
13
+ export function runNote(opts) {
14
+ const dataDir = opts.dataDir ?? defaultDataDir();
15
+ const sub = opts.positional[0];
16
+ switch (sub) {
17
+ case 'add':
18
+ return noteAdd(opts, dataDir);
19
+ case 'list':
20
+ return noteList(opts, dataDir);
21
+ case 'edit':
22
+ return noteEdit(opts, dataDir);
23
+ case 'delete':
24
+ return noteDelete(opts, dataDir);
25
+ default:
26
+ console.error(USAGE);
27
+ return 1;
28
+ }
29
+ }
30
+ function noteAdd(opts, dataDir) {
31
+ const target = opts.positional[1];
32
+ if (!target || !opts.message || !opts.message.trim()) {
33
+ console.error('usage: practi note add <node> -m "<笔记内容>"');
34
+ return 1;
35
+ }
36
+ // 存在性校验兼前缀解析:笔记必须钉在工作区已有的节点上(挡手滑哈希)
37
+ const ws = openWorkspace(dataDir);
38
+ const hash = resolveNodeRef(ws, target);
39
+ const note = insertNote(dataDir, hash, opts.message);
40
+ if (opts.json) {
41
+ console.log(JSON.stringify(note, null, 2));
42
+ return 0;
43
+ }
44
+ console.log(`noted on ${shortHash(hash)} — id ${note.id}`);
45
+ return 0;
46
+ }
47
+ function noteList(opts, dataDir) {
48
+ const target = opts.positional[1];
49
+ const file = loadNotes(dataDir);
50
+ let notes = file.notes;
51
+ if (target) {
52
+ const ws = openWorkspace(dataDir);
53
+ const hash = resolveNodeRef(ws, target);
54
+ const set = subtreeHashes(ws, hash);
55
+ notes = notes.filter(n => set.has(n.hash));
56
+ }
57
+ if (opts.json) {
58
+ // 机器窗:按存入顺序(时间正序)平铺,不分组——分组是人看的
59
+ console.log(JSON.stringify(notes, null, 2));
60
+ return 0;
61
+ }
62
+ if (notes.length === 0) {
63
+ console.log(target ? 'no notes in this subtree' : 'no notes');
64
+ return 0;
65
+ }
66
+ if (target) {
67
+ const ws2 = openWorkspace(dataDir);
68
+ printNotes(notes, h => ws2.nodes.get(h)?.name ?? shortHash(h));
69
+ return 0;
70
+ }
71
+ // 无参:按所属文档分组(组内时间正序=学习轨迹,组按最新笔记倒序=最近在学的在前);
72
+ // 钉在已 GC/换根孤儿上的笔记归入悬空组殿后
73
+ const ws = openWorkspace(dataDir);
74
+ const state = loadState(dataDir);
75
+ const claimed = new Set();
76
+ const groups = [];
77
+ for (const root of state.direct) {
78
+ if (!ws.nodes.has(root))
79
+ continue;
80
+ const set = subtreeHashes(ws, root);
81
+ const items = notes.filter(n => set.has(n.hash));
82
+ if (!items.length)
83
+ continue;
84
+ for (const n of items)
85
+ claimed.add(n.id);
86
+ groups.push({ title: groupTitle(ws, root), items });
87
+ }
88
+ const dangling = notes.filter(n => !claimed.has(n.id));
89
+ if (dangling.length) {
90
+ groups.push({ title: `dangling (${dangling.length})`, items: dangling });
91
+ }
92
+ groups.sort((a, b) => newest(b.items).localeCompare(newest(a.items)));
93
+ for (const g of groups) {
94
+ console.log(`\n${g.title}`);
95
+ printNotes(g.items, h => ws.nodes.get(h)?.name ?? shortHash(h));
96
+ }
97
+ return 0;
98
+ }
99
+ function groupTitle(ws, root) {
100
+ const node = ws.nodes.get(root);
101
+ const tag = node ? (node.type === 'practice' ? `practice·${node.op}` : 'action') : '';
102
+ return `${node?.name ?? '?'} [${tag}] ${shortHash(root)}`;
103
+ }
104
+ function newest(items) {
105
+ return items.reduce((acc, n) => (n.createdAt > acc ? n.createdAt : acc), '');
106
+ }
107
+ function printNotes(notes, label) {
108
+ for (const n of notes) {
109
+ console.log(` ${n.id} ${fmtLocal(n.createdAt)} ${label(n.hash)}`);
110
+ for (const line of n.content.split('\n'))
111
+ console.log(` ${line}`);
112
+ }
113
+ }
114
+ /** ISO → 本地时区 YYYY-MM-DD HH:mm(个人日记口径:时间属于看的人) */
115
+ function fmtLocal(iso) {
116
+ const d = new Date(iso);
117
+ if (Number.isNaN(d.getTime()))
118
+ return iso;
119
+ const p = (x) => (x < 10 ? '0' : '') + x;
120
+ return `${d.getFullYear()}-${p(d.getMonth() + 1)}-${p(d.getDate())} ${p(d.getHours())}:${p(d.getMinutes())}`;
121
+ }
122
+ function reportMutation(id, m) {
123
+ if (!m.ok) {
124
+ if (m.reason === 'not_found')
125
+ console.error(`error: note "${id}" not found`);
126
+ else
127
+ console.error(`error: note id prefix "${id}" matches ${m.matches} notes`);
128
+ return 1;
129
+ }
130
+ return 0;
131
+ }
132
+ function noteEdit(opts, dataDir) {
133
+ const id = opts.positional[1];
134
+ if (!id || !opts.message || !opts.message.trim()) {
135
+ console.error('usage: practi note edit <note-id> -m "<新内容>"');
136
+ return 1;
137
+ }
138
+ const m = updateNote(dataDir, id, opts.message);
139
+ if (!m.ok)
140
+ return reportMutation(id, m);
141
+ if (opts.json) {
142
+ console.log(JSON.stringify(m.note, null, 2));
143
+ return 0;
144
+ }
145
+ console.log(`note ${m.note.id} edited`);
146
+ return 0;
147
+ }
148
+ function noteDelete(opts, dataDir) {
149
+ const id = opts.positional[1];
150
+ if (!id) {
151
+ console.error('usage: practi note delete <note-id>');
152
+ return 1;
153
+ }
154
+ const m = removeNote(dataDir, id);
155
+ if (!m.ok)
156
+ return reportMutation(id, m);
157
+ console.log(`note ${m.note.id} deleted`);
158
+ return 0;
159
+ }
160
+ //# sourceMappingURL=note.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"note.js","sourceRoot":"","sources":["../../src/cmd/note.ts"],"names":[],"mappings":"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"}
package/dist/cmd/push.js CHANGED
@@ -7,7 +7,7 @@ import { authedFetch, fetchMine } from '../client.js';
7
7
  * - 先分页取 hub 上「我的」认领表(mine),diff 出本地认领而 hub 我还没认领的,
8
8
  * 只传这些(带 hash 只推该 direct;不带推全部 direct)——不再全量 POST。
9
9
  * - 走 POST /api/v1/pop(内容寻址幂等):hub 没有就存,有则 idempotent 不重复写,
10
- * 且每次上传都获得 DIRECT 认领。默认存为 PRIVATE;公开仍需 submit 审核。
10
+ * 且每次上传都获得 DIRECT 认领。默认存为 PRIVATE;公开仍需 practi publish 送审。
11
11
  */
12
12
  export async function runPush(opts) {
13
13
  const dataDir = opts.dataDir ?? defaultDataDir();
@@ -45,6 +45,11 @@ export async function runPush(opts) {
45
45
  failed++;
46
46
  continue;
47
47
  }
48
+ if (!state.direct.includes(resolved)) {
49
+ console.error(`push failed: ${ref} — ${resolved} is not one of your direct pops (push exports YOUR direct roots; indirect nodes travel inside them)`);
50
+ failed++;
51
+ continue;
52
+ }
48
53
  if (!mineHashes.has(resolved))
49
54
  toPush.push(resolved);
50
55
  }
@@ -1 +1 @@
1
- {"version":3,"file":"push.js","sourceRoot":"","sources":["../../src/cmd/push.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"push.js","sourceRoot":"","sources":["../../src/cmd/push.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,11 @@
1
- import { defaultDataDir, loadState, saveState } from '../state.js';
1
+ import { defaultDataDir, DEFAULT_REMOTE_URL, loadState, saveState } from '../state.js';
2
2
  import { loadCredentials, deleteCredentials } from '../credentials.js';
3
3
  import { cliResource, revokeToken } from '../oauth.js';
4
+ /** practi remote set / remove。看当前挂靠用 `practi config`(remote show 已砍——与 config 重复)。 */
4
5
  export async function runRemote(opts) {
5
6
  const dataDir = opts.dataDir ?? defaultDataDir();
6
7
  const state = loadState(dataDir);
7
- const action = opts.positional[0] ?? 'show';
8
+ const action = opts.positional[0];
8
9
  switch (action) {
9
10
  case 'set': {
10
11
  const url = opts.positional[1];
@@ -33,15 +34,21 @@ export async function runRemote(opts) {
33
34
  case 'remove': {
34
35
  delete state.remote;
35
36
  saveState(dataDir, state);
36
- console.log('remote removed');
37
- return 0;
38
- }
39
- case 'show': {
40
- console.log(state.remote ? state.remote.url : '(not set)');
37
+ console.log(`remote removed — falls back to the official hub (${DEFAULT_REMOTE_URL})`);
38
+ // 与 set 同规:换回官方 hub 时,自建 hub 签发的凭据已无用——revoke(best-effort)并清除
39
+ const creds = loadCredentials(dataDir);
40
+ if (creds && creds.resource && creds.resource !== cliResource(DEFAULT_REMOTE_URL)) {
41
+ const oldOrigin = creds.resource.replace(/\/cli$/, '');
42
+ if (oldOrigin)
43
+ await revokeToken(oldOrigin, creds.client_id, creds.refresh_token, 'refresh_token');
44
+ deleteCredentials(dataDir);
45
+ console.log(`note: cleared credentials issued by ${oldOrigin} — run \`practi login\` against ${DEFAULT_REMOTE_URL}`);
46
+ }
41
47
  return 0;
42
48
  }
43
49
  default:
44
- console.error(`usage: practi remote set <url> | show | remove`);
50
+ console.error('error: missing action set or remove');
51
+ console.error('usage: practi remote set <url> | remove (see the current remote with `practi config`)');
45
52
  return 1;
46
53
  }
47
54
  }
@@ -1 +1 @@
1
- {"version":3,"file":"remote.js","sourceRoot":"","sources":["../../src/cmd/remote.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACnE,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACvE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAOvD,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAAgB;IAC9C,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,cAAc,EAAE,CAAC;IACjD,MAAM,KAAK,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;IACjC,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC;IAE5C,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,KAAK,CAAC,CAAC,CAAC;YACX,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;YAC/B,IAAI,CAAC,GAAG,EAAE,CAAC;gBACT,OAAO,CAAC,KAAK,CAAC,+EAA+E,CAAC,CAAC;gBAC/F,OAAO,CAAC,CAAC;YACX,CAAC;YACD,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;gBACnC,OAAO,CAAC,KAAK,CAAC,WAAW,GAAG,yBAAyB,CAAC,CAAC;gBACvD,OAAO,CAAC,CAAC;YACX,CAAC;YACD,KAAK,CAAC,MAAM,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC;YAChD,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YAC1B,OAAO,CAAC,GAAG,CAAC,eAAe,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;YAC/C,iEAAiE;YACjE,MAAM,KAAK,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;YACvC,IAAI,KAAK,IAAI,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,QAAQ,KAAK,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;gBAChF,MAAM,SAAS,GAAG,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;gBACvD,IAAI,SAAS;oBAAE,MAAM,WAAW,CAAC,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,aAAa,EAAE,eAAe,CAAC,CAAC;gBACnG,iBAAiB,CAAC,OAAO,CAAC,CAAC;gBAC3B,OAAO,CAAC,GAAG,CAAC,uCAAuC,SAAS,mCAAmC,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;YACrH,CAAC;YACD,OAAO,CAAC,CAAC;QACX,CAAC;QACD,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,OAAO,KAAK,CAAC,MAAM,CAAC;YACpB,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YAC1B,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;YAC9B,OAAO,CAAC,CAAC;QACX,CAAC;QACD,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;YAC3D,OAAO,CAAC,CAAC;QACX,CAAC;QACD;YACE,OAAO,CAAC,KAAK,CAAC,gDAAgD,CAAC,CAAC;YAChE,OAAO,CAAC,CAAC;IACb,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"remote.js","sourceRoot":"","sources":["../../src/cmd/remote.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACvF,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACvE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAOvD,sFAAsF;AACtF,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAAgB;IAC9C,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,cAAc,EAAE,CAAC;IACjD,MAAM,KAAK,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;IACjC,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IAElC,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,KAAK,CAAC,CAAC,CAAC;YACX,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;YAC/B,IAAI,CAAC,GAAG,EAAE,CAAC;gBACT,OAAO,CAAC,KAAK,CAAC,+EAA+E,CAAC,CAAC;gBAC/F,OAAO,CAAC,CAAC;YACX,CAAC;YACD,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;gBACnC,OAAO,CAAC,KAAK,CAAC,WAAW,GAAG,yBAAyB,CAAC,CAAC;gBACvD,OAAO,CAAC,CAAC;YACX,CAAC;YACD,KAAK,CAAC,MAAM,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC;YAChD,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YAC1B,OAAO,CAAC,GAAG,CAAC,eAAe,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;YAC/C,iEAAiE;YACjE,MAAM,KAAK,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;YACvC,IAAI,KAAK,IAAI,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,QAAQ,KAAK,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;gBAChF,MAAM,SAAS,GAAG,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;gBACvD,IAAI,SAAS;oBAAE,MAAM,WAAW,CAAC,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,aAAa,EAAE,eAAe,CAAC,CAAC;gBACnG,iBAAiB,CAAC,OAAO,CAAC,CAAC;gBAC3B,OAAO,CAAC,GAAG,CAAC,uCAAuC,SAAS,mCAAmC,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;YACrH,CAAC;YACD,OAAO,CAAC,CAAC;QACX,CAAC;QACD,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,OAAO,KAAK,CAAC,MAAM,CAAC;YACpB,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YAC1B,OAAO,CAAC,GAAG,CAAC,oDAAoD,kBAAkB,GAAG,CAAC,CAAC;YACvF,8DAA8D;YAC9D,MAAM,KAAK,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;YACvC,IAAI,KAAK,IAAI,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,QAAQ,KAAK,WAAW,CAAC,kBAAkB,CAAC,EAAE,CAAC;gBAClF,MAAM,SAAS,GAAG,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;gBACvD,IAAI,SAAS;oBAAE,MAAM,WAAW,CAAC,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,aAAa,EAAE,eAAe,CAAC,CAAC;gBACnG,iBAAiB,CAAC,OAAO,CAAC,CAAC;gBAC3B,OAAO,CAAC,GAAG,CAAC,uCAAuC,SAAS,mCAAmC,kBAAkB,EAAE,CAAC,CAAC;YACvH,CAAC;YACD,OAAO,CAAC,CAAC;QACX,CAAC;QACD;YACE,OAAO,CAAC,KAAK,CAAC,uCAAuC,CAAC,CAAC;YACvD,OAAO,CAAC,KAAK,CAAC,yFAAyF,CAAC,CAAC;YACzG,OAAO,CAAC,CAAC;IACb,CAAC;AACH,CAAC"}
@@ -0,0 +1,42 @@
1
+ import fs from 'node:fs';
2
+ import { loadWorkspace, resolveNodeRef, nodeFilePath } from '@arshdelight/pop-sdk';
3
+ import { defaultDataDir, loadState, saveState } from '../state.js';
4
+ import { openWorkspace } from '../workspace.js';
5
+ import { collectUnreachable } from './edit.js';
6
+ import { runDelete } from './lifecycle.js';
7
+ import { shortHash } from '../render.js';
8
+ export async function runRemove(opts) {
9
+ if (opts.remote === true) {
10
+ return runDelete({ dataDir: opts.dataDir, positional: opts.positional.slice(0, 1) }); // 一命令一认领,多给的不静默连删
11
+ }
12
+ const ref = opts.positional[0];
13
+ if (!ref) {
14
+ console.error('usage: practi remove <hash> (take a direct pop out of the local directory; unreachable nodes are GCed)');
15
+ console.error(' practi remove <hash> --remote (withdraw the claim on the remote instead)');
16
+ return 1;
17
+ }
18
+ const dataDir = opts.dataDir ?? defaultDataDir();
19
+ const state = loadState(dataDir);
20
+ const ws = openWorkspace(dataDir);
21
+ const root = resolveNodeRef(ws, ref);
22
+ if (!state.direct.includes(root)) {
23
+ console.error(`error: ${root} is not one of your direct pops — remove takes a direct root out of the local directory;`);
24
+ console.error(' indirect nodes live inside direct trees (`practi ls -a`), leave by removing their root');
25
+ return 1;
26
+ }
27
+ state.direct = state.direct.filter((h) => h !== root);
28
+ saveState(dataDir, state); // claims 修剪在写盘口:被删根的认领时刻随之失效
29
+ console.log(`removed: ${root} from the local directory`);
30
+ const dead = collectUnreachable(loadWorkspace(dataDir), state.direct);
31
+ for (const h of dead)
32
+ fs.unlinkSync(nodeFilePath(dataDir, h));
33
+ console.log(`gc: removed ${dead.length} unreachable node(s)${dead.length > 0 ? ` — ${dead.map(shortHash).join(', ')}` : ''}`);
34
+ if (dead.length > 0) {
35
+ console.log('hint: blobs stay with their bytes — `practi gc` sweeps orphans when you want');
36
+ }
37
+ if (state.remote) {
38
+ console.log(`remote: the hub copy (if pushed) stays — withdraw with \`practi remove ${shortHash(root)} --remote\``);
39
+ }
40
+ return 0;
41
+ }
42
+ //# sourceMappingURL=remove.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remove.js","sourceRoot":"","sources":["../../src/cmd/remove.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACnF,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACnE,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAiBzC,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAAgB;IAC9C,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;QACzB,OAAO,SAAS,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,kBAAkB;IAC1G,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IAC/B,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,CAAC,KAAK,CAAC,0GAA0G,CAAC,CAAC;QAC1H,OAAO,CAAC,KAAK,CAAC,mFAAmF,CAAC,CAAC;QACnG,OAAO,CAAC,CAAC;IACX,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,cAAc,EAAE,CAAC;IACjD,MAAM,KAAK,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;IACjC,MAAM,EAAE,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;IAClC,MAAM,IAAI,GAAG,cAAc,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;IACrC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACjC,OAAO,CAAC,KAAK,CAAC,UAAU,IAAI,0FAA0F,CAAC,CAAC;QACxH,OAAO,CAAC,KAAK,CAAC,+FAA+F,CAAC,CAAC;QAC/G,OAAO,CAAC,CAAC;IACX,CAAC;IAED,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;IACtD,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,6BAA6B;IACxD,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,2BAA2B,CAAC,CAAC;IAE1D,MAAM,IAAI,GAAG,kBAAkB,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IACtE,KAAK,MAAM,CAAC,IAAI,IAAI;QAAE,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;IAC9D,OAAO,CAAC,GAAG,CACT,qBAAqB,IAAI,CAAC,MAAM,uBAAuB,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CACvH,CAAC;IACF,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpB,OAAO,CAAC,GAAG,CAAC,kFAAkF,CAAC,CAAC;IAClG,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,4EAA4E,SAAS,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IACxH,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC"}
@@ -28,7 +28,7 @@ export function runRepair(opts) {
28
28
  saveState(dataDir, state);
29
29
  console.log(`claims: ${already} already stamped, ${backfilled} backfilled from file time, ${unrepairable.length} unrepairable`);
30
30
  for (const h of unrepairable)
31
- console.log(` no local node file: ${h}`);
31
+ console.error(` no local node file: ${h}`);
32
32
  return unrepairable.length > 0 ? 1 : 0;
33
33
  }
34
34
  //# sourceMappingURL=repair.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"repair.js","sourceRoot":"","sources":["../../src/cmd/repair.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACnE,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAM9D;;;qCAGqC;AACrC,MAAM,UAAU,SAAS,CAAC,IAAgB;IACxC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,cAAc,EAAE,CAAC;IACjD,MAAM,EAAE,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;IAClC,MAAM,KAAK,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;IAEjC,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,MAAM,YAAY,GAAa,EAAE,CAAC;IAClC,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QAC7B,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACtB,OAAO,EAAE,CAAC;YACV,SAAS;QACX,CAAC;QACD,MAAM,CAAC,GAAG,YAAY,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACnC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YACnC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACrB,SAAS;QACX,CAAC;QACD,CAAC,KAAK,CAAC,MAAM,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAC7B,UAAU,EAAE,CAAC;IACf,CAAC;IACD,IAAI,UAAU,GAAG,CAAC;QAAE,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAE9C,OAAO,CAAC,GAAG,CAAC,aAAa,OAAO,qBAAqB,UAAU,+BAA+B,YAAY,CAAC,MAAM,eAAe,CAAC,CAAC;IAClI,KAAK,MAAM,CAAC,IAAI,YAAY;QAAE,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,EAAE,CAAC,CAAC;IACxE,OAAO,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACzC,CAAC"}
1
+ {"version":3,"file":"repair.js","sourceRoot":"","sources":["../../src/cmd/repair.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACnE,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAM9D;;;qCAGqC;AACrC,MAAM,UAAU,SAAS,CAAC,IAAgB;IACxC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,cAAc,EAAE,CAAC;IACjD,MAAM,EAAE,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;IAClC,MAAM,KAAK,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;IAEjC,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,MAAM,YAAY,GAAa,EAAE,CAAC;IAClC,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QAC7B,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACtB,OAAO,EAAE,CAAC;YACV,SAAS;QACX,CAAC;QACD,MAAM,CAAC,GAAG,YAAY,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACnC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YACnC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACrB,SAAS;QACX,CAAC;QACD,CAAC,KAAK,CAAC,MAAM,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAC7B,UAAU,EAAE,CAAC;IACf,CAAC;IACD,IAAI,UAAU,GAAG,CAAC;QAAE,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAE9C,OAAO,CAAC,GAAG,CAAC,aAAa,OAAO,qBAAqB,UAAU,+BAA+B,YAAY,CAAC,MAAM,eAAe,CAAC,CAAC;IAClI,KAAK,MAAM,CAAC,IAAI,YAAY;QAAE,OAAO,CAAC,KAAK,CAAC,yBAAyB,CAAC,EAAE,CAAC,CAAC;IAC1E,OAAO,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACzC,CAAC"}