dsh-task-ledger 0.1.14 → 0.2.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/README.md
CHANGED
|
@@ -79,7 +79,7 @@ The skill only loads when a request matches an explicit task intent, and "should
|
|
|
79
79
|
```markdown
|
|
80
80
|
- **Every piece of task progress, work item and work log (create / advance / query / close) goes through the `task-ledger` skill**; answer progress and history questions from it, never from conversation memory or a hand-rolled list.
|
|
81
81
|
- **Creation anchor**: hand something to `task-ledger` only when the user explicitly asks for a new task ("open a task", "log this first", "create a task"). Questions, queries, discussion and small incidental edits do not count — ask when unsure, and never create a task without an explicit instruction.
|
|
82
|
-
- **Ask in passing**: when the user is pushing forward work that spans turns (this turn ends with actions still on your plate) and has never mentioned tracking it, ask once after answering: "
|
|
82
|
+
- **Ask in passing**: when the user is pushing forward work that spans turns (this turn ends with actions still on your plate) and has never mentioned tracking it, ask once after answering: "Want me to open a ledger for this task? (Ignore this if not needed — no reply necessary.)" Once asked in a session, do not ask again; no reply means ignore it.
|
|
83
83
|
```
|
|
84
84
|
|
|
85
85
|
Without it the skill still works — it just acts only when you mention the task yourself.
|
package/dist/client.js
CHANGED
|
@@ -55930,6 +55930,20 @@ window.__ModuleLoader__.load({
|
|
|
55930
55930
|
settingsFlow3Todo: "在办:执行中的任务与待认领项",
|
|
55931
55931
|
settingsFlow3History: "历史:本项目已结案的任务数量",
|
|
55932
55932
|
settingsFlow3Stats: "设置:多 Agent 安装、台账目录管理",
|
|
55933
|
+
settingsAgentsTitle: "在其他 Agent 中使用",
|
|
55934
|
+
settingsAgentsHint: "如您有多个 Agent 工具,可以在各自的 Agent 中安装这个 Skill 记录台账,再由此看板统一查看管理。",
|
|
55935
|
+
settingsAgentsLead: "同一份 skill 装在其他 Agent 上,记录的仍是这个项目的台账,看板一并汇总。",
|
|
55936
|
+
settingsAgentsStep1: "安装 Skill",
|
|
55937
|
+
settingsAgentsStep1Note: "命令会自动识别本机已装的 Agent(Claude Code、Codex、CodeBuddy 等),写进各自的技能目录。",
|
|
55938
|
+
settingsAgentsPromptLabel: "也可以把这句话发给任意 Agent,让它自己装:",
|
|
55939
|
+
settingsAgentsPrompt: "帮我安装 task-ledger 这个 skill(npm 包名 task-ledger,GitHub 包名 cq-guojia/dsh-task-ledger)。",
|
|
55940
|
+
settingsAgentsStep2: "注入规则文件(可选)",
|
|
55941
|
+
settingsAgentsStep2Note: "把下面这段加进项目根目录的 AGENTS.md,让 Agent 按台账口径跟进任务:",
|
|
55942
|
+
settingsAgentsStep3: "加进看板",
|
|
55943
|
+
settingsAgentsStep3Note: "在上面的「台账目录」点「添加目录」,选中项目根目录,看板就会汇总它。",
|
|
55944
|
+
settingsAgentsSupport: "Claude Code、Cursor、Codex、CodeBuddy、Trae,以及任何加载 SKILL.md 的 Agent 工具。",
|
|
55945
|
+
settingsAgentsCopied: "已复制",
|
|
55946
|
+
settingsCopy: "复制",
|
|
55933
55947
|
settingsColDir: "台账名",
|
|
55934
55948
|
settingsColPath: "路径",
|
|
55935
55949
|
settingsColActions: "操作",
|
|
@@ -56249,6 +56263,20 @@ window.__ModuleLoader__.load({
|
|
|
56249
56263
|
settingsFlow3Todo: "In flight: running tasks and unclaimed items",
|
|
56250
56264
|
settingsFlow3History: "History: closed task count for this project",
|
|
56251
56265
|
settingsFlow3Stats: "Settings: multi-agent install, ledger folder management",
|
|
56266
|
+
settingsAgentsTitle: "Use from other agents",
|
|
56267
|
+
settingsAgentsHint: "If you use several agent tools, install this Skill in each of them to keep the ledger, then review and manage everything on this board.",
|
|
56268
|
+
settingsAgentsLead: "The same skill installed in another agent still writes to this project's ledger, and the board sums it up.",
|
|
56269
|
+
settingsAgentsStep1: "Install the skill",
|
|
56270
|
+
settingsAgentsStep1Note: "The command detects the agents installed on this machine (Claude Code, Codex, CodeBuddy, …) and writes into each skills directory.",
|
|
56271
|
+
settingsAgentsPromptLabel: "Or send this line to any agent and let it install:",
|
|
56272
|
+
settingsAgentsPrompt: "Install the task-ledger skill (npm package task-ledger, GitHub repo cq-guojia/dsh-task-ledger).",
|
|
56273
|
+
settingsAgentsStep2: "Inject the rules (optional)",
|
|
56274
|
+
settingsAgentsStep2Note: "Add this to AGENTS.md in the project root so the agent follows the ledger convention:",
|
|
56275
|
+
settingsAgentsStep3: "Add it to the board",
|
|
56276
|
+
settingsAgentsStep3Note: "Under \"Ledger folders\" above, click \"Add folder\" and pick the project root; the board will include it.",
|
|
56277
|
+
settingsAgentsSupport: "Claude Code, Cursor, Codex, CodeBuddy, Trae, and any agent tool that loads SKILL.md.",
|
|
56278
|
+
settingsAgentsCopied: "Copied",
|
|
56279
|
+
settingsCopy: "Copy",
|
|
56252
56280
|
settingsColDir: "Ledger name",
|
|
56253
56281
|
settingsColPath: "Path",
|
|
56254
56282
|
settingsColActions: "Actions",
|
|
@@ -64137,6 +64165,38 @@ body[data-ds-dark-theme]{
|
|
|
64137
64165
|
/* 可编辑文案框:高度由核心 CodeEditor 的 height 给,这里只补间距与保存中的锁定态 */
|
|
64138
64166
|
.dtl-set__rules-editor{margin-bottom:var(--dtl-space-2);}
|
|
64139
64167
|
.dtl-set__rules-editor--busy{opacity:.65;pointer-events:none;}
|
|
64168
|
+
/* 「在其他 Agent 中使用」(2026-11-11):三步,步与步之间一条横线。
|
|
64169
|
+
命令单行省略(全文靠 Tip 气泡),复制钮紧贴右缘。 */
|
|
64170
|
+
.dtl-set__agents-lead{margin:0 0 var(--dtl-space-3);font-size:var(--dtl-font-md);
|
|
64171
|
+
line-height:var(--dtl-line-md);color:var(--dtl-fg-2);}
|
|
64172
|
+
.dtl-set__step + .dtl-set__step{margin-top:var(--dtl-space-4);padding-top:var(--dtl-space-4);
|
|
64173
|
+
border-top:1px solid var(--dtl-border);}
|
|
64174
|
+
.dtl-set__stephead{display:flex;align-items:center;gap:var(--dtl-space-2);
|
|
64175
|
+
margin-bottom:var(--dtl-space-2);}
|
|
64176
|
+
.dtl-set__stepno{display:inline-flex;align-items:center;justify-content:center;
|
|
64177
|
+
width:20px;height:20px;flex:none;border-radius:50%;
|
|
64178
|
+
background:var(--dtl-business-soft);color:var(--dtl-business);
|
|
64179
|
+
font-size:var(--dtl-font-xs);font-weight:600;}
|
|
64180
|
+
.dtl-set__steptitle{font-size:var(--dtl-font-md);font-weight:600;color:var(--dtl-fg);}
|
|
64181
|
+
.dtl-set__cmd{display:flex;align-items:center;gap:var(--dtl-space-2);
|
|
64182
|
+
padding:var(--dtl-space-2) var(--dtl-space-3);border:1px solid var(--dtl-border);
|
|
64183
|
+
border-radius:var(--dtl-radius-sm);background:var(--dtl-table-head-bg);}
|
|
64184
|
+
.dtl-set__cmdtext{flex:1 1 auto;min-width:0;font-family:var(--dtl-font-mono);
|
|
64185
|
+
font-size:var(--dtl-font-sm);color:var(--dtl-fg);white-space:nowrap;
|
|
64186
|
+
overflow:hidden;text-overflow:ellipsis;}
|
|
64187
|
+
.dtl-set__agents-note{margin:var(--dtl-space-2) 0 0;font-size:var(--dtl-font-sm);
|
|
64188
|
+
line-height:var(--dtl-line-sm);color:var(--dtl-fg-3);}
|
|
64189
|
+
/* 复制钮钉在框的**右上角**(用户 2026-11-11):距上、右同为 space-2。
|
|
64190
|
+
正文右侧留出按钮位与间隙;单行时正文行高 = 按钮高 ⇒ 上 8 下 8,视觉上仍是垂直居中。 */
|
|
64191
|
+
.dtl-set__prompt{position:relative;margin-top:var(--dtl-space-2);
|
|
64192
|
+
padding:var(--dtl-space-2) calc(var(--dtl-space-2) * 2 + 24px) var(--dtl-space-2) var(--dtl-space-3);
|
|
64193
|
+
border:1px dashed var(--dtl-border-strong);border-radius:var(--dtl-radius-sm);}
|
|
64194
|
+
.dtl-set__promptact{position:absolute;top:var(--dtl-space-2);right:var(--dtl-space-2);}
|
|
64195
|
+
.dtl-set__promptbody{display:block;min-height:24px;font-size:var(--dtl-font-sm);
|
|
64196
|
+
line-height:24px;color:var(--dtl-fg-2);white-space:pre-wrap;word-break:break-word;}
|
|
64197
|
+
.dtl-set__agents-support{margin:var(--dtl-space-4) 0 0;padding-top:var(--dtl-space-3);
|
|
64198
|
+
border-top:1px solid var(--dtl-border-faint);font-size:var(--dtl-font-sm);
|
|
64199
|
+
line-height:var(--dtl-line-sm);color:var(--dtl-fg-3);}
|
|
64140
64200
|
|
|
64141
64201
|
/* hero:左栏**定宽 320px**(用户 2026-11-01:别跟着窗口伸缩),右栏吃掉剩下的宽度。
|
|
64142
64202
|
两侧**等高**(用户 2026-11-01:右边流程要跟左边身份卡一样高):
|
|
@@ -67447,6 +67507,9 @@ body[data-ds-dark-theme]{
|
|
|
67447
67507
|
}));
|
|
67448
67508
|
/** 本轮的写动作一律空着(界面先定,方法下一轮接)。 */
|
|
67449
67509
|
const notYet = () => {};
|
|
67510
|
+
/** skills CLI 只认 git / 下载 URL(实测 `add task-ledger` 会当 git 仓库克隆并失败),
|
|
67511
|
+
* 所以走仓库坐标;CLI 自己会挑出 monorepo 里的这个 skill(实测只列一个)。 */
|
|
67512
|
+
const SKILL_ADD = "npx skills add cq-guojia/dsh-task-ledger -g";
|
|
67450
67513
|
/** 名册 → 表格行(用户 2026-11-02):多个工作区都有的身份合并成一行、工作区列写「通用用户」,
|
|
67451
67514
|
* 只在一个工作区出现的按各自工作区名;通用的排前面。 */
|
|
67452
67515
|
function rosterRows(roster, sharedTitle) {
|
|
@@ -67716,14 +67779,14 @@ body[data-ds-dark-theme]{
|
|
|
67716
67779
|
cancelText: t("settingsCancel")
|
|
67717
67780
|
})) claim(row.uuid, row.workspaceId, row.name);
|
|
67718
67781
|
};
|
|
67719
|
-
const
|
|
67782
|
+
const copyText = (value, done) => {
|
|
67720
67783
|
const clip = navigator.clipboard;
|
|
67721
67784
|
if (clip === void 0) return;
|
|
67722
|
-
clip.writeText(
|
|
67723
|
-
setCopied(
|
|
67724
|
-
notify(
|
|
67785
|
+
clip.writeText(value).then(() => {
|
|
67786
|
+
setCopied(value);
|
|
67787
|
+
notify(done, { variant: "success" });
|
|
67725
67788
|
window.setTimeout(() => {
|
|
67726
|
-
setCopied((current) => current ===
|
|
67789
|
+
setCopied((current) => current === value ? null : current);
|
|
67727
67790
|
}, 1500);
|
|
67728
67791
|
}, notYet);
|
|
67729
67792
|
};
|
|
@@ -68044,7 +68107,7 @@ body[data-ds-dark-theme]{
|
|
|
68044
68107
|
size: "sm",
|
|
68045
68108
|
className: "dtl-dir__copy",
|
|
68046
68109
|
onClick: () => {
|
|
68047
|
-
|
|
68110
|
+
copyText(dir.path, t("settingsPathCopied"));
|
|
68048
68111
|
}
|
|
68049
68112
|
})
|
|
68050
68113
|
})),
|
|
@@ -68117,6 +68180,31 @@ body[data-ds-dark-theme]{
|
|
|
68117
68180
|
],
|
|
68118
68181
|
rows: dirRows
|
|
68119
68182
|
});
|
|
68183
|
+
const copyButton = (value) => (0, react$1.createElement)(Tip, {
|
|
68184
|
+
label: t("settingsCopy"),
|
|
68185
|
+
children: (0, react$1.createElement)(IconButton, {
|
|
68186
|
+
icon: copied === value ? (0, react$1.createElement)(_deepseek_ai_dsh_client_ui_primitives.IconCheckOutlineRegular, { size: 14 }) : (0, react$1.createElement)(_deepseek_ai_dsh_client_ui_primitives.IconCopyOutlineRegular, { size: 14 }),
|
|
68187
|
+
label: t("settingsCopy"),
|
|
68188
|
+
size: "sm",
|
|
68189
|
+
onClick: () => {
|
|
68190
|
+
copyText(value, t("settingsAgentsCopied"));
|
|
68191
|
+
}
|
|
68192
|
+
})
|
|
68193
|
+
});
|
|
68194
|
+
/** 一块可复制的正文(提示词 / 规则片段共用):复制钮钉在框的右上角(CSS 绝对定位,
|
|
68195
|
+
* 距上、右同距);单行内容靠正文的 min-height 让它看起来仍是垂直居中。 */
|
|
68196
|
+
const copyBlock = (text) => (0, react$1.createElement)("div", { className: "dtl-set__prompt" }, (0, react$1.createElement)("span", { className: "dtl-set__promptbody" }, text), (0, react$1.createElement)("div", { className: "dtl-set__promptact" }, copyButton(text)));
|
|
68197
|
+
const step = (no, title, body) => (0, react$1.createElement)("div", { className: "dtl-set__step" }, (0, react$1.createElement)("div", { className: "dtl-set__stephead" }, (0, react$1.createElement)("span", { className: "dtl-set__stepno" }, no), (0, react$1.createElement)("span", { className: "dtl-set__steptitle" }, title)), body);
|
|
68198
|
+
const note = (text) => (0, react$1.createElement)("p", { className: "dtl-set__agents-note" }, text);
|
|
68199
|
+
const prompt = t("settingsAgentsPrompt");
|
|
68200
|
+
const agentsBlock = (0, react$1.createElement)(Surface, { padding: "lg" }, (0, react$1.createElement)(SectionHead, {
|
|
68201
|
+
icon: (0, react$1.createElement)(_deepseek_ai_dsh_client_ui_primitives.IconDownloadOutlineRegular, { size: 16 }),
|
|
68202
|
+
title: (0, react$1.createElement)("span", { className: "dtl-set__rules-title" }, t("settingsAgentsTitle"), (0, react$1.createElement)(FieldHint, {
|
|
68203
|
+
text: t("settingsAgentsHint"),
|
|
68204
|
+
side: "top",
|
|
68205
|
+
maxWidth: 420
|
|
68206
|
+
}))
|
|
68207
|
+
}), (0, react$1.createElement)("div", { className: "dtl-set__body" }, (0, react$1.createElement)("p", { className: "dtl-set__agents-lead" }, t("settingsAgentsLead")), step("1", t("settingsAgentsStep1"), (0, react$1.createElement)(react$1.Fragment, null, (0, react$1.createElement)("div", { className: "dtl-set__cmd" }, (0, react$1.createElement)("code", { className: "dtl-set__cmdtext" }, SKILL_ADD), copyButton(SKILL_ADD)), note(t("settingsAgentsStep1Note")), note(t("settingsAgentsPromptLabel")), copyBlock(prompt))), step("2", t("settingsAgentsStep2"), (0, react$1.createElement)(react$1.Fragment, null, note(t("settingsAgentsStep2Note")), copyBlock(rulesDefaultText === "" ? rulesText : rulesDefaultText))), step("3", t("settingsAgentsStep3"), note(t("settingsAgentsStep3Note"))), (0, react$1.createElement)("p", { className: "dtl-set__agents-support" }, t("settingsAgentsSupport"))));
|
|
68120
68208
|
const userModal = userOpen ? (0, react$1.createElement)(Modal, {
|
|
68121
68209
|
title: t("settingsUserModalTitle"),
|
|
68122
68210
|
width: "576px",
|
|
@@ -68321,7 +68409,7 @@ body[data-ds-dark-theme]{
|
|
|
68321
68409
|
onClick: () => {
|
|
68322
68410
|
writeRules({ action: "reset" });
|
|
68323
68411
|
}
|
|
68324
|
-
}, t("settingsRulesReset"))), rulesError !== null ? (0, react$1.createElement)("p", null, t("settingsRulesFailed", { message: rulesError })) : null)), userModal, forgetDialog);
|
|
68412
|
+
}, t("settingsRulesReset"))), rulesError !== null ? (0, react$1.createElement)("p", null, t("settingsRulesFailed", { message: rulesError })) : null)), agentsBlock, userModal, forgetDialog);
|
|
68325
68413
|
}
|
|
68326
68414
|
//#endregion
|
|
68327
68415
|
//#region src/client/board-home.ts
|
|
@@ -68817,7 +68905,7 @@ body[data-ds-dark-theme]{
|
|
|
68817
68905
|
variant: "outline",
|
|
68818
68906
|
size: "md",
|
|
68819
68907
|
onClick: onBack
|
|
68820
|
-
}, `← ${t("backToConversation")}`), (0, react$1.createElement)("div", { style: titleStyle }, t("panelTitle"), (0, react$1.createElement)("span", { style: buildTagStyle }, `v0.
|
|
68908
|
+
}, `← ${t("backToConversation")}`), (0, react$1.createElement)("div", { style: titleStyle }, t("panelTitle"), (0, react$1.createElement)("span", { style: buildTagStyle }, `v0.2.0 261111-125914-503`))), (0, react$1.createElement)("div", { style: {
|
|
68821
68909
|
display: "flex",
|
|
68822
68910
|
alignItems: "center",
|
|
68823
68911
|
gap: "var(--dtl-space-3)"
|