@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.
- package/README.md +12 -0
- package/docs/cli-interface.md +288 -0
- package/docs/spec-contract.md +183 -0
- package/package.json +18 -0
- package/templates/workspace/.agents/skills/aiws-change-archive/SKILL.md +23 -0
- package/templates/workspace/.agents/skills/aiws-change-list/SKILL.md +18 -0
- package/templates/workspace/.agents/skills/aiws-change-new/SKILL.md +26 -0
- package/templates/workspace/.agents/skills/aiws-change-next/SKILL.md +19 -0
- package/templates/workspace/.agents/skills/aiws-change-start/SKILL.md +27 -0
- package/templates/workspace/.agents/skills/aiws-change-status/SKILL.md +19 -0
- package/templates/workspace/.agents/skills/aiws-change-sync/SKILL.md +19 -0
- package/templates/workspace/.agents/skills/aiws-change-templates-init/SKILL.md +18 -0
- package/templates/workspace/.agents/skills/aiws-change-templates-which/SKILL.md +18 -0
- package/templates/workspace/.agents/skills/aiws-change-validate/SKILL.md +23 -0
- package/templates/workspace/.agents/skills/aiws-hooks-install/SKILL.md +30 -0
- package/templates/workspace/.agents/skills/aiws-hooks-status/SKILL.md +18 -0
- package/templates/workspace/.agents/skills/aiws-init/SKILL.md +27 -0
- package/templates/workspace/.agents/skills/aiws-rollback/SKILL.md +18 -0
- package/templates/workspace/.agents/skills/aiws-update/SKILL.md +26 -0
- package/templates/workspace/.agents/skills/aiws-validate/SKILL.md +22 -0
- package/templates/workspace/.agents/skills/ws-analyze/SKILL.md +26 -0
- package/templates/workspace/.agents/skills/ws-commit/SKILL.md +50 -0
- package/templates/workspace/.agents/skills/ws-dev/SKILL.md +34 -0
- package/templates/workspace/.agents/skills/ws-migrate/SKILL.md +54 -0
- package/templates/workspace/.agents/skills/ws-plan/SKILL.md +39 -0
- package/templates/workspace/.agents/skills/ws-preflight/SKILL.md +29 -0
- package/templates/workspace/.agents/skills/ws-req-change/SKILL.md +33 -0
- package/templates/workspace/.agents/skills/ws-req-contract-sync/SKILL.md +17 -0
- package/templates/workspace/.agents/skills/ws-req-contract-validate/SKILL.md +12 -0
- package/templates/workspace/.agents/skills/ws-req-flow-sync/SKILL.md +28 -0
- package/templates/workspace/.agents/skills/ws-req-review/SKILL.md +32 -0
- package/templates/workspace/.agents/skills/ws-review/SKILL.md +24 -0
- package/templates/workspace/.agents/skills/ws-rule/SKILL.md +23 -0
- package/templates/workspace/.aiws/manifest.json +36 -0
- package/templates/workspace/.claude/commands/aiws-init.md +19 -0
- package/templates/workspace/.claude/commands/aiws-rollback.md +12 -0
- package/templates/workspace/.claude/commands/aiws-update.md +18 -0
- package/templates/workspace/.claude/commands/aiws-validate.md +13 -0
- package/templates/workspace/.claude/commands/ws-analyze.md +27 -0
- package/templates/workspace/.claude/commands/ws-dev.md +24 -0
- package/templates/workspace/.claude/commands/ws-migrate.md +22 -0
- package/templates/workspace/.claude/commands/ws-preflight.md +27 -0
- package/templates/workspace/.claude/commands/ws-req-change.md +34 -0
- package/templates/workspace/.claude/commands/ws-req-contract-sync.md +18 -0
- package/templates/workspace/.claude/commands/ws-req-contract-validate.md +13 -0
- package/templates/workspace/.claude/commands/ws-req-flow-sync.md +20 -0
- package/templates/workspace/.claude/commands/ws-req-review.md +33 -0
- package/templates/workspace/.claude/commands/ws-review.md +25 -0
- package/templates/workspace/.claude/commands/ws-rule.md +24 -0
- package/templates/workspace/.codex/prompts/aiws-init.md +23 -0
- package/templates/workspace/.codex/prompts/aiws-rollback.md +16 -0
- package/templates/workspace/.codex/prompts/aiws-update.md +22 -0
- package/templates/workspace/.codex/prompts/aiws-validate.md +17 -0
- package/templates/workspace/.codex/prompts/ws-analyze.md +32 -0
- package/templates/workspace/.codex/prompts/ws-dev.md +29 -0
- package/templates/workspace/.codex/prompts/ws-migrate.md +27 -0
- package/templates/workspace/.codex/prompts/ws-preflight.md +32 -0
- package/templates/workspace/.codex/prompts/ws-req-change.md +39 -0
- package/templates/workspace/.codex/prompts/ws-req-contract-sync.md +23 -0
- package/templates/workspace/.codex/prompts/ws-req-contract-validate.md +18 -0
- package/templates/workspace/.codex/prompts/ws-req-flow-sync.md +25 -0
- package/templates/workspace/.codex/prompts/ws-req-review.md +38 -0
- package/templates/workspace/.codex/prompts/ws-review.md +30 -0
- package/templates/workspace/.codex/prompts/ws-rule.md +29 -0
- package/templates/workspace/.githooks/pre-commit +32 -0
- package/templates/workspace/.githooks/pre-push +32 -0
- package/templates/workspace/.iflow/agents/feature-reviewer.md +27 -0
- package/templates/workspace/.iflow/agents/requirements-analyst.md +24 -0
- package/templates/workspace/.iflow/agents/server-commit-manager.md +28 -0
- package/templates/workspace/.iflow/agents/server-fix-implementer.md +31 -0
- package/templates/workspace/.iflow/agents/server-test-planner.md +28 -0
- package/templates/workspace/.iflow/agents/server-test-triager.md +30 -0
- package/templates/workspace/.iflow/commands/aiws-init.toml +24 -0
- package/templates/workspace/.iflow/commands/aiws-rollback.toml +18 -0
- package/templates/workspace/.iflow/commands/aiws-update.toml +23 -0
- package/templates/workspace/.iflow/commands/aiws-validate.toml +18 -0
- package/templates/workspace/.iflow/commands/server-commit.toml +27 -0
- package/templates/workspace/.iflow/commands/server-drain.toml +99 -0
- package/templates/workspace/.iflow/commands/server-fix-and-commit.toml +27 -0
- package/templates/workspace/.iflow/commands/server-fix.toml +65 -0
- package/templates/workspace/.iflow/commands/server-test-plan.toml +62 -0
- package/templates/workspace/.iflow/commands/server-test.toml +58 -0
- package/templates/workspace/.iflow/commands/server-triage.toml +38 -0
- package/templates/workspace/.iflow/commands/server_test-plan.toml +12 -0
- package/templates/workspace/.iflow/commands/server_test.toml +12 -0
- package/templates/workspace/.iflow/commands/ws-analyze.toml +33 -0
- package/templates/workspace/.iflow/commands/ws-contract-check.toml +69 -0
- package/templates/workspace/.iflow/commands/ws-dev.toml +34 -0
- package/templates/workspace/.iflow/commands/ws-doctor.toml +141 -0
- package/templates/workspace/.iflow/commands/ws-env-doctor.toml +74 -0
- package/templates/workspace/.iflow/commands/ws-feature-deliver.toml +44 -0
- package/templates/workspace/.iflow/commands/ws-feature-plan.toml +47 -0
- package/templates/workspace/.iflow/commands/ws-init.toml +53 -0
- package/templates/workspace/.iflow/commands/ws-memory-bank-init.toml +100 -0
- package/templates/workspace/.iflow/commands/ws-migrate.toml +59 -0
- package/templates/workspace/.iflow/commands/ws-preflight.toml +30 -0
- package/templates/workspace/.iflow/commands/ws-req-change.toml +52 -0
- package/templates/workspace/.iflow/commands/ws-req-contract-sync.toml +25 -0
- package/templates/workspace/.iflow/commands/ws-req-contract-validate.toml +16 -0
- package/templates/workspace/.iflow/commands/ws-req-flow-sync.toml +36 -0
- package/templates/workspace/.iflow/commands/ws-req-review.toml +56 -0
- package/templates/workspace/.iflow/commands/ws-review.toml +32 -0
- package/templates/workspace/.iflow/commands/ws-rule.toml +43 -0
- package/templates/workspace/.opencode/command/aiws-init.md +19 -0
- package/templates/workspace/.opencode/command/aiws-rollback.md +12 -0
- package/templates/workspace/.opencode/command/aiws-update.md +18 -0
- package/templates/workspace/.opencode/command/aiws-validate.md +13 -0
- package/templates/workspace/.opencode/command/ws-analyze.md +27 -0
- package/templates/workspace/.opencode/command/ws-dev.md +24 -0
- package/templates/workspace/.opencode/command/ws-migrate.md +22 -0
- package/templates/workspace/.opencode/command/ws-preflight.md +27 -0
- package/templates/workspace/.opencode/command/ws-req-change.md +34 -0
- package/templates/workspace/.opencode/command/ws-req-contract-sync.md +18 -0
- package/templates/workspace/.opencode/command/ws-req-contract-validate.md +13 -0
- package/templates/workspace/.opencode/command/ws-req-flow-sync.md +20 -0
- package/templates/workspace/.opencode/command/ws-req-review.md +33 -0
- package/templates/workspace/.opencode/command/ws-review.md +25 -0
- package/templates/workspace/.opencode/command/ws-rule.md +24 -0
- package/templates/workspace/AGENTS.md +22 -0
- package/templates/workspace/AI_PROJECT.md +86 -0
- package/templates/workspace/AI_WORKSPACE.md +167 -0
- package/templates/workspace/REQUIREMENTS.md +94 -0
- package/templates/workspace/changes/README.md +55 -0
- package/templates/workspace/changes/templates/design.md +29 -0
- package/templates/workspace/changes/templates/proposal.md +59 -0
- package/templates/workspace/changes/templates/tasks.md +33 -0
- package/templates/workspace/issues/problem-issues.csv +2 -0
- package/templates/workspace/manifest.json +205 -0
- package/templates/workspace/memory-bank/README.md +14 -0
- package/templates/workspace/memory-bank/architecture.md +9 -0
- package/templates/workspace/memory-bank/implementation-plan.md +11 -0
- package/templates/workspace/memory-bank/progress.md +10 -0
- package/templates/workspace/memory-bank/tech-stack.md +11 -0
- package/templates/workspace/requirements/CHANGELOG.md +13 -0
- package/templates/workspace/requirements/requirements-issues.csv +2 -0
- package/templates/workspace/secrets/test-accounts.example.json +32 -0
- package/templates/workspace/tools/iflow_watchdog.sh +138 -0
- package/templates/workspace/tools/install_iflow_watchdog_systemd_user.sh +118 -0
- package/templates/workspace/tools/requirements_contract.py +285 -0
- package/templates/workspace/tools/requirements_contract_sync.py +290 -0
- package/templates/workspace/tools/requirements_flow_gen.py +250 -0
- package/templates/workspace/tools/server_test_runner.py +1902 -0
- package/templates/workspace/tools/systemd/iflow-watchdog@.service +16 -0
- package/templates/workspace/tools/systemd/iflow-watchdog@.timer +11 -0
- package/templates/workspace/tools/ws_change_check.py +323 -0
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: 合同同步(requirements contract sync)
|
|
3
|
+
argument-hint: ""
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
<!-- AIWS_MANAGED_BEGIN:codex:ws-req-contract-sync -->
|
|
7
|
+
# ws req contract sync
|
|
8
|
+
|
|
9
|
+
用中文输出(命令/路径/代码标识符保持原样不翻译)。
|
|
10
|
+
|
|
11
|
+
用途:从 `REQUIREMENTS.md` 的 FlowSpec 补齐 `requirements/requirements-issues.csv`(只生成骨架,不猜测完成状态)。
|
|
12
|
+
|
|
13
|
+
执行(在 workspace 根目录):
|
|
14
|
+
- `python3 tools/requirements_contract_sync.py --workspace .`
|
|
15
|
+
|
|
16
|
+
输出要求:
|
|
17
|
+
- 说明新增/更新了多少条
|
|
18
|
+
- 明确下一步:手工补齐 CRUD/Inputs/Outputs/Business_Logic/Tests,并将可开工条目标为 `Spec_Status=READY`
|
|
19
|
+
|
|
20
|
+
下一步建议:`/ws-req-contract-validate`
|
|
21
|
+
<!-- AIWS_MANAGED_END:codex:ws-req-contract-sync -->
|
|
22
|
+
|
|
23
|
+
可在下方追加本项目对 Codex 的额外说明(托管块外内容会被保留)。
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: 合同校验(requirements contract validate)
|
|
3
|
+
argument-hint: ""
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
<!-- AIWS_MANAGED_BEGIN:codex:ws-req-contract-validate -->
|
|
7
|
+
# ws req contract validate
|
|
8
|
+
|
|
9
|
+
用中文输出(命令/路径/代码标识符保持原样不翻译)。
|
|
10
|
+
|
|
11
|
+
执行(失败则修正 CSV 后重试):
|
|
12
|
+
- `python3 tools/requirements_contract.py validate`
|
|
13
|
+
|
|
14
|
+
输出要求:
|
|
15
|
+
- 若失败:列出前 20 条缺失字段(Req_ID + field),并给出最小补齐建议
|
|
16
|
+
<!-- AIWS_MANAGED_END:codex:ws-req-contract-validate -->
|
|
17
|
+
|
|
18
|
+
可在下方追加本项目对 Codex 的额外说明(托管块外内容会被保留)。
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Flow 同步(生成 api-flow 与场景执行合同)
|
|
3
|
+
argument-hint: ""
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
<!-- AIWS_MANAGED_BEGIN:codex:ws-req-flow-sync -->
|
|
7
|
+
# ws req flow sync
|
|
8
|
+
|
|
9
|
+
用中文输出;命令与路径保持原样不翻译。
|
|
10
|
+
|
|
11
|
+
目标:基于 `REQUIREMENTS.md` 的 FlowSpec 生成:
|
|
12
|
+
- `docs/api-flow.mmd`(简短逻辑图,Mermaid)
|
|
13
|
+
- `issues/server-scenario-issues.csv`(场景执行合同:TODO/DONE/BLOCKED)
|
|
14
|
+
|
|
15
|
+
执行(在 workspace 根目录):
|
|
16
|
+
`python3 tools/requirements_flow_gen.py --workspace .`
|
|
17
|
+
|
|
18
|
+
若缺少工具 `tools/requirements_flow_gen.py`:提示用户先运行 `npx @aipper/aiws init .`(默认会安装 optional tools)。
|
|
19
|
+
|
|
20
|
+
输出要求:只打印生成的文件路径与下一步命令:
|
|
21
|
+
- 查看逻辑图:`cat docs/api-flow.mmd`
|
|
22
|
+
- 查看场景合同:`cat issues/server-scenario-issues.csv`
|
|
23
|
+
<!-- AIWS_MANAGED_END:codex:ws-req-flow-sync -->
|
|
24
|
+
|
|
25
|
+
可在下方追加本项目对 Codex 的额外说明(托管块外内容会被保留)。
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: 需求评审(对齐真值与验收)
|
|
3
|
+
argument-hint: ""
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
<!-- AIWS_MANAGED_BEGIN:codex:ws-req-review -->
|
|
7
|
+
# ws req review
|
|
8
|
+
|
|
9
|
+
用中文输出(命令/路径/代码标识符保持原样不翻译)。
|
|
10
|
+
|
|
11
|
+
目标:在不修改任何文件的前提下,对 `REQUIREMENTS.md` 做一次整体 QA,输出缺口/冲突/风险,减少实现漂移。
|
|
12
|
+
|
|
13
|
+
执行步骤(强制):
|
|
14
|
+
1) 定位项目根目录:`git rev-parse --show-toplevel`(失败则停止并让用户确认根目录)。
|
|
15
|
+
2) 读取(存在则必须读取;缺失则明确列出,不要臆测):
|
|
16
|
+
- `AI_PROJECT.md`
|
|
17
|
+
- `REQUIREMENTS.md`
|
|
18
|
+
- `AI_WORKSPACE.md`
|
|
19
|
+
- `requirements/CHANGELOG.md`(若存在)
|
|
20
|
+
- `requirements/requirements-issues.csv`(若存在)
|
|
21
|
+
3) 输出固定结构的报告:
|
|
22
|
+
|
|
23
|
+
## Requirements QA
|
|
24
|
+
- 结论:是否可进入实现(是/否/有条件)
|
|
25
|
+
- 漂移风险:最容易导致不一致的点
|
|
26
|
+
- 可验收性缺口:缺少输入/输出/错误码/边界/示例的条目
|
|
27
|
+
- 完整性:Non-goals/兼容性/鉴权/重试/并发/观测性/性能
|
|
28
|
+
- 一致性:与 `AI_PROJECT.md` 约束冲突点
|
|
29
|
+
- 可测试性与证据:最小验证命令 + 期望结果 + 证据路径
|
|
30
|
+
- 风险清单:3–8 条
|
|
31
|
+
- 需要澄清的问题:5–12 个(按优先级)
|
|
32
|
+
|
|
33
|
+
4) 最后询问用户:是否进入需求落盘流程 `/ws-req-change`?(Y/N)
|
|
34
|
+
|
|
35
|
+
安全:不打印 `secrets/test-accounts.json`。
|
|
36
|
+
<!-- AIWS_MANAGED_END:codex:ws-req-review -->
|
|
37
|
+
|
|
38
|
+
可在下方追加本项目对 Codex 的额外说明(托管块外内容会被保留)。
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: 评审(提交前审计与证据落盘)
|
|
3
|
+
argument-hint: ""
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
<!-- AIWS_MANAGED_BEGIN:codex:ws-review -->
|
|
7
|
+
# ws review
|
|
8
|
+
|
|
9
|
+
用中文输出(命令/路径/代码标识符保持原样不翻译)。
|
|
10
|
+
|
|
11
|
+
目标:在提交/交付前审计当前改动,对照真值文件检查是否越界,并把审计证据落盘到 `.agentdocs/tmp/review/`。
|
|
12
|
+
|
|
13
|
+
步骤(建议):
|
|
14
|
+
1) 先运行 `/ws-preflight`。
|
|
15
|
+
2) 基于 `git status` / `git diff`(以及你实际运行过的测试结果),对照 `AI_PROJECT.md` 与 `REQUIREMENTS.md` 检查:
|
|
16
|
+
- 是否存在越界目录改动/危险操作
|
|
17
|
+
- 是否有可复现验证命令与证据
|
|
18
|
+
- 是否维护了 `changes/<change-id>/` 或相关 `issues/*.csv`
|
|
19
|
+
3) 将审计落盘到:`.agentdocs/tmp/review/codex-review.md`(目录不存在则创建)。
|
|
20
|
+
4) 回复中输出:
|
|
21
|
+
- `Evidence:` 证据文件路径
|
|
22
|
+
- `Top risks:` 3–8 条(高→低)
|
|
23
|
+
- `Next:` 最小修复清单 + 最小验证命令
|
|
24
|
+
|
|
25
|
+
安全:
|
|
26
|
+
- 不打印 secrets。
|
|
27
|
+
- 不执行破坏性命令。
|
|
28
|
+
<!-- AIWS_MANAGED_END:codex:ws-review -->
|
|
29
|
+
|
|
30
|
+
可在下方追加本项目对 Codex 的额外说明(托管块外内容会被保留)。
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: 规则(解释项目规则与边界)
|
|
3
|
+
argument-hint: ""
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
<!-- AIWS_MANAGED_BEGIN:codex:ws-rule -->
|
|
7
|
+
# ws rule
|
|
8
|
+
|
|
9
|
+
用中文输出(命令/路径/代码标识符保持原样不翻译)。
|
|
10
|
+
|
|
11
|
+
目标:把用户口述的“项目特有规则”整理成可执行条款,并写入 `AI_PROJECT.md` 的 `AI_PROJECT_RULES_BEGIN/END` 段(托管块外内容会被保留)。
|
|
12
|
+
|
|
13
|
+
安全规则(强制):
|
|
14
|
+
- 不打印/不写入 secrets(token、密钥、内网地址、账号密码)。
|
|
15
|
+
- 不执行破坏性命令。
|
|
16
|
+
|
|
17
|
+
工作流:
|
|
18
|
+
1) 先运行 `/ws-preflight`;若缺失 `AI_PROJECT.md`:提示用户先 `/ws-migrate` 或运行 `npx @aipper/aiws init .`。
|
|
19
|
+
2) 写入前创建备份(必须):
|
|
20
|
+
`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}`
|
|
21
|
+
3) 先输出“将写入的规则清单”(3–12 条),并要求用户回复 `CONFIRM` 后再落盘。
|
|
22
|
+
4) 用户确认后,**仅更新** BEGIN/END 段内内容(合并去重;写成可检查条款:目录白名单/必须验证命令/禁止项/产物要求)。
|
|
23
|
+
5) 输出必须包含:
|
|
24
|
+
- 更新了哪些文件(路径)
|
|
25
|
+
- 回滚方式(恢复备份文件)
|
|
26
|
+
- 下一步建议:`aiws validate .`
|
|
27
|
+
<!-- AIWS_MANAGED_END:codex:ws-rule -->
|
|
28
|
+
|
|
29
|
+
可在下方追加本项目对 Codex 的额外说明(托管块外内容会被保留)。
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
set -euo pipefail
|
|
3
|
+
|
|
4
|
+
if [[ "${WS_CHANGE_HOOK_BYPASS:-0}" == "1" ]]; then
|
|
5
|
+
echo "warn: WS_CHANGE_HOOK_BYPASS=1; skip aiws pre-commit hook" >&2
|
|
6
|
+
exit 0
|
|
7
|
+
fi
|
|
8
|
+
|
|
9
|
+
root="$(git rev-parse --show-toplevel 2>/dev/null || true)"
|
|
10
|
+
[[ -n "${root:-}" ]] || exit 0
|
|
11
|
+
|
|
12
|
+
cd "$root"
|
|
13
|
+
|
|
14
|
+
# Write validate evidence stamp to: .agentdocs/tmp/aiws-validate/*.json
|
|
15
|
+
export AIWS_VALIDATE_STAMP=1
|
|
16
|
+
|
|
17
|
+
aiws_bin=""
|
|
18
|
+
if [[ -x "$root/node_modules/.bin/aiws" ]]; then
|
|
19
|
+
aiws_bin="$root/node_modules/.bin/aiws"
|
|
20
|
+
elif command -v aiws >/dev/null 2>&1; then
|
|
21
|
+
aiws_bin="aiws"
|
|
22
|
+
fi
|
|
23
|
+
|
|
24
|
+
if [[ -z "${aiws_bin:-}" ]]; then
|
|
25
|
+
echo "error: aiws CLI not found (required for git hook validation)" >&2
|
|
26
|
+
echo "hint: install @aipper/aiws then retry:" >&2
|
|
27
|
+
echo " - npm i -g @aipper/aiws" >&2
|
|
28
|
+
echo " - or: npm i -D @aipper/aiws" >&2
|
|
29
|
+
exit 1
|
|
30
|
+
fi
|
|
31
|
+
|
|
32
|
+
"$aiws_bin" validate .
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
set -euo pipefail
|
|
3
|
+
|
|
4
|
+
if [[ "${WS_CHANGE_HOOK_BYPASS:-0}" == "1" ]]; then
|
|
5
|
+
echo "warn: WS_CHANGE_HOOK_BYPASS=1; skip aiws pre-push hook" >&2
|
|
6
|
+
exit 0
|
|
7
|
+
fi
|
|
8
|
+
|
|
9
|
+
root="$(git rev-parse --show-toplevel 2>/dev/null || true)"
|
|
10
|
+
[[ -n "${root:-}" ]] || exit 0
|
|
11
|
+
|
|
12
|
+
cd "$root"
|
|
13
|
+
|
|
14
|
+
# Write validate evidence stamp to: .agentdocs/tmp/aiws-validate/*.json
|
|
15
|
+
export AIWS_VALIDATE_STAMP=1
|
|
16
|
+
|
|
17
|
+
aiws_bin=""
|
|
18
|
+
if [[ -x "$root/node_modules/.bin/aiws" ]]; then
|
|
19
|
+
aiws_bin="$root/node_modules/.bin/aiws"
|
|
20
|
+
elif command -v aiws >/dev/null 2>&1; then
|
|
21
|
+
aiws_bin="aiws"
|
|
22
|
+
fi
|
|
23
|
+
|
|
24
|
+
if [[ -z "${aiws_bin:-}" ]]; then
|
|
25
|
+
echo "error: aiws CLI not found (required for git hook validation)" >&2
|
|
26
|
+
echo "hint: install @aipper/aiws then retry:" >&2
|
|
27
|
+
echo " - npm i -g @aipper/aiws" >&2
|
|
28
|
+
echo " - or: npm i -D @aipper/aiws" >&2
|
|
29
|
+
exit 1
|
|
30
|
+
fi
|
|
31
|
+
|
|
32
|
+
"$aiws_bin" validate .
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
---
|
|
2
|
+
agentType: "feature-reviewer"
|
|
3
|
+
whenToUse: "用于交付前审核:对照 REQUIREMENTS.md 检查实现/测试/日志/边界是否达标,并给出是否可提交的结论。"
|
|
4
|
+
model: ""
|
|
5
|
+
allowedTools: ["*"]
|
|
6
|
+
proactive: false
|
|
7
|
+
systemPrompt: |
|
|
8
|
+
你是“交付审核员(Feature Reviewer)”,默认中文输出,只做审核,不做实现。
|
|
9
|
+
|
|
10
|
+
审核输入:
|
|
11
|
+
- REQUIREMENTS.md(验收真值)
|
|
12
|
+
- issues/feature-issues.csv(任务状态)
|
|
13
|
+
- (如有)issues/server-api-issues.csv + .agentdocs/tmp/server-test/report.json(接口验收证据)
|
|
14
|
+
|
|
15
|
+
审核规则:
|
|
16
|
+
- 任何 TODO/DOING/BLOCKED 不允许进入提交阶段。
|
|
17
|
+
- 任何越过 policy 的行为(非 test 环境、base_url 不在 allowlist)视为不合格。
|
|
18
|
+
- 必须有可复现的测试命令与通过证据(不允许“口头通过”)。
|
|
19
|
+
|
|
20
|
+
输出:
|
|
21
|
+
- 结论:可提交 / 不可提交
|
|
22
|
+
- 阻塞项列表(引用文件路径)
|
|
23
|
+
- 推荐的最小下一步
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
# Feature Reviewer
|
|
27
|
+
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
---
|
|
2
|
+
agentType: "requirements-analyst"
|
|
3
|
+
whenToUse: "用于把 REQUIREMENTS.md 补齐成“可验收、可测试”的形态:只补字段与验收口径,不改变业务语义。"
|
|
4
|
+
model: ""
|
|
5
|
+
allowedTools: ["*"]
|
|
6
|
+
proactive: false
|
|
7
|
+
systemPrompt: |
|
|
8
|
+
你是“需求分析与验收规范化专家(Requirements Analyst)”,默认中文输出。
|
|
9
|
+
|
|
10
|
+
工作目标:
|
|
11
|
+
- 把 REQUIREMENTS.md 从“描述性”补齐到“可验收、可测试”的最小版本。
|
|
12
|
+
- 只补齐缺失字段/示例/验收口径,不改变需求语义;遇到语义不清只提问 1-2 个关键问题。
|
|
13
|
+
|
|
14
|
+
边界:
|
|
15
|
+
- 不引入 secrets,不打印 secrets/test-accounts.json。
|
|
16
|
+
- 不决定是否允许副作用;这属于 AI_WORKSPACE.md policy + REQUIREMENTS 明确许可的范围。
|
|
17
|
+
|
|
18
|
+
输出要求:
|
|
19
|
+
- 给出明确的“验收清单”(可对应到 issues CSV 的字段)。
|
|
20
|
+
- 给出需要补充或更新的文件路径与回滚方式。
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
# Requirements Analyst
|
|
24
|
+
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
---
|
|
2
|
+
agentType: "server-commit-manager"
|
|
3
|
+
whenToUse: "用于全部 DONE/SKIP 后的提交收口:submodule 内 commit + 工作区根仓库 gitlink bump commit,并做敏感文件防护。"
|
|
4
|
+
model: ""
|
|
5
|
+
allowedTools: ["*"]
|
|
6
|
+
proactive: false
|
|
7
|
+
systemPrompt: |
|
|
8
|
+
你是“提交管理员(Committer)”,默认中文输出,只负责在验收通过后安全提交。
|
|
9
|
+
|
|
10
|
+
硬性前置:
|
|
11
|
+
- `issues/server-api-issues.csv` 不得包含 TODO/DOING/BLOCKED。
|
|
12
|
+
- 必须处于测试环境:`AI_WORKSPACE.md` 中 `environment: "test"`。
|
|
13
|
+
|
|
14
|
+
安全边界:
|
|
15
|
+
- 禁止提交 `.env`、`secrets/`、token/key/credential 等敏感文件;发现立即停止并提示用户移除。
|
|
16
|
+
- 不执行 push。
|
|
17
|
+
- commit message 使用通用、简洁、可审阅的约定(Conventional Commits)。
|
|
18
|
+
|
|
19
|
+
执行方式:
|
|
20
|
+
- 优先调用 `/server:commit`(或 `/server:fix-and-commit` / `/server:fix-and-commit`)。
|
|
21
|
+
- 若启用 hooks 自动提交,也要强调以 AI_WORKSPACE.md 的边界为准。
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
# Server Commit Manager
|
|
25
|
+
|
|
26
|
+
使用提示:
|
|
27
|
+
- 全通过后用 `/server:commit` 或 `/server:fix-and-commit`。
|
|
28
|
+
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
---
|
|
2
|
+
agentType: "server-fix-implementer"
|
|
3
|
+
whenToUse: "用于代码修复阶段:根据 triage 结论做最小修复,并确保 request-id/trace-id 约定与 OpenAPI/需求一致。"
|
|
4
|
+
model: ""
|
|
5
|
+
allowedTools: ["*"]
|
|
6
|
+
proactive: false
|
|
7
|
+
systemPrompt: |
|
|
8
|
+
你是“服务端修复实现者(Implementer)”,默认中文输出,只做最小代码修改与可验证修复。
|
|
9
|
+
|
|
10
|
+
硬性前置(每次准备改代码前都要做):
|
|
11
|
+
- 先阅读工作区真值文件:`REQUIREMENTS.md`、`AI_PROJECT.md`、`AI_WORKSPACE.md`(缺任何一个都先停止并让用户补齐/确认)。
|
|
12
|
+
- 明确本次要改动的 GOALS / NON-GOALS,并把改动映射到 REQUIREMENTS 的具体验收项(无法映射就不要改代码)。
|
|
13
|
+
- 如果 iFlow 的 pre_tool_guard 拦截提示缺少 contract-check:先执行 `/ws:contract-check` 再继续。
|
|
14
|
+
|
|
15
|
+
工作边界:
|
|
16
|
+
- 你只改代码/配置,不改 REQUIREMENTS 的业务期望(除非明确是需求文档缺失且用户同意补齐)。
|
|
17
|
+
- 修复前必须先阅读证据:resp/out、log_snippet、以及 CSV 的 Expected_* 字段。
|
|
18
|
+
- 对框架/API 用法不确定时,优先用 Context7 查官方文档后再修改。
|
|
19
|
+
- 严格遵守 Request-ID 约定:客户端携带 `X-Request-Id`,服务端响应回传,并在日志中输出 `request_id=<id>`(或 AI_WORKSPACE.md 定义的等价字段)。
|
|
20
|
+
|
|
21
|
+
验证要求:
|
|
22
|
+
- 每次修复后给出最小复测命令(runner 优先;只重测相关 service/相关 endpoint)。
|
|
23
|
+
- 不声称通过,除非确实运行并看到结果。
|
|
24
|
+
- 不做 git commit。
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
# Server Fix Implementer
|
|
28
|
+
|
|
29
|
+
使用提示:
|
|
30
|
+
- 优先配合 `/server:fix` 使用(它会驱动 runner→triage→修复→复测闭环)。
|
|
31
|
+
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
---
|
|
2
|
+
agentType: "server-test-planner"
|
|
3
|
+
whenToUse: "用于工作区(目录A)服务端接口自动化测试的计划阶段:读 REQUIREMENTS/AI_WORKSPACE,生成可执行计划与执行合同(OpenAPI/CSV/边界)。"
|
|
4
|
+
model: ""
|
|
5
|
+
allowedTools: ["*"]
|
|
6
|
+
proactive: false
|
|
7
|
+
systemPrompt: |
|
|
8
|
+
你是“服务端接口测试规划师(Planner)”,只负责把需求变成可执行计划与执行合同,默认中文输出。
|
|
9
|
+
|
|
10
|
+
核心职责:
|
|
11
|
+
- 读取并严格遵守 `REQUIREMENTS.md`(唯一真值)与 `AI_WORKSPACE.md`(工作区约定)。
|
|
12
|
+
- 明确 GOALS / NON-GOALS,输出可以直接执行的步骤与命令(Linux-first)。
|
|
13
|
+
- 以 `docs/openapi.json` 为接口清单真值来源;缺失则优先规划“如何导出并固化到 docs/openapi.json”。
|
|
14
|
+
- 以 `issues/server-api-issues.csv` 为执行合同:为每个 endpoint 填入可验收字段(状态码/关键字段/日志检查/鉴权)。
|
|
15
|
+
- 明确边界:默认不测破坏性接口;只有在 `AI_WORKSPACE.md` 中 `allow_mutations=true` 且 REQUIREMENTS 明确允许时才覆盖。
|
|
16
|
+
|
|
17
|
+
输出要求:
|
|
18
|
+
- 用中文叙述,但命令/路径/代码标识符保持原样不翻译。
|
|
19
|
+
- 任何需要修改的文件必须列出路径,并提供回滚与验证命令。
|
|
20
|
+
- 不打印 `secrets/test-accounts.json` 内容;只引用其字段名/用途。
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
# Server Test Planner
|
|
24
|
+
|
|
25
|
+
使用提示:
|
|
26
|
+
- 优先配合 `/server:test-plan` 或 `/server_test-plan` 使用。
|
|
27
|
+
- 如果 `AI_WORKSPACE.md` 未声明 `server_dirs`,先让用户补齐(初始化阶段固定下来)。
|
|
28
|
+
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
---
|
|
2
|
+
agentType: "server-test-triager"
|
|
3
|
+
whenToUse: "用于接口测试失败分析:基于 report.json / CSV / 日志片段,把 BLOCKED 转换为可执行修复清单,并区分需求对齐 vs 代码缺陷。"
|
|
4
|
+
model: ""
|
|
5
|
+
allowedTools: ["*"]
|
|
6
|
+
proactive: false
|
|
7
|
+
systemPrompt: |
|
|
8
|
+
你是“服务端接口测试分诊师(Triage)”,默认中文输出,专注把失败项变成最小可执行修复动作。
|
|
9
|
+
|
|
10
|
+
输入优先级:
|
|
11
|
+
1) `.agentdocs/tmp/server-test/report.json`(机器可读失败清单)
|
|
12
|
+
2) `issues/server-api-issues.csv`(执行合同:Expected_* 与状态机)
|
|
13
|
+
3) `REQUIREMENTS.md`(业务验收真值)
|
|
14
|
+
4) 证据文件:`.out`(响应)与 `.log.txt`(按 request_id 命中的日志片段)
|
|
15
|
+
|
|
16
|
+
归因规则(必须明确写在输出里):
|
|
17
|
+
- 若 Expected_Status/期望字段与 REQUIREMENTS 不一致:这是“需求/业务对齐问题”,先改 REQUIREMENTS/CSV,再决定是否改代码。
|
|
18
|
+
- 若响应 500/解析异常/安全链路错误/缺 request_id 日志:这是“代码/配置问题”,先用 Context7 查对应栈文档,再给最小修复点。
|
|
19
|
+
|
|
20
|
+
输出要求:
|
|
21
|
+
- 每个 BLOCKED 都必须引用 Issue_ID + endpoint + 证据路径(report.json/resp/log_snippet)。
|
|
22
|
+
- 提供“复测命令”:优先 `uv run tools/server_test_runner.py --workspace . --manage-service`,必要时只测单服务(--service)。
|
|
23
|
+
- 不打印 secrets;不做 git commit。
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
# Server Test Triager
|
|
27
|
+
|
|
28
|
+
使用提示:
|
|
29
|
+
- 优先配合 `/server:triage` 使用(它会自动读取 report/CSV/requirements)。
|
|
30
|
+
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# Command: aiws:init
|
|
2
|
+
# Description: 初始化/补齐 aiws workspace 模板(生成真值文件与门禁)
|
|
3
|
+
# Category: aiws
|
|
4
|
+
# Version: 1
|
|
5
|
+
|
|
6
|
+
description = "初始化/补齐 aiws workspace 模板(生成真值文件与门禁)"
|
|
7
|
+
|
|
8
|
+
prompt = """
|
|
9
|
+
用中文输出(命令/路径/代码标识符保持原样不翻译)。
|
|
10
|
+
|
|
11
|
+
目标:
|
|
12
|
+
- 生成/补齐真值文件与门禁文件(以 `AI_PROJECT.md` / `REQUIREMENTS.md` / `AI_WORKSPACE.md` 为准)
|
|
13
|
+
- 写入/更新 `.gitignore` 的 aiws 托管块
|
|
14
|
+
- 生成/更新 `.aiws/manifest.json`(用于漂移检测)
|
|
15
|
+
|
|
16
|
+
建议执行:
|
|
17
|
+
1) `npx @aipper/aiws init .`
|
|
18
|
+
2) `npx @aipper/aiws validate .`
|
|
19
|
+
|
|
20
|
+
约束:
|
|
21
|
+
- 不写入任何 secrets
|
|
22
|
+
- 只允许更新托管块(`AIWS_MANAGED_BEGIN/END`)或 spec 指定的 `replace_file` 文件
|
|
23
|
+
"""
|
|
24
|
+
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# Command: aiws:rollback
|
|
2
|
+
# Description: 从 `.aiws/backups/` 回滚到某次快照(latest|timestamp)
|
|
3
|
+
# Category: aiws
|
|
4
|
+
# Version: 1
|
|
5
|
+
|
|
6
|
+
description = "从 `.aiws/backups/` 回滚到某次快照(latest|timestamp)"
|
|
7
|
+
|
|
8
|
+
prompt = """
|
|
9
|
+
用中文输出(命令/路径/代码标识符保持原样不翻译)。
|
|
10
|
+
|
|
11
|
+
用法:
|
|
12
|
+
- `npx @aipper/aiws rollback . latest`
|
|
13
|
+
- `npx @aipper/aiws rollback . <timestamp>`
|
|
14
|
+
|
|
15
|
+
说明:
|
|
16
|
+
- 仅恢复 aiws 备份过的文件;不会做额外推断或重建
|
|
17
|
+
"""
|
|
18
|
+
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# Command: aiws:update
|
|
2
|
+
# Description: 更新 aiws workspace 托管面(仅更新 replace_file/托管块)
|
|
3
|
+
# Category: aiws
|
|
4
|
+
# Version: 1
|
|
5
|
+
|
|
6
|
+
description = "更新 aiws workspace 托管面(仅更新 replace_file/托管块)"
|
|
7
|
+
|
|
8
|
+
prompt = """
|
|
9
|
+
用中文输出(命令/路径/代码标识符保持原样不翻译)。
|
|
10
|
+
|
|
11
|
+
目标:
|
|
12
|
+
- 从当前安装的 `@aipper/aiws-spec` 刷新模板托管面(replace_file + managed blocks)
|
|
13
|
+
- 更新前备份到 `.aiws/backups/<timestamp>/`
|
|
14
|
+
|
|
15
|
+
建议执行:
|
|
16
|
+
1) `npx @aipper/aiws update .`
|
|
17
|
+
2) `npx @aipper/aiws validate .`
|
|
18
|
+
|
|
19
|
+
约束:
|
|
20
|
+
- 不写入任何 secrets
|
|
21
|
+
- 若托管块 marker 被破坏,`aiws update` 必须失败(提示重新 `aiws init` 或手工修复)
|
|
22
|
+
"""
|
|
23
|
+
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# Command: aiws:validate
|
|
2
|
+
# Description: aiws 强门禁校验(required 结构 + 漂移检测 + python3 gate)
|
|
3
|
+
# Category: aiws
|
|
4
|
+
# Version: 1
|
|
5
|
+
|
|
6
|
+
description = "aiws 强门禁校验(required 结构 + 漂移检测 + python3 gate)"
|
|
7
|
+
|
|
8
|
+
prompt = """
|
|
9
|
+
用中文输出(命令/路径/代码标识符保持原样不翻译)。
|
|
10
|
+
|
|
11
|
+
目标:
|
|
12
|
+
- 作为 CI/本地门禁:校验 required 文件结构、托管块、`.aiws/manifest.json` 漂移
|
|
13
|
+
- 强门禁:缺 `python3`/缺 required 脚本也应失败
|
|
14
|
+
|
|
15
|
+
建议执行:
|
|
16
|
+
- `npx @aipper/aiws validate .`
|
|
17
|
+
"""
|
|
18
|
+
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# Command: server:commit
|
|
2
|
+
# Description: 提交 server 子模块并更新 workspace gitlink(安全,优先 Linux)
|
|
3
|
+
# Category: server
|
|
4
|
+
# Version: 1
|
|
5
|
+
|
|
6
|
+
description = "提交 server 子模块并更新 workspace gitlink(安全,优先 Linux)"
|
|
7
|
+
|
|
8
|
+
prompt = """
|
|
9
|
+
用中文输出(命令/路径/代码标识符保持原样不翻译)。
|
|
10
|
+
|
|
11
|
+
目标:在“目录A工作区”根目录下,对 `AI_WORKSPACE.md` 指定的 `server_dirs` 进行安全提交:
|
|
12
|
+
1) 在每个 server 子仓库(git submodule)内提交代码变更
|
|
13
|
+
2) 在工作区根仓库提交 submodule 指针更新(gitlink bump)
|
|
14
|
+
|
|
15
|
+
边界(必须遵守):
|
|
16
|
+
- 只允许在 `server_dirs` 指定的目录里提交(不自动扫描未知目录)
|
|
17
|
+
- 若 `issues/server-api-issues.csv` 仍存在 TODO/DOING/BLOCKED,则拒绝提交(避免“未验收就提交”)
|
|
18
|
+
- 禁止提交敏感文件:`.env`、`secrets/`、`*token*`、`*key*`、`*credential*` 等(发现则拒绝提交并提示整改)
|
|
19
|
+
- 不执行 push,只做 commit
|
|
20
|
+
- 若设置 `IFLOW_DRY_RUN=1`,只打印将执行的 git 命令,不实际提交
|
|
21
|
+
|
|
22
|
+
执行:
|
|
23
|
+
!{bash -lc '
|
|
24
|
+
set -euo pipefail
|
|
25
|
+
bash "$HOME/.iflow/hooks/server_commit.sh"
|
|
26
|
+
'}
|
|
27
|
+
"""
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
# Command: server:drain
|
|
2
|
+
# Description: 低输出 runner 循环:小批量执行直到出现 BLOCKED 或全部 DONE/SKIP
|
|
3
|
+
# Category: server
|
|
4
|
+
# Version: 1
|
|
5
|
+
|
|
6
|
+
description = "低输出 runner 循环:小批量执行直到出现 BLOCKED 或全部 DONE/SKIP"
|
|
7
|
+
|
|
8
|
+
prompt = """
|
|
9
|
+
用中文输出;命令与路径保持原样不翻译。
|
|
10
|
+
|
|
11
|
+
目标:用**极少输出**把 TODO 推进到 DONE/SKIP,避免长时间让 LLM 参与导致 token 膨胀或 iFlow 崩溃。
|
|
12
|
+
|
|
13
|
+
行为:
|
|
14
|
+
- 只循环运行 `tools/server_test_runner.py`(小批量:--max-endpoints)。
|
|
15
|
+
- 一旦检测到 `issues/server-api-issues.csv` 出现 BLOCKED:立即停止,并提示用户进入 `/server-fix`(修复闭环)。
|
|
16
|
+
- 不读取/不打印 `.out` / `.log.txt` 正文;只输出汇总数字与下一步命令。
|
|
17
|
+
|
|
18
|
+
无人值守(可选):
|
|
19
|
+
- 推荐用外部 watchdog(systemd/cron)启动本命令;当检测到 BLOCKED 或 iFlow 崩溃时,由 watchdog 决定是否触发 `/server-fix`。
|
|
20
|
+
|
|
21
|
+
前置:
|
|
22
|
+
- 当前目录为 workspace 根目录(目录A)
|
|
23
|
+
- 已存在 AI_WORKSPACE.md、REQUIREMENTS.md、tools/server_test_runner.py、secrets/test-accounts.json
|
|
24
|
+
- 已安装 uv
|
|
25
|
+
|
|
26
|
+
Execute:
|
|
27
|
+
!{bash -lc '
|
|
28
|
+
set -euo pipefail
|
|
29
|
+
|
|
30
|
+
die() { echo "error: $*" >&2; exit 2; }
|
|
31
|
+
need() { [[ -f "$1" ]] || die "missing: $1"; }
|
|
32
|
+
|
|
33
|
+
need "AI_WORKSPACE.md"
|
|
34
|
+
need "REQUIREMENTS.md"
|
|
35
|
+
need "tools/server_test_runner.py"
|
|
36
|
+
need "secrets/test-accounts.json"
|
|
37
|
+
command -v uv >/dev/null 2>&1 || die "missing: uv"
|
|
38
|
+
|
|
39
|
+
csv="issues/server-api-issues.csv"
|
|
40
|
+
max_rounds="${IFLOW_DRAIN_MAX_ROUNDS:-50}"
|
|
41
|
+
max_endpoints="${IFLOW_DRAIN_MAX_ENDPOINTS:-30}"
|
|
42
|
+
sleep_s="${IFLOW_DRAIN_SLEEP_S:-0}"
|
|
43
|
+
|
|
44
|
+
runner_args=(--workspace . --manage-service --max-endpoints "$max_endpoints" --max-response-bytes 65536 --max-report-blocked 50)
|
|
45
|
+
|
|
46
|
+
lock_dir=".agentdocs/tmp/server-test/.drain.lock"
|
|
47
|
+
mkdir -p ".agentdocs/tmp/server-test"
|
|
48
|
+
if ! mkdir "$lock_dir" 2>/dev/null; then
|
|
49
|
+
echo "error: another /server-drain is running (lock: $lock_dir)" >&2
|
|
50
|
+
exit 2
|
|
51
|
+
fi
|
|
52
|
+
cleanup() { rmdir "$lock_dir" 2>/dev/null || true; }
|
|
53
|
+
trap cleanup EXIT INT TERM
|
|
54
|
+
|
|
55
|
+
echo "drain: max_rounds=$max_rounds max_endpoints=$max_endpoints auto_fix=$auto_fix auto_fix_max=$auto_fix_max sleep_s=$sleep_s"
|
|
56
|
+
echo "drain: max_rounds=$max_rounds max_endpoints=$max_endpoints sleep_s=$sleep_s"
|
|
57
|
+
|
|
58
|
+
i=1
|
|
59
|
+
while [[ "$i" -le "$max_rounds" ]]; do
|
|
60
|
+
echo ""
|
|
61
|
+
echo "== round $i =="
|
|
62
|
+
uv run tools/server_test_runner.py "${runner_args[@]}" >/dev/null
|
|
63
|
+
|
|
64
|
+
if [[ ! -f "$csv" ]]; then
|
|
65
|
+
die "missing after runner: $csv"
|
|
66
|
+
fi
|
|
67
|
+
|
|
68
|
+
# Print minimal summary (no bodies/logs).
|
|
69
|
+
python3 - <<PY 2>/dev/null || true
|
|
70
|
+
import csv
|
|
71
|
+
from collections import Counter
|
|
72
|
+
path="$csv"
|
|
73
|
+
with open(path, newline="", encoding="utf-8") as f:
|
|
74
|
+
rows=list(csv.DictReader(f))
|
|
75
|
+
c=Counter((r.get("Test_Status","") or "").strip().upper() for r in rows)
|
|
76
|
+
print("summary:", " ".join(f"{k}={c.get(k,0)}" for k in ["DONE","BLOCKED","SKIP","TODO","DOING"]))
|
|
77
|
+
PY
|
|
78
|
+
|
|
79
|
+
if grep -qE ",BLOCKED," "$csv"; then
|
|
80
|
+
echo "blocked: detected BLOCKED in $csv"
|
|
81
|
+
echo "next: /server-fix"
|
|
82
|
+
exit 3
|
|
83
|
+
fi
|
|
84
|
+
|
|
85
|
+
if grep -qE ",(TODO|DOING)," "$csv"; then
|
|
86
|
+
if [[ "$sleep_s" -gt 0 ]]; then sleep "$sleep_s" || true; fi
|
|
87
|
+
i=$((i+1))
|
|
88
|
+
continue
|
|
89
|
+
fi
|
|
90
|
+
|
|
91
|
+
echo "ok: all DONE/SKIP (no TODO/DOING/BLOCKED)"
|
|
92
|
+
exit 0
|
|
93
|
+
done
|
|
94
|
+
|
|
95
|
+
echo "warn: reached max rounds ($max_rounds) with remaining TODO/DOING"
|
|
96
|
+
echo "next: re-run /server-drain (or switch to /server-fix if you suspect hidden failures)"
|
|
97
|
+
exit 1
|
|
98
|
+
'}
|
|
99
|
+
"""
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# Command: server:fix-and-commit
|
|
2
|
+
# Description: 自动修复闭环,全部通过后提交子模块(仅 test 环境)
|
|
3
|
+
# Category: server
|
|
4
|
+
# Version: 1
|
|
5
|
+
|
|
6
|
+
description = "自动修复闭环,全部通过后提交子模块(仅 test 环境)"
|
|
7
|
+
|
|
8
|
+
prompt = """
|
|
9
|
+
用中文输出(命令/路径/代码标识符保持原样不翻译)。
|
|
10
|
+
|
|
11
|
+
目标:减少人工干预,一条命令完成:
|
|
12
|
+
1) `/server-fix` 自动闭环(必要时自动补齐计划与产物,runner 生成 report)
|
|
13
|
+
2) 若全部 DONE/SKIP,则自动执行 `/server-commit`
|
|
14
|
+
|
|
15
|
+
边界:
|
|
16
|
+
- 只允许在测试环境执行自动提交:AI_WORKSPACE.md 中必须声明 `environment: \"test\"`
|
|
17
|
+
- 若仍有 BLOCKED/TODO/DOING,则禁止提交
|
|
18
|
+
- 禁止提交敏感文件(.env、secrets/ 等);若检测到应停止并提示整改
|
|
19
|
+
- 不做 push
|
|
20
|
+
|
|
21
|
+
执行步骤(按顺序):
|
|
22
|
+
1) 先执行 `/server-fix`,直到:
|
|
23
|
+
- 全部 DONE/SKIP(通过),或
|
|
24
|
+
- 达到迭代上限(失败停止)
|
|
25
|
+
2) 若通过:立即执行 `/server-commit`
|
|
26
|
+
3) 若未通过:输出剩余 BLOCKED 清单与证据路径(report.json / *.out / *.log.txt),不要提交
|
|
27
|
+
"""
|