@aipper/aiws-spec 0.0.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.
Files changed (145) hide show
  1. package/README.md +12 -0
  2. package/docs/cli-interface.md +288 -0
  3. package/docs/spec-contract.md +183 -0
  4. package/package.json +18 -0
  5. package/templates/workspace/.agents/skills/aiws-change-archive/SKILL.md +23 -0
  6. package/templates/workspace/.agents/skills/aiws-change-list/SKILL.md +18 -0
  7. package/templates/workspace/.agents/skills/aiws-change-new/SKILL.md +26 -0
  8. package/templates/workspace/.agents/skills/aiws-change-next/SKILL.md +19 -0
  9. package/templates/workspace/.agents/skills/aiws-change-start/SKILL.md +27 -0
  10. package/templates/workspace/.agents/skills/aiws-change-status/SKILL.md +19 -0
  11. package/templates/workspace/.agents/skills/aiws-change-sync/SKILL.md +19 -0
  12. package/templates/workspace/.agents/skills/aiws-change-templates-init/SKILL.md +18 -0
  13. package/templates/workspace/.agents/skills/aiws-change-templates-which/SKILL.md +18 -0
  14. package/templates/workspace/.agents/skills/aiws-change-validate/SKILL.md +23 -0
  15. package/templates/workspace/.agents/skills/aiws-hooks-install/SKILL.md +30 -0
  16. package/templates/workspace/.agents/skills/aiws-hooks-status/SKILL.md +18 -0
  17. package/templates/workspace/.agents/skills/aiws-init/SKILL.md +27 -0
  18. package/templates/workspace/.agents/skills/aiws-rollback/SKILL.md +18 -0
  19. package/templates/workspace/.agents/skills/aiws-update/SKILL.md +26 -0
  20. package/templates/workspace/.agents/skills/aiws-validate/SKILL.md +22 -0
  21. package/templates/workspace/.agents/skills/ws-analyze/SKILL.md +26 -0
  22. package/templates/workspace/.agents/skills/ws-commit/SKILL.md +50 -0
  23. package/templates/workspace/.agents/skills/ws-dev/SKILL.md +34 -0
  24. package/templates/workspace/.agents/skills/ws-migrate/SKILL.md +54 -0
  25. package/templates/workspace/.agents/skills/ws-plan/SKILL.md +39 -0
  26. package/templates/workspace/.agents/skills/ws-preflight/SKILL.md +29 -0
  27. package/templates/workspace/.agents/skills/ws-req-change/SKILL.md +33 -0
  28. package/templates/workspace/.agents/skills/ws-req-contract-sync/SKILL.md +17 -0
  29. package/templates/workspace/.agents/skills/ws-req-contract-validate/SKILL.md +12 -0
  30. package/templates/workspace/.agents/skills/ws-req-flow-sync/SKILL.md +28 -0
  31. package/templates/workspace/.agents/skills/ws-req-review/SKILL.md +32 -0
  32. package/templates/workspace/.agents/skills/ws-review/SKILL.md +24 -0
  33. package/templates/workspace/.agents/skills/ws-rule/SKILL.md +23 -0
  34. package/templates/workspace/.aiws/manifest.json +36 -0
  35. package/templates/workspace/.claude/commands/aiws-init.md +19 -0
  36. package/templates/workspace/.claude/commands/aiws-rollback.md +12 -0
  37. package/templates/workspace/.claude/commands/aiws-update.md +18 -0
  38. package/templates/workspace/.claude/commands/aiws-validate.md +13 -0
  39. package/templates/workspace/.claude/commands/ws-analyze.md +27 -0
  40. package/templates/workspace/.claude/commands/ws-dev.md +24 -0
  41. package/templates/workspace/.claude/commands/ws-migrate.md +22 -0
  42. package/templates/workspace/.claude/commands/ws-preflight.md +27 -0
  43. package/templates/workspace/.claude/commands/ws-req-change.md +34 -0
  44. package/templates/workspace/.claude/commands/ws-req-contract-sync.md +18 -0
  45. package/templates/workspace/.claude/commands/ws-req-contract-validate.md +13 -0
  46. package/templates/workspace/.claude/commands/ws-req-flow-sync.md +20 -0
  47. package/templates/workspace/.claude/commands/ws-req-review.md +33 -0
  48. package/templates/workspace/.claude/commands/ws-review.md +25 -0
  49. package/templates/workspace/.claude/commands/ws-rule.md +24 -0
  50. package/templates/workspace/.codex/prompts/aiws-init.md +23 -0
  51. package/templates/workspace/.codex/prompts/aiws-rollback.md +16 -0
  52. package/templates/workspace/.codex/prompts/aiws-update.md +22 -0
  53. package/templates/workspace/.codex/prompts/aiws-validate.md +17 -0
  54. package/templates/workspace/.codex/prompts/ws-analyze.md +32 -0
  55. package/templates/workspace/.codex/prompts/ws-dev.md +29 -0
  56. package/templates/workspace/.codex/prompts/ws-migrate.md +27 -0
  57. package/templates/workspace/.codex/prompts/ws-preflight.md +32 -0
  58. package/templates/workspace/.codex/prompts/ws-req-change.md +39 -0
  59. package/templates/workspace/.codex/prompts/ws-req-contract-sync.md +23 -0
  60. package/templates/workspace/.codex/prompts/ws-req-contract-validate.md +18 -0
  61. package/templates/workspace/.codex/prompts/ws-req-flow-sync.md +25 -0
  62. package/templates/workspace/.codex/prompts/ws-req-review.md +38 -0
  63. package/templates/workspace/.codex/prompts/ws-review.md +30 -0
  64. package/templates/workspace/.codex/prompts/ws-rule.md +29 -0
  65. package/templates/workspace/.githooks/pre-commit +32 -0
  66. package/templates/workspace/.githooks/pre-push +32 -0
  67. package/templates/workspace/.iflow/agents/feature-reviewer.md +27 -0
  68. package/templates/workspace/.iflow/agents/requirements-analyst.md +24 -0
  69. package/templates/workspace/.iflow/agents/server-commit-manager.md +28 -0
  70. package/templates/workspace/.iflow/agents/server-fix-implementer.md +31 -0
  71. package/templates/workspace/.iflow/agents/server-test-planner.md +28 -0
  72. package/templates/workspace/.iflow/agents/server-test-triager.md +30 -0
  73. package/templates/workspace/.iflow/commands/aiws-init.toml +24 -0
  74. package/templates/workspace/.iflow/commands/aiws-rollback.toml +18 -0
  75. package/templates/workspace/.iflow/commands/aiws-update.toml +23 -0
  76. package/templates/workspace/.iflow/commands/aiws-validate.toml +18 -0
  77. package/templates/workspace/.iflow/commands/server-commit.toml +27 -0
  78. package/templates/workspace/.iflow/commands/server-drain.toml +99 -0
  79. package/templates/workspace/.iflow/commands/server-fix-and-commit.toml +27 -0
  80. package/templates/workspace/.iflow/commands/server-fix.toml +65 -0
  81. package/templates/workspace/.iflow/commands/server-test-plan.toml +62 -0
  82. package/templates/workspace/.iflow/commands/server-test.toml +58 -0
  83. package/templates/workspace/.iflow/commands/server-triage.toml +38 -0
  84. package/templates/workspace/.iflow/commands/server_test-plan.toml +12 -0
  85. package/templates/workspace/.iflow/commands/server_test.toml +12 -0
  86. package/templates/workspace/.iflow/commands/ws-analyze.toml +33 -0
  87. package/templates/workspace/.iflow/commands/ws-contract-check.toml +69 -0
  88. package/templates/workspace/.iflow/commands/ws-dev.toml +34 -0
  89. package/templates/workspace/.iflow/commands/ws-doctor.toml +141 -0
  90. package/templates/workspace/.iflow/commands/ws-env-doctor.toml +74 -0
  91. package/templates/workspace/.iflow/commands/ws-feature-deliver.toml +44 -0
  92. package/templates/workspace/.iflow/commands/ws-feature-plan.toml +47 -0
  93. package/templates/workspace/.iflow/commands/ws-init.toml +53 -0
  94. package/templates/workspace/.iflow/commands/ws-memory-bank-init.toml +100 -0
  95. package/templates/workspace/.iflow/commands/ws-migrate.toml +59 -0
  96. package/templates/workspace/.iflow/commands/ws-preflight.toml +30 -0
  97. package/templates/workspace/.iflow/commands/ws-req-change.toml +52 -0
  98. package/templates/workspace/.iflow/commands/ws-req-contract-sync.toml +25 -0
  99. package/templates/workspace/.iflow/commands/ws-req-contract-validate.toml +16 -0
  100. package/templates/workspace/.iflow/commands/ws-req-flow-sync.toml +36 -0
  101. package/templates/workspace/.iflow/commands/ws-req-review.toml +56 -0
  102. package/templates/workspace/.iflow/commands/ws-review.toml +32 -0
  103. package/templates/workspace/.iflow/commands/ws-rule.toml +43 -0
  104. package/templates/workspace/.opencode/command/aiws-init.md +19 -0
  105. package/templates/workspace/.opencode/command/aiws-rollback.md +12 -0
  106. package/templates/workspace/.opencode/command/aiws-update.md +18 -0
  107. package/templates/workspace/.opencode/command/aiws-validate.md +13 -0
  108. package/templates/workspace/.opencode/command/ws-analyze.md +27 -0
  109. package/templates/workspace/.opencode/command/ws-dev.md +24 -0
  110. package/templates/workspace/.opencode/command/ws-migrate.md +22 -0
  111. package/templates/workspace/.opencode/command/ws-preflight.md +27 -0
  112. package/templates/workspace/.opencode/command/ws-req-change.md +34 -0
  113. package/templates/workspace/.opencode/command/ws-req-contract-sync.md +18 -0
  114. package/templates/workspace/.opencode/command/ws-req-contract-validate.md +13 -0
  115. package/templates/workspace/.opencode/command/ws-req-flow-sync.md +20 -0
  116. package/templates/workspace/.opencode/command/ws-req-review.md +33 -0
  117. package/templates/workspace/.opencode/command/ws-review.md +25 -0
  118. package/templates/workspace/.opencode/command/ws-rule.md +24 -0
  119. package/templates/workspace/AGENTS.md +22 -0
  120. package/templates/workspace/AI_PROJECT.md +86 -0
  121. package/templates/workspace/AI_WORKSPACE.md +167 -0
  122. package/templates/workspace/REQUIREMENTS.md +94 -0
  123. package/templates/workspace/changes/README.md +55 -0
  124. package/templates/workspace/changes/templates/design.md +29 -0
  125. package/templates/workspace/changes/templates/proposal.md +59 -0
  126. package/templates/workspace/changes/templates/tasks.md +33 -0
  127. package/templates/workspace/issues/problem-issues.csv +2 -0
  128. package/templates/workspace/manifest.json +205 -0
  129. package/templates/workspace/memory-bank/README.md +14 -0
  130. package/templates/workspace/memory-bank/architecture.md +9 -0
  131. package/templates/workspace/memory-bank/implementation-plan.md +11 -0
  132. package/templates/workspace/memory-bank/progress.md +10 -0
  133. package/templates/workspace/memory-bank/tech-stack.md +11 -0
  134. package/templates/workspace/requirements/CHANGELOG.md +13 -0
  135. package/templates/workspace/requirements/requirements-issues.csv +2 -0
  136. package/templates/workspace/secrets/test-accounts.example.json +32 -0
  137. package/templates/workspace/tools/iflow_watchdog.sh +138 -0
  138. package/templates/workspace/tools/install_iflow_watchdog_systemd_user.sh +118 -0
  139. package/templates/workspace/tools/requirements_contract.py +285 -0
  140. package/templates/workspace/tools/requirements_contract_sync.py +290 -0
  141. package/templates/workspace/tools/requirements_flow_gen.py +250 -0
  142. package/templates/workspace/tools/server_test_runner.py +1902 -0
  143. package/templates/workspace/tools/systemd/iflow-watchdog@.service +16 -0
  144. package/templates/workspace/tools/systemd/iflow-watchdog@.timer +11 -0
  145. package/templates/workspace/tools/ws_change_check.py +323 -0
@@ -0,0 +1,24 @@
1
+ <!-- AIWS_MANAGED_BEGIN:opencode:ws-dev -->
2
+ # ws dev
3
+
4
+ 用中文输出(命令/路径/代码标识符保持原样不翻译)。
5
+
6
+ 目标:在 AIWS 约束下完成一个可回放、可验证的小步交付。
7
+
8
+ 建议流程:
9
+ 1) 先运行 `/ws-preflight`(读真值文件并输出约束摘要)。
10
+ 2) 建立变更归因(推荐):
11
+ - 切分支:`git switch -c change/<change-id>`
12
+ - 初始化变更工件:创建 `changes/<change-id>/proposal.md` 与 `changes/<change-id>/tasks.md`(参考 `changes/README.md`)
13
+ 3) 如涉及需求调整:先 `/ws-req-review` → 用户确认后再 `/ws-req-change`(避免需求漂移)。
14
+ 4) 实施最小改动:任何改动都要能归因到 `REQUIREMENTS.md`(验收)或 `issues/problem-issues.csv`(问题)。
15
+ 5) 运行 `AI_WORKSPACE.md` 里声明的验证命令;未运行不声称已运行。
16
+ 6) 提交前强制:`aiws validate .`(commit/push hooks 也会阻断)。
17
+
18
+ 输出要求:
19
+ - `Changed:` 文件清单
20
+ - `Verify:` 实际运行的命令 + 期望结果
21
+ - `Evidence:` 证据路径(例如 `.agentdocs/tmp/...` 或 `changes/<change-id>/...`)
22
+ <!-- AIWS_MANAGED_END:opencode:ws-dev -->
23
+
24
+ 可在下方追加本项目对 OpenCode 的额外说明(托管块外内容会被保留)。
@@ -0,0 +1,22 @@
1
+ <!-- AIWS_MANAGED_BEGIN:opencode:ws-migrate -->
2
+ # ws migrate
3
+
4
+ 用中文输出;命令与路径保持原样不翻译。
5
+
6
+ 目标:把当前仓库补齐为 aiws workspace 模板,并启用可验证门禁。
7
+
8
+ 执行(在项目根目录):
9
+ 1) 若已存在 `.aiws/manifest.json`:`npx @aipper/aiws update .`
10
+ 2) 否则:`npx @aipper/aiws init .`
11
+ 3) 门禁校验:`npx @aipper/aiws validate .`
12
+ 4) 启用本机 git hooks(推荐,本地生效):`git config core.hooksPath .githooks`
13
+
14
+ 回滚:
15
+ - 恢复最近一次快照:`npx @aipper/aiws rollback . latest`
16
+
17
+ 约束:
18
+ - 不写入任何 secrets。
19
+ - 不执行破坏性命令。
20
+ <!-- AIWS_MANAGED_END:opencode:ws-migrate -->
21
+
22
+ 可在下方追加本项目对 OpenCode 的额外说明(托管块外内容会被保留)。
@@ -0,0 +1,27 @@
1
+ <!-- AIWS_MANAGED_BEGIN:opencode:ws-preflight -->
2
+ # ws preflight
3
+
4
+ 用中文输出(命令/路径/代码标识符保持原样不翻译)。
5
+
6
+ 目标:在开始任何“写代码/改配置/落盘文件”之前,对齐工作区真值文件,避免规则漂移。
7
+
8
+ 执行步骤(强制):
9
+ 1) 定位项目根目录:
10
+ - 优先:`git rev-parse --show-toplevel`
11
+ - 若失败:停止并让用户确认当前目录是否为项目根(不要猜测)。
12
+ 2) 在项目根目录读取以下文件(存在则必须读取;缺失则明确报告缺失项,不要臆测内容):
13
+ - `AI_PROJECT.md`
14
+ - `REQUIREMENTS.md`
15
+ - `AI_WORKSPACE.md`
16
+ 3) 输出:
17
+ - `Root:` <项目根路径>
18
+ - `Found:` <实际读取到的文件列表>
19
+ - `Missing:` <缺失文件列表>
20
+ - `Key rules:` 3–8 条 bullet(范围/禁止项/必须产物/必须验证命令)
21
+
22
+ 安全:
23
+ - 不打印 secrets;遇到疑似敏感值只提示“存在风险”但不要复述原文。
24
+ - 不执行破坏性命令。
25
+ <!-- AIWS_MANAGED_END:opencode:ws-preflight -->
26
+
27
+ 可在下方追加本项目对 OpenCode 的额外说明(托管块外内容会被保留)。
@@ -0,0 +1,34 @@
1
+ <!-- AIWS_MANAGED_BEGIN:opencode:ws-req-change -->
2
+ # ws req change
3
+
4
+ 用中文输出(命令/路径/代码标识符保持原样不翻译)。
5
+
6
+ 目标:记录需求变更(更新 `REQUIREMENTS.md` + 追加 `requirements/CHANGELOG.md`),并同步/校验执行合同 `requirements/requirements-issues.csv`。
7
+
8
+ 步骤(必须按顺序):
9
+ 1) 读取:`AI_PROJECT.md`、`REQUIREMENTS.md`、`AI_WORKSPACE.md`、`requirements/CHANGELOG.md`(缺失则创建目录与文件)。
10
+ 2) 先产出“拟变更方案”(不要立刻写文件):
11
+ - 变更摘要(1–5 条)
12
+ - 影响范围(API/鉴权/字段/状态码/测试边界)
13
+ - 回滚思路(1–2 条)
14
+ 3) 强制停下来让用户确认:是否继续落盘?(Y/N)
15
+ 4) 用户确认 Y 后再写入:
16
+ - 更新 `REQUIREMENTS.md`(只保留当前有效版本,不在此堆历史)
17
+ - 追加 `requirements/CHANGELOG.md`
18
+ 5) 同步/补齐执行合同(至少做其中之一,按仓库现状选择最安全路径):
19
+ - 若你维护了 FlowSpec:`python3 tools/requirements_contract_sync.py --workspace .`
20
+ - 否则:`python3 tools/requirements_contract.py init` 后手工补齐/新增对应 Req 行
21
+ 6) 校验(强制):`python3 tools/requirements_contract.py validate`
22
+ 7) 建议(如维护 FlowSpec):运行 `/ws-req-flow-sync`
23
+
24
+ 输出必须包含:
25
+ - 本次更新的文件清单(路径)
26
+ - 回滚方案(如何撤销本次需求变更)
27
+ - 下一步建议命令
28
+
29
+ 安全:
30
+ - 不打印 `secrets/test-accounts.json`
31
+ - 不引入任何 token/密钥到仓库
32
+ <!-- AIWS_MANAGED_END:opencode:ws-req-change -->
33
+
34
+ 可在下方追加本项目对 OpenCode 的额外说明(托管块外内容会被保留)。
@@ -0,0 +1,18 @@
1
+ <!-- AIWS_MANAGED_BEGIN:opencode:ws-req-contract-sync -->
2
+ # ws req contract sync
3
+
4
+ 用中文输出(命令/路径/代码标识符保持原样不翻译)。
5
+
6
+ 用途:从 `REQUIREMENTS.md` 的 FlowSpec 补齐 `requirements/requirements-issues.csv`(只生成骨架,不猜测完成状态)。
7
+
8
+ 执行(在 workspace 根目录):
9
+ - `python3 tools/requirements_contract_sync.py --workspace .`
10
+
11
+ 输出要求:
12
+ - 说明新增/更新了多少条
13
+ - 明确下一步:手工补齐 CRUD/Inputs/Outputs/Business_Logic/Tests,并将可开工条目标为 `Spec_Status=READY`
14
+
15
+ 下一步建议:`/ws-req-contract-validate`
16
+ <!-- AIWS_MANAGED_END:opencode:ws-req-contract-sync -->
17
+
18
+ 可在下方追加本项目对 OpenCode 的额外说明(托管块外内容会被保留)。
@@ -0,0 +1,13 @@
1
+ <!-- AIWS_MANAGED_BEGIN:opencode:ws-req-contract-validate -->
2
+ # ws req contract validate
3
+
4
+ 用中文输出(命令/路径/代码标识符保持原样不翻译)。
5
+
6
+ 执行(失败则修正 CSV 后重试):
7
+ - `python3 tools/requirements_contract.py validate`
8
+
9
+ 输出要求:
10
+ - 若失败:列出前 20 条缺失字段(Req_ID + field),并给出最小补齐建议
11
+ <!-- AIWS_MANAGED_END:opencode:ws-req-contract-validate -->
12
+
13
+ 可在下方追加本项目对 OpenCode 的额外说明(托管块外内容会被保留)。
@@ -0,0 +1,20 @@
1
+ <!-- AIWS_MANAGED_BEGIN:opencode:ws-req-flow-sync -->
2
+ # ws req flow sync
3
+
4
+ 用中文输出;命令与路径保持原样不翻译。
5
+
6
+ 目标:基于 `REQUIREMENTS.md` 的 FlowSpec 生成:
7
+ - `docs/api-flow.mmd`(简短逻辑图,Mermaid)
8
+ - `issues/server-scenario-issues.csv`(场景执行合同:TODO/DONE/BLOCKED)
9
+
10
+ 执行(在 workspace 根目录):
11
+ `python3 tools/requirements_flow_gen.py --workspace .`
12
+
13
+ 若缺少工具 `tools/requirements_flow_gen.py`:提示用户先运行 `npx @aipper/aiws init .`(默认会安装 optional tools)。
14
+
15
+ 输出要求:只打印生成的文件路径与下一步命令:
16
+ - 查看逻辑图:`cat docs/api-flow.mmd`
17
+ - 查看场景合同:`cat issues/server-scenario-issues.csv`
18
+ <!-- AIWS_MANAGED_END:opencode:ws-req-flow-sync -->
19
+
20
+ 可在下方追加本项目对 OpenCode 的额外说明(托管块外内容会被保留)。
@@ -0,0 +1,33 @@
1
+ <!-- AIWS_MANAGED_BEGIN:opencode:ws-req-review -->
2
+ # ws req review
3
+
4
+ 用中文输出(命令/路径/代码标识符保持原样不翻译)。
5
+
6
+ 目标:在不修改任何文件的前提下,对 `REQUIREMENTS.md` 做一次整体 QA,输出缺口/冲突/风险,减少实现漂移。
7
+
8
+ 执行步骤(强制):
9
+ 1) 定位项目根目录:`git rev-parse --show-toplevel`(失败则停止并让用户确认根目录)。
10
+ 2) 读取(存在则必须读取;缺失则明确列出,不要臆测):
11
+ - `AI_PROJECT.md`
12
+ - `REQUIREMENTS.md`
13
+ - `AI_WORKSPACE.md`
14
+ - `requirements/CHANGELOG.md`(若存在)
15
+ - `requirements/requirements-issues.csv`(若存在)
16
+ 3) 输出固定结构的报告:
17
+
18
+ ## Requirements QA
19
+ - 结论:是否可进入实现(是/否/有条件)
20
+ - 漂移风险:最容易导致不一致的点
21
+ - 可验收性缺口:缺少输入/输出/错误码/边界/示例的条目
22
+ - 完整性:Non-goals/兼容性/鉴权/重试/并发/观测性/性能
23
+ - 一致性:与 `AI_PROJECT.md` 约束冲突点
24
+ - 可测试性与证据:最小验证命令 + 期望结果 + 证据路径
25
+ - 风险清单:3–8 条
26
+ - 需要澄清的问题:5–12 个(按优先级)
27
+
28
+ 4) 最后询问用户:是否进入需求落盘流程 `/ws-req-change`?(Y/N)
29
+
30
+ 安全:不打印 `secrets/test-accounts.json`。
31
+ <!-- AIWS_MANAGED_END:opencode:ws-req-review -->
32
+
33
+ 可在下方追加本项目对 OpenCode 的额外说明(托管块外内容会被保留)。
@@ -0,0 +1,25 @@
1
+ <!-- AIWS_MANAGED_BEGIN:opencode:ws-review -->
2
+ # ws review
3
+
4
+ 用中文输出(命令/路径/代码标识符保持原样不翻译)。
5
+
6
+ 目标:在提交/交付前审计当前改动,对照真值文件检查是否越界,并把审计证据落盘到 `.agentdocs/tmp/review/`。
7
+
8
+ 步骤(建议):
9
+ 1) 先运行 `/ws-preflight`。
10
+ 2) 基于 `git status` / `git diff`(以及你实际运行过的测试结果),对照 `AI_PROJECT.md` 与 `REQUIREMENTS.md` 检查:
11
+ - 是否存在越界目录改动/危险操作
12
+ - 是否有可复现验证命令与证据
13
+ - 是否维护了 `changes/<change-id>/` 或相关 `issues/*.csv`
14
+ 3) 将审计落盘到:`.agentdocs/tmp/review/opencode-review.md`(目录不存在则创建)。
15
+ 4) 回复中输出:
16
+ - `Evidence:` 证据文件路径
17
+ - `Top risks:` 3–8 条(高→低)
18
+ - `Next:` 最小修复清单 + 最小验证命令
19
+
20
+ 安全:
21
+ - 不打印 secrets。
22
+ - 不执行破坏性命令。
23
+ <!-- AIWS_MANAGED_END:opencode:ws-review -->
24
+
25
+ 可在下方追加本项目对 OpenCode 的额外说明(托管块外内容会被保留)。
@@ -0,0 +1,24 @@
1
+ <!-- AIWS_MANAGED_BEGIN:opencode:ws-rule -->
2
+ # ws rule
3
+
4
+ 用中文输出(命令/路径/代码标识符保持原样不翻译)。
5
+
6
+ 目标:把用户口述的“项目特有规则”整理成可执行条款,并写入 `AI_PROJECT.md` 的 `AI_PROJECT_RULES_BEGIN/END` 段(托管块外内容会被保留)。
7
+
8
+ 安全规则(强制):
9
+ - 不打印/不写入 secrets(token、密钥、内网地址、账号密码)。
10
+ - 不执行破坏性命令。
11
+
12
+ 工作流:
13
+ 1) 先运行 `/ws-preflight`;若缺失 `AI_PROJECT.md`:提示用户先 `/ws-migrate` 或运行 `npx @aipper/aiws init .`。
14
+ 2) 写入前创建备份(必须):
15
+ `ts="$(date +%Y%m%d-%H%M%S)"; mkdir -p .aiws/backups/manual; cp -a AI_PROJECT.md .aiws/backups/manual/AI_PROJECT.md.bak.${ts}`
16
+ 3) 先输出“将写入的规则清单”(3–12 条),并要求用户回复 `CONFIRM` 后再落盘。
17
+ 4) 用户确认后,**仅更新** BEGIN/END 段内内容(合并去重;写成可检查条款:目录白名单/必须验证命令/禁止项/产物要求)。
18
+ 5) 输出必须包含:
19
+ - 更新了哪些文件(路径)
20
+ - 回滚方式(恢复备份文件)
21
+ - 下一步建议:`aiws validate .`
22
+ <!-- AIWS_MANAGED_END:opencode:ws-rule -->
23
+
24
+ 可在下方追加本项目对 OpenCode 的额外说明(托管块外内容会被保留)。
@@ -0,0 +1,22 @@
1
+ <!-- AIWS_MANAGED_BEGIN:agents -->
2
+ 本仓库启用 AIWS(AI Workspace)约定,请先读取并遵守(按优先级):
3
+ 1) `AI_PROJECT.md`(规则/边界)
4
+ 2) `REQUIREMENTS.md`(需求与验收真值)
5
+ 3) `AI_WORKSPACE.md`(运行/测试入口真值)
6
+ 4) `changes/README.md`(变更工件流程与归档)
7
+
8
+ 协作约束(建议最小集):
9
+ - 每次变更使用分支 `change/<change-id>`,并维护 `changes/<change-id>/proposal.md`、`tasks.md`(可选 `design.md`)
10
+ - 启用本机门禁(推荐):`aiws hooks install .`(或手工:`git config core.hooksPath .githooks`;`git commit`/`git push` 会自动跑 `aiws validate .`)
11
+ - 提交前校验(强制门禁):`aiws validate .`(包含:漂移检测 + `ws_change_check` + `requirements_contract`)
12
+ - Codex(推荐):本仓库内置 repo skills:`.agents/skills/`(可显式 `$ws-dev`,也可隐式套用工作流)
13
+ - Codex skills(常用):`$ws-preflight` / `$ws-plan` / `$ws-dev` / `$ws-review` / `$ws-commit` / `$aiws-init` / `$aiws-validate` / `$aiws-hooks-install` / `$aiws-change-new`
14
+ - Codex CLI(推荐,可选):安装全局 skills:`npx @aipper/aiws codex install-skills`(写入 `~/.codex/skills/` 或 `$CODEX_HOME/skills`)
15
+ - Codex CLI(遗留,可选):安装全局 prompts:`npx @aipper/aiws codex install-prompts`(写入 `~/.codex/prompts/` 或 `$CODEX_HOME/prompts`;prompts 已 deprecated)
16
+ - 不要把敏感信息写入 git:`secrets/test-accounts.json`、`.env*`、token、内网地址等
17
+
18
+ 如果缺文件:运行 `npx @aipper/aiws init`(或 `aiws init`)。
19
+ (如你仍在使用 dotfiles 的 `ws` wrappers,也可用 `ws init/ws migrate`;但本模板默认不依赖 dotfiles。)
20
+ <!-- AIWS_MANAGED_END:agents -->
21
+
22
+ 你可以在本段下方追加项目自定义说明;`aiws update` 不会改动托管块以外内容。
@@ -0,0 +1,86 @@
1
+ # AI_PROJECT.md(项目规则 / 约束真值)
2
+
3
+ <!-- AIWS_MANAGED_BEGIN:ai-project:core -->
4
+ <!-- AI_PROJECT_VERSION: 2 -->
5
+
6
+ 本文件用于在**具体项目/工作区**内统一 Codex / Claude / OpenCode / iFlow 的执行约束与协作方式,避免多套规则各写一份导致漂移。
7
+
8
+ 定位:
9
+ - `REQUIREMENTS.md`:定义“要做什么/验收是什么”(需求真值)
10
+ - `AI_WORKSPACE.md`:定义“怎么跑/怎么测/目录如何发现”(运行与测试真值)
11
+ - `AI_PROJECT.md`:定义“允许怎么做/边界是什么/产物如何沉淀”(项目约束真值)
12
+
13
+ ## 1) 优先级(强制)
14
+
15
+ 当三者内容冲突时,按以下优先级执行:
16
+ 1. `AI_PROJECT.md`
17
+ 2. `REQUIREMENTS.md`
18
+ 3. `AI_WORKSPACE.md`
19
+ 4. `requirements/CHANGELOG.md`(仅记录历史,不覆盖当前需求)
20
+ 5. `requirements/requirements-issues.csv`(需求拆解执行合同:Spec/Impl 状态机)
21
+ 6. `issues/*.csv`(执行合同;必须与上面真值一致)
22
+
23
+ ## 2) 安全与边界(强制)
24
+
25
+ - 不写入/不打印 secrets:`secrets/`、`.env*`、token/apiKey/oauth/private_key 等不得进入 git。
26
+ - 不做破坏性操作:除非在本文件明确允许(例如 `rm -rf`、`git reset --hard`、`git clean -fdx`)。
27
+ - 仅在 `environment: test` 场景允许自动化修复闭环/无人值守(否则必须人工确认每一步)。
28
+
29
+ ## 3) 产物与证据(强制)
30
+
31
+ 每轮迭代必须落盘至少一个“可追溯产物”(三选一即可):
32
+ - 证据:`.agentdocs/tmp/...`(report/log/resp)
33
+ - 合同:`issues/*.csv`(状态变化:TODO/DOING/DONE/BLOCKED/SKIP)
34
+ - 变更工件:`changes/<change-id>/`(proposal/tasks/design;详见 `changes/README.md`)
35
+
36
+ 不得只在对话里口头描述“已验证/已修复”。
37
+
38
+ 推荐(防规则/范围漂移):
39
+ - 创建工件:补齐 `changes/<change-id>/proposal.md`、`tasks.md`(可选 `design.md`)
40
+ - 声明 active change(团队共享):切到分支 `change/<change-id>`(也支持 `changes/`、`ws/`、`ws-change/`)
41
+ - 严格校验:`aiws validate .`(包含:漂移检测 + `ws_change_check` + `requirements_contract`)
42
+ - 启用 hooks(本地生效):`git config core.hooksPath .githooks`(提交/推送时自动跑 `aiws validate .`)
43
+ - CI 建议追加:`aiws validate .`
44
+
45
+ 可选(完全脱离 dotfiles 的默认路径):
46
+ - `aiws change new|validate|sync|archive ...`(创建工件/运行校验/归档的快捷命令)
47
+
48
+ ### 3.1) 变更归因(强制)
49
+
50
+ 任何“写代码/改配置/改测试”的改动必须能归因到以下二选一:
51
+ - **需求交付**:关联 `requirements/requirements-issues.csv` 的 `Req_ID`(并能映射到 `REQUIREMENTS.md` 的验收条款)
52
+ - **问题修复**:关联 `issues/problem-issues.csv` 的 `Problem_ID`(BUG/TECHDEBT/OPS/TOOLING 等)
53
+
54
+ 若一个问题阻塞某个需求交付:两边都要互相引用(在 `Notes` 字段里写对方的 ID),避免“修了但没人验收/验收了但遗留问题丢失”。
55
+
56
+ ## 4) 提交流程(默认推荐)
57
+
58
+ - 先对齐 `REQUIREMENTS.md`(必要时用 `/ws-req-change` 记录变更并写入 `requirements/CHANGELOG.md`)
59
+ - 再执行最小验证(以 `AI_WORKSPACE.md` 的测试入口为准)
60
+ - 最后才允许提交(若项目采用 submodule,按 `AI_WORKSPACE.md` 的 `server_dirs` 执行)
61
+
62
+ ## 5) 可配置开关(可选)
63
+
64
+ 如需要在本项目强制更严格的行为,可在此追加明确条款(示例):
65
+ - 只允许改动的目录白名单
66
+ - 必须执行的测试命令列表
67
+ - 必须携带/回传 `X-Request-Id` 的接口范围
68
+
69
+ ## 6) 服务端/自动化测试约束(工作区模式,强制)
70
+
71
+ 当本目录按 AI Workspace 运行(存在 `AI_WORKSPACE.md` / `REQUIREMENTS.md` / `tools/server_test_runner.py`)时,约束如下:
72
+
73
+ - `X-Request-Id`:自动化测试请求必须携带;服务端必须回传同名响应头;日志应包含 `request_id=<id>` 以便按单次请求定位问题。
74
+ - 接口清单真值:优先使用 `docs/openapi.json`。若缺失,先补齐导出方式并生成到该路径,再做全量覆盖测试(避免“覆盖范围不可复现”)。
75
+ - 证据落盘:每轮至少更新一次 `.agentdocs/tmp/...` 或 `issues/*.csv`(禁止只在对话里口头宣称“已验证/已修复”)。
76
+
77
+ <!-- AIWS_MANAGED_END:ai-project:core -->
78
+
79
+ ## 7) 项目特有规则(ws-rule 管理)
80
+
81
+ <!-- AI_PROJECT_RULES_BEGIN -->
82
+ - 使用 `/ws-rule` 维护本段内容;请勿手工修改 BEGIN/END 标记。
83
+ - 建议写成“可执行/可检查”的条款(能落到目录/文件/命令/产物),避免只写口号。
84
+ <!-- AI_PROJECT_RULES_END -->
85
+
86
+ 你可以在本段下方追加项目自定义说明;`aiws update` 不会改动托管块以外内容。
@@ -0,0 +1,167 @@
1
+ # AI_WORKSPACE.md(工作区说明)
2
+
3
+ ## 0) 项目配置(用户维护)
4
+
5
+ 本段由用户维护;`aiws update` 不会改动本段(建议把“可变参数”都放在这里)。
6
+
7
+ - server_dirs:
8
+ - ./backend
9
+ - web_dirs:
10
+ - ./web
11
+ - app_dirs:
12
+ - ./app
13
+
14
+ - openapi_path: "docs/openapi.json"
15
+ - openapi_url: "/openapi.json"
16
+
17
+ - base_url: "http://127.0.0.1:8080"
18
+ - health_path: "/health"
19
+ - log_path: ".agentdocs/tmp/server-test/app.log"
20
+
21
+ - environment: "test"
22
+ - base_url_allowlist:
23
+ - "http://127.0.0.1"
24
+ - "http://localhost"
25
+ - "https://127.0.0.1"
26
+ - "https://localhost"
27
+ - dangerous_disabled: true
28
+ - max_requests_per_minute: 60
29
+
30
+ - node_version: "20"
31
+ - node_use_cmd: "command -v mise >/dev/null && mise use -g node@20 || (command -v nvm >/dev/null && nvm use 20) || true"
32
+
33
+ <!-- AIWS_MANAGED_BEGIN:ai-workspace:core -->
34
+
35
+ 本文件描述“AI Workspace(多子项目工作区)”的结构与运行方式,供 Codex / Claude / OpenCode / iFlow 共同读取。
36
+
37
+ ## 1) 目录发现规则
38
+
39
+ 目录名不固定时,按以下优先级寻找 server(后端服务)目录:
40
+ 1. 明确配置(推荐):在上方 `0) 项目配置` 写出 `server_dirs` 列表(相对路径)
41
+ 2. 自动发现:扫描子目录,匹配以下标记文件
42
+ - Rust:`Cargo.toml`
43
+ - Go:`go.mod`
44
+ - Java:`pom.xml` 或 `build.gradle` / `build.gradle.kts`
45
+
46
+ 可选:前端目录同理(`package.json` + 常见前端脚手架特征),请在上方 `web_dirs/app_dirs` 写死路径。
47
+
48
+ ## 1.1) 接口清单来源(强烈建议)
49
+
50
+ 为保证自动化测试覆盖“全部已实现接口”且可复现,优先使用 OpenAPI 作为接口清单真值来源。
51
+
52
+ 请在上方 `0) 项目配置` 填写:
53
+ - `openapi_path`:固定路径(推荐 `docs/openapi.json`)
54
+ - `openapi_url`:服务运行时导出 OpenAPI 的 URL(缺省时 runner 会按常见路径尝试 `/openapi.json`、`/v3/api-docs`、`/swagger.json` 等)
55
+
56
+ 如 OpenAPI/Knife4j 受 basic/bearer 保护,可在 `secrets/test-accounts.json` 配置 `openapi_auth`(支持 headers/basic/bearer;未填则沿用 API 鉴权)。
57
+
58
+ 规则:
59
+ 1) 若 `docs/openapi.json` 存在,则以其生成接口清单(优先级最高)
60
+ 2) 否则尝试通过 `openapi_url` 从运行中的服务导出并写入 `docs/openapi.json`
61
+ 3) 若仍不可用,才降级到路由导出/代码扫描(兜底)
62
+
63
+ ## 2) 服务启动与构建(可覆盖)
64
+
65
+ 默认策略:
66
+ - Rust:`cargo build`,启动 `cargo run` 或 `./target/<bin>`
67
+ - Go:`go test ./...`,启动 `go run ./cmd/<app>`(按项目调整)
68
+ - Java:`./mvnw -q -DskipTests package`,启动 `java -jar target/*.jar`
69
+
70
+ 如果你的项目不是上述结构,请在上方 `0) 项目配置` 写死命令(推荐):
71
+ - `build_cmd` / `start_cmd` / `stop_cmd`(用于 runner 的 `--manage-service`)
72
+
73
+ 占位符:
74
+ - `{service_dir}`:服务目录的绝对路径
75
+ - `{service}`:服务目录名(Path.name)
76
+
77
+ ## 2.1) Git / Submodule 提交(可选)
78
+
79
+ 如果你的工作区使用 git submodule 管控后端/前端目录,建议把 server 目录固定写入 `server_dirs`,并把“提交动作”独立出来:
80
+ - 先 `/server-test-plan` → `/server-test` 跑到验收通过
81
+ - 再 `/server-commit` 对 `server_dirs` 指定的 submodule 做 commit,并在工作区根仓库提交 submodule 指针更新
82
+
83
+ 建议 commit message 保持通用简洁(Conventional Commits 风格),例如:
84
+ - `fix(api): ...`
85
+ - `chore(server): api test fixes`
86
+ - `chore(workspace): bump server submodules`
87
+
88
+ ## 3) 测试入口
89
+
90
+ 默认:
91
+ - BASE_URL: `http://127.0.0.1:8080`
92
+ - HEALTH_PATH: `/health`(或 Spring Boot `/actuator/health`)
93
+
94
+ 请在上方 `0) 项目配置` 覆盖:
95
+ - `base_url` / `health_path` / `log_path`
96
+
97
+ ## 3.2) web/app 的测试命令(可选但推荐)
98
+
99
+ 为了让“需求→实现→测试→提交”闭环在多子项目工作区中可自动执行,建议在上方 `0) 项目配置` 写死:
100
+ - `web_test_cmd` / `web_build_cmd`
101
+ - `app_test_cmd` / `app_build_cmd`
102
+
103
+ 占位符:
104
+ - `{web_dir}`:web 目录的绝对路径
105
+ - `{app_dir}`:app 目录的绝对路径
106
+
107
+ ## 3.3) 工具链与版本(强烈建议)
108
+
109
+ 为减少“在新机器上验证半天”的情况,建议在上方 `0) 项目配置` 显式声明语言工具链版本与切换方式:
110
+ - `node_version` / `node_use_cmd`
111
+ - `java_version` / `java_use_cmd`
112
+ - `python_version` / `python_use_cmd`
113
+
114
+ ## 3.0) Policy(默认安全边界)
115
+
116
+ 为让自动化测试“开箱即用且不越界”,建议统一用 policy 字段作为硬边界(runner 与 hooks 会读取)。推荐默认值:
117
+ - `environment: "test"`
118
+ - `base_url_allowlist`:默认仅允许 localhost(防止误打到生产)
119
+ - `dangerous_disabled: true`:默认禁用危险接口(除非 REQUIREMENTS 明确允许)
120
+ - `max_requests_per_minute: 60`:默认节流,避免压垮测试环境
121
+
122
+ ## 3.1) 环境声明(强烈建议)
123
+
124
+ 建议在上方 `0) 项目配置` 明确声明当前是测试环境,并写清允许的测试边界:
125
+ - `environment: "test"`
126
+ - `allow_mutations: true`
127
+ - `auto_commit: true`(可选:仅在 test 环境允许自动提交)
128
+
129
+ ## 4) 鉴权与测试账号
130
+
131
+ 测试账号与鉴权信息放在(固定位置):
132
+ - `secrets/test-accounts.json`
133
+
134
+ 规则:
135
+ - 该文件不应提交到 git
136
+ - AI 不应在输出中打印其中的敏感字段
137
+
138
+ 推荐格式(节选):
139
+ - 若已有 token:在 `auth.headers` 填入固定 header(例如 `Authorization: Bearer ...`)
140
+ - 若只有账号密码:填写 `accounts[0].username/password`,并在 `auth` 中指定登录方式(例如 `auth.type=login` + `login_path/token_json_path`);runner 会先登录再带 token 跑接口
141
+
142
+ ## 5) Request-ID / Trace-ID 约定(强烈建议)
143
+
144
+ 为便于自动化测试将“单次请求”与“服务端日志”稳定关联,建议统一以下约定:
145
+
146
+ - 请求 Header:`X-Request-Id`
147
+ - 测试端每次请求都生成一个新的 `X-Request-Id`(例如时间戳/uuid)
148
+ - 服务端若收到该 header,必须原样透传到响应 header(同名)
149
+ - 服务端若未收到该 header,必须生成一个,并写入响应 header
150
+ - 日志字段:服务端日志必须包含 `request_id=<id>`(或等价字段,但需在此文件中固定)
151
+
152
+ 说明:
153
+ - 自动化测试默认会在请求中携带 `X-Request-Id`,并以该值作为日志 grep 的主键(比时间窗更可靠)。
154
+ - 如果你的服务使用 `traceparent`(W3C Trace Context)也可以,但仍建议保留 `X-Request-Id` 作为最低公约数。
155
+
156
+ ## 6) Runner 约定(推荐)
157
+
158
+ 如果测试机安装了 `uv`,推荐在工作区根目录放置 `tools/server_test_runner.py`(来自本仓库模板),用于:
159
+ - 从 OpenAPI 生成/更新 `issues/server-api-issues.csv`
160
+ - 执行请求并按 `X-Request-Id` 关联日志
161
+
162
+ 如希望 runner 自动执行 build/start/stop,请使用:
163
+ ```bash
164
+ uv run tools/server_test_runner.py --workspace . --manage-service
165
+ ```
166
+
167
+ <!-- AIWS_MANAGED_END:ai-workspace:core -->
@@ -0,0 +1,94 @@
1
+ # REQUIREMENTS.md(需求与验收标准)
2
+
3
+ <!-- AIWS_MANAGED_BEGIN:requirements:contract -->
4
+ 本文件是工作区需求的唯一真值来源。AI 在制定计划与执行测试时必须以此为准。
5
+
6
+ 约束:
7
+ - 不写入任何 secrets(token、账号、内网端点等)
8
+ - `aiws update` 只维护本托管块;其余内容由项目自由编辑
9
+
10
+ 相关合同:
11
+ - `requirements/requirements-issues.csv`:需求拆解执行合同(校验:`python3 tools/requirements_contract.py validate`)
12
+ <!-- AIWS_MANAGED_END:requirements:contract -->
13
+
14
+ ## 需求概述
15
+
16
+ - 背景:
17
+ - 目标:
18
+ - 非目标:
19
+
20
+ ## 业务链路(简短逻辑图输入,建议填写)
21
+
22
+ 为降低“每次让 AI 重新理解系统”的 token 消耗,并让自动化测试能按业务链路组合执行,建议维护一份**机器可读**的 FlowSpec。
23
+
24
+ 说明:
25
+ - 该 FlowSpec 用于自动生成 `docs/api-flow.mmd`(简短逻辑图)与 `issues/server-scenario-issues.csv`(场景执行合同)。
26
+ - 每次需求变更(例如运行 `/ws-req-change`)后,都应重新生成一次(不会修改 secrets)。
27
+
28
+ <!-- FLOW_SPEC_BEGIN -->
29
+ ```json
30
+ {
31
+ "flows": [
32
+ {
33
+ "id": "auth_login",
34
+ "title": "登录并获取身份",
35
+ "steps": [
36
+ { "name": "login", "method": "POST", "path": "/api/login" },
37
+ { "name": "me", "method": "GET", "path": "/api/me" }
38
+ ],
39
+ "notes": "尽量使用无副作用接口;需要资源 id 的步骤请配合 secrets/test-accounts.json:test_resource_ids"
40
+ }
41
+ ]
42
+ }
43
+ ```
44
+ <!-- FLOW_SPEC_END -->
45
+
46
+ ## 变更记录
47
+
48
+ 进行中的需求变更请使用独立变更日志(避免在本文件里堆历史):
49
+ - `requirements/CHANGELOG.md`
50
+
51
+ ## 接口需求(按需填写)
52
+
53
+ 建议按接口列出:
54
+ - 名称:
55
+ - Method + Path:
56
+ - 鉴权要求(header/cookie/none):
57
+ - 请求示例:
58
+ - 响应示例:
59
+ - 错误码/边界条件:
60
+
61
+ ## 验收标准(必须可验证)
62
+
63
+ - 代码:编译/构建无报错
64
+ - 功能:需求覆盖完整(按接口清单逐项通过)
65
+ - 日志:关键请求路径无异常(ERROR/Exception/Stacktrace)或已确认可接受
66
+
67
+ ## 自动化测试闭环(建议)
68
+
69
+ 为减少“下一步操作”式的人工介入,建议把自动化测试的产物与边界固化为执行合同:
70
+ - `docs/openapi.json`:接口清单真值来源(优先)
71
+ - `issues/server-api-issues.csv`:每个 endpoint 的验收字段与状态机(TODO/DOING/DONE/BLOCKED/SKIP)
72
+ - `issues/server-fix-issues.csv`:当出现 BLOCKED 时自动生成的“下一步修复清单”(用于持续闭环;包含 Failure_Category/Failure_Analysis/Suggestion)
73
+ - `issues/server-triage-issues.csv`:当 runner 无法稳定归因/需要人工判断时生成的“人工介入清单”(避免把噪声混进 fix issues)
74
+ - `.agentdocs/tmp/server-test/`:响应与日志片段(不入库)
75
+
76
+ 当出现 BLOCKED:
77
+ - 若属于业务/需求不清:先补齐本文件对应接口的期望,再改代码
78
+ - 若属于代码/配置错误:修复后只重测失败项(runner 会跳过 DONE/SKIP)
79
+
80
+ ## 接口清单真值(推荐)
81
+
82
+ - OpenAPI:以 `docs/openapi.json` 为接口清单真值来源
83
+ - 若 OpenAPI 缺失:在本次任务中补齐导出方式(生成到 `docs/openapi.json`),否则自动化测试只能做“尽力覆盖”
84
+
85
+ ## 测试环境与副作用边界(强烈建议填写)
86
+
87
+ - 环境:test / staging / prod(推荐写 `test`)
88
+ - 是否允许测试有副作用接口(POST/PUT/DELETE):是/否
89
+ - 如允许:是否要求测试数据隔离/幂等(例如使用测试账号、固定测试数据、或每次清理)
90
+
91
+ ## Request-ID / Trace-ID 验收(推荐)
92
+
93
+ - 服务端支持并回传 `X-Request-Id` 响应头(与请求一致或自动生成)
94
+ - 服务端日志包含 `request_id=<id>`,便于按请求定位错误