dsh-journey 0.0.0-stage → 0.2.1

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.
@@ -0,0 +1,60 @@
1
+ # AGENT_INSTALL · dsh-journey
2
+
3
+ > 给管事的 AI:照这个做,不要猜。
4
+
5
+ ## 包
6
+
7
+ ```
8
+ name: dsh-journey
9
+ version: 0.2.1
10
+ display: Journey
11
+ ```
12
+
13
+ ## 前提
14
+
15
+ ```
16
+ DSH 0.2.2-rc.1
17
+ Windows
18
+ profile: %USERPROFILE%\.dsh\profiles\desktop
19
+ ```
20
+
21
+ ## 安装
22
+
23
+ ```
24
+ 1 把整个 dsh-journey 目录放到:
25
+ <profile>\node_modules\dsh-journey
26
+
27
+ 2 在 <profile>\package.json 的 dsh.profile.bundles 里加:
28
+ "dsh-journey"
29
+
30
+ 3 重启 DSH
31
+ ```
32
+
33
+ **不要手写 profile 的 journeyWorkspace**:
34
+ demo 工作区已经随包放在 `demo\`,插件默认读它。
35
+ 包内 `cordis.patch.yml` 不含任何本机路径。
36
+
37
+ ## 验证
38
+
39
+ ```
40
+ 左侧栏能看到 Journey
41
+ 点进去出现 P01 / P02 / P03
42
+ GET /wind-chain/journey/api/cards 返回 ok=true
43
+ ```
44
+
45
+ ## 卸载
46
+
47
+ ```
48
+ 1 从 bundles 去掉 "dsh-journey"
49
+ 2 重启 DSH
50
+ 3 把 node_modules\dsh-journey 移到 DW回收站(不要删除)
51
+ ```
52
+
53
+ ## 已知
54
+
55
+ ```
56
+ · 重启后 client 才加载
57
+ · UI 与接口仅限本机访问
58
+ · 不要手改 profile 里的其他 bundle
59
+ · 接口路径仍是 /wind-chain/journey/api/cards(历史路径,不是包名写错)
60
+ ```
package/README.md CHANGED
@@ -1,3 +1,69 @@
1
- # Temporary Holding Version
1
+ # Journey(风雨彩虹)
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ > 2026-11-13 | DSH 项目监控面板 | v0.2.1
4
+ > 中文统称:风雨彩虹
5
+
6
+ ## 是什么
7
+
8
+ ```
9
+ 在 DSH 左侧栏加一个 Journey 入口:
10
+ · 项目卡片总览
11
+ · 点卡片看“正在进行 / 卡点”
12
+ · 再点右栏看“计划总览”
13
+ ```
14
+
15
+ 只读监控;不派活、不急停。
16
+
17
+ ## 包结构
18
+
19
+ ```
20
+ dsh-journey\
21
+ package.json dsh.bundle + dsh.client
22
+ cordis.patch.yml host 配置
23
+ lib\index.js host:数据接口
24
+ lib\client.js client:侧栏入口 + main 页面
25
+ lib\journey-data.js 数据层:A 系列 / 演示工作区
26
+ public\index.html v362 页面(单文件 + 图片)
27
+ README.md
28
+ AGENT_INSTALL.md
29
+ install.manifest.json
30
+ ```
31
+
32
+ ## 安装
33
+
34
+ 见 `AGENT_INSTALL.md`。最短版:
35
+
36
+ ```
37
+ 装 dsh-journey 到 profile
38
+ bundle 加 dsh-journey
39
+ 重启 DSH
40
+ 左侧栏出现 Journey
41
+ ```
42
+
43
+ ## 数据源
44
+
45
+ ```
46
+ demo\ 随包携带,默认读取:
47
+ P01 潮汐表 / P02 词根 / P03 雨声
48
+ ```
49
+
50
+ 包内 `cordis.patch.yml` 不含本机路径;不需要填 `journeyWorkspace`。
51
+ 以后要换成真实项目,再在 profile 级配置里加 `journeyWorkspace`。
52
+
53
+ ## 验证
54
+
55
+ ```
56
+ GET /wind-chain/journey/api/cards
57
+ → ok=true
58
+ ```
59
+
60
+ 仅本机访问;对外部署前需加 token。
61
+
62
+ ## 状态
63
+
64
+ ```
65
+ host 可用
66
+ client 可用
67
+ 演示工作区 P01/P02/P03 可用
68
+ v362 UI 冻结
69
+ ```
@@ -0,0 +1,5 @@
1
+ # dsh-journey bundle patch
2
+ # 不写任何本机路径;demo 工作区随包携带,默认读取。
3
+ - insert:
4
+ - id: journey
5
+ name: dsh-journey
@@ -0,0 +1,28 @@
1
+ # P01 潮汐表
2
+
3
+ > 示例项目(虚构)。用于演示"**在跑**"状态。
4
+
5
+ ## 问题
6
+
7
+ 去海边之前要查潮汐,每次都要在网页上翻半天,还带广告。
8
+
9
+ ## 方案
10
+
11
+ 桌面小工具:读一份离线潮汐表,按日期输出当日高低潮两行。
12
+
13
+ ## 怎么跑
14
+
15
+ ```
16
+ python tide.py --date 2026-11-13
17
+ ```
18
+
19
+ ## 到哪一步
20
+
21
+ 解析器写完了,正在做命令行输出。
22
+
23
+ ## 不做什么
24
+
25
+ ```
26
+ · 不做图形界面
27
+ · 不联网(数据是离线表)
28
+ ```
@@ -0,0 +1,9 @@
1
+ # 状态 · P01_潮汐表
2
+
3
+ > 每次收工覆盖写,不追加;五字段
4
+
5
+ 当前阶段:解析器完成;正在做命令行输出
6
+ 最近一次动作:10:20 跑通 2026 全年数据解析,0 错误
7
+ 下一步:把高低潮按日切片,每天输出两行
8
+ 卡点:无
9
+ 最后更新:2026-11-13
@@ -0,0 +1,17 @@
1
+ # 计划 · P01_潮汐表
2
+
3
+ ```
4
+ 阶段 1 读数据
5
+ [x] 拿到离线潮汐表
6
+ [x] 解析全年数据
7
+ [ ] 校验闰年边界
8
+
9
+ 阶段 2 出结果
10
+ [ ] 按日切片
11
+ [ ] 命令行输出高低潮 ← 下一步
12
+ [ ] 支持 --date
13
+
14
+ 阶段 3 收口
15
+ [ ] 写 README
16
+ [ ] 打包单文件
17
+ ```
@@ -0,0 +1,28 @@
1
+ # P02 词根
2
+
3
+ > 示例项目(虚构)。用于演示"**停住、等我回一句话**"状态。
4
+
5
+ ## 问题
6
+
7
+ 背单词总在同一个词根上反复栽,散着背记不住。
8
+
9
+ ## 方案
10
+
11
+ 按词根聚类整理,做成可打印的单页——一页纸看完一批。
12
+
13
+ ## 怎么跑
14
+
15
+ ```
16
+ 打开 词根.html(单文件,无依赖)
17
+ ```
18
+
19
+ ## 到哪一步
20
+
21
+ 数据整理完了,**卡在一个决定上**:收录范围没定,写下去会返工。
22
+
23
+ ## 不做什么
24
+
25
+ ```
26
+ · 不做背单词 App
27
+ · 不做记忆曲线
28
+ ```
@@ -0,0 +1,9 @@
1
+ # 状态 · P02_词根
2
+
3
+ > 每次收工覆盖写,不追加;五字段
4
+
5
+ 当前阶段:整理完 120 个词根,等确定收录范围
6
+ 最近一次动作:昨日 21:10 出第一版 120 词根表,去重后 96 个
7
+ 下一步:确认"只收考试高频"还是"全收"
8
+ 卡点:等我说一句话——范围未定,往下写会返工
9
+ 最后更新:2026-11-12
@@ -0,0 +1,15 @@
1
+ # 计划 · P02_词根
2
+
3
+ ```
4
+ 阶段 1 收词
5
+ [x] 抓 120 个词根
6
+ [x] 去重到 96
7
+ [ ] 定收录范围 ← 下一步(等我一句话)
8
+
9
+ 阶段 2 排版
10
+ [ ] 单页 HTML
11
+ [ ] 打印预览
12
+
13
+ 阶段 3 收口
14
+ [ ] 印一页纸交出去
15
+ ```
@@ -0,0 +1,28 @@
1
+ # P03 雨声
2
+
3
+ > 示例项目(虚构)。用于演示"**已结束**"状态。
4
+
5
+ ## 问题
6
+
7
+ 写东西的时候需要稳定白噪音,现成的播放器都带广告、带推荐。
8
+
9
+ ## 方案
10
+
11
+ 循环播放一段 30 秒雨声,没有界面,只有托盘图标。
12
+
13
+ ## 怎么跑
14
+
15
+ ```
16
+ dist\rain.exe
17
+ ```
18
+
19
+ ## 到哪一步
20
+
21
+ 做完了,已归档。
22
+
23
+ ## 不做什么
24
+
25
+ ```
26
+ · 不做歌单
27
+ · 不做在线音源
28
+ ```
@@ -0,0 +1,9 @@
1
+ # 状态 · P03_雨声
2
+
3
+ > 每次收工覆盖写,不追加;五字段
4
+
5
+ 当前阶段:已完成,产物在 dist\
6
+ 最近一次动作:09:40 打包成单文件,52 KB
7
+ 下一步:无(已归档)
8
+ 卡点:无
9
+ 最后更新:2026-11-11
@@ -0,0 +1,15 @@
1
+ # 计划 · P03_雨声
2
+
3
+ ```
4
+ 阶段 1 素材
5
+ [x] 录 30 秒雨声
6
+ [x] 无缝循环处理
7
+
8
+ 阶段 2 播放器
9
+ [x] 托盘图标
10
+ [x] 开机自启开关
11
+
12
+ 阶段 3 收口
13
+ [x] 单文件打包
14
+ [x] 说明一页
15
+ ```
@@ -0,0 +1,48 @@
1
+ # 说明 · 演示工作区
2
+
3
+ > 用途:社团演示只跑这个目录 | 建:2026-11-13 | 归属:A07
4
+ > 性质:**纯示例**。三个虚构项目,不含任何真实项目、日志、隐私
5
+
6
+ ## 为什么要有这个
7
+
8
+ 自用工作区 `D:\deepseek_work` 里有真实项目、日志和隐私,**不能拿去演示**。
9
+ 插件必须把"工作区路径"当参数(见 `技术资料\疾风连环_与工作站的关系.md` §6),
10
+ 于是我们给它一个干净的小目录:插件装好那一刻,指向这里就能开演。
11
+
12
+ ## 里面有什么
13
+
14
+ ```
15
+ P01_潮汐表 在跑 演"它正在干什么"
16
+ P02_词根 等我说一句 演"为什么停"和"说一句话就能继续"
17
+ P03_雨声 结束 演"收口长什么样"
18
+ ```
19
+
20
+ 三个项目在面板上的样子:`◎` 在跑 / `○` 空闲(含"等我"与"已结束")。
21
+ **v362 没有单独的"结束"标记**——救星查 A16 记录确认,三态是 NEW / 在跑 / 空闲。
22
+ 所以 P03 会落在"空闲"组里,靠卡片第一句"已结束,无需处理"表达收口,不靠形状区分。
23
+ 演示脚本 §3 的动线就是照这三张卡排的。
24
+
25
+ ## 每个项目固定三件
26
+
27
+ ```
28
+ README.md 问题 / 方案 / 怎么跑 / 到哪一步
29
+ 状态.md 五字段(当前阶段 / 最近动作 / 下一步 / 卡点 / 最后更新)
30
+ 计划.md 阶段 + 勾选 + ← 下一步
31
+ ```
32
+
33
+ ## 和插件的关系
34
+
35
+ ```
36
+ · 插件的工作区路径指向本目录,不指向 D:\deepseek_work
37
+ · 数据格式以插件定稿为准;计划.md 是我方提议格式,
38
+ 若插件定了别的 schema,只改这类文件,不动其他
39
+ · 目录名前缀(P0x)如需改成 A/Z,只改文件夹名
40
+ ```
41
+
42
+ ## 三条规矩
43
+
44
+ ```
45
+ · 不往这里拷真实材料(一拷就污染,下次演示还得重来)
46
+ · 演示前先跑一遍:三个状态都要对得上
47
+ · 演完不删,下次彩排还要用
48
+ ```
@@ -0,0 +1,25 @@
1
+ {
2
+ "name": "dsh-journey",
3
+ "version": "0.2.1",
4
+ "displayName": "Journey",
5
+ "profile": "desktop",
6
+ "install": {
7
+ "target": "<profile>/node_modules/dsh-journey",
8
+ "bundle": "dsh-journey",
9
+ "restartRequired": true,
10
+ "bundledDemo": "demo/"
11
+ },
12
+ "verify": {
13
+ "ui": "sidebar Journey visible",
14
+ "api": "GET /wind-chain/journey/api/cards -> ok=true"
15
+ },
16
+ "uninstall": {
17
+ "removeBundle": "dsh-journey",
18
+ "moveTo": "D:\\deepseek_work\\DW回收站"
19
+ },
20
+ "notes": [
21
+ "demo workspace is bundled; no journeyWorkspace needed",
22
+ "UI and API are loopback-only",
23
+ "interface path keeps the historical /wind-chain prefix"
24
+ ]
25
+ }
package/lib/client.js ADDED
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Journey to the Rainbow · client half
3
+ * DSH 槽位:sidebar.panellist + main;页面本体由 host 路由提供。
4
+ */
5
+ window.__ModuleLoader__.load({
6
+ id: 'dsh-journey',
7
+ factory: (require) => {
8
+ const React = require('react');
9
+ const h = React.createElement;
10
+ const PANEL_ID = 'journey';
11
+ const PANEL_ORDER = 7;
12
+
13
+ function JourneyIcon() {
14
+ return h('svg', {
15
+ viewBox: '0 0 24 24',
16
+ width: 18,
17
+ height: 18,
18
+ fill: 'none',
19
+ stroke: 'currentColor',
20
+ strokeWidth: 1.6,
21
+ strokeLinecap: 'round',
22
+ strokeLinejoin: 'round',
23
+ 'aria-hidden': true,
24
+ },
25
+ h('circle', { cx: 12, cy: 12, r: 9 }),
26
+ h('path', { d: 'M5.2 14.5c3.2-4.6 6.1-6.8 8.6-6.8 2.2 0 4.1 1.4 5.6 3.2' }),
27
+ h('path', { d: 'M7.2 17.2c2.2-3.2 4.4-4.8 6.6-4.8 1.7 0 3.2 1 4.6 2.4' })
28
+ );
29
+ }
30
+
31
+ function JourneyPage() {
32
+ return h('div', {
33
+ style: { width: '100%', height: '100%', minHeight: 0, overflow: 'hidden' },
34
+ }, h('iframe', {
35
+ src: '/wind-chain/journey/ui/',
36
+ title: 'Journey to the Rainbow',
37
+ style: { width: '100%', height: '100%', border: 0, display: 'block', background: '#f7f7f4' },
38
+ }));
39
+ }
40
+
41
+ function apply(ctx) {
42
+ const disposeRow = ctx.slots.inject('sidebar.panellist', () =>
43
+ ctx.slots.register(
44
+ {
45
+ name: 'sidebar.panellist',
46
+ id: PANEL_ID,
47
+ order: PANEL_ORDER,
48
+ label: 'Journey',
49
+ },
50
+ JourneyIcon,
51
+ ),
52
+ );
53
+ const disposePage = ctx.slots.inject('main', () =>
54
+ ctx.slots.register({ name: 'main', key: PANEL_ID }, JourneyPage),
55
+ );
56
+ ctx.effect(() => () => {
57
+ disposePage();
58
+ disposeRow();
59
+ });
60
+ }
61
+
62
+ return { apply, inject: ['slots'] };
63
+ },
64
+ });