@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,55 @@
|
|
|
1
|
+
# changes/(变更工件目录)
|
|
2
|
+
|
|
3
|
+
本目录用于保存每一次“需求交付 / 问题修复”的可审计产物,避免关键约定只存在于聊天记录。
|
|
4
|
+
|
|
5
|
+
真值文件仍然是:
|
|
6
|
+
- `AI_PROJECT.md`(约束真值)
|
|
7
|
+
- `AI_WORKSPACE.md`(运行/测试真值)
|
|
8
|
+
- `REQUIREMENTS.md`(需求/验收真值)
|
|
9
|
+
|
|
10
|
+
建议结构:
|
|
11
|
+
```
|
|
12
|
+
changes/
|
|
13
|
+
README.md
|
|
14
|
+
<change-id>/
|
|
15
|
+
proposal.md
|
|
16
|
+
design.md # 可选
|
|
17
|
+
tasks.md
|
|
18
|
+
.ws-change.json
|
|
19
|
+
archive/
|
|
20
|
+
YYYY-MM-DD-<change-id>/
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
常用命令(推荐使用 `aiws`;不依赖 dotfiles):
|
|
24
|
+
- `aiws change start <change-id>`(推荐:自动切到 `change/<change-id>` 并初始化工件目录)
|
|
25
|
+
- `aiws change new <change-id>`
|
|
26
|
+
- `aiws change list`
|
|
27
|
+
- `aiws change status <change-id>`
|
|
28
|
+
- `aiws change next <change-id>`
|
|
29
|
+
- `aiws change validate <change-id>`
|
|
30
|
+
- `aiws change sync <change-id>`
|
|
31
|
+
- `aiws change archive <change-id>`
|
|
32
|
+
|
|
33
|
+
Active change(推荐,团队共享):
|
|
34
|
+
- 使用分支名声明当前变更:`change/<change-id>`(也支持 `changes/`、`ws/`、`ws-change/`)
|
|
35
|
+
- 切到该分支后,可省略 `<change-id>` 执行:`aiws change status|next|validate|sync|archive`
|
|
36
|
+
|
|
37
|
+
模板覆盖(可选):
|
|
38
|
+
- 在工作区创建 `changes/templates/` 可覆盖默认模板:
|
|
39
|
+
- `changes/templates/proposal.md`
|
|
40
|
+
- `changes/templates/tasks.md`
|
|
41
|
+
- `changes/templates/design.md`
|
|
42
|
+
- 快速初始化模板:`aiws change templates init`
|
|
43
|
+
- 查看模板来源:`aiws change templates which`
|
|
44
|
+
|
|
45
|
+
注意:
|
|
46
|
+
- 不要把任何 secrets 写进 proposal/design/tasks(账号、token、内网地址等用本地私有文件/环境变量)。
|
|
47
|
+
- 若真值文件(`AI_PROJECT.md` / `AI_WORKSPACE.md` / `REQUIREMENTS.md`)在变更期间发生变化,严格校验/归档会要求先运行 `aiws change sync <change-id>` 确认基线。
|
|
48
|
+
|
|
49
|
+
Hooks/CI(推荐,硬约束):
|
|
50
|
+
- 工作区会安装 `.githooks/{pre-commit,pre-push}`(默认执行 `aiws validate .`)与门禁脚本(`tools/ws_change_check.py`、`tools/requirements_contract.py`)。
|
|
51
|
+
- **启用 hooks 需要本地配置**(不会自动提交到 git):
|
|
52
|
+
- 直接启用:`git config core.hooksPath .githooks`
|
|
53
|
+
- 或使用:`aiws hooks install .`(等价)
|
|
54
|
+
- CI 建议增加一步(对 PR 分支执行):`aiws validate .`。
|
|
55
|
+
- 紧急跳过(不推荐):`WS_CHANGE_HOOK_BYPASS=1 ...`(CI 不应允许跳过)。
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# Design: {{CHANGE_ID}}
|
|
2
|
+
|
|
3
|
+
> Title: {{TITLE}}
|
|
4
|
+
>
|
|
5
|
+
> Created: {{CREATED_AT}}
|
|
6
|
+
|
|
7
|
+
## Context
|
|
8
|
+
|
|
9
|
+
- <!-- WS:TODO 背景、现状、约束(语言/框架/部署/性能/安全) -->
|
|
10
|
+
|
|
11
|
+
## Goals / Non-Goals
|
|
12
|
+
|
|
13
|
+
**Goals:**
|
|
14
|
+
- <!-- WS:TODO -->
|
|
15
|
+
|
|
16
|
+
**Non-Goals:**
|
|
17
|
+
- <!-- WS:TODO -->
|
|
18
|
+
|
|
19
|
+
## Decisions
|
|
20
|
+
|
|
21
|
+
- <!-- WS:TODO 关键技术决策 + 为什么 -->
|
|
22
|
+
|
|
23
|
+
## Risks / Trade-offs
|
|
24
|
+
|
|
25
|
+
- <!-- WS:TODO 风险 → 缓解 -->
|
|
26
|
+
|
|
27
|
+
## Migration / Rollback
|
|
28
|
+
|
|
29
|
+
- <!-- WS:TODO 如涉及数据/接口迁移,写步骤;必须含回滚路径 -->
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# Change Proposal: {{CHANGE_ID}}
|
|
2
|
+
|
|
3
|
+
> Title: {{TITLE}}
|
|
4
|
+
>
|
|
5
|
+
> Created: {{CREATED_AT}}
|
|
6
|
+
|
|
7
|
+
## 目标与非目标
|
|
8
|
+
|
|
9
|
+
**目标:**
|
|
10
|
+
- <!-- WS:TODO 填写本次变更的目标(可验收) -->
|
|
11
|
+
|
|
12
|
+
**非目标:**
|
|
13
|
+
- <!-- WS:TODO 填写明确“不做什么”,防止 scope creep -->
|
|
14
|
+
|
|
15
|
+
## 变更归因(强制二选一)
|
|
16
|
+
|
|
17
|
+
- 需求交付:`Req_ID` = <!-- WS:TODO -->
|
|
18
|
+
- 问题修复:`Problem_ID` = <!-- WS:TODO -->
|
|
19
|
+
|
|
20
|
+
> 备注:若“问题阻塞需求”,两边都要在各自 CSV 的 `Notes` 字段互相引用对方 ID。
|
|
21
|
+
|
|
22
|
+
## 现状与问题
|
|
23
|
+
|
|
24
|
+
- <!-- WS:TODO 现状是什么、痛点是什么;必要时给证据(日志/截图/issue 链接) -->
|
|
25
|
+
|
|
26
|
+
## 方案概述(What changes)
|
|
27
|
+
|
|
28
|
+
- <!-- WS:TODO 逐条写清要改什么(行为/接口/数据/配置);BREAKING 请标注 -->
|
|
29
|
+
|
|
30
|
+
## 影响范围(Scope)
|
|
31
|
+
|
|
32
|
+
- 影响的服务/模块/目录:
|
|
33
|
+
- <!-- WS:TODO -->
|
|
34
|
+
- 可能影响的外部接口/使用方:
|
|
35
|
+
- <!-- WS:TODO -->
|
|
36
|
+
|
|
37
|
+
## 风险与回滚
|
|
38
|
+
|
|
39
|
+
- 风险:
|
|
40
|
+
- <!-- WS:TODO -->
|
|
41
|
+
- 回滚方案(必须可执行):
|
|
42
|
+
- <!-- WS:TODO -->
|
|
43
|
+
|
|
44
|
+
## 验证计划(必须可复现)
|
|
45
|
+
|
|
46
|
+
> 从 `AI_WORKSPACE.md` 选择最贴近本变更的验证入口,写成可直接复制执行的命令。
|
|
47
|
+
|
|
48
|
+
- 命令:
|
|
49
|
+
- <!-- WS:TODO 例如:`uv run tools/server_test_runner.py --workspace .` -->
|
|
50
|
+
- 期望结果:
|
|
51
|
+
- <!-- WS:TODO 例如:所有相关用例 DONE;无新增错误日志 -->
|
|
52
|
+
|
|
53
|
+
## 真值文件/合同更新清单
|
|
54
|
+
|
|
55
|
+
- `REQUIREMENTS.md`:<!-- WS:TODO 需要/不需要;如需要,写明新增/修改的验收条款 -->
|
|
56
|
+
- `requirements/CHANGELOG.md`:<!-- WS:TODO 需要/不需要 -->
|
|
57
|
+
- `requirements/requirements-issues.csv`:<!-- WS:TODO 需要/不需要 -->
|
|
58
|
+
- `issues/problem-issues.csv`:<!-- WS:TODO 需要/不需要 -->
|
|
59
|
+
- 证据落盘(`.agentdocs/tmp/...`):<!-- WS:TODO 计划输出哪些报告/日志 -->
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# Tasks: {{CHANGE_ID}}
|
|
2
|
+
|
|
3
|
+
> Title: {{TITLE}}
|
|
4
|
+
>
|
|
5
|
+
> Created: {{CREATED_AT}}
|
|
6
|
+
|
|
7
|
+
## 0. Preflight
|
|
8
|
+
|
|
9
|
+
- [ ] 0.1 阅读并遵守 `AI_PROJECT.md` / `AI_WORKSPACE.md` / `REQUIREMENTS.md`
|
|
10
|
+
- [ ] 0.2 运行门禁校验:`aiws validate .`(或 `npx -y @aipper/aiws validate .`)
|
|
11
|
+
- [ ] 0.3 若真值文件发生变化(例如你更新了 REQUIREMENTS.md),同步基线:`aiws change sync {{CHANGE_ID}}`
|
|
12
|
+
|
|
13
|
+
## 1. 需求/问题合同(如适用)
|
|
14
|
+
|
|
15
|
+
- [ ] 1.1 需求交付:补齐/更新 `REQUIREMENTS.md` 验收条款(或确认不需要)
|
|
16
|
+
- [ ] 1.2 同步 `requirements/requirements-issues.csv`(或更新 `issues/problem-issues.csv`)
|
|
17
|
+
- [ ] 1.3 记录到 `requirements/CHANGELOG.md`(如需求发生变化)
|
|
18
|
+
|
|
19
|
+
## 2. 实现
|
|
20
|
+
|
|
21
|
+
- [ ] 2.1 <!-- WS:TODO -->
|
|
22
|
+
- [ ] 2.2 <!-- WS:TODO -->
|
|
23
|
+
|
|
24
|
+
## 3. 验证(必须可复现)
|
|
25
|
+
|
|
26
|
+
- [ ] 3.1 <!-- WS:TODO 写具体命令(来自 AI_WORKSPACE.md) -->
|
|
27
|
+
- [ ] 3.2 <!-- WS:TODO 写期望结果(可判断 DONE/FAIL) -->
|
|
28
|
+
|
|
29
|
+
## 4. 交付与归档
|
|
30
|
+
|
|
31
|
+
- [ ] 4.1 证据落盘到 `.agentdocs/tmp/...`(报告/日志/请求响应等)
|
|
32
|
+
- [ ] 4.2 交叉审计(可选但推荐):在 AI 工具内运行 `/ws-review`(或按 `AI_PROJECT.md` 手工审计)
|
|
33
|
+
- [ ] 4.3 归档:`aiws change archive {{CHANGE_ID}}`
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
Problem_ID,Type,Severity,Title,Symptom,Repro,Root_Cause,Fix_Plan,Files,Tests,Evidence,Status,Owner,Created_At,Updated_At,Notes
|
|
2
|
+
PROB-000,BUG,P2,示例:/api/system/menu/routes 返回 500,"访问 routes 接口报 500;日志提示参数解析错误","curl -sS -H 'Authorization: Bearer <token>' 'http://localhost:8080/api/system/menu/routes?x=1'","Controller 入参类型与前端实际 query 不一致","对齐入参定义并补充单测;复测 runner 端点状态更新为 DONE","server/src/...","uv run tools/server_test_runner.py --workspace . --service backend --max-endpoints 10",".agentdocs/tmp/server-test/report.json",TODO,ab,YYYY-MM-DDTHH:MM:SSZ,YYYY-MM-DDTHH:MM:SSZ,"若该问题阻塞某个需求交付,在 requirements/requirements-issues.csv 的 Notes 里关联 Problem_ID"
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
{
|
|
2
|
+
"template_id": "workspace",
|
|
3
|
+
"template_version": 2,
|
|
4
|
+
"defaults": {
|
|
5
|
+
"include_optional": true,
|
|
6
|
+
"tools": ["claude", "opencode", "codex", "iflow"]
|
|
7
|
+
},
|
|
8
|
+
"required": [
|
|
9
|
+
"AGENTS.md",
|
|
10
|
+
"AI_PROJECT.md",
|
|
11
|
+
"AI_WORKSPACE.md",
|
|
12
|
+
"REQUIREMENTS.md",
|
|
13
|
+
".gitignore",
|
|
14
|
+
".aiws/manifest.json",
|
|
15
|
+
".githooks/pre-commit",
|
|
16
|
+
".githooks/pre-push",
|
|
17
|
+
"changes/README.md",
|
|
18
|
+
"requirements/CHANGELOG.md",
|
|
19
|
+
"requirements/requirements-issues.csv",
|
|
20
|
+
"issues/problem-issues.csv",
|
|
21
|
+
".agents/skills/**",
|
|
22
|
+
"tools/ws_change_check.py",
|
|
23
|
+
"tools/requirements_contract.py",
|
|
24
|
+
".claude/commands/aiws-init.md",
|
|
25
|
+
".claude/commands/aiws-update.md",
|
|
26
|
+
".claude/commands/aiws-validate.md",
|
|
27
|
+
".claude/commands/aiws-rollback.md",
|
|
28
|
+
".claude/commands/ws-preflight.md",
|
|
29
|
+
".claude/commands/ws-migrate.md",
|
|
30
|
+
".claude/commands/ws-dev.md",
|
|
31
|
+
".claude/commands/ws-analyze.md",
|
|
32
|
+
".claude/commands/ws-review.md",
|
|
33
|
+
".claude/commands/ws-rule.md",
|
|
34
|
+
".claude/commands/ws-req-review.md",
|
|
35
|
+
".claude/commands/ws-req-change.md",
|
|
36
|
+
".claude/commands/ws-req-contract-sync.md",
|
|
37
|
+
".claude/commands/ws-req-contract-validate.md",
|
|
38
|
+
".claude/commands/ws-req-flow-sync.md",
|
|
39
|
+
".opencode/command/aiws-init.md",
|
|
40
|
+
".opencode/command/aiws-update.md",
|
|
41
|
+
".opencode/command/aiws-validate.md",
|
|
42
|
+
".opencode/command/aiws-rollback.md",
|
|
43
|
+
".opencode/command/ws-preflight.md",
|
|
44
|
+
".opencode/command/ws-migrate.md",
|
|
45
|
+
".opencode/command/ws-dev.md",
|
|
46
|
+
".opencode/command/ws-analyze.md",
|
|
47
|
+
".opencode/command/ws-review.md",
|
|
48
|
+
".opencode/command/ws-rule.md",
|
|
49
|
+
".opencode/command/ws-req-review.md",
|
|
50
|
+
".opencode/command/ws-req-change.md",
|
|
51
|
+
".opencode/command/ws-req-contract-sync.md",
|
|
52
|
+
".opencode/command/ws-req-contract-validate.md",
|
|
53
|
+
".opencode/command/ws-req-flow-sync.md",
|
|
54
|
+
".iflow/commands/aiws-init.toml",
|
|
55
|
+
".iflow/commands/aiws-update.toml",
|
|
56
|
+
".iflow/commands/aiws-validate.toml",
|
|
57
|
+
".iflow/commands/aiws-rollback.toml",
|
|
58
|
+
".iflow/commands/server-test-plan.toml",
|
|
59
|
+
".iflow/commands/server-test.toml",
|
|
60
|
+
".iflow/commands/server-triage.toml",
|
|
61
|
+
".iflow/commands/server-fix.toml",
|
|
62
|
+
".iflow/commands/server-fix-and-commit.toml",
|
|
63
|
+
".iflow/commands/server-drain.toml",
|
|
64
|
+
".iflow/commands/server-commit.toml",
|
|
65
|
+
".iflow/commands/server_test-plan.toml",
|
|
66
|
+
".iflow/commands/server_test.toml",
|
|
67
|
+
".iflow/commands/ws-preflight.toml",
|
|
68
|
+
".iflow/commands/ws-migrate.toml",
|
|
69
|
+
".iflow/commands/ws-dev.toml",
|
|
70
|
+
".iflow/commands/ws-analyze.toml",
|
|
71
|
+
".iflow/commands/ws-review.toml",
|
|
72
|
+
".iflow/commands/ws-rule.toml",
|
|
73
|
+
".iflow/commands/ws-contract-check.toml",
|
|
74
|
+
".iflow/commands/ws-doctor.toml",
|
|
75
|
+
".iflow/commands/ws-env-doctor.toml",
|
|
76
|
+
".iflow/commands/ws-init.toml",
|
|
77
|
+
".iflow/commands/ws-memory-bank-init.toml",
|
|
78
|
+
".iflow/commands/ws-feature-plan.toml",
|
|
79
|
+
".iflow/commands/ws-feature-deliver.toml",
|
|
80
|
+
".iflow/commands/ws-req-review.toml",
|
|
81
|
+
".iflow/commands/ws-req-change.toml",
|
|
82
|
+
".iflow/commands/ws-req-contract-sync.toml",
|
|
83
|
+
".iflow/commands/ws-req-contract-validate.toml",
|
|
84
|
+
".iflow/commands/ws-req-flow-sync.toml"
|
|
85
|
+
],
|
|
86
|
+
"optional": [
|
|
87
|
+
".iflow/agents/**",
|
|
88
|
+
"memory-bank/**",
|
|
89
|
+
"secrets/test-accounts.example.json",
|
|
90
|
+
"changes/templates/proposal.md",
|
|
91
|
+
"changes/templates/tasks.md",
|
|
92
|
+
"changes/templates/design.md",
|
|
93
|
+
"tools/requirements_contract_sync.py",
|
|
94
|
+
"tools/requirements_flow_gen.py",
|
|
95
|
+
"tools/server_test_runner.py",
|
|
96
|
+
"tools/iflow_watchdog.sh",
|
|
97
|
+
"tools/install_iflow_watchdog_systemd_user.sh"
|
|
98
|
+
],
|
|
99
|
+
"update": {
|
|
100
|
+
"replace_file": [
|
|
101
|
+
".aiws/manifest.json",
|
|
102
|
+
".githooks/pre-commit",
|
|
103
|
+
".githooks/pre-push",
|
|
104
|
+
"tools/ws_change_check.py",
|
|
105
|
+
"tools/requirements_contract.py",
|
|
106
|
+
".agents/skills/aiws-init/SKILL.md",
|
|
107
|
+
".agents/skills/aiws-rollback/SKILL.md",
|
|
108
|
+
".agents/skills/aiws-update/SKILL.md",
|
|
109
|
+
".agents/skills/aiws-validate/SKILL.md",
|
|
110
|
+
".agents/skills/aiws-hooks-install/SKILL.md",
|
|
111
|
+
".agents/skills/aiws-hooks-status/SKILL.md",
|
|
112
|
+
".agents/skills/aiws-change-list/SKILL.md",
|
|
113
|
+
".agents/skills/aiws-change-new/SKILL.md",
|
|
114
|
+
".agents/skills/aiws-change-start/SKILL.md",
|
|
115
|
+
".agents/skills/aiws-change-status/SKILL.md",
|
|
116
|
+
".agents/skills/aiws-change-next/SKILL.md",
|
|
117
|
+
".agents/skills/aiws-change-sync/SKILL.md",
|
|
118
|
+
".agents/skills/aiws-change-validate/SKILL.md",
|
|
119
|
+
".agents/skills/aiws-change-archive/SKILL.md",
|
|
120
|
+
".agents/skills/aiws-change-templates-which/SKILL.md",
|
|
121
|
+
".agents/skills/aiws-change-templates-init/SKILL.md",
|
|
122
|
+
".agents/skills/ws-analyze/SKILL.md",
|
|
123
|
+
".agents/skills/ws-commit/SKILL.md",
|
|
124
|
+
".agents/skills/ws-dev/SKILL.md",
|
|
125
|
+
".agents/skills/ws-migrate/SKILL.md",
|
|
126
|
+
".agents/skills/ws-plan/SKILL.md",
|
|
127
|
+
".agents/skills/ws-preflight/SKILL.md",
|
|
128
|
+
".agents/skills/ws-req-change/SKILL.md",
|
|
129
|
+
".agents/skills/ws-req-contract-sync/SKILL.md",
|
|
130
|
+
".agents/skills/ws-req-contract-validate/SKILL.md",
|
|
131
|
+
".agents/skills/ws-req-flow-sync/SKILL.md",
|
|
132
|
+
".agents/skills/ws-req-review/SKILL.md",
|
|
133
|
+
".agents/skills/ws-review/SKILL.md",
|
|
134
|
+
".agents/skills/ws-rule/SKILL.md",
|
|
135
|
+
".iflow/commands/aiws-init.toml",
|
|
136
|
+
".iflow/commands/aiws-update.toml",
|
|
137
|
+
".iflow/commands/aiws-validate.toml",
|
|
138
|
+
".iflow/commands/aiws-rollback.toml",
|
|
139
|
+
".iflow/commands/server-test-plan.toml",
|
|
140
|
+
".iflow/commands/server-test.toml",
|
|
141
|
+
".iflow/commands/server-triage.toml",
|
|
142
|
+
".iflow/commands/server-fix.toml",
|
|
143
|
+
".iflow/commands/server-fix-and-commit.toml",
|
|
144
|
+
".iflow/commands/server-drain.toml",
|
|
145
|
+
".iflow/commands/server-commit.toml",
|
|
146
|
+
".iflow/commands/server_test-plan.toml",
|
|
147
|
+
".iflow/commands/server_test.toml",
|
|
148
|
+
".iflow/commands/ws-preflight.toml",
|
|
149
|
+
".iflow/commands/ws-migrate.toml",
|
|
150
|
+
".iflow/commands/ws-dev.toml",
|
|
151
|
+
".iflow/commands/ws-analyze.toml",
|
|
152
|
+
".iflow/commands/ws-review.toml",
|
|
153
|
+
".iflow/commands/ws-rule.toml",
|
|
154
|
+
".iflow/commands/ws-contract-check.toml",
|
|
155
|
+
".iflow/commands/ws-doctor.toml",
|
|
156
|
+
".iflow/commands/ws-env-doctor.toml",
|
|
157
|
+
".iflow/commands/ws-init.toml",
|
|
158
|
+
".iflow/commands/ws-memory-bank-init.toml",
|
|
159
|
+
".iflow/commands/ws-feature-plan.toml",
|
|
160
|
+
".iflow/commands/ws-feature-deliver.toml",
|
|
161
|
+
".iflow/commands/ws-req-review.toml",
|
|
162
|
+
".iflow/commands/ws-req-change.toml",
|
|
163
|
+
".iflow/commands/ws-req-contract-sync.toml",
|
|
164
|
+
".iflow/commands/ws-req-contract-validate.toml",
|
|
165
|
+
".iflow/commands/ws-req-flow-sync.toml"
|
|
166
|
+
],
|
|
167
|
+
"managed_blocks": {
|
|
168
|
+
"AGENTS.md": ["agents"],
|
|
169
|
+
"AI_PROJECT.md": ["ai-project:core"],
|
|
170
|
+
"AI_WORKSPACE.md": ["ai-workspace:core"],
|
|
171
|
+
"REQUIREMENTS.md": ["requirements:contract"],
|
|
172
|
+
".gitignore": ["gitignore"],
|
|
173
|
+
".claude/commands/aiws-init.md": ["claude:aiws-init"],
|
|
174
|
+
".claude/commands/aiws-update.md": ["claude:aiws-update"],
|
|
175
|
+
".claude/commands/aiws-validate.md": ["claude:aiws-validate"],
|
|
176
|
+
".claude/commands/aiws-rollback.md": ["claude:aiws-rollback"],
|
|
177
|
+
".claude/commands/ws-preflight.md": ["claude:ws-preflight"],
|
|
178
|
+
".claude/commands/ws-migrate.md": ["claude:ws-migrate"],
|
|
179
|
+
".claude/commands/ws-dev.md": ["claude:ws-dev"],
|
|
180
|
+
".claude/commands/ws-analyze.md": ["claude:ws-analyze"],
|
|
181
|
+
".claude/commands/ws-review.md": ["claude:ws-review"],
|
|
182
|
+
".claude/commands/ws-rule.md": ["claude:ws-rule"],
|
|
183
|
+
".claude/commands/ws-req-review.md": ["claude:ws-req-review"],
|
|
184
|
+
".claude/commands/ws-req-change.md": ["claude:ws-req-change"],
|
|
185
|
+
".claude/commands/ws-req-contract-sync.md": ["claude:ws-req-contract-sync"],
|
|
186
|
+
".claude/commands/ws-req-contract-validate.md": ["claude:ws-req-contract-validate"],
|
|
187
|
+
".claude/commands/ws-req-flow-sync.md": ["claude:ws-req-flow-sync"],
|
|
188
|
+
".opencode/command/aiws-init.md": ["opencode:aiws-init"],
|
|
189
|
+
".opencode/command/aiws-update.md": ["opencode:aiws-update"],
|
|
190
|
+
".opencode/command/aiws-validate.md": ["opencode:aiws-validate"],
|
|
191
|
+
".opencode/command/aiws-rollback.md": ["opencode:aiws-rollback"],
|
|
192
|
+
".opencode/command/ws-preflight.md": ["opencode:ws-preflight"],
|
|
193
|
+
".opencode/command/ws-migrate.md": ["opencode:ws-migrate"],
|
|
194
|
+
".opencode/command/ws-dev.md": ["opencode:ws-dev"],
|
|
195
|
+
".opencode/command/ws-analyze.md": ["opencode:ws-analyze"],
|
|
196
|
+
".opencode/command/ws-review.md": ["opencode:ws-review"],
|
|
197
|
+
".opencode/command/ws-rule.md": ["opencode:ws-rule"],
|
|
198
|
+
".opencode/command/ws-req-review.md": ["opencode:ws-req-review"],
|
|
199
|
+
".opencode/command/ws-req-change.md": ["opencode:ws-req-change"],
|
|
200
|
+
".opencode/command/ws-req-contract-sync.md": ["opencode:ws-req-contract-sync"],
|
|
201
|
+
".opencode/command/ws-req-contract-validate.md": ["opencode:ws-req-contract-validate"],
|
|
202
|
+
".opencode/command/ws-req-flow-sync.md": ["opencode:ws-req-flow-sync"]
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# Memory Bank(工作区上下文)
|
|
2
|
+
|
|
3
|
+
目的:给 iFlow/Codex/Claude 一个“固定且可持续更新”的上下文集合,避免每次会话重新讲一遍导致跑偏。
|
|
4
|
+
|
|
5
|
+
在你的工作区中:
|
|
6
|
+
- `REQUIREMENTS.md` 仍是**需求真值**(不要复制到这里)。
|
|
7
|
+
- `AI_PROJECT.md` / `AI_WORKSPACE.md` 是**边界与运行真值**。
|
|
8
|
+
- 本目录补齐的是“实现过程中的稳定上下文”(更偏工程视角)。
|
|
9
|
+
|
|
10
|
+
建议规则:
|
|
11
|
+
- 改代码前:先看 `REQUIREMENTS.md` + `AI_PROJECT.md` + `AI_WORKSPACE.md`,再结合本目录的 `architecture.md`/`progress.md`。
|
|
12
|
+
- 每次完成一个可验证的小步:更新 `progress.md`(写清:做了什么、证据路径、下一步)。
|
|
13
|
+
- 发生重大结构变化:更新 `architecture.md`(只写高层关系,不要堆细节)。
|
|
14
|
+
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# Requirements Changelog
|
|
2
|
+
|
|
3
|
+
本文件记录“需求变更历史”。`REQUIREMENTS.md` 始终表示“当前有效需求”,变更过程在此追踪。
|
|
4
|
+
|
|
5
|
+
规则:
|
|
6
|
+
- 任何需求变更必须追加一条记录(不要覆盖历史)。
|
|
7
|
+
- 记录应可审计:说明变更内容、原因、影响范围、关联 issues/PR。
|
|
8
|
+
- 不要写入 secrets。
|
|
9
|
+
|
|
10
|
+
| 日期 | 变更内容 | 原因/背景 | 影响范围(模块/接口) | 关联 issues/PR | 记录人 |
|
|
11
|
+
|---|---|---|---|---|---|
|
|
12
|
+
| YYYY-MM-DD | | | | | |
|
|
13
|
+
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
Req_ID,Title,Change_Type,Module,CRUD,Actor,Scenario,Preconditions,Inputs,Outputs,Data_Model,Business_Logic,API_Impact,NonFunctional,Spec_Status,Impl_Status,Tests,Evidence,Owner,Created_At,Updated_At,Notes
|
|
2
|
+
REQ-000,示例:用户列表分页支持按部门筛选,ADD,system/user,R,admin,管理员在用户管理页按部门筛选列表,已登录且有 system:user:list 权限,"deptId=10&page=1&pageSize=20",返回包含 deptId=10 的用户列表,"user,dept 表(字段:dept_id)","查询条件增加 deptId;默认不传不筛选;分页参数边界:page>=1&pageSize<=100",GET /api/system/user/list 新增 query 参数 deptId(可选),响应字段不变,性能:分页查询需走索引;安全:权限不变,READY,TODO,"uv run tools/server_test_runner.py --workspace . --service demo-spring --max-endpoints 10",.agentdocs/tmp/server-test/report.json,ab,YYYY-MM-DDTHH:MM:SSZ,YYYY-MM-DDTHH:MM:SSZ,
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
{
|
|
2
|
+
"base_url": "http://127.0.0.1:8080",
|
|
3
|
+
"services": {
|
|
4
|
+
"backend": {
|
|
5
|
+
"base_url": "http://127.0.0.1:8080"
|
|
6
|
+
}
|
|
7
|
+
},
|
|
8
|
+
"test_resource_ids": {
|
|
9
|
+
"id": "1"
|
|
10
|
+
},
|
|
11
|
+
"auth": {
|
|
12
|
+
"type": "login",
|
|
13
|
+
"login_path": "/login",
|
|
14
|
+
"username_field": "username",
|
|
15
|
+
"password_field": "password",
|
|
16
|
+
"token_json_path": "token",
|
|
17
|
+
"header_name": "Authorization",
|
|
18
|
+
"scheme": "Bearer"
|
|
19
|
+
},
|
|
20
|
+
"accounts": [
|
|
21
|
+
{
|
|
22
|
+
"name": "smoke-user",
|
|
23
|
+
"username": "user@example.com",
|
|
24
|
+
"password": "<password>"
|
|
25
|
+
}
|
|
26
|
+
],
|
|
27
|
+
"openapi_auth": {
|
|
28
|
+
"type": "basic",
|
|
29
|
+
"username": "<doc-user>",
|
|
30
|
+
"password": "<doc-pass>"
|
|
31
|
+
}
|
|
32
|
+
}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
set -euo pipefail
|
|
3
|
+
|
|
4
|
+
# iFlow unattended watchdog for AI Workspace (Arch Linux/systemd friendly).
|
|
5
|
+
#
|
|
6
|
+
# Goal:
|
|
7
|
+
# - Run /server-drain in a loop (low output, small batches).
|
|
8
|
+
# - If drain reports BLOCKED (exit 3) or crashes, run /server-fix in a fresh iFlow process (bounded).
|
|
9
|
+
# - Keep outputs in .agentdocs/tmp/server-test/ to avoid blowing up interactive sessions.
|
|
10
|
+
#
|
|
11
|
+
# Safety:
|
|
12
|
+
# - Intended for test environments only.
|
|
13
|
+
# - Requires explicit IFLOW_WATCHDOG_YOLO=1 to run with --yolo.
|
|
14
|
+
|
|
15
|
+
die() { echo "error: $*" >&2; exit 2; }
|
|
16
|
+
need_file() { [[ -f "$1" ]] || die "missing: $1"; }
|
|
17
|
+
have() { command -v "$1" >/dev/null 2>&1; }
|
|
18
|
+
|
|
19
|
+
root="${IFLOW_WATCHDOG_ROOT:-.}"
|
|
20
|
+
cd "$root"
|
|
21
|
+
|
|
22
|
+
need_file "AI_WORKSPACE.md"
|
|
23
|
+
need_file "REQUIREMENTS.md"
|
|
24
|
+
need_file "tools/server_test_runner.py"
|
|
25
|
+
need_file "secrets/test-accounts.json"
|
|
26
|
+
|
|
27
|
+
have iflow || die "missing: iflow"
|
|
28
|
+
have uv || die "missing: uv (runner requires uv)"
|
|
29
|
+
|
|
30
|
+
csv="issues/server-api-issues.csv"
|
|
31
|
+
workspace_dir="$(pwd)"
|
|
32
|
+
log_dir="${IFLOW_WATCHDOG_LOG_DIR:-$workspace_dir/.agentdocs/tmp/server-test}"
|
|
33
|
+
mkdir -p "$log_dir"
|
|
34
|
+
|
|
35
|
+
fatal_log="$log_dir/watchdog-fatal.log"
|
|
36
|
+
timestamp() { date +"%Y-%m-%dT%H:%M:%S%z"; }
|
|
37
|
+
say() { printf "[%s] %s\n" "$(timestamp)" "$*"; }
|
|
38
|
+
fatal() { say "fatal: $*" | tee -a "$fatal_log" >&2; exit 2; }
|
|
39
|
+
|
|
40
|
+
yolo="${IFLOW_WATCHDOG_YOLO:-0}"
|
|
41
|
+
if [[ "$yolo" != "1" ]]; then
|
|
42
|
+
fatal "unattended mode requires IFLOW_WATCHDOG_YOLO=1 (this will use iflow --yolo; test env only)"
|
|
43
|
+
fi
|
|
44
|
+
|
|
45
|
+
if ! iflow --version >/dev/null 2>&1; then
|
|
46
|
+
fatal "iflow command failed (check auth/config/environment)"
|
|
47
|
+
fi
|
|
48
|
+
|
|
49
|
+
date_suffix="$(date +%Y%m%d)"
|
|
50
|
+
drain_log="${IFLOW_WATCHDOG_DRAIN_LOG:-$log_dir/iflow-drain-$date_suffix.log}"
|
|
51
|
+
fix_log="${IFLOW_WATCHDOG_FIX_LOG:-$log_dir/iflow-fix-$date_suffix.log}"
|
|
52
|
+
find "$log_dir" -maxdepth 1 -type f -name "iflow-*.log" -mtime +7 -delete 2>/dev/null || true
|
|
53
|
+
|
|
54
|
+
lock_dir="$log_dir/.watchdog.lock"
|
|
55
|
+
pid_file="$lock_dir/pid"
|
|
56
|
+
if ! mkdir "$lock_dir" 2>/dev/null; then
|
|
57
|
+
other_pid="$(cat "$pid_file" 2>/dev/null || true)"
|
|
58
|
+
fatal "another watchdog is running (lock: $lock_dir pid=${other_pid:-unknown})"
|
|
59
|
+
fi
|
|
60
|
+
printf "%s\n" "$$" >"$pid_file" 2>/dev/null || true
|
|
61
|
+
|
|
62
|
+
cleanup() {
|
|
63
|
+
say "cleanup: stopping child iflow processes (if any)" >>"$fatal_log" 2>/dev/null || true
|
|
64
|
+
pkill -P $$ iflow 2>/dev/null || true
|
|
65
|
+
rm -f "$pid_file" 2>/dev/null || true
|
|
66
|
+
rmdir "$lock_dir" 2>/dev/null || true
|
|
67
|
+
}
|
|
68
|
+
trap cleanup EXIT INT TERM
|
|
69
|
+
|
|
70
|
+
drain_timeout="${IFLOW_WATCHDOG_DRAIN_TIMEOUT:-7200}"
|
|
71
|
+
fix_timeout="${IFLOW_WATCHDOG_FIX_TIMEOUT:-3600}"
|
|
72
|
+
drain_max_turns="${IFLOW_WATCHDOG_DRAIN_MAX_TURNS:-6}"
|
|
73
|
+
fix_max_turns="${IFLOW_WATCHDOG_FIX_MAX_TURNS:-12}"
|
|
74
|
+
drain_max_tokens="${IFLOW_WATCHDOG_DRAIN_MAX_TOKENS:-15000}"
|
|
75
|
+
fix_max_tokens="${IFLOW_WATCHDOG_FIX_MAX_TOKENS:-30000}"
|
|
76
|
+
|
|
77
|
+
max_cycles="${IFLOW_WATCHDOG_MAX_CYCLES:-200}"
|
|
78
|
+
sleep_s="${IFLOW_WATCHDOG_SLEEP_S:-10}"
|
|
79
|
+
fix_retry_max="${IFLOW_WATCHDOG_FIX_RETRY_MAX:-3}"
|
|
80
|
+
fix_retry_file="$log_dir/.fix-retry-count"
|
|
81
|
+
|
|
82
|
+
drain_max_endpoints="${IFLOW_DRAIN_MAX_ENDPOINTS:-30}"
|
|
83
|
+
drain_sleep_s="${IFLOW_DRAIN_SLEEP_S:-0}"
|
|
84
|
+
|
|
85
|
+
csv_has_blocked() { [[ -f "$csv" ]] && grep -qE ",BLOCKED," "$csv"; }
|
|
86
|
+
|
|
87
|
+
run_drain() {
|
|
88
|
+
say "run: /server-drain (max_endpoints=$drain_max_endpoints)"
|
|
89
|
+
IFLOW_DRAIN_MAX_ENDPOINTS="$drain_max_endpoints" \
|
|
90
|
+
IFLOW_DRAIN_SLEEP_S="$drain_sleep_s" \
|
|
91
|
+
iflow --yolo -p "/server-drain" --timeout "$drain_timeout" --max-turns "$drain_max_turns" --max-tokens "$drain_max_tokens" >>"$drain_log" 2>&1
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
run_fix() {
|
|
95
|
+
say "run: /server-fix"
|
|
96
|
+
retry_count="$(cat "$fix_retry_file" 2>/dev/null || echo 0)"
|
|
97
|
+
if [[ "$retry_count" -ge "$fix_retry_max" ]]; then
|
|
98
|
+
fatal "fix reached retry limit ($fix_retry_max); check $fix_log"
|
|
99
|
+
fi
|
|
100
|
+
if iflow --yolo -p "/server-fix" --timeout "$fix_timeout" --max-turns "$fix_max_turns" --max-tokens "$fix_max_tokens" >>"$fix_log" 2>&1; then
|
|
101
|
+
rm -f "$fix_retry_file" 2>/dev/null || true
|
|
102
|
+
else
|
|
103
|
+
echo $((retry_count + 1)) >"$fix_retry_file" 2>/dev/null || true
|
|
104
|
+
fi
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
say "watchdog: start (cycles=$max_cycles sleep_s=$sleep_s)"
|
|
108
|
+
say "logs: drain=$drain_log fix=$fix_log"
|
|
109
|
+
|
|
110
|
+
cycle=1
|
|
111
|
+
while [[ "$cycle" -le "$max_cycles" ]]; do
|
|
112
|
+
if csv_has_blocked; then
|
|
113
|
+
say "state: BLOCKED detected in $csv (trigger fix)"
|
|
114
|
+
run_fix
|
|
115
|
+
fi
|
|
116
|
+
|
|
117
|
+
set +e
|
|
118
|
+
run_drain
|
|
119
|
+
rc=$?
|
|
120
|
+
set -e
|
|
121
|
+
|
|
122
|
+
if [[ "$rc" == "0" ]]; then
|
|
123
|
+
say "done: drain finished with all DONE/SKIP"
|
|
124
|
+
exit 0
|
|
125
|
+
fi
|
|
126
|
+
|
|
127
|
+
if [[ "$rc" == "3" ]] || csv_has_blocked; then
|
|
128
|
+
say "blocked: drain reported BLOCKED (rc=$rc), trigger fix"
|
|
129
|
+
run_fix
|
|
130
|
+
else
|
|
131
|
+
say "warn: drain exited rc=$rc without BLOCKED; will retry"
|
|
132
|
+
fi
|
|
133
|
+
|
|
134
|
+
sleep "$sleep_s" || true
|
|
135
|
+
cycle=$((cycle + 1))
|
|
136
|
+
done
|
|
137
|
+
|
|
138
|
+
fatal "reached max cycles ($max_cycles); check logs under $log_dir"
|