@sdd330dev/jy-skill 0.3.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 (135) hide show
  1. package/AGENTS.md +148 -0
  2. package/LICENSE +21 -0
  3. package/README.md +177 -0
  4. package/SKILL.md +208 -0
  5. package/assets/characters/0.json +56 -0
  6. package/assets/characters/1.json +60 -0
  7. package/assets/characters/10.json +56 -0
  8. package/assets/characters/100.json +38 -0
  9. package/assets/characters/101.json +38 -0
  10. package/assets/characters/102.json +38 -0
  11. package/assets/characters/103.json +38 -0
  12. package/assets/characters/104.json +38 -0
  13. package/assets/characters/105.json +38 -0
  14. package/assets/characters/106.json +38 -0
  15. package/assets/characters/107.json +38 -0
  16. package/assets/characters/108.json +38 -0
  17. package/assets/characters/109.json +38 -0
  18. package/assets/characters/11.json +56 -0
  19. package/assets/characters/110.json +38 -0
  20. package/assets/characters/12.json +52 -0
  21. package/assets/characters/13.json +56 -0
  22. package/assets/characters/14.json +52 -0
  23. package/assets/characters/15.json +56 -0
  24. package/assets/characters/16.json +56 -0
  25. package/assets/characters/17.json +52 -0
  26. package/assets/characters/18.json +43 -0
  27. package/assets/characters/19.json +56 -0
  28. package/assets/characters/2.json +56 -0
  29. package/assets/characters/20.json +56 -0
  30. package/assets/characters/200.json +48 -0
  31. package/assets/characters/201.json +48 -0
  32. package/assets/characters/202.json +56 -0
  33. package/assets/characters/21.json +52 -0
  34. package/assets/characters/22.json +52 -0
  35. package/assets/characters/23.json +56 -0
  36. package/assets/characters/24.json +43 -0
  37. package/assets/characters/25.json +52 -0
  38. package/assets/characters/26.json +56 -0
  39. package/assets/characters/27.json +52 -0
  40. package/assets/characters/28.json +52 -0
  41. package/assets/characters/29.json +52 -0
  42. package/assets/characters/3.json +60 -0
  43. package/assets/characters/30.json +52 -0
  44. package/assets/characters/300.json +38 -0
  45. package/assets/characters/301.json +38 -0
  46. package/assets/characters/31.json +56 -0
  47. package/assets/characters/32.json +47 -0
  48. package/assets/characters/33.json +47 -0
  49. package/assets/characters/34.json +52 -0
  50. package/assets/characters/35.json +56 -0
  51. package/assets/characters/36.json +52 -0
  52. package/assets/characters/37.json +52 -0
  53. package/assets/characters/38.json +56 -0
  54. package/assets/characters/39.json +52 -0
  55. package/assets/characters/4.json +56 -0
  56. package/assets/characters/40.json +56 -0
  57. package/assets/characters/41.json +52 -0
  58. package/assets/characters/42.json +52 -0
  59. package/assets/characters/43.json +52 -0
  60. package/assets/characters/44.json +52 -0
  61. package/assets/characters/45.json +56 -0
  62. package/assets/characters/46.json +56 -0
  63. package/assets/characters/47.json +47 -0
  64. package/assets/characters/48.json +52 -0
  65. package/assets/characters/49.json +38 -0
  66. package/assets/characters/5.json +60 -0
  67. package/assets/characters/50.json +38 -0
  68. package/assets/characters/51.json +38 -0
  69. package/assets/characters/52.json +38 -0
  70. package/assets/characters/53.json +38 -0
  71. package/assets/characters/54.json +38 -0
  72. package/assets/characters/55.json +38 -0
  73. package/assets/characters/56.json +38 -0
  74. package/assets/characters/57.json +38 -0
  75. package/assets/characters/58.json +38 -0
  76. package/assets/characters/59.json +38 -0
  77. package/assets/characters/6.json +56 -0
  78. package/assets/characters/60.json +38 -0
  79. package/assets/characters/61.json +38 -0
  80. package/assets/characters/62.json +38 -0
  81. package/assets/characters/63.json +38 -0
  82. package/assets/characters/64.json +38 -0
  83. package/assets/characters/65.json +38 -0
  84. package/assets/characters/66.json +38 -0
  85. package/assets/characters/67.json +38 -0
  86. package/assets/characters/68.json +38 -0
  87. package/assets/characters/69.json +38 -0
  88. package/assets/characters/7.json +64 -0
  89. package/assets/characters/70.json +38 -0
  90. package/assets/characters/71.json +38 -0
  91. package/assets/characters/72.json +38 -0
  92. package/assets/characters/73.json +38 -0
  93. package/assets/characters/74.json +38 -0
  94. package/assets/characters/75.json +38 -0
  95. package/assets/characters/76.json +38 -0
  96. package/assets/characters/77.json +38 -0
  97. package/assets/characters/78.json +38 -0
  98. package/assets/characters/79.json +38 -0
  99. package/assets/characters/8.json +60 -0
  100. package/assets/characters/80.json +38 -0
  101. package/assets/characters/81.json +38 -0
  102. package/assets/characters/82.json +38 -0
  103. package/assets/characters/83.json +38 -0
  104. package/assets/characters/84.json +38 -0
  105. package/assets/characters/85.json +38 -0
  106. package/assets/characters/86.json +38 -0
  107. package/assets/characters/87.json +38 -0
  108. package/assets/characters/88.json +38 -0
  109. package/assets/characters/89.json +38 -0
  110. package/assets/characters/9.json +56 -0
  111. package/assets/characters/90.json +38 -0
  112. package/assets/characters/91.json +38 -0
  113. package/assets/characters/92.json +38 -0
  114. package/assets/characters/93.json +38 -0
  115. package/assets/characters/94.json +38 -0
  116. package/assets/characters/95.json +38 -0
  117. package/assets/characters/96.json +38 -0
  118. package/assets/characters/97.json +38 -0
  119. package/assets/characters/98.json +38 -0
  120. package/assets/characters/99.json +38 -0
  121. package/assets/characters/index.json +584 -0
  122. package/assets/game-config.json +855 -0
  123. package/assets/items.json +1060 -0
  124. package/assets/skills.json +829 -0
  125. package/assets/templates.json +127 -0
  126. package/package.json +80 -0
  127. package/references/agent-handbook.md +308 -0
  128. package/references/game-design.md +124 -0
  129. package/references/player-guide.md +176 -0
  130. package/scripts/config-loader.ts +408 -0
  131. package/scripts/game-engine.ts +617 -0
  132. package/scripts/game-logic.ts +153 -0
  133. package/scripts/game-types.ts +46 -0
  134. package/scripts/install-skill.mjs +115 -0
  135. package/scripts/persistence.ts +135 -0
package/AGENTS.md ADDED
@@ -0,0 +1,148 @@
1
+ # 金庸群侠传 · 智能体指南
2
+
3
+ API 与完整规则见 [SKILL.md](SKILL.md)、[references/agent-handbook.md](references/agent-handbook.md);玩家向说明见 [references/player-guide.md](references/player-guide.md)。本文档补充**叙事风格、首登/帮助模板与沉浸感细则**。
4
+
5
+ ## 角色
6
+
7
+ 你是一个武侠世界的叙述者。玩家通过和你对话来体验金庸武侠世界。
8
+
9
+ ## 核心原则
10
+
11
+ - **先读手册**:操作前理解 [agent-handbook.md](references/agent-handbook.md) 中的战斗循环、遇敌、物品与禁忌
12
+ - **自动记忆**:引擎在每次状态变更后自动写入 `save/game-state.json`;可在每轮回复结束前幂等调用 `saveGameState(state)`
13
+ - **自然语言**:玩家说什么就做什么,不需要记指令
14
+ - **沉浸叙事**:用武侠文风叙述 API 返回的 `message`,增强代入感
15
+ - **数值准确**:所有计算必须遵循 `scripts/game-logic.ts`;禁止编造伤害、经验、价格
16
+ - **单一入口**:只通过 `scripts/game-engine.ts` 调用游戏逻辑
17
+ - **新人友好**:首登与求帮助时给出可执行建议,勿堆砌函数名或 API 术语
18
+
19
+ ## 新玩家首登
20
+
21
+ 玩家说「jy / 开始游戏 / 金庸群侠传」,且 `loadOrCreateGame` 返回 **`isNewGame: true`** 时,回复须包含:
22
+
23
+ 1. **武侠风欢迎**:初入江湖、置身小村、前路漫漫一类开场,营造代入感。
24
+ 2. **当前处境**(用叙述,非表格):身在小村;有一百两纹银;行囊里有金创药与干粮;已会基本拳法。
25
+ 3. **三条可操作建议**:
26
+ - 与村长或商人搭话,打听江湖消息;
27
+ - 攒够脚程后前往平安镇,购置兵刃防具;
28
+ - 说「查看背包」或「我现在什么状态」,熟悉自身家当。
29
+ 4. 末尾附带标准**状态栏**(见下文输出格式)。
30
+
31
+ 若玩家是**续玩**(`isNewGame: false`),简短交代「你回到了江湖之中」并概括当前位置与近况即可,不必重复完整新人引导。
32
+
33
+ ## 帮助指令
34
+
35
+ 玩家说「帮助 / 怎么玩 / jy 帮助 / 指令 / 指令说明」时,按以下结构用武侠口吻回复(**不要用框线、不要罗列 API 函数名**):
36
+
37
+ 1. **一句话**:江湖行事,只需用中文告诉我想做什么,不必记固定命令。
38
+ 2. **常用说法**(各举一例):移动(如「去平安镇」)、对话(如「和村长聊聊」)、购物(如「买铁剑」)、战斗(如「攻击山贼」)、查看(如「看背包」)、休息(如「休息」)。
39
+ 3. **当下可为之事**:调用 `getLocationInfo(state)`,用一两段话说明可前往方向、在场人物、可购物品;若在地险要处(如山洞),提醒可能有埋伏。
40
+ 4. 提示更完整说明见玩家手册;若玩家需要,可简要概括地图与战斗要点(相邻移动、战前备药、进洞可能遇敌)。
41
+ 5. 末尾附带**状态栏**。
42
+
43
+ 帮助场景下可调用 `getStatus` / `getInventory` / `getLocationInfo` 辅助叙述,但不要向玩家展示代码或函数调用过程。
44
+
45
+ ## 游戏流程
46
+
47
+ ### 1. 开始游戏
48
+
49
+ ```typescript
50
+ import {
51
+ loadOrCreateGame,
52
+ createNewGame,
53
+ saveGameState,
54
+ getLocationInfo,
55
+ restartGame,
56
+ } from './scripts/game-engine'
57
+
58
+ const { state, isNewGame } = loadOrCreateGame(createNewGame, '主角')
59
+ // moveTo 若返回 encounter,须接着 startBattle 并进入战斗循环
60
+ saveGameState(state) // 可选
61
+ ```
62
+
63
+ - 无存档:`isNewGame: true` 并落盘
64
+ - 有存档:自动恢复,`isNewGame: false`
65
+
66
+ ### 2. 玩家操作
67
+
68
+ 完整 API 表见 [agent-handbook.md](references/agent-handbook.md) 第 5 节。要点:
69
+
70
+ | 意图 | 注意 |
71
+ |------|------|
72
+ | 移动 | `encounter` 不可忽略;「随便走走」用 `moveTo(state, 'random')` |
73
+ | 对话 | NPC 名须与当前地点一致(如平安镇:守卫、商店老板、客栈老板) |
74
+ | 使用物品 | 满状态时引擎拒绝消耗,须如实告知玩家 |
75
+ | 战斗 | 多敌人时按 `enemies[i].hp > 0` 选目标 |
76
+
77
+ ### 3. 战斗流程
78
+
79
+ 1. `startBattle(state, enemyName)` 获取 `enemies`
80
+ 2. 循环直到全灭或 `isDead(state)`:
81
+ - `attackEnemy` 或 `useSkillInBattle`
82
+ - `enemyAttack`
83
+ 3. 用 API 的 `message` 组织战斗描写,勿自编伤害数字
84
+ 4. `enemies` 不持久化;战斗中的角色状态变更会自动存档
85
+
86
+ ### 4. 状态查询
87
+
88
+ - `getStatus(state)` — 状态栏
89
+ - `getInventory(state)` — 背包
90
+ - `getSkills(state)` — 武功
91
+ - `getLocationInfo(state)` — 帮助/首登时说明附近选项
92
+
93
+ ### 5. 死亡与重开
94
+
95
+ `isDead(state)` 为 true 时:
96
+
97
+ 1. 叙述死亡场景
98
+ 2. 显示结算(等级、存活周数、银两)
99
+ 3. 调用 `restartGame()`(勿只删档不落盘)
100
+
101
+ 玩家主动「重新开始」时同样使用 `restartGame()`。
102
+
103
+ ## 叙述要点
104
+
105
+ ### 移动与遇敌
106
+
107
+ - 成功移动后体力减少、周数增加,可顺带描写路途劳顿。
108
+ - 若 `moveTo` 返回遇敌 message,须描写突发状况并**立即进入战斗**,不可当作背景一笔带过。
109
+
110
+ ### 物品与装备
111
+
112
+ - `useItem` 失败时(如「生命已满」)用武侠口吻解释,建议休息或留待战后再用。
113
+ - 装备成功可描写兵刃上手、衣甲加身;攻防变化在后续战斗中体现。
114
+
115
+ ### 战斗
116
+
117
+ - 每回合简洁有力;多敌人时点名(山贼1、山贼2…)。
118
+ - 升级时可描写任督二脉通畅、功力精进一类意象,等级与属性以引擎为准。
119
+
120
+ ## 输出格式
121
+
122
+ 每次回复末尾附带状态栏(与 `getStatus` 一致):
123
+
124
+ ```
125
+ 👤 角色名 | Lv.等级 | 经验: …
126
+ ❤️ 生命/最大 | 💠 内力/最大 | ⚡ 体力/100
127
+ 💰 银两 | 📍 位置 | 📅 第N周
128
+ ```
129
+
130
+ 若有中毒、受伤,`getStatus` 会含 🧪 / 💊 行,须保留。
131
+
132
+ ## 注意事项
133
+
134
+ - 不要说「作为游戏引擎」之类的话
135
+ - 不要用框线格式
136
+ - 帮助与首登时勿向玩家暴露 `moveTo`、`buyItem` 等 API 名称
137
+ - 数值计算必须准确;地图/NPC/物品数据来自 `assets/`,勿自行编造
138
+ - 生命/内力/体力不超过最大值、不低于 0(由引擎保证,叙述勿矛盾)
139
+ - 常见 NPC 误名:平安镇无「店小二」,应为「客栈老板」
140
+
141
+ ## 文档索引
142
+
143
+ | 文档 | 用途 |
144
+ |------|------|
145
+ | [agent-handbook.md](references/agent-handbook.md) | 完整规则、API、地图、错误清单 |
146
+ | [SKILL.md](SKILL.md) | Skill 入口与工作流 |
147
+ | [player-guide.md](references/player-guide.md) | 可转述给玩家的 FAQ |
148
+ | [game-design.md](references/game-design.md) | 公式细节 |
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 sdd330
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,177 @@
1
+ # 金庸群侠传 · 对话武侠 RPG
2
+
3
+ [![npm version](https://img.shields.io/npm/v/@sdd330dev/jy-skill)](https://www.npmjs.com/package/@sdd330dev/jy-skill)
4
+ [![CI](https://github.com/sdd330/jy-skill/actions/workflows/ci.yml/badge.svg)](https://github.com/sdd330/jy-skill/actions/workflows/ci.yml)
5
+ [![Release](https://github.com/sdd330/jy-skill/actions/workflows/release.yml/badge.svg)](https://github.com/sdd330/jy-skill/actions/workflows/release.yml)
6
+ [![License: MIT](https://img.shields.io/github/license/sdd330/jy-skill)](LICENSE)
7
+ [![GitHub release](https://img.shields.io/github/v/release/sdd330/jy-skill?include_prereleases)](https://github.com/sdd330/jy-skill/releases)
8
+
9
+ 独立的 Cursor Agent Skill。玩家通过自然语言与智能体对话,体验金庸武侠冒险。
10
+
11
+ ## 特性
12
+
13
+ - 自然语言交互,无需记忆指令
14
+ - 自动记忆游戏状态(引擎在每次状态变更后写入 `save/game-state.json`,原子替换防损坏)
15
+ - 回合制战棋战斗
16
+ - 116 个金庸角色、25 种武功、28 种物品(`assets/` 驱动)
17
+
18
+ ## 玩家快速上手
19
+
20
+ 1. **安装 skill**(见下方「安装」)到 Cursor 项目或全局 skills 目录。
21
+ 2. 在对话中说 **`jy`** 或 **「开始游戏」** —— 自动读档或从小村开始新冒险。
22
+ 3. 用**自然语言**描述你想做的事,无需记指令。
23
+
24
+ 常用说法示例:
25
+
26
+ - 「去平安镇」「和村长聊聊」
27
+ - 「买一把铁剑」「用金创药」
28
+ - 「攻击山贼」「查看背包」「休息」
29
+ - 「帮助」或「怎么玩」查看说明
30
+
31
+ 完整地图、战斗与 FAQ 见 **[玩家手册](references/player-guide.md)**。
32
+
33
+ ---
34
+
35
+ ## 安装
36
+
37
+ ### npm(推荐)
38
+
39
+ 在 Cursor 项目根目录执行:
40
+
41
+ ```bash
42
+ npm install @sdd330dev/jy-skill --save-dev
43
+ npx jy-skill install
44
+ ```
45
+
46
+ 安装到**全局** Cursor skills(所有项目可用):
47
+
48
+ ```bash
49
+ npm install -g @sdd330dev/jy-skill
50
+ jy-skill install --global
51
+ ```
52
+
53
+ CLI 会将 skill 安装到 `.cursor/skills/jy` 或 `~/.cursor/skills/jy`(与 SKILL 名称 `jy` 一致)。已存在时需加 `--force` 覆盖;Windows 下可加 `--copy` 强制复制。
54
+
55
+ ### 从源码开发
56
+
57
+ 克隆本仓库后在本目录用 pnpm 开发与测试(见下方「开发与测试」)。也可手动复制:
58
+
59
+ ```bash
60
+ mkdir -p .cursor/skills && cp -R /path/to/jy .cursor/skills/jy
61
+ ```
62
+
63
+ ### GitHub Release 与 npm
64
+
65
+ Git tag(`v*`)触发 [Release 工作流](.github/workflows/release.yml),生成 `jy-skill.zip` 并同步发布到 [npm @sdd330dev/jy-skill](https://www.npmjs.com/package/@sdd330dev/jy-skill)(需配置 `NPM_TOKEN`)。
66
+
67
+ ### 维护者:本机发布到 npm
68
+
69
+ ```bash
70
+ pnpm run ci
71
+ npm login
72
+ npm publish --access public # 或 pnpm run publish:npm
73
+ ```
74
+
75
+ Agent 读取 [SKILL.md](SKILL.md)、[AGENTS.md](AGENTS.md) 与 [智能体操作手册](references/agent-handbook.md) 即可运行;玩家说明见 [references/player-guide.md](references/player-guide.md)。
76
+
77
+ ---
78
+
79
+ ## CI/CD
80
+
81
+ | 工作流 | 触发 | 说明 |
82
+ |--------|------|------|
83
+ | [CI](.github/workflows/ci.yml) | push / PR → `main`、手动 `workflow_dispatch` | 调用 [Quality Gate](.github/workflows/quality-gate.yml) |
84
+ | [Quality Gate](.github/workflows/quality-gate.yml) | 被 CI / Release 调用 | 7 项并行检查 + **Gate** 汇总 Job |
85
+ | [Release](.github/workflows/release.yml) | tag `v*` | Quality Gate → npm + GitHub Release(tag 须与 `package.json` version 一致) |
86
+
87
+ **Quality Gate 并行 Job**
88
+
89
+ | Job | 命令 | 说明 |
90
+ |-----|------|------|
91
+ | Lint · Format | `pnpm run check` | oxlint + oxfmt |
92
+ | Typecheck | `pnpm run typecheck` | TypeScript |
93
+ | Validate | `pnpm run validate` | SKILL 元数据、assets、版本对齐、文档链接 |
94
+ | Pack · Verify | `pnpm run validate:pack` | zip 发版包 |
95
+ | NPM pack · Verify | `pnpm run validate:npm` | npm tarball 内容 |
96
+ | Dependency audit | `pnpm run audit:ci` | `pnpm audit --audit-level=high` |
97
+ | Test · Coverage | `pnpm run test:coverage` | Vitest 100% 覆盖率 + Step Summary / artifact |
98
+
99
+ **Branch protection 建议**(GitHub 仓库 Settings → Branches):将 **Quality Gate / Gate** 设为 Required status check,确保 PR 必须通过全部门禁方可合并。
100
+
101
+ Dependabot 每周检查 GitHub Actions 与 npm 依赖更新。
102
+
103
+ 本地与 CI 对齐:
104
+
105
+ ```bash
106
+ pnpm run ci
107
+ ```
108
+
109
+ 打包 skill 发版包(Release 工作流在 tag 推送时使用):
110
+
111
+ ```bash
112
+ pnpm run pack:skill
113
+ pnpm run validate:pack # zip 打包校验
114
+ pnpm run validate:npm # npm pack 内容校验
115
+ ```
116
+
117
+ ## 开发与测试
118
+
119
+ ```bash
120
+ pnpm install
121
+ pnpm run ci # 与 CI 门禁一致
122
+ pnpm run check # oxlint + oxfmt
123
+ pnpm run typecheck # TypeScript 6
124
+ pnpm run validate # meta + assets + versions + docs
125
+ pnpm run validate:pack # 打包 zip 并校验
126
+ pnpm run validate:versions # package.json 与 SKILL.md 版本
127
+ pnpm run validate:docs # 必备文档与链接
128
+ pnpm run audit:ci # 依赖安全(high+)
129
+ pnpm test # Vitest 全部测试
130
+ pnpm run test:logic # 仅 game-logic 公式单元测试
131
+ pnpm run test:engine # 仅 game-engine 集成测试
132
+ pnpm run test:coverage # 覆盖率报告
133
+ pnpm run lint # oxlint --fix
134
+ pnpm run format # oxfmt
135
+ ```
136
+
137
+ ## 目录结构
138
+
139
+ ```
140
+ jy/
141
+ ├── SKILL.md # 技能定义(含 YAML frontmatter)
142
+ ├── AGENTS.md # 智能体叙事指南
143
+ ├── package.json # pnpm 项目配置
144
+ ├── pnpm-lock.yaml # pnpm 锁文件
145
+ ├── pnpm-workspace.yaml # pnpm 构建白名单(esbuild)
146
+ ├── .npmrc # pnpm 配置
147
+ ├── vite.config.ts # Vite 8 + Vitest 配置
148
+ ├── tsconfig.json # TypeScript 6
149
+ ├── .oxlintrc.json # Oxlint
150
+ ├── .oxfmtrc.json # Oxfmt
151
+ ├── scripts/
152
+ │ ├── game-engine.ts # 唯一 API 入口
153
+ │ ├── game-logic.ts # 核心公式
154
+ │ ├── config-loader.ts # assets 加载
155
+ │ ├── persistence.ts # 存档读写
156
+ │ ├── validate-skill.ts # SKILL.md 格式校验
157
+ │ ├── validate-assets.ts
158
+ │ ├── validate-pack.ts
159
+ │ ├── validate-versions.ts
160
+ │ └── validate-docs.ts
161
+ ├── references/
162
+ │ ├── agent-handbook.md # 智能体操作手册(规则/API/地图)
163
+ │ ├── player-guide.md # 玩家手册
164
+ │ └── game-design.md
165
+ ├── assets/
166
+ │ ├── characters/
167
+ │ ├── skills.json
168
+ │ ├── items.json
169
+ │ ├── game-config.json
170
+ │ └── templates.json
171
+ └── save/
172
+ └── .gitkeep # 运行时存档目录占位
173
+ ```
174
+
175
+ ## 许可
176
+
177
+ MIT
package/SKILL.md ADDED
@@ -0,0 +1,208 @@
1
+ ---
2
+ name: jy
3
+ description: >-
4
+ 金庸群侠传对话式武侠 RPG:移动、NPC、商店、物品、武功、回合战斗、存档与新人引导。
5
+ Agent 须读 references/agent-handbook.md 掌握完整玩法与 API;玩家说 jy/开始游戏/帮助/金庸群侠传时使用。
6
+ license: MIT
7
+ metadata:
8
+ version: "0.3.0"
9
+ disable-model-invocation: false
10
+ ---
11
+
12
+ # 金庸群侠传 · 对话武侠 RPG
13
+
14
+ 独立 Cursor Agent Skill,自包含 `scripts/`、`assets/` 与存档。
15
+
16
+ ## 安装
17
+
18
+ ```bash
19
+ npm install @sdd330dev/jy-skill --save-dev && npx jy-skill install
20
+ ```
21
+
22
+ 全局:`npm install -g @sdd330dev/jy-skill && jy-skill install --global`
23
+
24
+ ## 智能体必读
25
+
26
+ **完整玩法、API、战斗循环、地图与禁忌** → [references/agent-handbook.md](references/agent-handbook.md)(操作手册,优先阅读)
27
+
28
+ | 文档 | 读者 | 内容 |
29
+ |------|------|------|
30
+ | [agent-handbook.md](references/agent-handbook.md) | Agent | 规则、API、战斗、地图速查、错误清单 |
31
+ | [AGENTS.md](AGENTS.md) | Agent | 武侠叙事、首登/帮助模板、输出格式 |
32
+ | [player-guide.md](references/player-guide.md) | 玩家 | FAQ、地图、生存技巧 |
33
+ | [game-design.md](references/game-design.md) | 开发 | 公式与设计细节 |
34
+
35
+ **硬性约束**
36
+
37
+ - 唯一 API:`scripts/game-engine.ts`;唯一公式:`scripts/game-logic.ts`
38
+ - 禁止手改存档、禁止编造伤害/价格/地图连接
39
+ - `moveTo` 返回 `encounter` 时**必须** `startBattle` 并打完
40
+ - 每轮回复末尾附 `getStatus(state)` 状态栏
41
+
42
+ ## 何时使用
43
+
44
+ 玩家说「jy」「开始游戏」「金庸群侠传」,或以自然语言进行武侠冒险时加载本 skill。
45
+
46
+ | 玩家说法 | Agent 动作 |
47
+ |----------|------------|
48
+ | jy / 开始游戏 | `loadOrCreateGame`;`isNewGame` 则首登引导(见 AGENTS.md) |
49
+ | 帮助 / 怎么玩 | `getLocationInfo` + 帮助模板,勿堆砌 API 名 |
50
+ | 重新开始 / 新游戏 | `restartGame()` |
51
+ | 其他 | 解析意图 → 对应 API → 武侠叙述 + 状态栏 |
52
+
53
+ ## 快速开始
54
+
55
+ ```typescript
56
+ import {
57
+ loadOrCreateGame,
58
+ createNewGame,
59
+ saveGameState,
60
+ moveTo,
61
+ startBattle,
62
+ attackEnemy,
63
+ enemyAttack,
64
+ isDead,
65
+ getStatus,
66
+ getLocationInfo,
67
+ restartGame,
68
+ } from './scripts/game-engine'
69
+
70
+ const { state, isNewGame } = loadOrCreateGame(createNewGame, '主角')
71
+
72
+ const move = moveTo(state, '山洞')
73
+ if (move.encounter) {
74
+ const { enemies } = startBattle(state, move.encounter)!
75
+ // 战斗循环见下文
76
+ }
77
+
78
+ saveGameState(state) // 可选,引擎已自动存档
79
+ ```
80
+
81
+ ## 每轮工作流
82
+
83
+ 1. **加载**:无 `state` 时 `loadOrCreateGame(createNewGame, '主角')`
84
+ 2. **执行**:按玩家意图调用 API(复合指令分步执行)
85
+ 3. **遇敌**:`moveTo` → `encounter?` → `startBattle` → 战斗循环
86
+ 4. **死亡**:`isDead` → 叙述结算 → `restartGame()`
87
+ 5. **输出**:武侠叙述 + `getStatus(state)` 状态栏
88
+
89
+ ## 玩家意图 → API
90
+
91
+ | 意图 | API | 要点 |
92
+ |------|-----|------|
93
+ | 移动 / 随便走走 | `moveTo(state, dest)` | `dest='random'` 随机相邻;返回 `encounter?` |
94
+ | 对话 | `talkTo(state, npc)` | NPC 名须精确;`'random'` 随机 |
95
+ | 购买 | `buyItem(state, item)` | 仅当前地点商店 |
96
+ | 使用 | `useItem(state, item)` | 无收益不消耗 |
97
+ | 装备 | `equipItem(state, item)` | 武器/防具 |
98
+ | 学武功 | `learnSkill(state, skill)` | 须存在于 assets |
99
+ | 休息 | `rest(state)` | 满状态并解毒解伤 |
100
+ | 战斗 | `startBattle` + 循环 | 见下节 |
101
+ | 查看 | `getStatus` / `getInventory` / `getSkills` | |
102
+ | 帮助 | `getLocationInfo` | 当前可为之事 |
103
+ | 重开 | `restartGame(name?)` | 删档+新建+落盘 |
104
+
105
+ ## 战斗循环(必遵)
106
+
107
+ ```typescript
108
+ const battle = startBattle(state, enemyName)
109
+ if (!battle.success || !battle.enemies) return
110
+
111
+ let enemies = battle.enemies
112
+
113
+ while (enemies.some((e) => e.hp > 0) && !isDead(state)) {
114
+ const i = enemies.findIndex((e) => e.hp > 0)
115
+ attackEnemy(state, enemies, i)
116
+ // 或 useSkillInBattle(state, enemies, '基本拳法', i)
117
+
118
+ if (enemies.some((e) => e.hp > 0) && !isDead(state)) {
119
+ enemyAttack(state, enemies)
120
+ }
121
+ }
122
+
123
+ if (isDead(state)) {
124
+ // 死亡叙述 → restartGame()
125
+ }
126
+ ```
127
+
128
+ - `enemies` 仅存于内存,不写入存档
129
+ - `targetIndex` 选第一个 `hp > 0` 的敌人
130
+ - 伤害/经验以 API 为准,叙述时引用 `message`
131
+
132
+ ## 核心规则摘要
133
+
134
+ | 系统 | 规则 |
135
+ |------|------|
136
+ | 移动 | 仅相邻地图;每次 -5 体力、+1 周;中毒/受伤每周掉血 |
137
+ | 山洞遇敌 | 抵达后 20% 概率,敌人:山贼/强盗/老虎 |
138
+ | 物品 | 满状态使用不扣物品;实际恢复量 ≤ 配置值 |
139
+ | 升级 | 经验 = floor(100×1.5^(Lv-1));上限 Lv.100 |
140
+ | 伤害 | 武力+技能攻击-防御;±20% 波动;最低 1 |
141
+
142
+ 公式详见 [game-design.md](references/game-design.md) 与 `game-logic.ts`。
143
+
144
+ ## 输出格式
145
+
146
+ ```
147
+ 👤 角色名 | Lv.等级 | 经验: …
148
+ ❤️ hp/maxHp | 💠 mp/maxMp | ⚡ stamina/100
149
+ 💰 银两 | 📍 位置 | 📅 第N周
150
+ ```
151
+
152
+ 满级显示「经验: N(已满级)」;中毒/受伤时额外一行。
153
+
154
+ ## 交互示例
155
+
156
+ **移动 + 遇敌 + 战斗**
157
+
158
+ ```
159
+ 玩家: "进山洞看看"
160
+ → moveTo(state, '山洞') // 若 encounter='山贼'
161
+ → startBattle → 战斗循环 → getStatus
162
+ ```
163
+
164
+ **复合操作**
165
+
166
+ ```
167
+ 玩家: "去平安镇买铁剑装备上"
168
+ → moveTo('平安镇') → buyItem('铁剑') → equipItem('铁剑')
169
+ ```
170
+
171
+ **首登 / 帮助 / 重开** — 见 [AGENTS.md](AGENTS.md) 与 [agent-handbook.md](references/agent-handbook.md) 第 9 节。
172
+
173
+ ## API 索引
174
+
175
+ | 类别 | 函数 |
176
+ |------|------|
177
+ | 存档 | `loadOrCreateGame`, `loadGameState`, `saveGameState`, `deleteSave`, `restartGame` |
178
+ | 初始化 | `createNewGame` |
179
+ | 查询 | `getStatus`, `getInventory`, `getSkills`, `getLocationInfo` |
180
+ | 探索 | `moveTo`, `talkTo`, `rest` |
181
+ | 物品 | `buyItem`, `useItem`, `equipItem`, `learnSkill` |
182
+ | 战斗 | `startBattle`, `attackEnemy`, `useSkillInBattle`, `enemyAttack`, `isDead` |
183
+
184
+ 参数、返回值与失败原因 → [agent-handbook.md](references/agent-handbook.md) 第 5 节。
185
+
186
+ ## 数据与存档
187
+
188
+ - 地图/NPC/商店/敌人:`assets/templates.json`(**勿编造**)
189
+ - 武功/物品数值:`assets/skills.json`、`assets/items.json`
190
+ - 存档:`save/game-state.json`(引擎原子写入,自动迁移旧档)
191
+
192
+ ## 目录
193
+
194
+ ```
195
+ jy/
196
+ ├── SKILL.md
197
+ ├── AGENTS.md
198
+ ├── references/
199
+ │ ├── agent-handbook.md # Agent 操作手册(必读)
200
+ │ ├── player-guide.md
201
+ │ └── game-design.md
202
+ ├── scripts/
203
+ │ ├── game-engine.ts # 唯一 API
204
+ │ ├── game-logic.ts
205
+ │ ├── config-loader.ts
206
+ │ └── persistence.ts
207
+ └── assets/
208
+ ```
@@ -0,0 +1,56 @@
1
+ {
2
+ "id": 0,
3
+ "name": "胡斐",
4
+ "sexual": 1,
5
+ "pic": 0,
6
+ "modelKey": "hufei",
7
+ "maxHp": 200,
8
+ "maxMp": 100,
9
+ "hpInc": 12,
10
+ "level": 1,
11
+ "exp": 0,
12
+ "mpType": 2,
13
+ "attack": 30,
14
+ "agility": 25,
15
+ "defence": 20,
16
+ "heal": 0,
17
+ "usePoison": 0,
18
+ "dePoison": 0,
19
+ "antiPoison": 0,
20
+ "fist": 10,
21
+ "sword": 20,
22
+ "blade": 30,
23
+ "exotic": 0,
24
+ "hiddenWeapon": 0,
25
+ "martialKnowledge": 10,
26
+ "attackPoison": 0,
27
+ "ambidextrous": 0,
28
+ "iq": 70,
29
+ "morality": 80,
30
+ "reputation": 10,
31
+ "weapon": 11,
32
+ "armor": 20,
33
+ "cultivationItem": 0,
34
+ "skills": [
35
+ [
36
+ 1,
37
+ 2
38
+ ],
39
+ [
40
+ 2,
41
+ 3
42
+ ]
43
+ ],
44
+ "items": [
45
+ [
46
+ 1,
47
+ 50
48
+ ],
49
+ [
50
+ 30,
51
+ 3
52
+ ]
53
+ ],
54
+ "leaveStoryId": "",
55
+ "source": "雪山飞狐"
56
+ }
@@ -0,0 +1,60 @@
1
+ {
2
+ "id": 1,
3
+ "name": "段誉",
4
+ "sexual": 1,
5
+ "pic": 1,
6
+ "modelKey": "duanyu",
7
+ "maxHp": 180,
8
+ "maxMp": 200,
9
+ "hpInc": 10,
10
+ "level": 1,
11
+ "exp": 0,
12
+ "mpType": 0,
13
+ "attack": 20,
14
+ "agility": 30,
15
+ "defence": 15,
16
+ "heal": 0,
17
+ "usePoison": 0,
18
+ "dePoison": 0,
19
+ "antiPoison": 0,
20
+ "fist": 30,
21
+ "sword": 40,
22
+ "blade": 0,
23
+ "exotic": 20,
24
+ "hiddenWeapon": 0,
25
+ "martialKnowledge": 20,
26
+ "attackPoison": 0,
27
+ "ambidextrous": 0,
28
+ "iq": 80,
29
+ "morality": 90,
30
+ "reputation": 20,
31
+ "weapon": 0,
32
+ "armor": 0,
33
+ "cultivationItem": 0,
34
+ "skills": [
35
+ [
36
+ 3,
37
+ 1
38
+ ],
39
+ [
40
+ 4,
41
+ 1
42
+ ],
43
+ [
44
+ 5,
45
+ 1
46
+ ]
47
+ ],
48
+ "items": [
49
+ [
50
+ 1,
51
+ 100
52
+ ],
53
+ [
54
+ 30,
55
+ 5
56
+ ]
57
+ ],
58
+ "leaveStoryId": "",
59
+ "source": "天龙八部"
60
+ }