@arshdelight/practi 0.9.3 → 0.9.5
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/README.md +23 -1
- package/dist/cmd/clone.js +2 -3
- package/dist/cmd/clone.js.map +1 -1
- package/dist/cmd/edit.js +2 -3
- package/dist/cmd/edit.js.map +1 -1
- package/dist/cmd/new.js +2 -3
- package/dist/cmd/new.js.map +1 -1
- package/dist/cmd/pull.js +2 -3
- package/dist/cmd/pull.js.map +1 -1
- package/dist/cmd/repair.js +34 -0
- package/dist/cmd/repair.js.map +1 -0
- package/dist/cmd/skill.js +2 -3
- package/dist/cmd/skill.js.map +1 -1
- package/dist/cmd/update.js +41 -14
- package/dist/cmd/update.js.map +1 -1
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -1
- package/dist/state.js +30 -0
- package/dist/state.js.map +1 -1
- package/dist/web.js +305 -139
- package/dist/web.js.map +1 -1
- package/dist/workspace.js +10 -0
- package/dist/workspace.js.map +1 -1
- package/package.json +3 -2
- package/web-default/app.js +106 -0
- package/web-default/detail.html +32 -0
- package/web-default/detail.js +531 -0
- package/web-default/index.html +28 -0
- package/web-default/lang.js +169 -0
- package/web-default/marked.min.js +69 -0
- package/web-default/style.css +182 -0
package/dist/web.js
CHANGED
|
@@ -1,17 +1,52 @@
|
|
|
1
1
|
import http from 'node:http';
|
|
2
|
+
import fs from 'node:fs';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { fileURLToPath } from 'node:url';
|
|
2
5
|
import { spawn } from 'node:child_process';
|
|
3
|
-
import { aggregateView, exportSubtree, readBlob, resolveNodeRef, PracticeError } from '@arshdelight/pop-sdk';
|
|
6
|
+
import { aggregateView, computeNodeHash, exportSubtree, readBlob, resolveNodeRef, PracticeError } from '@arshdelight/pop-sdk';
|
|
4
7
|
import { defaultDataDir, loadState } from './state.js';
|
|
5
|
-
import { openWorkspace } from './workspace.js';
|
|
6
|
-
import {
|
|
8
|
+
import { nodeFileTime, openWorkspace } from './workspace.js';
|
|
9
|
+
import { runNew } from './cmd/new.js';
|
|
10
|
+
import { runPull } from './cmd/pull.js';
|
|
11
|
+
import { runPush } from './cmd/push.js';
|
|
12
|
+
import { runLogin, runLogout, runMe } from './cmd/login.js';
|
|
13
|
+
/** 内置默认前端(随包分发的普通文件):dist/../web-default 与 src/../web-default 都指向 cli/web-default */
|
|
14
|
+
const DEFAULT_WEB_DIR = path.join(path.dirname(fileURLToPath(import.meta.url)), '..', 'web-default');
|
|
15
|
+
/** workspace 里的覆盖目录名:里面的文件按文件级覆盖默认前端(不存在的文件回落默认) */
|
|
16
|
+
const WEB_OVERRIDE_DIR = 'web';
|
|
17
|
+
const STATIC_TYPES = {
|
|
18
|
+
'.html': 'text/html; charset=utf-8',
|
|
19
|
+
'.css': 'text/css; charset=utf-8',
|
|
20
|
+
'.js': 'text/javascript; charset=utf-8',
|
|
21
|
+
'.mjs': 'text/javascript; charset=utf-8',
|
|
22
|
+
'.json': 'application/json; charset=utf-8',
|
|
23
|
+
'.svg': 'image/svg+xml',
|
|
24
|
+
'.png': 'image/png',
|
|
25
|
+
'.ico': 'image/x-icon',
|
|
26
|
+
};
|
|
27
|
+
/** live reload 客户端:连 SSE、收到 reload 事件整页刷新(只读浏览器无状态,整刷即热更) */
|
|
28
|
+
const LR_SCRIPT = "(function(){var es=new EventSource('/_lr');es.addEventListener('reload',function(){location.reload()});})();";
|
|
29
|
+
function injectLiveReload(html) {
|
|
30
|
+
const tag = '<script src="/_lr.js" defer></script>';
|
|
31
|
+
return /<\/body>/i.test(html) ? html.replace(/<\/body>/i, `${tag}</body>`) : html + tag;
|
|
32
|
+
}
|
|
7
33
|
export function runWeb(opts) {
|
|
8
34
|
const dataDir = opts.dataDir ?? defaultDataDir();
|
|
9
35
|
// validate the data dir up front so a typo fails fast instead of on first request
|
|
10
|
-
|
|
36
|
+
openWorkspace(dataDir);
|
|
11
37
|
const url = `http://127.0.0.1:${opts.port}/`;
|
|
38
|
+
// live reload:SSE 客户端池 + 文件/数据监听。监听面 = 整个 data dir(nodes/、
|
|
39
|
+
// 覆盖目录 web/、practi.json 全覆盖:另一终端 practi new/pull 页面也会自动跟新)
|
|
40
|
+
// + 内置默认前端目录(CLI 开发期改默认文件也即时生效)
|
|
41
|
+
const clients = new Set();
|
|
42
|
+
watchLive([dataDir, DEFAULT_WEB_DIR], clients);
|
|
43
|
+
const overrideDir = path.join(dataDir, WEB_OVERRIDE_DIR);
|
|
44
|
+
console.log(`frontend: ${fs.existsSync(overrideDir) ? `workspace override ${overrideDir} (missing files fall back to built-in)` : `built-in default (drop files into ${overrideDir}${path.sep} to customize)`}`);
|
|
12
45
|
const server = http.createServer((req, res) => {
|
|
13
46
|
try {
|
|
14
|
-
|
|
47
|
+
// ws 每请求重建:命令写入(本端点的 /api/run,或另一终端的 practi new/pull)
|
|
48
|
+
// 必须立即可见,不能拿启动时的快照过滤数据窗
|
|
49
|
+
handle(req, res, dataDir, openWorkspace(dataDir), clients);
|
|
15
50
|
}
|
|
16
51
|
catch (e) {
|
|
17
52
|
if (e instanceof PracticeError) {
|
|
@@ -32,11 +67,29 @@ export function runWeb(opts) {
|
|
|
32
67
|
});
|
|
33
68
|
return 0;
|
|
34
69
|
}
|
|
35
|
-
function handle(req, res, dataDir, ws) {
|
|
70
|
+
function handle(req, res, dataDir, ws, clients) {
|
|
36
71
|
const pathname = (req.url ?? '/').split('?')[0];
|
|
37
72
|
const state = loadState(dataDir);
|
|
73
|
+
if (pathname === '/_lr') {
|
|
74
|
+
sseHandshake(req, res, clients);
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
if (pathname === '/_lr.js') {
|
|
78
|
+
send(res, 200, 'text/javascript; charset=utf-8', LR_SCRIPT);
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
if (pathname === '/api/directs') {
|
|
82
|
+
send(res, 200, 'application/json; charset=utf-8', JSON.stringify(directsPayload(dataDir, ws, state), null, 2));
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
if (pathname === '/api/run') {
|
|
86
|
+
void handleRun(req, res, dataDir);
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
38
89
|
if (pathname === '/' || pathname === '/index.html') {
|
|
39
|
-
|
|
90
|
+
if (serveStatic(res, 'index.html', dataDir))
|
|
91
|
+
return;
|
|
92
|
+
send(res, 500, 'text/plain; charset=utf-8', 'built-in web frontend missing — reinstall the CLI');
|
|
40
93
|
return;
|
|
41
94
|
}
|
|
42
95
|
const pop = pathname.match(/^\/pop\/(.+)$/);
|
|
@@ -48,8 +101,9 @@ function handle(req, res, dataDir, ws) {
|
|
|
48
101
|
send(res, 200, 'application/json; charset=utf-8', JSON.stringify(view, null, 2));
|
|
49
102
|
return;
|
|
50
103
|
}
|
|
51
|
-
|
|
52
|
-
|
|
104
|
+
if (!serveStatic(res, 'detail.html', dataDir)) {
|
|
105
|
+
send(res, 500, 'text/plain; charset=utf-8', 'built-in web frontend missing — reinstall the CLI');
|
|
106
|
+
}
|
|
53
107
|
return;
|
|
54
108
|
}
|
|
55
109
|
const blob = pathname.match(/^\/blobs\/(sha256:[0-9a-f]{64})$/);
|
|
@@ -67,7 +121,11 @@ function handle(req, res, dataDir, ws) {
|
|
|
67
121
|
const hash = decodeURIComponent(doc[1]).replace(/\.json$/, '');
|
|
68
122
|
const node = ws.nodes.get(resolveNodeRef(ws, hash));
|
|
69
123
|
if (node) {
|
|
70
|
-
|
|
124
|
+
// 加法演进:树字段仍在顶层(老前端照常读),nodeIndex 是新增兄弟键(新前端才消费)。
|
|
125
|
+
// 前端文件热更可能跑在服务器 dist 前面、用户覆盖的 web/ 也可能落后 CLI 升级——
|
|
126
|
+
// 数据窗任何改动都必须新旧两端互容,不能用信封换结构
|
|
127
|
+
const tree = exportSubtree(node, ws.nodes);
|
|
128
|
+
send(res, 200, 'application/json; charset=utf-8', JSON.stringify({ ...tree, nodeIndex: buildNodeIndex(tree) }, null, 2));
|
|
71
129
|
return;
|
|
72
130
|
}
|
|
73
131
|
}
|
|
@@ -75,12 +133,249 @@ function handle(req, res, dataDir, ws) {
|
|
|
75
133
|
send(res, 200, 'text/plain', 'ok');
|
|
76
134
|
return;
|
|
77
135
|
}
|
|
136
|
+
// 静态资产兜底(style.css / app.js / 自定义前端文件):放在最后,不与 /pop /blobs /doc 抢路由
|
|
137
|
+
if (serveStatic(res, pathname.slice(1), dataDir))
|
|
138
|
+
return;
|
|
78
139
|
send(res, 404, 'text/plain; charset=utf-8', 'not found');
|
|
79
140
|
}
|
|
141
|
+
class ApiError extends Error {
|
|
142
|
+
status;
|
|
143
|
+
constructor(status, message) {
|
|
144
|
+
super(message);
|
|
145
|
+
this.status = status;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
function asStr(v) {
|
|
149
|
+
if (v !== undefined && typeof v !== 'string')
|
|
150
|
+
throw new ApiError(400, 'string argument expected');
|
|
151
|
+
return v;
|
|
152
|
+
}
|
|
153
|
+
const RUNNABLE = {
|
|
154
|
+
new: {
|
|
155
|
+
run: (a, d) => {
|
|
156
|
+
const json = asStr(a.json);
|
|
157
|
+
if (!json || !json.trim())
|
|
158
|
+
throw new ApiError(400, 'new requires args.json (POP document text)');
|
|
159
|
+
return runNew({ dataDir: d, json, positional: [] });
|
|
160
|
+
},
|
|
161
|
+
},
|
|
162
|
+
pull: {
|
|
163
|
+
run: (a, d) => runPull({ dataDir: d, positional: hashArg(a) }),
|
|
164
|
+
},
|
|
165
|
+
push: {
|
|
166
|
+
run: (a, d) => runPush({ dataDir: d, positional: hashArg(a) }),
|
|
167
|
+
},
|
|
168
|
+
login: {
|
|
169
|
+
// OAuth 授权流:web 进程内起 loopback 回调 + 开系统浏览器,请求挂起至授权完成
|
|
170
|
+
run: (a, d) => runLogin({ dataDir: d, noOpen: a.noOpen === true }),
|
|
171
|
+
},
|
|
172
|
+
logout: { run: (_a, d) => runLogout({ dataDir: d }) },
|
|
173
|
+
me: { run: (_a, d) => runMe({ dataDir: d }) },
|
|
174
|
+
};
|
|
175
|
+
function hashArg(a) {
|
|
176
|
+
const hash = asStr(a.hash);
|
|
177
|
+
return hash ? [hash] : [];
|
|
178
|
+
}
|
|
179
|
+
/** 命令输出捕获:命令函数走 console.log/error,调用期间临时替换收集,finally 恢复。
|
|
180
|
+
* 进程级替换在并发下有竞态 → runQueue 互斥,同一时刻只跑一条命令(写操作本就不应并发) */
|
|
181
|
+
let runQueue = Promise.resolve();
|
|
182
|
+
function enqueueRun(fn) {
|
|
183
|
+
const next = runQueue.then(fn, fn);
|
|
184
|
+
runQueue = next.catch(() => { });
|
|
185
|
+
return next;
|
|
186
|
+
}
|
|
187
|
+
async function captureConsole(fn) {
|
|
188
|
+
const out = [];
|
|
189
|
+
const errBuf = [];
|
|
190
|
+
const origLog = console.log;
|
|
191
|
+
const origErr = console.error;
|
|
192
|
+
console.log = (...a) => void out.push(a.join(' '));
|
|
193
|
+
console.error = (...a) => void errBuf.push(a.join(' '));
|
|
194
|
+
try {
|
|
195
|
+
return { code: await fn(), out: out.join('\n'), err: errBuf.join('\n') };
|
|
196
|
+
}
|
|
197
|
+
finally {
|
|
198
|
+
console.log = origLog;
|
|
199
|
+
console.error = origErr;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
/** 安全闸:浏览器跨站 POST 必带 Origin;Origin 的 host 必须等于请求的 Host 头
|
|
203
|
+
* (即 127.0.0.1:port 本身),否则 403——挡 CSRF 与 DNS rebinding */
|
|
204
|
+
function sameOrigin(req) {
|
|
205
|
+
const origin = req.headers.origin;
|
|
206
|
+
const host = req.headers.host;
|
|
207
|
+
if (typeof origin !== 'string' || typeof host !== 'string')
|
|
208
|
+
return false;
|
|
209
|
+
try {
|
|
210
|
+
return new URL(origin).host === host;
|
|
211
|
+
}
|
|
212
|
+
catch {
|
|
213
|
+
return false;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
async function handleRun(req, res, dataDir) {
|
|
217
|
+
const fail = (status, message) => send(res, status, 'application/json; charset=utf-8', JSON.stringify({ error: message }));
|
|
218
|
+
try {
|
|
219
|
+
if (req.method !== 'POST')
|
|
220
|
+
throw new ApiError(405, 'POST only');
|
|
221
|
+
if (!sameOrigin(req))
|
|
222
|
+
throw new ApiError(403, 'same-origin POST required (Origin header missing or foreign)');
|
|
223
|
+
const ctype = String(req.headers['content-type'] ?? '');
|
|
224
|
+
if (!ctype.startsWith('application/json'))
|
|
225
|
+
throw new ApiError(415, 'content-type must be application/json');
|
|
226
|
+
const body = await readBody(req, 2 * 1024 * 1024);
|
|
227
|
+
let parsed;
|
|
228
|
+
try {
|
|
229
|
+
parsed = JSON.parse(body);
|
|
230
|
+
}
|
|
231
|
+
catch {
|
|
232
|
+
throw new ApiError(400, 'request body is not valid JSON');
|
|
233
|
+
}
|
|
234
|
+
const spec = typeof parsed.cmd === 'string' ? RUNNABLE[parsed.cmd] : undefined;
|
|
235
|
+
if (!spec)
|
|
236
|
+
throw new ApiError(400, `unknown cmd — runnable: ${Object.keys(RUNNABLE).join(', ')}`);
|
|
237
|
+
const args = parsed.args ?? {};
|
|
238
|
+
const result = await enqueueRun(() => captureConsole(() => spec.run(args, dataDir)).catch(e => {
|
|
239
|
+
// 参数校验错误透传为 4xx;命令自身的异常对齐 CLI 顶层语义(打印 + 退出码 1),
|
|
240
|
+
// 命令失败是结果不是服务器错误,不该是 500
|
|
241
|
+
if (e instanceof ApiError)
|
|
242
|
+
throw e;
|
|
243
|
+
return { code: 1, out: '', err: e instanceof Error ? e.message : String(e) };
|
|
244
|
+
}));
|
|
245
|
+
send(res, 200, 'application/json; charset=utf-8', JSON.stringify(result));
|
|
246
|
+
}
|
|
247
|
+
catch (e) {
|
|
248
|
+
if (e instanceof ApiError)
|
|
249
|
+
fail(e.status, e.message);
|
|
250
|
+
else
|
|
251
|
+
fail(500, e instanceof Error ? e.message : String(e));
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
async function readBody(req, limit) {
|
|
255
|
+
return new Promise((resolve, reject) => {
|
|
256
|
+
const chunks = [];
|
|
257
|
+
let size = 0;
|
|
258
|
+
req.on('data', (c) => {
|
|
259
|
+
size += c.length;
|
|
260
|
+
if (size > limit) {
|
|
261
|
+
reject(new ApiError(413, 'request body too large'));
|
|
262
|
+
req.destroy();
|
|
263
|
+
return;
|
|
264
|
+
}
|
|
265
|
+
chunks.push(c);
|
|
266
|
+
});
|
|
267
|
+
req.on('end', () => resolve(Buffer.concat(chunks).toString('utf8')));
|
|
268
|
+
req.on('error', reject);
|
|
269
|
+
});
|
|
270
|
+
}
|
|
271
|
+
/** 节点指纹登记簿(哈希→树内 children 下标路径),/doc 数据窗附带:前端把 inputs.from
|
|
272
|
+
* 反解成 #编号引用用。与 hub 的 node_index 物化列同一思路——内容寻址下哈希不在树里,
|
|
273
|
+
* 引用靠旁路登记。根(空路径)不成节、无编号,不登记(from 指向根按未命中回落哈希)。 */
|
|
274
|
+
function buildNodeIndex(tree) {
|
|
275
|
+
const index = {};
|
|
276
|
+
const visit = (n, p) => {
|
|
277
|
+
if (p.length > 0)
|
|
278
|
+
index[computeNodeHash(n)] = p;
|
|
279
|
+
const kids = Array.isArray(n.children) ? n.children : [];
|
|
280
|
+
kids.forEach((c, i) => visit(c, [...p, i]));
|
|
281
|
+
};
|
|
282
|
+
visit(tree, []);
|
|
283
|
+
return index;
|
|
284
|
+
}
|
|
80
285
|
function send(res, code, type, body) {
|
|
81
286
|
res.writeHead(code, { 'content-type': type });
|
|
82
287
|
res.end(body);
|
|
83
288
|
}
|
|
289
|
+
/** 静态文件:workspace 的 web/ 按文件覆盖,缺失文件回落内置默认。
|
|
290
|
+
* 拒绝 `..` 段做路径遍历防护;HTML 响应注入 live reload 脚本(对默认与自定义前端一视同仁) */
|
|
291
|
+
function serveStatic(res, rel, dataDir) {
|
|
292
|
+
const parts = rel.split('/').filter(Boolean);
|
|
293
|
+
if (parts.length === 0 || parts.includes('..'))
|
|
294
|
+
return false;
|
|
295
|
+
const file = [path.join(dataDir, WEB_OVERRIDE_DIR, ...parts), path.join(DEFAULT_WEB_DIR, ...parts)]
|
|
296
|
+
.find(f => fs.existsSync(f) && fs.statSync(f).isFile());
|
|
297
|
+
if (!file)
|
|
298
|
+
return false;
|
|
299
|
+
const type = STATIC_TYPES[path.extname(file).toLowerCase()] ?? 'application/octet-stream';
|
|
300
|
+
const body = fs.readFileSync(file);
|
|
301
|
+
res.writeHead(200, { 'content-type': type, 'cache-control': 'no-cache' });
|
|
302
|
+
if (type.startsWith('text/html')) {
|
|
303
|
+
res.end(injectLiveReload(body.toString('utf8')));
|
|
304
|
+
}
|
|
305
|
+
else {
|
|
306
|
+
res.end(body);
|
|
307
|
+
}
|
|
308
|
+
return true;
|
|
309
|
+
}
|
|
310
|
+
/** 目录数据窗:direct 列表的名称/描述/统计 + 数据目录路径(前端头部展示用)。
|
|
311
|
+
* claimedAt=声明值(state.claims 盖戳);addedAt=生效值,未盖戳的老数据回落节点文件
|
|
312
|
+
* mtime(推测值,前端弱化显示)——声明与推测不混装一个字段 */
|
|
313
|
+
function directsPayload(dataDir, ws, state) {
|
|
314
|
+
const docs = state.direct
|
|
315
|
+
.filter(h => ws.nodes.has(h))
|
|
316
|
+
.map(h => {
|
|
317
|
+
const v = aggregateView(h, ws.nodes);
|
|
318
|
+
const claimedAt = state.claims?.[h] ?? null;
|
|
319
|
+
return {
|
|
320
|
+
hash: v.hash,
|
|
321
|
+
name: v.name,
|
|
322
|
+
description: v.description,
|
|
323
|
+
type: v.type,
|
|
324
|
+
op: v.type === 'practice' ? v.op : null,
|
|
325
|
+
steps: v.steps.length,
|
|
326
|
+
outputs: v.outputs.length,
|
|
327
|
+
claimedAt,
|
|
328
|
+
addedAt: claimedAt ?? nodeFileTime(dataDir, h),
|
|
329
|
+
};
|
|
330
|
+
});
|
|
331
|
+
return { dataDir, docs };
|
|
332
|
+
}
|
|
333
|
+
function sseHandshake(req, res, clients) {
|
|
334
|
+
res.writeHead(200, {
|
|
335
|
+
'content-type': 'text/event-stream',
|
|
336
|
+
'cache-control': 'no-cache',
|
|
337
|
+
connection: 'keep-alive',
|
|
338
|
+
});
|
|
339
|
+
res.write('retry: 1000\n\n');
|
|
340
|
+
clients.add(res);
|
|
341
|
+
req.on('close', () => clients.delete(res));
|
|
342
|
+
}
|
|
343
|
+
/** 监听 roots(递归;平台不支持时降级单层,再失败静默跳过——live reload 是锦上添花,不致命)。
|
|
344
|
+
* 事件去抖:一次保存或一条 practi 命令会喷一串文件事件,合并成一次 reload */
|
|
345
|
+
function watchLive(roots, clients) {
|
|
346
|
+
let timer = null;
|
|
347
|
+
const onChange = () => {
|
|
348
|
+
if (timer)
|
|
349
|
+
return;
|
|
350
|
+
timer = setTimeout(() => {
|
|
351
|
+
timer = null;
|
|
352
|
+
if (clients.size === 0)
|
|
353
|
+
return;
|
|
354
|
+
for (const res of clients)
|
|
355
|
+
res.write('event: reload\ndata: 1\n\n');
|
|
356
|
+
}, 150);
|
|
357
|
+
};
|
|
358
|
+
for (const root of roots) {
|
|
359
|
+
if (!fs.existsSync(root))
|
|
360
|
+
continue;
|
|
361
|
+
try {
|
|
362
|
+
fs.watch(root, { recursive: true }, onChange);
|
|
363
|
+
}
|
|
364
|
+
catch {
|
|
365
|
+
try {
|
|
366
|
+
fs.watch(root, onChange);
|
|
367
|
+
}
|
|
368
|
+
catch {
|
|
369
|
+
// fs.watch 完全不可用:live reload 静默失效,其余功能不受影响
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
// 保活注释行:防空闲 SSE 连接被掐(本地一般无此问题,防御性)
|
|
374
|
+
setInterval(() => {
|
|
375
|
+
for (const res of clients)
|
|
376
|
+
res.write(': ping\n\n');
|
|
377
|
+
}, 25000).unref();
|
|
378
|
+
}
|
|
84
379
|
function sendBytes(res, type, body) {
|
|
85
380
|
res.writeHead(200, { 'content-type': type, 'cache-control': 'public, max-age=31536000, immutable' });
|
|
86
381
|
res.end(body);
|
|
@@ -111,133 +406,4 @@ export function openBrowser(url) {
|
|
|
111
406
|
const cmd = process.platform === 'darwin' ? 'open' : 'xdg-open';
|
|
112
407
|
spawn(cmd, [url], { stdio: 'ignore', detached: true }).unref();
|
|
113
408
|
}
|
|
114
|
-
const CSS = `
|
|
115
|
-
:root { color-scheme: light; }
|
|
116
|
-
* { box-sizing: border-box; }
|
|
117
|
-
body { font: 15px/1.5 system-ui, -apple-system, "Segoe UI", sans-serif; margin: 0; color: #1a1a1a; background: #fafafa; }
|
|
118
|
-
header { background: #111; color: #fff; padding: 14px 24px; display: flex; gap: 16px; align-items: baseline; }
|
|
119
|
-
header .brand { font-weight: 700; letter-spacing: .5px; }
|
|
120
|
-
header .sub { color: #999; font-size: 13px; }
|
|
121
|
-
main { max-width: 860px; margin: 24px auto; padding: 0 24px 60px; }
|
|
122
|
-
a { color: #0b57d0; text-decoration: none; }
|
|
123
|
-
a:hover { text-decoration: underline; }
|
|
124
|
-
.card { background: #fff; border: 1px solid #e3e3e3; border-radius: 8px; padding: 14px 18px; margin-bottom: 12px; }
|
|
125
|
-
.card .title { font-weight: 600; font-size: 16px; }
|
|
126
|
-
.tag { font-size: 12px; color: #666; background: #f0f0f0; border-radius: 4px; padding: 1px 6px; margin-left: 6px; }
|
|
127
|
-
.hash { font-family: ui-monospace, "Cascadia Code", Consolas, monospace; font-size: 12px; color: #888; }
|
|
128
|
-
pre { background: #fff; border: 1px solid #e3e3e3; border-radius: 8px; padding: 14px; overflow-x: auto; font-size: 13px; }
|
|
129
|
-
table { border-collapse: collapse; width: 100%; font-size: 14px; }
|
|
130
|
-
th, td { text-align: left; padding: 6px 10px; border-bottom: 1px solid #eee; }
|
|
131
|
-
th { color: #666; font-weight: 600; }
|
|
132
|
-
.muted { color: #888; }
|
|
133
|
-
.breadcrumb { margin-bottom: 12px; font-size: 13px; }
|
|
134
|
-
.section { margin-top: 22px; }
|
|
135
|
-
.section h2 { font-size: 14px; text-transform: uppercase; letter-spacing: .4px; color: #666; margin: 0 0 8px; }
|
|
136
|
-
.step { padding: 2px 0; }
|
|
137
|
-
.step .n { color: #999; }
|
|
138
|
-
.stepbody { margin: 6px 0 12px 0; padding-left: 20px; }
|
|
139
|
-
.prose { font-size: 14px; color: #333; }
|
|
140
|
-
.prose figure { margin: 10px 0; }
|
|
141
|
-
.prose img { max-width: 100%; border: 1px solid #e3e3e3; border-radius: 6px; }
|
|
142
|
-
.prose figcaption { font-size: 12px; color: #888; text-align: center; margin-top: 4px; }
|
|
143
|
-
`;
|
|
144
|
-
function page(title, body, dataDir) {
|
|
145
|
-
return `<!doctype html><html lang="en"><head><meta charset="utf-8"><title>${title}</title>
|
|
146
|
-
<style>${CSS}</style></head><body>
|
|
147
|
-
<header><span class="brand">POP</span><span class="sub">local registry</span><span class="sub">${dataDir}</span></header>
|
|
148
|
-
<main>${body}</main></body></html>`;
|
|
149
|
-
}
|
|
150
|
-
function indexHtml(ws, direct) {
|
|
151
|
-
const roots = direct.filter(h => ws.nodes.has(h));
|
|
152
|
-
const cards = roots
|
|
153
|
-
.map(h => {
|
|
154
|
-
const view = aggregateView(h, ws.nodes);
|
|
155
|
-
return `<div class="card">
|
|
156
|
-
<div class="title"><a href="/pop/${encodeURIComponent(h)}">${escapeHtml(view.name)}</a><span class="tag">${view.type === 'practice' ? `practice·${view.op}` : 'action'}</span></div>
|
|
157
|
-
<div class="hash">${view.hash}</div>
|
|
158
|
-
${view.description ? `<div class="muted">${escapeHtml(view.description)}</div>` : ''}
|
|
159
|
-
<div class="muted">${view.steps.length} step${view.steps.length === 1 ? '' : 's'} · ${view.flow.length} flow edge${view.flow.length === 1 ? '' : 's'} · ${view.outputs.length} output${view.outputs.length === 1 ? '' : 's'}</div>
|
|
160
|
-
</div>`;
|
|
161
|
-
})
|
|
162
|
-
.join('\n');
|
|
163
|
-
const empty = roots.length === 0 ? '<p class="muted">no direct pops — create one with <code>pop new</code></p>' : '';
|
|
164
|
-
return page('POP — local registry', `<h1>Direct pops</h1>${empty}${cards}`, ws.root);
|
|
165
|
-
}
|
|
166
|
-
function detailHtml(ws, view) {
|
|
167
|
-
const esc = escapeHtml;
|
|
168
|
-
const steps = view.steps
|
|
169
|
-
.map(s => {
|
|
170
|
-
const n = ws.nodes.get(s.refHash);
|
|
171
|
-
const tag = n ? nodeTag(n) : '';
|
|
172
|
-
const body = s.content && s.content.trim() ? `<div class="stepbody">${renderContent(s.content, n, ws)}</div>` : '';
|
|
173
|
-
return `<div class="step"><span class="n">${' '.repeat(s.depth)}</span>${esc(s.name)} ${tag ? `<span class="tag">${esc(tag)}</span>` : ''}${s.note ? ` <span class="muted">(${esc(s.note)})</span>` : ''}${body}</div>`;
|
|
174
|
-
})
|
|
175
|
-
.join('\n');
|
|
176
|
-
const flowRows = view.flow
|
|
177
|
-
.map(e => `<tr><td>${esc(e.name)}</td><td class="hash">${shortHash(e.fromHash)}</td><td>${esc(e.fromName)}</td><td class="hash">${shortHash(e.toHash)}</td><td>${esc(e.toName)}</td></tr>`)
|
|
178
|
-
.join('\n');
|
|
179
|
-
const inputs = view.inputs.map(d => `<tr><td>${esc(d.name)}</td><td>${d.spec ? esc(d.spec) : ''}</td><td class="hash">${shortHash(d.refHash)}</td></tr>`).join('\n');
|
|
180
|
-
const outputs = view.outputs.map(d => `<tr><td>${esc(d.name)}</td><td>${d.spec ? esc(d.spec) : ''}</td><td class="hash">${shortHash(d.refHash)}</td></tr>`).join('\n');
|
|
181
|
-
const atts = view.attachments.map(a => `<tr><td>${esc(a.name)}</td><td>${a.mime ? esc(a.mime) : ''}</td><td>${a.size ?? ''}</td><td class="hash">${shortHash(a.hash)}</td></tr>`).join('\n');
|
|
182
|
-
const revs = (view.revisions ?? []).map(r => `<tr><td>${esc(r.when)}</td><td>${esc(r.what)}</td>${r.from ? `<td class="hash">${shortHash(r.from)}</td>` : '<td></td>'}</tr>`).join('\n');
|
|
183
|
-
return page(`${view.name} — POP`, `
|
|
184
|
-
<div class="breadcrumb"><a href="/">← all pops</a></div>
|
|
185
|
-
<h1>${esc(view.name)} <span class="tag">${view.type === 'practice' ? `practice·${view.op}` : 'action'}</span></h1>
|
|
186
|
-
<div class="hash">${view.hash}</div>
|
|
187
|
-
${view.description ? `<p>${esc(view.description)}</p>` : ''}
|
|
188
|
-
${view.content && view.content.trim() ? `<div class="section"><h2>Content</h2>${renderContent(view.content, ws.nodes.get(view.hash), ws)}</div>` : ''}
|
|
189
|
-
<div class="section"><h2>Steps (${view.steps.length})</h2>${steps || '<p class="muted">—</p>'}</div>
|
|
190
|
-
${flowRows ? `<div class="section"><h2>Flow (${view.flow.length})</h2><table><tr><th>name</th><th>from</th><th></th><th>to</th><th></th></tr>${flowRows}</table></div>` : ''}
|
|
191
|
-
${inputs ? `<div class="section"><h2>Declared inputs (needs)</h2><table><tr><th>name</th><th>spec</th><th>node</th></tr>${inputs}</table></div>` : ''}
|
|
192
|
-
${outputs ? `<div class="section"><h2>Declared outputs (produces)</h2><table><tr><th>name</th><th>spec</th><th>node</th></tr>${outputs}</table></div>` : ''}
|
|
193
|
-
${atts ? `<div class="section"><h2>Attachments</h2><table><tr><th>name</th><th>mime</th><th>size</th><th>hash</th></tr>${atts}</table></div>` : ''}
|
|
194
|
-
${revs ? `<div class="section"><h2>Revisions</h2><table><tr><th>when</th><th>what</th><th>from</th></tr>${revs}</table></div>` : ''}
|
|
195
|
-
<div class="section"><h2>Links</h2>
|
|
196
|
-
<a href="/pop/${encodeURIComponent(view.hash)}.json">StandardView JSON</a> ·
|
|
197
|
-
<a href="/doc/${encodeURIComponent(view.hash)}.json">document JSON</a>
|
|
198
|
-
</div>
|
|
199
|
-
`, ws.root);
|
|
200
|
-
}
|
|
201
|
-
function escapeHtml(s) {
|
|
202
|
-
return s.replace(/[&<>"']/g, c => ({ '&': '&', '<': '<', '>': '>', '"': '"', "'": ''' })[c]);
|
|
203
|
-
}
|
|
204
|
-
/**
|
|
205
|
-
* Render action content for the web UI: markdown image refs ``
|
|
206
|
-
* become real <figure><img> (name → attachment url or a local /blobs/:hash);
|
|
207
|
-
* http(s) URL targets are used as-is (external refs, spec §5.1); unresolved
|
|
208
|
-
* refs stay literal. Fenced code blocks are treated as prose-exempt (§5.1).
|
|
209
|
-
*/
|
|
210
|
-
function renderContent(content, node, ws) {
|
|
211
|
-
const blocks = [];
|
|
212
|
-
const prose = content.replace(/```[\s\S]*?```/g, m => {
|
|
213
|
-
blocks.push(m);
|
|
214
|
-
return `\u0000B${blocks.length - 1}\u0000`;
|
|
215
|
-
});
|
|
216
|
-
const parts = [];
|
|
217
|
-
let last = 0;
|
|
218
|
-
for (const m of prose.matchAll(/!\[([^\]]*)\]\(([^)]*)\)/g)) {
|
|
219
|
-
parts.push(escapeHtml(prose.slice(last, m.index)));
|
|
220
|
-
const caption = m[1];
|
|
221
|
-
const target = m[2];
|
|
222
|
-
const url = mediaUrl(target, node, ws);
|
|
223
|
-
if (url === null) {
|
|
224
|
-
parts.push(escapeHtml(m[0]));
|
|
225
|
-
}
|
|
226
|
-
else {
|
|
227
|
-
const cap = escapeHtml(caption);
|
|
228
|
-
parts.push(`<figure><img src="${escapeHtml(url)}" alt="${cap}"><figcaption>${cap}</figcaption></figure>`);
|
|
229
|
-
}
|
|
230
|
-
last = m.index + m[0].length;
|
|
231
|
-
}
|
|
232
|
-
parts.push(escapeHtml(prose.slice(last)));
|
|
233
|
-
return `<div class="prose">${parts.join('').replace(/\u0000B(\d+)\u0000/g, (_, i) => `<pre>${escapeHtml(blocks[Number(i)])}</pre>`)}</div>`;
|
|
234
|
-
}
|
|
235
|
-
function mediaUrl(target, node, ws) {
|
|
236
|
-
if (/^https?:\/\//i.test(target))
|
|
237
|
-
return target;
|
|
238
|
-
if (!node || node.type !== 'action')
|
|
239
|
-
return null;
|
|
240
|
-
const a = (node.attachments ?? []).find(x => x.name === target);
|
|
241
|
-
return a ? (a.url ?? `/blobs/${a.hash}`) : null;
|
|
242
|
-
}
|
|
243
409
|
//# sourceMappingURL=web.js.map
|
package/dist/web.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"web.js","sourceRoot":"","sources":["../src/web.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"web.js","sourceRoot":"","sources":["../src/web.ts"],"names":[],"mappings":"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"}
|
package/dist/workspace.js
CHANGED
|
@@ -19,6 +19,16 @@ export function openWorkspace(dataDir) {
|
|
|
19
19
|
requireDataDir(dataDir);
|
|
20
20
|
return loadWorkspace(dataDir);
|
|
21
21
|
}
|
|
22
|
+
/** 节点文件的系统 mtime:这份内容落进本工作区的时刻(new/edit=创建或编辑时刻;
|
|
23
|
+
* clone/pull=拉取时刻,非原创时刻)。repair 用它给老数据补认领戳 */
|
|
24
|
+
export function nodeFileTime(dataDir, hash) {
|
|
25
|
+
try {
|
|
26
|
+
return fs.statSync(path.join(dataDir, 'nodes', `${hash.slice('sha256:'.length)}.md`)).mtime.toISOString();
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
22
32
|
/** Create the data dir (idempotent): workspace + CLI state. Adopts an existing workspace if present. */
|
|
23
33
|
export function initDataDir(dataDir) {
|
|
24
34
|
fs.mkdirSync(dataDir, { recursive: true });
|
package/dist/workspace.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workspace.js","sourceRoot":"","sources":["../src/workspace.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAkB,MAAM,sBAAsB,CAAC;AACnG,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAExD;2DAC2D;AAC3D,MAAM,UAAU,aAAa,CAAC,OAAe;IAC3C,MAAM,QAAQ,GAAG,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC;IAC9F,OAAO,QAAQ,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC,CAAC;AACxE,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,OAAe;IAC5C,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,aAAa,CAAC,mBAAmB,EAAE,+BAA+B,OAAO,EAAE,EAAE;YACrF,IAAI,EAAE,qDAAqD;SAC5D,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,OAAe;IAC3C,cAAc,CAAC,OAAO,CAAC,CAAC;IACxB,OAAO,aAAa,CAAC,OAAO,CAAC,CAAC;AAChC,CAAC;AAED,wGAAwG;AACxG,MAAM,UAAU,WAAW,CAAC,OAAe;IACzC,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3C,IAAI,aAAa,CAAC,OAAO,CAAC;QAAE,OAAO,QAAQ,CAAC;IAC5C,IAAI,CAAC;QACH,aAAa,CAAC,OAAO,CAAC,CAAC;IACzB,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,sFAAsF;QACtF,IAAI,CAAC,CAAC,CAAC,YAAY,aAAa,IAAI,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC;YAAE,MAAM,CAAC,CAAC;IACtE,CAAC;IACD,EAAE,CAAC,aAAa,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC;IACxG,OAAO,SAAS,CAAC;AACnB,CAAC"}
|
|
1
|
+
{"version":3,"file":"workspace.js","sourceRoot":"","sources":["../src/workspace.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAkB,MAAM,sBAAsB,CAAC;AACnG,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAExD;2DAC2D;AAC3D,MAAM,UAAU,aAAa,CAAC,OAAe;IAC3C,MAAM,QAAQ,GAAG,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC;IAC9F,OAAO,QAAQ,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC,CAAC;AACxE,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,OAAe;IAC5C,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,aAAa,CAAC,mBAAmB,EAAE,+BAA+B,OAAO,EAAE,EAAE;YACrF,IAAI,EAAE,qDAAqD;SAC5D,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,OAAe;IAC3C,cAAc,CAAC,OAAO,CAAC,CAAC;IACxB,OAAO,aAAa,CAAC,OAAO,CAAC,CAAC;AAChC,CAAC;AAED;+CAC+C;AAC/C,MAAM,UAAU,YAAY,CAAC,OAAe,EAAE,IAAY;IACxD,IAAI,CAAC;QACH,OAAO,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;IAC5G,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,wGAAwG;AACxG,MAAM,UAAU,WAAW,CAAC,OAAe;IACzC,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3C,IAAI,aAAa,CAAC,OAAO,CAAC;QAAE,OAAO,QAAQ,CAAC;IAC5C,IAAI,CAAC;QACH,aAAa,CAAC,OAAO,CAAC,CAAC;IACzB,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,sFAAsF;QACtF,IAAI,CAAC,CAAC,CAAC,YAAY,aAAa,IAAI,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC;YAAE,MAAM,CAAC,CAAC;IACtE,CAAC;IACD,EAAE,CAAC,aAAa,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC;IACxG,OAAO,SAAS,CAAC;AACnB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@arshdelight/practi",
|
|
3
|
-
"version": "0.9.
|
|
3
|
+
"version": "0.9.5",
|
|
4
4
|
"description": "Local registry CLI for POP (Protocol of Practice): manage a personal, content-addressed collection of practice documents on top of @arshdelight/pop-sdk. Syncs to PractiHub.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -8,7 +8,8 @@
|
|
|
8
8
|
},
|
|
9
9
|
"files": [
|
|
10
10
|
"dist",
|
|
11
|
-
"skills"
|
|
11
|
+
"skills",
|
|
12
|
+
"web-default"
|
|
12
13
|
],
|
|
13
14
|
"license": "MIT",
|
|
14
15
|
"keywords": [
|