@aipper/aiws-spec 0.0.25 → 0.0.27

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 (101) hide show
  1. package/docs/aiws-governance-positioning.md +1 -1
  2. package/docs/cli-interface.md +10 -5
  3. package/docs/collaboration-artifacts.md +1 -1
  4. package/docs/spec-contract.md +5 -12
  5. package/docs/workflow-governance-rules.json +18 -4
  6. package/docs/workflow-governance-rules.md +8 -6
  7. package/docs/workflow-router-rules.json +2 -2
  8. package/docs/workflow-router-rules.md +2 -2
  9. package/docs/workflow-stage-contracts.json +9 -9
  10. package/docs/workflow-stage-contracts.md +5 -5
  11. package/package.json +1 -1
  12. package/templates/workspace/.agents/skills/using-aiws/SKILL.md +5 -1
  13. package/templates/workspace/.agents/skills/ws-commit/SKILL.md +4 -1
  14. package/templates/workspace/.agents/skills/ws-deliver/SKILL.md +3 -4
  15. package/templates/workspace/.agents/skills/ws-dev-lite/SKILL.md +58 -0
  16. package/templates/workspace/.agents/skills/ws-finish/SKILL.md +13 -16
  17. package/templates/workspace/.agents/skills/ws-handoff/SKILL.md +8 -8
  18. package/templates/workspace/.aiws/manifest.json +2 -6
  19. package/templates/workspace/.claude/commands/using-aiws.md +3 -2
  20. package/templates/workspace/.claude/commands/ws-dev-lite.md +31 -0
  21. package/templates/workspace/.claude/commands/ws-finish.md +9 -5
  22. package/templates/workspace/.claude/commands/ws-handoff.md +3 -2
  23. package/templates/workspace/.claude/commands/ws-review.md +2 -2
  24. package/templates/workspace/.claude/skills/using-aiws/SKILL.md +5 -1
  25. package/templates/workspace/.claude/skills/ws-commit/SKILL.md +4 -1
  26. package/templates/workspace/.claude/skills/ws-deliver/SKILL.md +3 -4
  27. package/templates/workspace/.claude/skills/ws-dev-lite/SKILL.md +58 -0
  28. package/templates/workspace/.claude/skills/ws-finish/SKILL.md +13 -16
  29. package/templates/workspace/.claude/skills/ws-handoff/SKILL.md +8 -8
  30. package/templates/workspace/.githooks/commit-msg +10 -0
  31. package/templates/workspace/.opencode/command/using-aiws.md +3 -2
  32. package/templates/workspace/.opencode/command/ws-dev-lite.md +34 -0
  33. package/templates/workspace/.opencode/command/ws-finish.md +9 -5
  34. package/templates/workspace/.opencode/command/ws-handoff.md +4 -3
  35. package/templates/workspace/.opencode/command/ws-review.md +2 -2
  36. package/templates/workspace/.opencode/commands/using-aiws.md +3 -2
  37. package/templates/workspace/.opencode/commands/ws-dev-lite.md +34 -0
  38. package/templates/workspace/.opencode/commands/ws-finish.md +9 -5
  39. package/templates/workspace/.opencode/commands/ws-handoff.md +4 -3
  40. package/templates/workspace/.opencode/commands/ws-review.md +2 -2
  41. package/templates/workspace/.opencode/skills/using-aiws/SKILL.md +5 -1
  42. package/templates/workspace/.opencode/skills/ws-commit/SKILL.md +4 -1
  43. package/templates/workspace/.opencode/skills/ws-deliver/SKILL.md +3 -4
  44. package/templates/workspace/.opencode/skills/ws-dev-lite/SKILL.md +58 -0
  45. package/templates/workspace/.opencode/skills/ws-finish/SKILL.md +13 -16
  46. package/templates/workspace/.opencode/skills/ws-handoff/SKILL.md +8 -8
  47. package/templates/workspace/AGENTS.md +5 -3
  48. package/templates/workspace/AI_PROJECT.md +1 -1
  49. package/templates/workspace/AI_WORKSPACE.md +1 -1
  50. package/templates/workspace/changes/README.md +10 -6
  51. package/templates/workspace/changes/templates/tasks.md +1 -1
  52. package/templates/workspace/manifest.json +63 -80
  53. package/templates/workspace/memory-bank/README.md +1 -2
  54. package/templates/workspace/tools/ws_change_check.py +224 -7
  55. package/templates/workspace/.iflow/agents/feature-reviewer.md +0 -27
  56. package/templates/workspace/.iflow/agents/requirements-analyst.md +0 -24
  57. package/templates/workspace/.iflow/agents/server-commit-manager.md +0 -28
  58. package/templates/workspace/.iflow/agents/server-fix-implementer.md +0 -31
  59. package/templates/workspace/.iflow/agents/server-test-planner.md +0 -28
  60. package/templates/workspace/.iflow/agents/server-test-triager.md +0 -30
  61. package/templates/workspace/.iflow/commands/aiws-init.toml +0 -24
  62. package/templates/workspace/.iflow/commands/aiws-rollback.toml +0 -18
  63. package/templates/workspace/.iflow/commands/aiws-update.toml +0 -23
  64. package/templates/workspace/.iflow/commands/aiws-validate.toml +0 -18
  65. package/templates/workspace/.iflow/commands/server-commit.toml +0 -27
  66. package/templates/workspace/.iflow/commands/server-drain.toml +0 -99
  67. package/templates/workspace/.iflow/commands/server-fix-and-commit.toml +0 -27
  68. package/templates/workspace/.iflow/commands/server-fix.toml +0 -65
  69. package/templates/workspace/.iflow/commands/server-test-plan.toml +0 -62
  70. package/templates/workspace/.iflow/commands/server-test.toml +0 -58
  71. package/templates/workspace/.iflow/commands/server-triage.toml +0 -38
  72. package/templates/workspace/.iflow/commands/server_test-plan.toml +0 -12
  73. package/templates/workspace/.iflow/commands/server_test.toml +0 -12
  74. package/templates/workspace/.iflow/commands/ws-analyze.toml +0 -33
  75. package/templates/workspace/.iflow/commands/ws-commit.toml +0 -46
  76. package/templates/workspace/.iflow/commands/ws-contract-check.toml +0 -69
  77. package/templates/workspace/.iflow/commands/ws-deliver.toml +0 -58
  78. package/templates/workspace/.iflow/commands/ws-dev.toml +0 -34
  79. package/templates/workspace/.iflow/commands/ws-doctor.toml +0 -141
  80. package/templates/workspace/.iflow/commands/ws-env-doctor.toml +0 -74
  81. package/templates/workspace/.iflow/commands/ws-feature-deliver.toml +0 -44
  82. package/templates/workspace/.iflow/commands/ws-feature-plan.toml +0 -47
  83. package/templates/workspace/.iflow/commands/ws-finish.toml +0 -54
  84. package/templates/workspace/.iflow/commands/ws-init.toml +0 -53
  85. package/templates/workspace/.iflow/commands/ws-memory-bank-init.toml +0 -100
  86. package/templates/workspace/.iflow/commands/ws-migrate.toml +0 -59
  87. package/templates/workspace/.iflow/commands/ws-preflight.toml +0 -30
  88. package/templates/workspace/.iflow/commands/ws-pull.toml +0 -47
  89. package/templates/workspace/.iflow/commands/ws-push.toml +0 -40
  90. package/templates/workspace/.iflow/commands/ws-req-change.toml +0 -64
  91. package/templates/workspace/.iflow/commands/ws-req-contract-sync.toml +0 -25
  92. package/templates/workspace/.iflow/commands/ws-req-contract-validate.toml +0 -16
  93. package/templates/workspace/.iflow/commands/ws-req-flow-sync.toml +0 -36
  94. package/templates/workspace/.iflow/commands/ws-req-review.toml +0 -56
  95. package/templates/workspace/.iflow/commands/ws-review.toml +0 -33
  96. package/templates/workspace/.iflow/commands/ws-rule.toml +0 -43
  97. package/templates/workspace/.iflow/commands/ws-submodule-setup.toml +0 -32
  98. package/templates/workspace/tools/iflow_watchdog.sh +0 -138
  99. package/templates/workspace/tools/install_iflow_watchdog_systemd_user.sh +0 -118
  100. package/templates/workspace/tools/systemd/iflow-watchdog@.service +0 -16
  101. package/templates/workspace/tools/systemd/iflow-watchdog@.timer +0 -11
@@ -1,40 +0,0 @@
1
- # Command: ws:push
2
- # Description: 推送(submodule 感知:先 submodules 后 superproject;fast-forward;不 force)
3
- # Category: workspace
4
- # Version: 1
5
-
6
- description = "推送(submodule 感知:先 submodules 后 superproject;fast-forward;不 force)"
7
-
8
- prompt = """
9
- 用中文输出(命令/路径/代码标识符保持原样不翻译)。
10
-
11
- 目标:安全 push 当前仓库;若仓库包含 submodules,则先 push submodules,再 push superproject(默认 fast-forward;不 force)。
12
-
13
- 约束:
14
- - 不自动提交、不自动 `git add -A`
15
- - 不使用 `--force` / `--force-with-lease`
16
- - 若工作区不干净:停止并要求先 commit 或 stash
17
-
18
- 步骤(建议):
19
- 1) 输出上下文并检查工作区干净:
20
- - `git branch --show-current`
21
- - `git status --porcelain`
22
- - `git status -sb`
23
- - 非空则停止。
24
-
25
- 2) 判断是否存在 submodules:若存在 `.gitmodules`,输出 submodule 列表:
26
- - `git config --file .gitmodules --get-regexp '^submodule\\..*\\.path$'`
27
-
28
- 3) 若没有 submodules:正常 push(仍需用户确认远端/分支):
29
- - `git remote -v`
30
- - `git push`
31
-
32
- 4) 若有 submodules:先检查 `.gitmodules` 的 `submodule.<name>.branch` 是否齐全(缺失则停止并提示 `ws:submodule-setup`)。
33
-
34
- 5) 逐个 push submodules(fast-forward only),再 push superproject:
35
- - `git -C "<sub_path>" fetch origin --prune`
36
- - 若 `origin/<target_branch>` 不是 `HEAD` 的祖先:停止并提示先在 submodule 做 rebase/merge
37
- - `git -C "<sub_path>" push origin "HEAD:refs/heads/<target_branch>"`
38
- - 最后 `git push`
39
- """
40
-
@@ -1,64 +0,0 @@
1
- # Command: ws:req-change
2
- # Description: 记录需求变更到 requirements/CHANGELOG.md 并更新 REQUIREMENTS.md
3
- # Category: requirements
4
- # Version: 1
5
-
6
- description = "记录需求变更到 requirements/CHANGELOG.md 并更新 REQUIREMENTS.md"
7
-
8
- prompt = """
9
- 用中文输出(命令/路径/代码标识符保持原样不翻译)。
10
-
11
- 目标:处理“进行中的需求变更”,并把变更记录到独立的变更文件中,避免 REQUIREMENTS.md 的历史被覆盖。
12
-
13
- 约定:
14
- - `REQUIREMENTS.md`:当前有效需求(唯一真值)
15
- - `requirements/CHANGELOG.md`:需求变更历史(追加记录,不改旧记录)
16
- - `requirements/requirements-issues.csv`:需求拆解执行合同(机器可读;用于审核/回放/状态机)
17
-
18
- 步骤(必须按顺序):
19
- 1) 读取 `REQUIREMENTS.md` 与 `requirements/CHANGELOG.md`(若不存在则创建 changelog 文件与目录)
20
- 2) 明确本次变更的类型:
21
- - Clarify:补充不清晰的验收字段(不改变语义)
22
- - Change:修改/新增/删除需求(改变语义)
23
- 3) 产出“变更摘要”(1-5 条)并在执行前确认边界:
24
- - 是否影响 API(OpenAPI/状态码/鉴权/字段)
25
- - 是否影响自动化测试边界(allow_mutations/dangerous_disabled/base_url_allowlist)
26
- 4) 对比与冲突检查(强制,不写文件):
27
- - 对比“变更前 vs 拟变更后”的差异清单(新增/删除/语义变化)
28
- - 整理潜在冲突/不确定点(只列“最可能影响验收/实现”的,避免噪音)
29
- 5) 逐条澄清(强制,避免一次问完):
30
- - 若存在潜在冲突/不确定点:本轮只问 1 个最高优先级问题(给出 2–4 个可选答案或二选一),然后停止,等待用户回复;不要继续问下一题,也不要写文件。
31
- - 收到用户回复后:更新拟变更方案,回到步骤 4) 重新对比,直至没有未决问题。
32
- 6) 强制停下来让用户确认:是否继续落盘?(Y/N)
33
- 7) 用户确认 Y 后再写入:
34
- - 更新 `REQUIREMENTS.md`(只留下当前有效版本;不要在文件中堆历史表格)
35
- - 追加一条 changelog 记录到 `requirements/CHANGELOG.md`(必须包含:日期、变更内容、原因、影响范围、关联 issues/PR、记录人)
36
- 8) 需求拆解到 CSV 执行合同(强制):
37
- - 确保存在 `requirements/requirements-issues.csv`(若无则初始化):
38
- - `python3 tools/requirements_contract.py init`
39
- - 为本次变更新增/更新 1..N 条 Req 行,并拆到“可实现、可测试”的粒度:
40
- - 每条至少写清:CRUD、Scenario、Inputs、Outputs、Business_Logic、Tests
41
- - 状态机:
42
- - `Spec_Status`: DRAFT(未完善)/READY(已完善可开工)
43
- - `Impl_Status`: TODO/DOING/DONE/BLOCKED/SKIP
44
- - 完成后必须跑一次校验(READY/DONE 的必填字段会被检查):
45
- - `python3 tools/requirements_contract.py validate`
46
- 9) 同步/补齐需求执行合同(强制,自动处理 FlowSpec 有/无两种情况):
47
- - `python3 tools/requirements_contract_sync.py --workspace .`
48
- - 说明:若 `REQUIREMENTS.md` 中不存在 FlowSpec(或 flows 为空),该命令只会确保 `requirements/requirements-issues.csv` 表头存在并给出 WARN(这是预期行为,不要当成失败)。
49
- 10) 同步执行合同(至少做到其中之一):
50
- - 更新 `issues/feature-issues.csv`(新增/调整对应任务,并关联 Req_ID)
51
- - 若涉及 API:运行/更新 runner 产物并修正 `issues/server-api-issues.csv` 的验收字段
52
- 11) 生成简短逻辑图与场景执行合同(可选,但若存在 FlowSpec 则强烈建议自动执行):
53
- - 若 `REQUIREMENTS.md` 同时包含 `<!-- FLOW_SPEC_BEGIN -->` 与 `<!-- FLOW_SPEC_END -->`:运行 `/ws-req-flow-sync` 生成/更新 `docs/api-flow.mmd` 与 `issues/server-scenario-issues.csv`
54
- - 否则:跳过,并提示用户“可以先不维护 FlowSpec;后续需要场景回归时再补”
55
-
56
- 输出必须包含:
57
- - 本次更新的文件清单(路径)
58
- - 回滚方案(如何撤销本次需求变更)
59
- - 下一步建议命令(若存在 FlowSpec:包含 `/ws-req-flow-sync`;以及 `/server-fix` 或 runner 命令)
60
-
61
- 安全规则:
62
- - 不打印 secrets/test-accounts.json
63
- - 不引入任何 token/密钥到仓库
64
- """
@@ -1,25 +0,0 @@
1
- # Command: ws:req-contract-sync
2
- # Description: 从 REQUIREMENTS.md 的 FlowSpec 补齐 requirements/requirements-issues.csv(半自动)
3
- # Category: requirements
4
- # Version: 1
5
-
6
- description = "从 REQUIREMENTS.md 的 FlowSpec 补齐 requirements/requirements-issues.csv(半自动)"
7
-
8
- prompt = """
9
- 用中文输出(命令/路径/代码标识符保持原样不翻译)。
10
-
11
- 用途:当项目已经做了一部分,但 `requirements/requirements-issues.csv` 还没建立/没补齐时,用本命令从 `REQUIREMENTS.md` 的 FlowSpec(机器可读)生成/补齐需求条目骨架。
12
-
13
- 说明:
14
- - 本命令只做“补齐骨架”:把每条 Flow 变成一条 Req(默认 `Spec_Status=DRAFT`、`Impl_Status=TODO`),不会猜测你已完成哪些。
15
- - 生成后请手工补齐 CRUD/Inputs/Outputs/Business_Logic/Tests,并把可开工的条目标为 `Spec_Status=READY`。
16
-
17
- 执行:
18
- !{bash -lc '
19
- set -euo pipefail
20
- python3 tools/requirements_contract_sync.py --workspace .
21
- '}
22
-
23
- 下一步:
24
- - 运行:`/ws-req-contract-validate`
25
- """
@@ -1,16 +0,0 @@
1
- # Command: ws:req-contract-validate
2
- # Description: 校验 requirements/requirements-issues.csv(READY/DONE 必填字段)
3
- # Category: requirements
4
- # Version: 1
5
-
6
- description = "校验 requirements/requirements-issues.csv(READY/DONE 必填字段)"
7
-
8
- prompt = """
9
- 用中文输出(命令/路径/代码标识符保持原样不翻译)。
10
-
11
- 执行(失败则修正 CSV 再重试):
12
- !{bash -lc '
13
- set -euo pipefail
14
- python3 tools/requirements_contract.py validate
15
- '}
16
- """
@@ -1,36 +0,0 @@
1
- # Command: ws:req-flow-sync
2
- # Description: 从 REQUIREMENTS.md FlowSpec 生成流程图与场景 CSV
3
- # Category: requirements
4
- # Version: 1
5
-
6
- description = "从 REQUIREMENTS.md FlowSpec 生成流程图与场景 CSV"
7
-
8
- prompt = """
9
- 用中文输出;命令与路径保持原样不翻译。
10
-
11
- 目标:在工作区根目录基于 `REQUIREMENTS.md` 内的 FlowSpec(FLOW_SPEC_BEGIN/END 标记)生成:
12
- - `docs/api-flow.mmd`(简短逻辑图,Mermaid)
13
- - `issues/server-scenario-issues.csv`(场景执行合同:TODO/DONE/BLOCKED)
14
-
15
- 要求:
16
- - 不读取/不打印 secrets
17
- - 输出要短:只打印生成的文件路径与下一步命令
18
-
19
- Execute:
20
- !{bash -lc '
21
- set -euo pipefail
22
-
23
- [[ -f REQUIREMENTS.md ]] || { echo "缺少 REQUIREMENTS.md(请先 /aiws-init 或补齐需求文件)" >&2; exit 2; }
24
-
25
- if [[ -f tools/requirements_flow_gen.py ]]; then
26
- python3 tools/requirements_flow_gen.py --workspace .
27
- echo ""
28
- echo "下一步:"
29
- echo " - 查看逻辑图: cat docs/api-flow.mmd"
30
- echo " - 查看场景合同: cat issues/server-scenario-issues.csv"
31
- else
32
- echo "缺少工具: tools/requirements_flow_gen.py(建议运行 /aiws-init 或从模板复制)" >&2
33
- exit 2
34
- fi
35
- '}
36
- """
@@ -1,56 +0,0 @@
1
- # Command: ws:req-review
2
- # Description: 需求整体评估(不落盘):对 REQUIREMENTS.md 做 QA,输出缺口/冲突/风险,减少漂移
3
- # Category: requirements
4
- # Version: 1
5
-
6
- description = "需求整体评估(不落盘):对 REQUIREMENTS.md 做 QA,输出缺口/冲突/风险,减少漂移"
7
-
8
- prompt = """
9
- 用中文输出(命令/路径/代码标识符保持原样不翻译)。
10
-
11
- 目标:在不修改任何文件的前提下,对“当前整体需求”做一次质量评估(Requirements 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) 输出一个固定结构的评估报告(Markdown):
22
-
23
- ## Requirements QA
24
-
25
- ### 1) 结论(1–3 行)
26
- - 当前需求是否“可进入实现阶段”?(是/否/有条件)
27
-
28
- ### 2) 漂移风险(必须列出)
29
- - 哪些点最容易导致实现与需求不一致?为什么?
30
-
31
- ### 3) 可验收性(必须列出)
32
- - 列出“缺少明确验收标准”的条目(输入/输出/错误码/边界条件/示例)。
33
-
34
- ### 4) 完整性(必须列出)
35
- - 是否缺少:Non-goals、兼容性/迁移、鉴权/权限、失败重试、并发/幂等、观测性(日志/trace/request-id)、性能预算。
36
-
37
- ### 5) 一致性(必须列出)
38
- - 与 `AI_PROJECT.md`(禁止项/产物要求/验证要求/边界)是否冲突?逐条列冲突与建议。
39
-
40
- ### 6) 可测试性与证据(必须列出)
41
- - 给出最小验证路径(命令 + 期望结果 + 证据落盘路径建议,例如 `.agentdocs/tmp/...`)。
42
-
43
- ### 7) 风险清单(3–8 条)
44
- - 风险 → 影响面 → 缓解建议(尽量可操作)。
45
-
46
- ### 8) 需要澄清的问题(优先级排序)
47
- - 用 5–12 个问题把不确定点一次问清(每题说明“为什么要问/影响什么验收”)。
48
-
49
- 4) **强制停下来询问用户确认**:
50
- - 问用户:**“是否基于上述评估进入需求落盘/变更流程 `/ws-req-change`?(Y/N)”**
51
- - 若 N:停止,等待用户补充信息或调整需求文本。
52
-
53
- 边界:
54
- - 不打印任何 secrets(尤其是 `secrets/test-accounts.json`)。
55
- - 不执行破坏性命令。
56
- """
@@ -1,33 +0,0 @@
1
- # Command: ws:review
2
- # Description: AI Workspace 交叉审计交付(Claude + Codex + Gemini),证据优先落盘到 changes/<change-id>/review/
3
- # Category: workspace
4
- # Version: 1
5
-
6
- description = "AI Workspace 交叉审计交付(Claude + Codex + Gemini),证据优先落盘到 changes/<change-id>/review/"
7
-
8
- prompt = """
9
- 用中文输出(命令/路径/代码标识符保持原样不翻译)。
10
-
11
- 目标:在实现/提交前,对当前工作区改动进行交叉审计,并把审计结论优先落盘到 `changes/<change-id>/review/`(若无法确定 `change-id` 再回退 `.agentdocs/tmp/review/`),便于回放与追责。
12
-
13
- 强制步骤:
14
- 1) 读取真值文件:`AI_PROJECT.md`、`REQUIREMENTS.md`、`AI_WORKSPACE.md`。
15
- 2) 若 iFlow 拦截写入:先执行 `/ws-contract-check`,再继续。
16
- 3) 审计输入(按优先级):
17
- - `git diff`(或变更工件 `changes/<change-id>/`)
18
- - `issues/*.csv`(状态机是否存在 TODO/DOING/BLOCKED)
19
- - 最近一次门禁输出(如 `aiws validate .`)
20
- 4) 输出(必须):
21
- - Findings:问题清单(按严重性排序,引用具体文件路径)
22
- - Risks:3–8 条
23
- - Next:最小修复清单 + 最小验证命令
24
- 5) 证据落盘(必须):
25
- - 默认:在 `changes/<change-id>/review/` 写入一份 `iflow-review.<timestamp>.md`
26
- - 回退:在 `.agentdocs/tmp/review/` 写入同名文件(仅在无法确定 `change-id` 时使用)
27
- 6) 如果目标是提交前门禁:
28
- - 建议运行:`aiws validate .`(或 `npx @aipper/aiws validate .`)
29
-
30
- 边界:
31
- - 不打印任何 secrets(尤其是 `secrets/test-accounts.json`)。
32
- - 不执行破坏性命令。
33
- """
@@ -1,43 +0,0 @@
1
- # Command: ws:rule
2
- # Description: 整理项目规则写入 AI_PROJECT.md 的 managed block
3
- # Category: workspace
4
- # Version: 1
5
-
6
- description = "整理项目规则写入 AI_PROJECT.md 的 managed block"
7
-
8
- prompt = """
9
- 用中文输出(命令/路径/代码标识符保持原样不翻译)。
10
-
11
- 目标:当用户提出“项目规则/约束/边界”时,将其整理为结构化条款,并写入工作区根目录的 `AI_PROJECT.md`。
12
-
13
- 约定真值:
14
- - `AI_PROJECT.md`:项目约束真值(本命令只维护其中的 managed block)
15
- - `REQUIREMENTS.md`:需求真值(本命令不改需求)
16
- - `AI_WORKSPACE.md`:运行/测试真值(本命令不改运行方式)
17
-
18
- 安全规则(强制):
19
- - 不打印 secrets;不把 token/密钥/内网地址写入 `AI_PROJECT.md`。
20
- - 不进行破坏性命令。
21
- - 写入前必须创建备份:`.aiws/backups/manual/AI_PROJECT.md.bak.<timestamp>`
22
-
23
- 写入位置(强制):
24
- - 仅修改 `AI_PROJECT.md` 中 `<!-- AI_PROJECT_RULES_BEGIN -->` 与 `<!-- AI_PROJECT_RULES_END -->` 之间的内容。
25
- - 若文件/标记不存在:先运行 `/aiws-init`(或 `aiws init .`)补齐模板,再继续。
26
-
27
- 工作流:
28
- 1) 读取(或创建)`AI_PROJECT.md`,并定位 managed block。
29
- 2) 如果用户还没给出明确的规则文本:最多问 3 个澄清问题(例如:允许改动目录白名单/必须跑哪些测试/是否允许有副作用接口/是否允许自动提交)。
30
- 3) 将用户输入整理为短而硬的条款(建议按以下结构):
31
- - 范围/目录白名单
32
- - 必须执行的验证命令(含期望结果)
33
- - 禁止项(危险操作/敏感文件/越界访问)
34
- - 交付产物(必须更新哪些文件:issues/证据/文档)
35
- 4) 更新 managed block:合并去重(同义合并)、保持条款可执行;避免重写文件其它部分。
36
- 4.1) 写入前必须复述“将写入的规则清单”,并要求用户回复 `CONFIRM` 后再落盘(避免误写/误删)。
37
- 5) 输出必须包含:
38
- - 更新了哪些文件(路径)
39
- - 回滚方式(恢复备份文件)
40
- - 下一步建议(例如运行 `/ws-doctor`)
41
-
42
- 提示:用户的“规则”可能零散,优先把它们变成可检查的条款(能落到命令/文件/目录)。
43
- """
@@ -1,32 +0,0 @@
1
- # Command: ws:submodule-setup
2
- # Description: 子模块分支对齐(写入 .gitmodules 的 submodule.<name>.branch)
3
- # Category: workspace
4
- # Version: 1
5
-
6
- description = "子模块分支对齐(写入 .gitmodules 的 submodule.<name>.branch)"
7
-
8
- prompt = """
9
- 用中文输出(命令/路径/代码标识符保持原样不翻译)。
10
-
11
- 目标:为每个 submodule 写入 `.gitmodules` 的 `submodule.<name>.branch`(团队真值),让 `ws:pull`、`ws:finish` 能确定性地减少 detached 与人为差异;并使 `aiws validate` 的 submodule 分支门禁通过。
12
-
13
- 约束:
14
- - 不自动提交、不自动 push(必须先输出 diff 并让用户确认)
15
- - 不做破坏性命令
16
-
17
- 步骤(建议):
18
- 1) 确认工作区干净:`git status --porcelain`(非空则停止)。
19
- 2) 列出 submodules:
20
- - `test -f .gitmodules || { echo "no .gitmodules"; exit 0; }`
21
- - `git config --file .gitmodules --get-regexp '^submodule\\..*\\.path$'`
22
- 3) 对每个 submodule 让用户选择目标分支(推荐具体分支名;可选 `.` 表示跟随 superproject 分支名)。
23
- 4) 写入分支配置:
24
- - `git submodule set-branch --branch <branch-or-dot> <sub_path>`
25
- 5) 输出 diff 并让用户确认是否提交:
26
- - `git diff -- .gitmodules`
27
- - `git status --porcelain`
28
- 6) 用户确认后提交:
29
- - `git add .gitmodules`
30
- - `git commit -m "chore(submodule): set tracking branches"`
31
- """
32
-
@@ -1,138 +0,0 @@
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"
@@ -1,118 +0,0 @@
1
- #!/usr/bin/env bash
2
- set -euo pipefail
3
-
4
- die() { echo "error: $*" >&2; exit 2; }
5
- have() { command -v "$1" >/dev/null 2>&1; }
6
-
7
- usage() {
8
- cat <<'EOF'
9
- Usage:
10
- bash tools/install_iflow_watchdog_systemd_user.sh
11
- bash tools/install_iflow_watchdog_systemd_user.sh --name <instance>
12
- bash tools/install_iflow_watchdog_systemd_user.sh --workspace <abs_path>
13
- bash tools/install_iflow_watchdog_systemd_user.sh --name <instance> --workspace <abs_path>
14
-
15
- What it does:
16
- - Installs systemd user instance units:
17
- ~/.config/systemd/user/iflow-watchdog@.service
18
- ~/.config/systemd/user/iflow-watchdog@.timer
19
- - Writes per-instance env file:
20
- ~/.config/iflow-watchdog/<instance>.env
21
- - Enables and starts the timer:
22
- systemctl --user enable --now iflow-watchdog@<instance>.timer
23
-
24
- Notes:
25
- - You can run multiple instances on one server (different --name and --workspace).
26
- - Unattended mode uses --yolo; only use in test environment.
27
- Defaults:
28
- - --workspace defaults to current directory (pwd)
29
- - --name defaults to basename(--workspace)
30
- EOF
31
- }
32
-
33
- name=""
34
- workspace=""
35
- while [[ $# -gt 0 ]]; do
36
- case "$1" in
37
- --name) name="${2:-}"; shift 2 ;;
38
- --workspace) workspace="${2:-}"; shift 2 ;;
39
- -h|--help) usage; exit 0 ;;
40
- *) die "unknown arg: $1" ;;
41
- esac
42
- done
43
-
44
- if [[ -z "$workspace" ]]; then
45
- workspace="$(pwd)"
46
- fi
47
-
48
- if [[ -z "$name" ]]; then
49
- name="$(basename "$workspace")"
50
- fi
51
-
52
- [[ "$workspace" == /* ]] || die "--workspace must be an absolute path"
53
- [[ -d "$workspace" ]] || die "workspace not found: $workspace"
54
-
55
- have systemctl || die "missing: systemctl"
56
-
57
- if [[ ! -f "$workspace/AI_WORKSPACE.md" ]] || [[ ! -f "$workspace/REQUIREMENTS.md" ]]; then
58
- die "workspace must contain AI_WORKSPACE.md and REQUIREMENTS.md: $workspace"
59
- fi
60
-
61
- # Best-effort check that systemd --user is available (common pitfall on servers).
62
- if [[ -z "${XDG_RUNTIME_DIR:-}" ]] || ! systemctl --user is-system-running >/dev/null 2>&1; then
63
- die "systemd --user not running (try: loginctl enable-linger $USER, then re-login)"
64
- fi
65
-
66
- unit_dir="$HOME/.config/systemd/user"
67
- env_dir="$HOME/.config/iflow-watchdog"
68
- mkdir -p "$unit_dir" "$env_dir"
69
-
70
- src_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
71
- tpl_service="$src_dir/systemd/iflow-watchdog@.service"
72
- tpl_timer="$src_dir/systemd/iflow-watchdog@.timer"
73
- [[ -f "$tpl_service" ]] || die "missing template: $tpl_service"
74
- [[ -f "$tpl_timer" ]] || die "missing template: $tpl_timer"
75
-
76
- cp -a "$tpl_service" "$unit_dir/iflow-watchdog@.service"
77
- cp -a "$tpl_timer" "$unit_dir/iflow-watchdog@.timer"
78
-
79
- env_file="$env_dir/${name}.env"
80
-
81
- # Only allow unattended --yolo if AI_WORKSPACE.md declares test environment.
82
- yo="0"
83
- if grep -Eq '^\s*-\s*environment\s*:\s*"?test"?\s*$' "$workspace/AI_WORKSPACE.md"; then
84
- yo="1"
85
- fi
86
-
87
- cat >"$env_file" <<EOF
88
- # Generated by tools/install_iflow_watchdog_systemd_user.sh
89
- WORKSPACE_DIR=${workspace}
90
- IFLOW_WATCHDOG_ROOT=.
91
- # Unattended mode (uses iflow --yolo). Only safe when environment=test.
92
- IFLOW_WATCHDOG_YOLO=${yo}
93
- # Optional: override logs dir (default: <workspace>/.agentdocs/tmp/server-test)
94
- # IFLOW_WATCHDOG_LOG_DIR=${workspace}/.agentdocs/tmp/server-test
95
- IFLOW_DRAIN_MAX_ENDPOINTS=30
96
- IFLOW_WATCHDOG_SLEEP_S=10
97
- EOF
98
-
99
- systemctl --user daemon-reload
100
-
101
- if [[ "$yo" == "1" ]]; then
102
- systemctl --user enable --now "iflow-watchdog@${name}.timer"
103
- enabled_msg="enabled"
104
- else
105
- enabled_msg="not enabled (edit IFLOW_WATCHDOG_YOLO=1 after confirming test env)"
106
- fi
107
-
108
- echo "OK: installed iflow-watchdog@${name}"
109
- echo "env: $env_file"
110
- echo "unit: $unit_dir/iflow-watchdog@.service"
111
- echo "timer: iflow-watchdog@${name}.timer ($enabled_msg)"
112
- echo "tune: edit $env_file, then run:"
113
- echo " systemctl --user daemon-reload"
114
- echo " systemctl --user restart iflow-watchdog@${name}.service"
115
- if [[ "$yo" != "1" ]]; then
116
- echo "enable:"
117
- echo " systemctl --user enable --now iflow-watchdog@${name}.timer"
118
- fi
@@ -1,16 +0,0 @@
1
- [Unit]
2
- Description=iFlow AI Workspace API Test Watchdog (%i)
3
- After=network.target
4
-
5
- [Service]
6
- Type=simple
7
- # Per-instance environment file created by tools/install_iflow_watchdog_systemd_user.sh
8
- EnvironmentFile=%h/.config/iflow-watchdog/%i.env
9
- ExecStart=/usr/bin/env bash -lc 'cd "${WORKSPACE_DIR}" && bash tools/iflow_watchdog.sh'
10
- Restart=always
11
- RestartSec=30
12
- KillMode=mixed
13
- TimeoutStopSec=30
14
-
15
- [Install]
16
- WantedBy=default.target
@@ -1,11 +0,0 @@
1
- [Unit]
2
- Description=Nightly iFlow API Test Watchdog (%i)
3
-
4
- [Timer]
5
- OnCalendar=*-*-* 02:00:00
6
- Persistent=true
7
- Unit=iflow-watchdog@%i.service
8
-
9
- [Install]
10
- WantedBy=timers.target
11
-