@arshdelight/practi 0.10.0 → 0.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cmd/show.js +2 -1
- package/dist/cmd/show.js.map +1 -1
- package/package.json +1 -1
- package/skills/use-practi/SKILL.md +3 -1
- package/web-default/detail.html +1 -0
- package/web-default/detail.js +158 -3
- package/web-default/highlight.min.js +1262 -0
- package/web-default/lang.js +3 -3
- package/web-default/style.css +63 -4
package/dist/cmd/show.js
CHANGED
|
@@ -99,7 +99,8 @@ function renderNode(hash, nodes, opts) {
|
|
|
99
99
|
console.log(JSON.stringify(exportSubtree(node, nodes), null, 2));
|
|
100
100
|
return 0;
|
|
101
101
|
}
|
|
102
|
-
|
|
102
|
+
// --json 传 full:机器视图带每步正文,AI 一次读全免逐哈希往返;人类文本仍走紧凑骨架
|
|
103
|
+
const view = aggregateView(hash, nodes, opts.json ? { full: true } : undefined);
|
|
103
104
|
if (opts.json) {
|
|
104
105
|
console.log(JSON.stringify(view, null, 2));
|
|
105
106
|
return 0;
|
package/dist/cmd/show.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"show.js","sourceRoot":"","sources":["../../src/cmd/show.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"show.js","sourceRoot":"","sources":["../../src/cmd/show.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@arshdelight/practi",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.11.0",
|
|
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": {
|
|
@@ -126,7 +126,8 @@ practi edit <hash> doc.json --remote
|
|
|
126
126
|
# against your remote claims) swaps to the new document; nothing local
|
|
127
127
|
practi remove <hash> # take a direct pop out of the local directory (registry op; GCs
|
|
128
128
|
# unreachable nodes — shared indirect nodes survive)
|
|
129
|
-
practi show <hash> # aggregate view; --json machine view
|
|
129
|
+
practi show <hash> # aggregate view; --json machine view (steps carry content —
|
|
130
|
+
# the one-read reproduction view); --doc full document form
|
|
130
131
|
# local first (hash prefix OK); a full hash missing locally falls
|
|
131
132
|
# back to the hub — content is re-hashed before display, a
|
|
132
133
|
# found-but-mismatched hash is an error, never shown
|
|
@@ -143,6 +144,7 @@ practi migrate [path] [--keep] # cut: move the workspace (old dir removed after
|
|
|
143
144
|
|
|
144
145
|
- `practi new` validates through the SDK, persists the content-addressed tree, registers the root as direct, and prints the root hash with `status: valid, registered as direct`. On validation issues the tree is stored but **not** registered — read the printed `E_*` issues, fix the JSON, re-run.
|
|
145
146
|
- `practi show` accepts a unique hash prefix (≥4 hex digits); `--doc` emits the expanded document — the starting point for forking or refining.
|
|
147
|
+
- **Reading vs editing**: to follow or reproduce a practice, read the aggregate view (`show`, or `show --json` — steps come with their content, one read is enough); to edit, fork, or reason about the op structure (choice branches, loop bodies, set sections), read `--doc` — the aggregate flattens those by design.
|
|
146
148
|
|
|
147
149
|
## Remote workflow
|
|
148
150
|
|
package/web-default/detail.html
CHANGED
package/web-default/detail.js
CHANGED
|
@@ -83,7 +83,8 @@ function render() {
|
|
|
83
83
|
var node = walk(path);
|
|
84
84
|
// 三视图:向导正文 / StandardView JSON / document JSON——侧栏大纲始终是导航脊柱,
|
|
85
85
|
// 底部 Prev/Next 也常驻(在 JSON 视图里换节点=高亮跟着走)
|
|
86
|
-
app.innerHTML = (view === 'wizard' ? nodeHtml(node) : jsonSectionHtml()) + navHtml();
|
|
86
|
+
app.innerHTML = topbarHtml() + (view === 'wizard' ? nodeHtml(node) : jsonSectionHtml()) + navHtml();
|
|
87
|
+
enhanceCodeBlocks(app);
|
|
87
88
|
updateTabs();
|
|
88
89
|
markSide();
|
|
89
90
|
renderNoteSide(); // 右栏跟人走:每次导航换节点都重渲染(草稿保真在 renderNoteSide 内部处理)
|
|
@@ -105,14 +106,19 @@ function render() {
|
|
|
105
106
|
// set 孩子的后代不递归聚合、天生不在视图里——老实不高亮
|
|
106
107
|
|
|
107
108
|
function jsonSectionHtml() {
|
|
109
|
+
// label 行右侧复制按钮:复用 data-code-copy 委托(编码 JSON 文本)
|
|
110
|
+
function labelRow(text, json) {
|
|
111
|
+
return '<div class="label-row"><div class="label">' + POP_I18N.t(text) + '</div>' +
|
|
112
|
+
'<button type="button" class="codeblock-copy json-copy" data-code-copy="' + encodeURIComponent(JSON.stringify(json, null, 2)) + '" aria-label="copy json">' + COPY_SVG + '</button></div>';
|
|
113
|
+
}
|
|
108
114
|
if (view === 'doc') {
|
|
109
|
-
return '<div class="section-sm"
|
|
115
|
+
return '<div class="section-sm">' + labelRow('labelDocJson', doc) +
|
|
110
116
|
'<pre class="json-pre">' + jsonHtml(doc, markDoc) + '</pre></div>';
|
|
111
117
|
}
|
|
112
118
|
if (svJson === null) {
|
|
113
119
|
return '<div class="section-sm"><div class="label">' + POP_I18N.t('labelSvJson') + '</div><p class="op-note">' + POP_I18N.t('loading') + '</p></div>';
|
|
114
120
|
}
|
|
115
|
-
return '<div class="section-sm"
|
|
121
|
+
return '<div class="section-sm">' + labelRow('labelSvJson', svJson) +
|
|
116
122
|
'<pre class="json-pre">' + jsonHtml(svJson, markSv) + '</pre></div>';
|
|
117
123
|
}
|
|
118
124
|
|
|
@@ -478,6 +484,125 @@ function proseHtml(node) {
|
|
|
478
484
|
return sectionWrap(proseLite(content, node));
|
|
479
485
|
}
|
|
480
486
|
|
|
487
|
+
// ── 围栏代码块增强:highlight.js 按语言高亮(未标注自动探测,relevance>=3 才信——
|
|
488
|
+
// 与 hub PopCodeBlock / D:/Dev/practi 桌面端同款逻辑),外包深色卡:
|
|
489
|
+
// 顶栏=语言标签 + 复制按钮(委托 data-code-copy)。hljs 缺库(DIY 覆盖前端)时跳过。
|
|
490
|
+
function enhanceCodeBlocks(root) {
|
|
491
|
+
if (typeof hljs === 'undefined') return;
|
|
492
|
+
var codes = root.querySelectorAll('.prose pre > code, .prose pre');
|
|
493
|
+
for (var i = 0; i < codes.length; i++) {
|
|
494
|
+
var el = codes[i];
|
|
495
|
+
var pre = el.tagName === 'PRE' ? el : el.parentElement;
|
|
496
|
+
if (!pre || pre.parentElement && pre.parentElement.classList.contains('codeblock')) continue;
|
|
497
|
+
if (el.tagName !== 'CODE') {
|
|
498
|
+
// proseLite 回落路径:<pre> 直接包文本——包一层 code 再走同一条路
|
|
499
|
+
var codeEl = document.createElement('code');
|
|
500
|
+
codeEl.textContent = pre.textContent;
|
|
501
|
+
pre.textContent = '';
|
|
502
|
+
pre.appendChild(codeEl);
|
|
503
|
+
el = codeEl;
|
|
504
|
+
}
|
|
505
|
+
var raw = el.textContent.replace(/^[`]{3}[\w-]*\r?\n/, '').replace(/\r?\n[`]{3}$/, '');
|
|
506
|
+
var m = /language-([\w-]+)/.exec(el.className);
|
|
507
|
+
var lang = m && hljs.getLanguage(m[1]) ? m[1] : '';
|
|
508
|
+
var detected = '';
|
|
509
|
+
var html;
|
|
510
|
+
if (lang) {
|
|
511
|
+
html = hljs.highlight(raw, { language: lang }).value;
|
|
512
|
+
detected = lang;
|
|
513
|
+
} else {
|
|
514
|
+
var r = hljs.highlightAuto(raw, AUTO_LANGS);
|
|
515
|
+
html = r.value;
|
|
516
|
+
detected = r.relevance >= 3 ? (r.language || '') : '';
|
|
517
|
+
}
|
|
518
|
+
var wrap = document.createElement('div');
|
|
519
|
+
wrap.className = 'codeblock';
|
|
520
|
+
var head = document.createElement('div');
|
|
521
|
+
head.className = 'codeblock-head';
|
|
522
|
+
head.innerHTML = '<span></span><button type="button" class="codeblock-copy" data-code-copy="' +
|
|
523
|
+
encodeURIComponent(raw) + '" aria-label="copy code">' + COPY_SVG + '</button>';
|
|
524
|
+
head.querySelector('span').textContent = detected;
|
|
525
|
+
var newPre = document.createElement('pre');
|
|
526
|
+
var newCode = document.createElement('code');
|
|
527
|
+
newCode.className = 'hljs';
|
|
528
|
+
newCode.innerHTML = html;
|
|
529
|
+
newPre.appendChild(newCode);
|
|
530
|
+
wrap.appendChild(head);
|
|
531
|
+
wrap.appendChild(newPre);
|
|
532
|
+
pre.parentElement.replaceChild(wrap, pre);
|
|
533
|
+
}
|
|
534
|
+
}
|
|
535
|
+
|
|
536
|
+
function flashCopied(btn) {
|
|
537
|
+
if (btn.getAttribute('data-flashing') || btn.textContent.trim() !== '') return;
|
|
538
|
+
btn.setAttribute('data-flashing', '1');
|
|
539
|
+
btn.innerHTML = CHECK_SVG;
|
|
540
|
+
setTimeout(function () {
|
|
541
|
+
btn.innerHTML = COPY_SVG;
|
|
542
|
+
btn.removeAttribute('data-flashing');
|
|
543
|
+
}, 1500);
|
|
544
|
+
}
|
|
545
|
+
|
|
546
|
+
// 自动探测语言子集(与 hub PopCodeBlock 的 AUTO_LANGS 同步):css/html/xml/markdown
|
|
547
|
+
// 极易误报(winget 命令被判成 css),排除后未命中就退回无标签
|
|
548
|
+
var AUTO_LANGS = ['bash', 'shell', 'powershell', 'json', 'javascript', 'typescript', 'python', 'sql', 'yaml', 'ini', 'rust', 'go', 'java', 'c', 'cpp', 'csharp', 'diff', 'makefile']
|
|
549
|
+
.filter(function (l) { return hljs.getLanguage(l); });
|
|
550
|
+
|
|
551
|
+
var COPY_SVG = '<svg width="11" height="11" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect width="14" height="14" x="8" y="8" rx="2" ry="2"/><path d="M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2"/></svg>';
|
|
552
|
+
var CHECK_SVG = '<svg width="11" height="11" viewBox="0 0 24 24" fill="none" stroke="#10b981" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M20 6 9 17l-5-5"/></svg>';
|
|
553
|
+
|
|
554
|
+
// 轻量 toast(hub notify 同观感):底部居中深色胶囊,1.6s 自动消退
|
|
555
|
+
function showToast(text) {
|
|
556
|
+
var el = document.getElementById('web-toast');
|
|
557
|
+
if (!el) {
|
|
558
|
+
el = document.createElement('div');
|
|
559
|
+
el.id = 'web-toast';
|
|
560
|
+
el.className = 'web-toast';
|
|
561
|
+
document.body.appendChild(el);
|
|
562
|
+
}
|
|
563
|
+
el.innerHTML = '<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="#10b981" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="12" r="10"/><path d="m9 12 2 2 4-4"/></svg><span></span>';
|
|
564
|
+
el.querySelector('span').textContent = text;
|
|
565
|
+
el.classList.add('show');
|
|
566
|
+
clearTimeout(el.__timer);
|
|
567
|
+
el.__timer = setTimeout(function () { el.classList.remove('show'); }, 1600);
|
|
568
|
+
}
|
|
569
|
+
|
|
570
|
+
// ── 内容列顶栏(hub 同款):返回(历史 back,兜底回目录)+ 文档信息弹窗。
|
|
571
|
+
// 本地文档没有状态/上传者/认领/浏览这些 hub 数据,弹窗只列节点数与根哈希 ──
|
|
572
|
+
var FP_SVG = '<svg width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M12 10a2 2 0 0 0-2 2c0 1.02-.1 2.51-.26 4"/><path d="M14 13.12c0 2.38 0 6.38-1 8.88"/><path d="M17.29 21.02c.12-.6.43-2.3.5-3.02"/><path d="M2 12a10 10 0 0 1 18-6"/><path d="M2 16h.01"/><path d="M21.8 16c.2-2 .131-5.354 0-6"/><path d="M5 19.5C5.5 18 6 15 6 12a6 6 0 0 1 .34-2"/><path d="M8.65 22c.21-.66.45-1.32.57-2"/><path d="M9 6.8a6 6 0 0 1 9 5.2v2"/></svg>';
|
|
573
|
+
var INFO_SVG = '<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="12" r="10"/><path d="M12 16v-4"/><path d="M12 8h.01"/></svg>';
|
|
574
|
+
var BACK_SVG = '<svg width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m12 19-7-7 7-7"/><path d="M19 12H5"/></svg>';
|
|
575
|
+
|
|
576
|
+
function topbarHtml() {
|
|
577
|
+
return '<div class="detail-topbar">' +
|
|
578
|
+
'<button type="button" class="topbar-btn" data-top="back">' + BACK_SVG + '<span>' + POP_I18N.t('back') + '</span></button>' +
|
|
579
|
+
'<button type="button" class="topbar-btn topbar-icon" data-top="info" aria-label="' + POP_I18N.t('metaInfo') + '" title="' + POP_I18N.t('metaInfo') + '">' + INFO_SVG + '</button>' +
|
|
580
|
+
'</div>';
|
|
581
|
+
}
|
|
582
|
+
|
|
583
|
+
function openInfoDialog() {
|
|
584
|
+
closeInfoDialog();
|
|
585
|
+
var overlay = document.createElement('div');
|
|
586
|
+
overlay.id = 'info-overlay';
|
|
587
|
+
overlay.innerHTML =
|
|
588
|
+
'<div class="info-card" role="dialog" aria-label="' + POP_I18N.t('metaInfo') + '">' +
|
|
589
|
+
'<div class="info-head"><div class="info-title">' + POP_I18N.t('metaInfo') + '</div>' +
|
|
590
|
+
'<button type="button" class="info-close" aria-label="close">' + INFO_SVG + '</button></div>' +
|
|
591
|
+
'<div class="info-row"><span class="info-key">' + POP_I18N.t('nodeCount', countNodes(doc)) + '</span></div>' +
|
|
592
|
+
'<button type="button" class="info-hash-btn" data-code-copy="' + encodeURIComponent(HASH) + '" title="' + POP_I18N.t('copied') + '">' +
|
|
593
|
+
FP_SVG + '<span class="info-hash">' + escapeHtml(HASH) + '</span>' + COPY_SVG + '</button>' +
|
|
594
|
+
'</div>';
|
|
595
|
+
overlay.addEventListener('click', function (e) {
|
|
596
|
+
if (e.target === overlay) closeInfoDialog();
|
|
597
|
+
});
|
|
598
|
+
document.body.appendChild(overlay);
|
|
599
|
+
}
|
|
600
|
+
|
|
601
|
+
function closeInfoDialog() {
|
|
602
|
+
var el = document.getElementById('info-overlay');
|
|
603
|
+
if (el) el.remove();
|
|
604
|
+
}
|
|
605
|
+
|
|
481
606
|
function sectionWrap(body) {
|
|
482
607
|
return '<div class="section-sm"><div class="label">' + POP_I18N.t('secContent') + '</div><div class="prose">' + body + '</div></div>';
|
|
483
608
|
}
|
|
@@ -495,6 +620,11 @@ function renderMarkdown(content, node) {
|
|
|
495
620
|
// 只转义 < 与 &(足以挡内联 HTML 注入);> 保留——行首 "> " 是块引用语法
|
|
496
621
|
src = src.replace(/&/g, '&').replace(/</g, '<');
|
|
497
622
|
var html = marked.parse(src, { gfm: true, breaks: false, async: false });
|
|
623
|
+
// marked 在 code 段内会把预转义产生的 & 再转一次(< 变 &lt;,页面显示字面
|
|
624
|
+
// <)——code 段内 & 还原回 &:预转义的 < 复原、原文的字面 & 仍只剩一层
|
|
625
|
+
html = html.replace(/(<code[^>]*>)([\s\S]*?)(<\/code>)/g, function (m0, open, body, close) {
|
|
626
|
+
return open + body.replace(/&/g, '&') + close;
|
|
627
|
+
});
|
|
498
628
|
return html.replace(/<a href="mailto:[^"]*">([^<]*)<\/a>/g, '$1');
|
|
499
629
|
}
|
|
500
630
|
|
|
@@ -649,6 +779,31 @@ function navHtml() {
|
|
|
649
779
|
// ── 事件(委托:innerHTML 重渲染不需要重复绑监听) ──
|
|
650
780
|
|
|
651
781
|
document.addEventListener('click', function (e) {
|
|
782
|
+
var top = e.target.closest('[data-top]');
|
|
783
|
+
if (top) {
|
|
784
|
+
if (top.getAttribute('data-top') === 'back') {
|
|
785
|
+
if (history.length > 1) history.back();
|
|
786
|
+
else location.href = '/';
|
|
787
|
+
} else if (top.getAttribute('data-top') === 'info') {
|
|
788
|
+
openInfoDialog();
|
|
789
|
+
}
|
|
790
|
+
return;
|
|
791
|
+
}
|
|
792
|
+
if (e.target.closest('#info-overlay .info-close')) {
|
|
793
|
+
closeInfoDialog();
|
|
794
|
+
return;
|
|
795
|
+
}
|
|
796
|
+
var copyBtn = e.target.closest('[data-code-copy]');
|
|
797
|
+
if (copyBtn) {
|
|
798
|
+
var text = decodeURIComponent(copyBtn.getAttribute('data-code-copy'));
|
|
799
|
+
if (navigator.clipboard && navigator.clipboard.writeText) {
|
|
800
|
+
navigator.clipboard.writeText(text).then(function () {
|
|
801
|
+
flashCopied(copyBtn);
|
|
802
|
+
showToast(POP_I18N.t('copied'));
|
|
803
|
+
}, function () {});
|
|
804
|
+
}
|
|
805
|
+
return;
|
|
806
|
+
}
|
|
652
807
|
var tab = e.target.closest('[data-view]');
|
|
653
808
|
if (tab) {
|
|
654
809
|
view = tab.getAttribute('data-view');
|