@scemoon/cdh 1.0.5 → 1.0.7
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/package.json +2 -2
- package/run.js +68 -14
- package/ai-dlc-skill/SKILL.md +0 -77
- package/ai-dlc-skill/agents/deliver-agent.md +0 -24
- package/ai-dlc-skill/agents/master.md +0 -50
- package/ai-dlc-skill/agents/plan-agent.md +0 -23
- package/ai-dlc-skill/agents/understand-agent.md +0 -23
- package/ai-dlc-skill/agents/verify-agent.md +0 -27
- package/ai-dlc-skill/architecture/project-structure.md +0 -78
- package/ai-dlc-skill/brownfield/README.md +0 -30
- package/ai-dlc-skill/brownfield/generate-context.sh +0 -64
- package/ai-dlc-skill/brownfield/scripts/deps.sh +0 -27
- package/ai-dlc-skill/brownfield/scripts/discover.sh +0 -34
- package/ai-dlc-skill/brownfield/scripts/extract-api.sh +0 -45
- package/ai-dlc-skill/components/backend.md +0 -34
- package/ai-dlc-skill/components/desktop.md +0 -30
- package/ai-dlc-skill/components/mya.md +0 -29
- package/ai-dlc-skill/components/native.md +0 -30
- package/ai-dlc-skill/components/tta.md +0 -29
- package/ai-dlc-skill/components/web.md +0 -31
- package/ai-dlc-skill/components/wxa.md +0 -29
- package/ai-dlc-skill/contracts/README.md +0 -25
- package/ai-dlc-skill/core/adaptive-flow.md +0 -36
- package/ai-dlc-skill/core/security.md +0 -29
- package/ai-dlc-skill/cross-tool/cline/export.sh +0 -31
- package/ai-dlc-skill/cross-tool/copilot/export.sh +0 -47
- package/ai-dlc-skill/cross-tool/cursor/export.sh +0 -32
- package/ai-dlc-skill/cross-tool/export.sh +0 -22
- package/ai-dlc-skill/cross-tool/onecode/config.yaml.tpl +0 -17
- package/ai-dlc-skill/cross-tool/onecode/export-skills.sh +0 -35
- package/ai-dlc-skill/cross-tool/onecode/export.sh +0 -54
- package/ai-dlc-skill/phases/deliver/entry.md +0 -26
- package/ai-dlc-skill/phases/deliver/lifecycle.md +0 -185
- package/ai-dlc-skill/phases/deliver/prompt.md +0 -40
- package/ai-dlc-skill/phases/deliver/rules.md +0 -61
- package/ai-dlc-skill/phases/plan/entry.md +0 -25
- package/ai-dlc-skill/phases/plan/lifecycle.md +0 -204
- package/ai-dlc-skill/phases/plan/prompt.md +0 -38
- package/ai-dlc-skill/phases/plan/rules.md +0 -25
- package/ai-dlc-skill/phases/understand/entry.md +0 -26
- package/ai-dlc-skill/phases/understand/lifecycle.md +0 -184
- package/ai-dlc-skill/phases/understand/prompt.md +0 -41
- package/ai-dlc-skill/phases/understand/rules.md +0 -37
- package/ai-dlc-skill/phases/verify/entry.md +0 -26
- package/ai-dlc-skill/phases/verify/lifecycle.md +0 -192
- package/ai-dlc-skill/phases/verify/prompt.md +0 -43
- package/ai-dlc-skill/phases/verify/rules.md +0 -73
- package/ai-dlc-skill/practices/bdd.md +0 -91
- package/ai-dlc-skill/practices/sdd.md +0 -84
- package/ai-dlc-skill/practices/tdd.md +0 -95
- package/ai-dlc-skill/providers/README.md +0 -114
- package/ai-dlc-skill/providers/aliyun/deployment.yaml +0 -66
- package/ai-dlc-skill/providers/aliyun/preview.yaml +0 -84
- package/ai-dlc-skill/providers/aliyun/provider.yaml +0 -160
- package/ai-dlc-skill/providers/tcb/deployment.yaml +0 -69
- package/ai-dlc-skill/providers/tcb/preview.yaml +0 -83
- package/ai-dlc-skill/providers/tcb/provider.yaml +0 -172
- package/ai-dlc-skill/requirements.md +0 -140
- package/ai-dlc-skill/skill.yaml +0 -147
- package/ai-dlc-skill/templates/integration/CHANGELOG.md +0 -41
- package/ai-dlc-skill/templates/integration/asyncapi.yaml +0 -43
- package/ai-dlc-skill/templates/integration/contract-diff.md +0 -63
- package/ai-dlc-skill/templates/integration/contract-spec.md +0 -49
- package/ai-dlc-skill/templates/integration/openapi.yaml +0 -18
- package/ai-dlc-skill/templates/integration/runtime-contract.yaml +0 -36
- package/ai-dlc-skill/templates/plan/design.md +0 -49
- package/ai-dlc-skill/templates/plan/task-list.md +0 -32
- package/ai-dlc-skill/templates/project/README.md +0 -126
- package/ai-dlc-skill/templates/project/template.md +0 -119
- package/ai-dlc-skill/templates/understand/feature.feature +0 -23
- package/ai-dlc-skill/templates/understand/intent.md +0 -29
- package/ai-dlc-skill/templates/understand/spec-delta.md +0 -47
- package/ai-dlc-skill/templates/verify/test-unit.py +0 -27
- package/ai-dlc-skill/walkthrough/collect.sh +0 -50
- package/ai-dlc-skill/walkthrough/template.md +0 -54
- package/ai-dlc-skill/workflows/ai-dlc.yaml +0 -110
- package/ai-dlc-skill/workflows/deployment.yaml +0 -199
- package/cdh/__init__.py +0 -0
- package/cdh/__main__.py +0 -4
- package/cdh/__pycache__/__init__.cpython-314.pyc +0 -0
- package/cdh/__pycache__/cdh_mcp_injector.cpython-314.pyc +0 -0
- package/cdh/__pycache__/cdh_mcp_loader.cpython-314.pyc +0 -0
- package/cdh/__pycache__/cdh_mcp_manager.cpython-314.pyc +0 -0
- package/cdh/__pycache__/cdh_session_aggregator.cpython-314.pyc +0 -0
- package/cdh/__pycache__/cdh_skill_loader.cpython-314.pyc +0 -0
- package/cdh/__pycache__/cdh_skill_manager.cpython-314.pyc +0 -0
- package/cdh/__pycache__/cli.cpython-313.pyc +0 -0
- package/cdh/__pycache__/cli.cpython-314.pyc +0 -0
- package/cdh/__pycache__/scaffold.cpython-314.pyc +0 -0
- package/cdh/cdh_mcp_injector.py +0 -115
- package/cdh/cdh_mcp_loader.py +0 -67
- package/cdh/cdh_mcp_manager.py +0 -73
- package/cdh/cdh_session_aggregator.py +0 -258
- package/cdh/cdh_skill_manager.py +0 -105
- package/cdh/cli.py +0 -758
- package/cdh/scaffold.py +0 -728
- package/onecode/__init__.py +0 -1
- package/onecode/__main__.py +0 -4
- package/onecode/__pycache__/__init__.cpython-314.pyc +0 -0
- package/onecode/__pycache__/cli.cpython-314.pyc +0 -0
- package/onecode/__pycache__/commands.cpython-314.pyc +0 -0
- package/onecode/__pycache__/config.cpython-314.pyc +0 -0
- package/onecode/__pycache__/config_screen.cpython-314.pyc +0 -0
- package/onecode/__pycache__/migrate.cpython-314.pyc +0 -0
- package/onecode/agent/__init__.py +0 -0
- package/onecode/agent/__pycache__/__init__.cpython-314.pyc +0 -0
- package/onecode/agent/__pycache__/cdh_loader.cpython-314.pyc +0 -0
- package/onecode/agent/__pycache__/context.cpython-314.pyc +0 -0
- package/onecode/agent/__pycache__/engine.cpython-314.pyc +0 -0
- package/onecode/agent/__pycache__/hooks.cpython-314.pyc +0 -0
- package/onecode/agent/__pycache__/onecode_agent_acp.cpython-314.pyc +0 -0
- package/onecode/agent/__pycache__/permissions.cpython-314.pyc +0 -0
- package/onecode/agent/__pycache__/permissions_store.cpython-314.pyc +0 -0
- package/onecode/agent/__pycache__/project_doc.cpython-314.pyc +0 -0
- package/onecode/agent/__pycache__/session.cpython-314.pyc +0 -0
- package/onecode/agent/agents/__init__.py +0 -29
- package/onecode/agent/agents/__pycache__/__init__.cpython-314.pyc +0 -0
- package/onecode/agent/agents/__pycache__/types.cpython-314.pyc +0 -0
- package/onecode/agent/agents/types.py +0 -589
- package/onecode/agent/attachments.py +0 -112
- package/onecode/agent/cdh_loader.py +0 -267
- package/onecode/agent/context.py +0 -343
- package/onecode/agent/engine.py +0 -2700
- package/onecode/agent/hooks.py +0 -86
- package/onecode/agent/onecode_agent_acp.py +0 -2743
- package/onecode/agent/onecode_agent_acp.py.bak +0 -2447
- package/onecode/agent/permissions.py +0 -150
- package/onecode/agent/permissions_store.py +0 -62
- package/onecode/agent/project_doc.py +0 -19
- package/onecode/agent/session.py +0 -195
- package/onecode/agent/snapshot.py +0 -144
- package/onecode/agent/tools/__init__.py +0 -17
- package/onecode/agent/tools/__pycache__/__init__.cpython-314.pyc +0 -0
- package/onecode/agent/tools/__pycache__/agent_tools.cpython-314.pyc +0 -0
- package/onecode/agent/tools/__pycache__/apply_patch_tool.cpython-314.pyc +0 -0
- package/onecode/agent/tools/__pycache__/bash_tool.cpython-314.pyc +0 -0
- package/onecode/agent/tools/__pycache__/communication_tools.cpython-314.pyc +0 -0
- package/onecode/agent/tools/__pycache__/config_tool.cpython-314.pyc +0 -0
- package/onecode/agent/tools/__pycache__/cron_tools.cpython-314.pyc +0 -0
- package/onecode/agent/tools/__pycache__/errors.cpython-314.pyc +0 -0
- package/onecode/agent/tools/__pycache__/file_ops.cpython-314.pyc +0 -0
- package/onecode/agent/tools/__pycache__/file_tools.cpython-314.pyc +0 -0
- package/onecode/agent/tools/__pycache__/git_tools.cpython-314.pyc +0 -0
- package/onecode/agent/tools/__pycache__/lsp_tools.cpython-314.pyc +0 -0
- package/onecode/agent/tools/__pycache__/mcp_tools.cpython-314.pyc +0 -0
- package/onecode/agent/tools/__pycache__/permission_handler.cpython-314.pyc +0 -0
- package/onecode/agent/tools/__pycache__/permissions.cpython-314.pyc +0 -0
- package/onecode/agent/tools/__pycache__/protocol.cpython-314.pyc +0 -0
- package/onecode/agent/tools/__pycache__/registry.cpython-314.pyc +0 -0
- package/onecode/agent/tools/__pycache__/sandbox.cpython-314.pyc +0 -0
- package/onecode/agent/tools/__pycache__/schema_validation.cpython-314.pyc +0 -0
- package/onecode/agent/tools/__pycache__/skill_tools.cpython-314.pyc +0 -0
- package/onecode/agent/tools/__pycache__/todo_tools.cpython-314.pyc +0 -0
- package/onecode/agent/tools/__pycache__/web_tools.cpython-314.pyc +0 -0
- package/onecode/agent/tools/agent_tools.py +0 -132
- package/onecode/agent/tools/apply_patch_tool.py +0 -138
- package/onecode/agent/tools/bash_tool.py +0 -111
- package/onecode/agent/tools/communication_tools.py +0 -148
- package/onecode/agent/tools/config_tool.py +0 -130
- package/onecode/agent/tools/cron_tools.py +0 -178
- package/onecode/agent/tools/errors.py +0 -17
- package/onecode/agent/tools/file_ops.py +0 -221
- package/onecode/agent/tools/file_tools.py +0 -225
- package/onecode/agent/tools/git_tools.py +0 -88
- package/onecode/agent/tools/lsp_tools.py +0 -404
- package/onecode/agent/tools/mcp_tools.py +0 -127
- package/onecode/agent/tools/permission_handler.py +0 -46
- package/onecode/agent/tools/permissions.py +0 -77
- package/onecode/agent/tools/protocol.py +0 -20
- package/onecode/agent/tools/registry.py +0 -201
- package/onecode/agent/tools/sandbox.py +0 -358
- package/onecode/agent/tools/schema_validation.py +0 -100
- package/onecode/agent/tools/skill_tools.py +0 -52
- package/onecode/agent/tools/todo_tools.py +0 -207
- package/onecode/agent/tools/web_tools.py +0 -169
- package/onecode/builtin_skills/agent-browser/SKILL.md +0 -212
- package/onecode/builtin_skills/agent-browser/skill.yaml +0 -8
- package/onecode/builtin_skills/git/SKILL.md +0 -64
- package/onecode/builtin_skills/git/skill.yaml +0 -7
- package/onecode/builtin_skills/shell/SKILL.md +0 -58
- package/onecode/builtin_skills/shell/skill.yaml +0 -8
- package/onecode/builtin_skills/skill-creator/SKILL.md +0 -106
- package/onecode/builtin_skills/skill-creator/skill.yaml +0 -8
- package/onecode/cli.py +0 -935
- package/onecode/cloud/__init__.py +0 -0
- package/onecode/cloud/base.py +0 -20
- package/onecode/codebase/__init__.py +0 -69
- package/onecode/codebase/__pycache__/__init__.cpython-314.pyc +0 -0
- package/onecode/codebase/__pycache__/chunker.cpython-314.pyc +0 -0
- package/onecode/codebase/__pycache__/indexer.cpython-314.pyc +0 -0
- package/onecode/codebase/__pycache__/retriever.cpython-314.pyc +0 -0
- package/onecode/codebase/__pycache__/storage.cpython-314.pyc +0 -0
- package/onecode/codebase/__pycache__/tools.cpython-314.pyc +0 -0
- package/onecode/codebase/chunker.py +0 -125
- package/onecode/codebase/indexer.py +0 -149
- package/onecode/codebase/retriever.py +0 -203
- package/onecode/codebase/storage.py +0 -131
- package/onecode/codebase/tools.py +0 -59
- package/onecode/commands.py +0 -596
- package/onecode/config.py +0 -314
- package/onecode/config_screen.py +0 -600
- package/onecode/cron/__init__.py +0 -3
- package/onecode/lsp/__init__.py +0 -3
- package/onecode/mcp/__init__.py +0 -4
- package/onecode/mcp/__pycache__/__init__.cpython-314.pyc +0 -0
- package/onecode/mcp/__pycache__/client.cpython-314.pyc +0 -0
- package/onecode/mcp/__pycache__/manager.cpython-314.pyc +0 -0
- package/onecode/mcp/client.py +0 -193
- package/onecode/mcp/manager.py +0 -190
- package/onecode/memory/__init__.py +0 -49
- package/onecode/memory/__pycache__/__init__.cpython-314.pyc +0 -0
- package/onecode/memory/__pycache__/backend.cpython-314.pyc +0 -0
- package/onecode/memory/__pycache__/offload.cpython-314.pyc +0 -0
- package/onecode/memory/__pycache__/pyramid.cpython-314.pyc +0 -0
- package/onecode/memory/__pycache__/recall.cpython-314.pyc +0 -0
- package/onecode/memory/__pycache__/symbolic.cpython-314.pyc +0 -0
- package/onecode/memory/backend.py +0 -159
- package/onecode/memory/pyramid.py +0 -133
- package/onecode/memory/recall.py +0 -203
- package/onecode/migrate.py +0 -122
- package/onecode/models/__init__.py +0 -4
- package/onecode/models/__pycache__/__init__.cpython-314.pyc +0 -0
- package/onecode/models/__pycache__/errors.cpython-314.pyc +0 -0
- package/onecode/models/__pycache__/messages.cpython-314.pyc +0 -0
- package/onecode/models/__pycache__/provider.cpython-314.pyc +0 -0
- package/onecode/models/__pycache__/registry.cpython-314.pyc +0 -0
- package/onecode/models/errors.py +0 -104
- package/onecode/models/messages.py +0 -739
- package/onecode/models/provider.py +0 -699
- package/onecode/models/providers/__init__.py +0 -17
- package/onecode/models/providers/__pycache__/__init__.cpython-314.pyc +0 -0
- package/onecode/models/providers/__pycache__/anthropic_provider.cpython-314.pyc +0 -0
- package/onecode/models/providers/__pycache__/deepseek_provider.cpython-314.pyc +0 -0
- package/onecode/models/providers/__pycache__/glm_provider.cpython-314.pyc +0 -0
- package/onecode/models/providers/__pycache__/minimax_provider.cpython-314.pyc +0 -0
- package/onecode/models/providers/__pycache__/minimaxi_provider.cpython-314.pyc +0 -0
- package/onecode/models/providers/__pycache__/ollama_provider.cpython-314.pyc +0 -0
- package/onecode/models/providers/__pycache__/openai_provider.cpython-314.pyc +0 -0
- package/onecode/models/providers/anthropic_provider.py +0 -273
- package/onecode/models/providers/deepseek_provider.py +0 -212
- package/onecode/models/providers/glm_provider.py +0 -195
- package/onecode/models/providers/minimax_provider.py +0 -158
- package/onecode/models/providers/minimaxi_provider.py +0 -417
- package/onecode/models/providers/ollama_provider.py +0 -100
- package/onecode/models/providers/openai_provider.py +0 -237
- package/onecode/models/registry.py +0 -212
- package/onecode/server/__init__.py +0 -3
- package/onecode/server/app.py +0 -224
- package/onecode/skills/__init__.py +0 -11
- package/onecode/skills/__pycache__/__init__.cpython-314.pyc +0 -0
- package/onecode/skills/__pycache__/argument_substitution.cpython-314.pyc +0 -0
- package/onecode/skills/__pycache__/bootstrap.cpython-314.pyc +0 -0
- package/onecode/skills/__pycache__/create.cpython-314.pyc +0 -0
- package/onecode/skills/__pycache__/frontmatter.cpython-314.pyc +0 -0
- package/onecode/skills/__pycache__/loader.cpython-314.pyc +0 -0
- package/onecode/skills/__pycache__/manager.cpython-314.pyc +0 -0
- package/onecode/skills/__pycache__/model.cpython-314.pyc +0 -0
- package/onecode/skills/argument_substitution.py +0 -38
- package/onecode/skills/bootstrap.py +0 -124
- package/onecode/skills/create.py +0 -56
- package/onecode/skills/frontmatter.py +0 -33
- package/onecode/skills/loader.py +0 -139
- package/onecode/skills/manager.py +0 -75
- package/onecode/skills/model.py +0 -43
- package/onecode/storage/__init__.py +0 -0
- package/onecode/storage/activity.py +0 -63
- package/onecode/storage/project.py +0 -54
- package/onecode/storage/session.py +0 -112
- package/onecode/tasks/__init__.py +0 -26
- package/onecode/tasks/manager.py +0 -232
- package/onecode/tasks/models.py +0 -240
- package/onecode/trace/__init__.py +0 -0
- package/onecode/trace/tracer.py +0 -173
- package/onecode/utils/__init__.py +0 -0
- package/onecode/utils/helpers.py +0 -20
- package/pyproject.toml +0 -74
- package/tui/__init__.py +0 -46
- package/tui/__main__.py +0 -4
- package/tui/__pycache__/__init__.cpython-314.pyc +0 -0
- package/tui/__pycache__/_loop.cpython-314.pyc +0 -0
- package/tui/__pycache__/_path_fuzzy_search.cpython-314.pyc +0 -0
- package/tui/__pycache__/_path_match.cpython-314.pyc +0 -0
- package/tui/__pycache__/about.cpython-314.pyc +0 -0
- package/tui/__pycache__/agent.cpython-314.pyc +0 -0
- package/tui/__pycache__/agent_schema.cpython-314.pyc +0 -0
- package/tui/__pycache__/agents.cpython-314.pyc +0 -0
- package/tui/__pycache__/answer.cpython-314.pyc +0 -0
- package/tui/__pycache__/app.cpython-313.pyc +0 -0
- package/tui/__pycache__/app.cpython-314.pyc +0 -0
- package/tui/__pycache__/atomic.cpython-314.pyc +0 -0
- package/tui/__pycache__/complete.cpython-314.pyc +0 -0
- package/tui/__pycache__/constants.cpython-314.pyc +0 -0
- package/tui/__pycache__/conversation_markdown.cpython-314.pyc +0 -0
- package/tui/__pycache__/danger.cpython-314.pyc +0 -0
- package/tui/__pycache__/db.cpython-314.pyc +0 -0
- package/tui/__pycache__/dec.cpython-314.pyc +0 -0
- package/tui/__pycache__/directory.cpython-314.pyc +0 -0
- package/tui/__pycache__/directory_suggester.cpython-314.pyc +0 -0
- package/tui/__pycache__/directory_watcher.cpython-314.pyc +0 -0
- package/tui/__pycache__/format_path.cpython-314.pyc +0 -0
- package/tui/__pycache__/fuzzy.cpython-314.pyc +0 -0
- package/tui/__pycache__/fuzzy_index.cpython-314.pyc +0 -0
- package/tui/__pycache__/history.cpython-314.pyc +0 -0
- package/tui/__pycache__/jsonrpc.cpython-314.pyc +0 -0
- package/tui/__pycache__/menus.cpython-314.pyc +0 -0
- package/tui/__pycache__/message_log.cpython-314.pyc +0 -0
- package/tui/__pycache__/messages.cpython-314.pyc +0 -0
- package/tui/__pycache__/path_complete.cpython-314.pyc +0 -0
- package/tui/__pycache__/path_filter.cpython-314.pyc +0 -0
- package/tui/__pycache__/paths.cpython-314.pyc +0 -0
- package/tui/__pycache__/pill.cpython-314.pyc +0 -0
- package/tui/__pycache__/platform_commands.cpython-314.pyc +0 -0
- package/tui/__pycache__/protocol.cpython-314.pyc +0 -0
- package/tui/__pycache__/session_tracker.cpython-314.pyc +0 -0
- package/tui/__pycache__/settings.cpython-314.pyc +0 -0
- package/tui/__pycache__/settings_schema.cpython-314.pyc +0 -0
- package/tui/__pycache__/shell.cpython-314.pyc +0 -0
- package/tui/__pycache__/shell_read.cpython-314.pyc +0 -0
- package/tui/__pycache__/slash_command.cpython-314.pyc +0 -0
- package/tui/__pycache__/version.cpython-314.pyc +0 -0
- package/tui/_loop.py +0 -86
- package/tui/_path_fuzzy_search.py +0 -48
- package/tui/_path_match.py +0 -141
- package/tui/about.py +0 -95
- package/tui/acp/__pycache__/agent.cpython-314.pyc +0 -0
- package/tui/acp/__pycache__/api.cpython-314.pyc +0 -0
- package/tui/acp/__pycache__/encode_tool_call_id.cpython-314.pyc +0 -0
- package/tui/acp/__pycache__/messages.cpython-314.pyc +0 -0
- package/tui/acp/__pycache__/prompt.cpython-314.pyc +0 -0
- package/tui/acp/__pycache__/protocol.cpython-314.pyc +0 -0
- package/tui/acp/agent.py +0 -1002
- package/tui/acp/api.py +0 -73
- package/tui/acp/encode_tool_call_id.py +0 -12
- package/tui/acp/messages.py +0 -203
- package/tui/acp/prompt.py +0 -53
- package/tui/acp/protocol.py +0 -499
- package/tui/agent.py +0 -70
- package/tui/agent_schema.py +0 -76
- package/tui/agents.py +0 -46
- package/tui/ansi/__init__.py +0 -1
- package/tui/ansi/__pycache__/__init__.cpython-314.pyc +0 -0
- package/tui/ansi/__pycache__/_ansi.cpython-314.pyc +0 -0
- package/tui/ansi/__pycache__/_ansi_colors.cpython-314.pyc +0 -0
- package/tui/ansi/__pycache__/_control_codes.cpython-314.pyc +0 -0
- package/tui/ansi/__pycache__/_keys.cpython-314.pyc +0 -0
- package/tui/ansi/__pycache__/_sgr_styles.cpython-314.pyc +0 -0
- package/tui/ansi/__pycache__/_stream_parser.cpython-314.pyc +0 -0
- package/tui/ansi/_ansi.py +0 -1689
- package/tui/ansi/_ansi_colors.py +0 -264
- package/tui/ansi/_control_codes.py +0 -37
- package/tui/ansi/_keys.py +0 -251
- package/tui/ansi/_sgr_styles.py +0 -64
- package/tui/ansi/_stream_parser.py +0 -418
- package/tui/answer.py +0 -12
- package/tui/app.py +0 -1266
- package/tui/atomic.py +0 -37
- package/tui/cli.py +0 -313
- package/tui/code_analyze.py +0 -27
- package/tui/complete.py +0 -38
- package/tui/constants.py +0 -61
- package/tui/conversation_markdown.py +0 -30
- package/tui/danger.py +0 -372
- package/tui/data/agents/ampcode.com.toml +0 -52
- package/tui/data/agents/augmentcode.com.toml +0 -41
- package/tui/data/agents/cdh.cloud-dev-harness.toml +0 -23
- package/tui/data/agents/claude.com.toml +0 -41
- package/tui/data/agents/copilot.github.com.toml +0 -29
- package/tui/data/agents/crowai.dev.toml +0 -36
- package/tui/data/agents/cursor.com.toml +0 -38
- package/tui/data/agents/deepagents.langchain.com +0 -34
- package/tui/data/agents/docker.com.toml +0 -60
- package/tui/data/agents/geminicli.com.toml +0 -28
- package/tui/data/agents/goose.ai.toml +0 -52
- package/tui/data/agents/inference.huggingface.co.toml +0 -41
- package/tui/data/agents/kimi.com.toml +0 -35
- package/tui/data/agents/kiro.dev.toml +0 -43
- package/tui/data/agents/onecode.dev.toml +0 -22
- package/tui/data/agents/openai.com.toml +0 -53
- package/tui/data/agents/openclaw.ai.toml +0 -37
- package/tui/data/agents/opencode.ai.toml +0 -39
- package/tui/data/agents/openhands.dev.toml +0 -46
- package/tui/data/agents/stakpak.dev.toml +0 -62
- package/tui/data/agents/vibe.mistral.ai.toml +0 -31
- package/tui/data/agents/vtcode.dev.toml +0 -63
- package/tui/data/images/frog.png +0 -0
- package/tui/data/sounds/question.wav +0 -0
- package/tui/data/sounds/turn-over.wav +0 -0
- package/tui/db.py +0 -213
- package/tui/dec.py +0 -332
- package/tui/directory.py +0 -234
- package/tui/directory_suggester.py +0 -93
- package/tui/directory_watcher.py +0 -231
- package/tui/format_path.py +0 -25
- package/tui/fuzzy.py +0 -140
- package/tui/fuzzy_index.py +0 -275
- package/tui/gist.py +0 -33
- package/tui/history.py +0 -138
- package/tui/jsonrpc.py +0 -578
- package/tui/menus.py +0 -14
- package/tui/message_log.py +0 -69
- package/tui/messages.py +0 -144
- package/tui/option_content.py +0 -51
- package/tui/os.py +0 -0
- package/tui/path_complete.py +0 -217
- package/tui/path_filter.py +0 -124
- package/tui/paths.py +0 -87
- package/tui/pill.py +0 -23
- package/tui/platform_commands.py +0 -52
- package/tui/prompt/__pycache__/extract.cpython-314.pyc +0 -0
- package/tui/prompt/__pycache__/resource.cpython-314.pyc +0 -0
- package/tui/prompt/extract.py +0 -19
- package/tui/prompt/resource.py +0 -68
- package/tui/protocol.py +0 -28
- package/tui/screens/__init__.py +0 -0
- package/tui/screens/__pycache__/__init__.cpython-314.pyc +0 -0
- package/tui/screens/__pycache__/agent_modal.cpython-314.pyc +0 -0
- package/tui/screens/__pycache__/component_picker.cpython-314.pyc +0 -0
- package/tui/screens/__pycache__/diff_screen.cpython-314.pyc +0 -0
- package/tui/screens/__pycache__/log.cpython-314.pyc +0 -0
- package/tui/screens/__pycache__/main.cpython-313.pyc +0 -0
- package/tui/screens/__pycache__/main.cpython-314.pyc +0 -0
- package/tui/screens/__pycache__/permissions.cpython-314.pyc +0 -0
- package/tui/screens/__pycache__/projects_app.cpython-314.pyc +0 -0
- package/tui/screens/__pycache__/projects_screen.cpython-314.pyc +0 -0
- package/tui/screens/__pycache__/sessions.cpython-314.pyc +0 -0
- package/tui/screens/__pycache__/store.cpython-314.pyc +0 -0
- package/tui/screens/__pycache__/tool_content_screen.cpython-314.pyc +0 -0
- package/tui/screens/action_modal.py +0 -94
- package/tui/screens/agent_modal.py +0 -175
- package/tui/screens/command_edit_modal.py +0 -74
- package/tui/screens/component_picker.py +0 -168
- package/tui/screens/diff_screen.py +0 -84
- package/tui/screens/log.py +0 -553
- package/tui/screens/main.py +0 -385
- package/tui/screens/main.tcss +0 -655
- package/tui/screens/permissions.py +0 -404
- package/tui/screens/permissions.tcss +0 -72
- package/tui/screens/projects.tcss +0 -80
- package/tui/screens/projects_app.py +0 -347
- package/tui/screens/projects_screen.py +0 -284
- package/tui/screens/session_resume_modal.py +0 -172
- package/tui/screens/session_resume_modal.tcss +0 -35
- package/tui/screens/sessions.py +0 -164
- package/tui/screens/sessions.tcss +0 -119
- package/tui/screens/settings.py +0 -254
- package/tui/screens/settings.tcss +0 -101
- package/tui/screens/store.py +0 -500
- package/tui/screens/store.tcss +0 -274
- package/tui/screens/tool_content_screen.py +0 -59
- package/tui/session_tracker.py +0 -123
- package/tui/settings.py +0 -353
- package/tui/settings_schema.py +0 -431
- package/tui/shell.py +0 -304
- package/tui/shell_read.py +0 -42
- package/tui/slash_command.py +0 -34
- package/tui/tui.tcss +0 -246
- package/tui/twitter.py +0 -38
- package/tui/version.py +0 -80
- package/tui/visuals/__init__.py +0 -0
- package/tui/visuals/__pycache__/__init__.cpython-314.pyc +0 -0
- package/tui/visuals/__pycache__/columns.cpython-314.pyc +0 -0
- package/tui/visuals/columns.py +0 -272
- package/tui/widgets/__init__.py +0 -0
- package/tui/widgets/__pycache__/__init__.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/acp_content.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/agent_response.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/agent_thought.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/ask_user.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/condensed_path.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/context_stats.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/conversation.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/diff_view.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/directory_input.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/flash.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/future_text.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/grid_select.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/highlighted_textarea.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/load_more.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/mandelbrot.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/markdown_note.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/menu.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/modified_files.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/non_selectable_label.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/note.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/path_search.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/plan.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/project_directory_tree.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/project_grid_select.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/project_summary.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/prompt.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/question.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/session_grid_select.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/session_summary.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/session_tabs.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/shell_result.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/shell_terminal.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/side_bar.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/slash_complete.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/strike_text.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/subagent.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/subagent_screen.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/terminal.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/throbber.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/tool_call.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/user_input.cpython-314.pyc +0 -0
- package/tui/widgets/acp_content.py +0 -70
- package/tui/widgets/agent_response.py +0 -76
- package/tui/widgets/agent_thought.py +0 -167
- package/tui/widgets/ask_user.py +0 -264
- package/tui/widgets/command_pane.py +0 -223
- package/tui/widgets/condensed_path.py +0 -115
- package/tui/widgets/context_stats.py +0 -66
- package/tui/widgets/conversation.py +0 -2641
- package/tui/widgets/danger_warning.py +0 -65
- package/tui/widgets/diff_view.py +0 -69
- package/tui/widgets/directory_input.py +0 -8
- package/tui/widgets/flash.py +0 -81
- package/tui/widgets/future_text.py +0 -126
- package/tui/widgets/grid_select.py +0 -234
- package/tui/widgets/highlighted_textarea.py +0 -180
- package/tui/widgets/load_more.py +0 -24
- package/tui/widgets/mandelbrot.py +0 -294
- package/tui/widgets/markdown_note.py +0 -13
- package/tui/widgets/menu.py +0 -147
- package/tui/widgets/modified_files.py +0 -306
- package/tui/widgets/non_selectable_label.py +0 -5
- package/tui/widgets/note.py +0 -18
- package/tui/widgets/path_search.py +0 -492
- package/tui/widgets/plan.py +0 -285
- package/tui/widgets/project_directory_tree.py +0 -102
- package/tui/widgets/project_grid_select.py +0 -64
- package/tui/widgets/project_summary.py +0 -33
- package/tui/widgets/prompt.py +0 -795
- package/tui/widgets/question.py +0 -360
- package/tui/widgets/session_grid_select.py +0 -230
- package/tui/widgets/session_summary.py +0 -115
- package/tui/widgets/session_tabs.py +0 -188
- package/tui/widgets/shell_result.py +0 -35
- package/tui/widgets/shell_terminal.py +0 -40
- package/tui/widgets/side_bar.py +0 -124
- package/tui/widgets/slash_complete.py +0 -235
- package/tui/widgets/strike_text.py +0 -70
- package/tui/widgets/subagent.py +0 -287
- package/tui/widgets/subagent_screen.py +0 -709
- package/tui/widgets/terminal.py +0 -576
- package/tui/widgets/terminal_tool.py +0 -360
- package/tui/widgets/throbber.py +0 -100
- package/tui/widgets/tool_call.py +0 -398
- package/tui/widgets/user_input.py +0 -23
- package/tui/widgets/version.py +0 -5
- package/tui/widgets/welcome.py +0 -31
|
@@ -1,184 +0,0 @@
|
|
|
1
|
-
# AI-DLC Phase 1: Understand (理解)
|
|
2
|
-
|
|
3
|
-
Transform business intent into formal specification and behavior scenarios, scoped to the right FR namespace.
|
|
4
|
-
|
|
5
|
-
## Goal
|
|
6
|
-
|
|
7
|
-
Convert a business need into unambiguous, verifiable requirements before any design or code work begins. For multi-component features, capture the **cross-component boundary** in addition to per-component behavior.
|
|
8
|
-
|
|
9
|
-
## Flow
|
|
10
|
-
|
|
11
|
-
```
|
|
12
|
-
Intent (business need / user story)
|
|
13
|
-
│
|
|
14
|
-
▼
|
|
15
|
-
Identify scope: which components does this touch?
|
|
16
|
-
│
|
|
17
|
-
▼
|
|
18
|
-
SDD: Proposal (why, what, impact, affects: [native|desktop|web|backend|wxa|mya|tta|contracts])
|
|
19
|
-
│
|
|
20
|
-
▼
|
|
21
|
-
SDD: Spec Delta (EARS format — ADDED/MODIFIED/REMOVED, FR namespaces)
|
|
22
|
-
│
|
|
23
|
-
▼
|
|
24
|
-
BDD: Feature Files
|
|
25
|
-
- features/{component}/{domain}/{feature}.feature (per-component)
|
|
26
|
-
- aidlc/features/cross-stack/{domain}/{feature}.feature (full flow, if applies)
|
|
27
|
-
│
|
|
28
|
-
▼
|
|
29
|
-
Gate: Human review → approved or revise
|
|
30
|
-
```
|
|
31
|
-
|
|
32
|
-
## Scope Identification
|
|
33
|
-
|
|
34
|
-
Before writing the spec, declare which components the feature affects. This determines the FR namespaces and which lifecycle paths run.
|
|
35
|
-
|
|
36
|
-
| Affects | Example | FRs |
|
|
37
|
-
|---------|---------|-----|
|
|
38
|
-
| `[backend]` only | Internal API | `BE-FR-NNN` |
|
|
39
|
-
| `[web, backend]` | Login UI + API | `WEB-FR-NNN`, `BE-FR-NNN`, `INT-FR-NNN` |
|
|
40
|
-
| `[native, backend]` | Native login | `NATIVE-FR-NNN`, `BE-FR-NNN`, `INT-FR-NNN` |
|
|
41
|
-
| `[desktop, backend]` | Desktop login | `DESKTOP-FR-NNN`, `BE-FR-NNN`, `INT-FR-NNN` |
|
|
42
|
-
| `[wxa, backend]` | Mini-program login | `WXA-FR-NNN`, `BE-FR-NNN`, `INT-FR-NNN` |
|
|
43
|
-
| `[mya, backend]` | Mini-program login | `MYA-FR-NNN`, `BE-FR-NNN`, `INT-FR-NNN` |
|
|
44
|
-
| `[tta, backend]` | Mini-program login | `TTA-FR-NNN`, `BE-FR-NNN`, `INT-FR-NNN` |
|
|
45
|
-
| `[web, native, desktop, wxa, mya, tta, backend]` | Full feature | `WEB-FR-NNN`, `NATIVE-FR-NNN`, `DESKTOP-FR-NNN`, `WXA-FR-NNN`, `MYA-FR-NNN`, `TTA-FR-NNN`, `BE-FR-NNN`, `INT-FR-NNN` |
|
|
46
|
-
| `[contracts]` | Schema-only change | `INT-FR-NNN` only |
|
|
47
|
-
|
|
48
|
-
`affects: [contracts]` is reserved for **pure contract changes** (e.g. add a new field shared by all components). It still requires Plan + Verify.
|
|
49
|
-
|
|
50
|
-
## SDD — Spec-Driven Development
|
|
51
|
-
|
|
52
|
-
### Intent Capture
|
|
53
|
-
|
|
54
|
-
```markdown
|
|
55
|
-
## Intent
|
|
56
|
-
|
|
57
|
-
**Title:** {{title}}
|
|
58
|
-
**Affects:** [{{components}}]
|
|
59
|
-
**Why:** {{why}}
|
|
60
|
-
**What:** {{what}}
|
|
61
|
-
**Success:** {{success_criteria}}
|
|
62
|
-
```
|
|
63
|
-
|
|
64
|
-
### Spec Delta (EARS) with Namespace
|
|
65
|
-
|
|
66
|
-
```markdown
|
|
67
|
-
## Change: CHG-{{id}} — {{title}}
|
|
68
|
-
|
|
69
|
-
**Affects:** [{{components}}]
|
|
70
|
-
**Contracts touched:** {{list or "none"}}
|
|
71
|
-
|
|
72
|
-
## ADDED Requirements
|
|
73
|
-
|
|
74
|
-
### INT-FR-{{nnn}}: {{contract_title}}
|
|
75
|
-
(only if affects contracts or ≥2 components)
|
|
76
|
-
|
|
77
|
-
**Description (Event-Driven):**
|
|
78
|
-
When a {{event}}, the system SHALL {{behavior}} on the contract boundary.
|
|
79
|
-
|
|
80
|
-
### BE-FR-{{nnn}}: {{backend_title}}
|
|
81
|
-
**Description (Event-Driven):**
|
|
82
|
-
When {{event}}, the backend SHALL {{behavior}}.
|
|
83
|
-
|
|
84
|
-
### WEB-FR-{{nnn}}: {{web_title}}
|
|
85
|
-
**Description (Event-Driven):**
|
|
86
|
-
When {{event}}, the web client SHALL {{behavior}}.
|
|
87
|
-
|
|
88
|
-
### NATIVE-FR-{{nnn}}: {{native_title}}
|
|
89
|
-
**Description (Event-Driven):**
|
|
90
|
-
When {{event}}, the native client SHALL {{behavior}}.
|
|
91
|
-
|
|
92
|
-
### DESKTOP-FR-{{nnn}}: {{desktop_title}}
|
|
93
|
-
**Description (Event-Driven):**
|
|
94
|
-
When {{event}}, the desktop client SHALL {{behavior}}.
|
|
95
|
-
|
|
96
|
-
### WXA-FR-{{nnn}}: {{wxa_title}}
|
|
97
|
-
**Description (Event-Driven):**
|
|
98
|
-
When {{event}}, the WeChat Mini Program SHALL {{behavior}}.
|
|
99
|
-
|
|
100
|
-
### MYA-FR-{{nnn}}: {{mya_title}}
|
|
101
|
-
**Description (Event-Driven):**
|
|
102
|
-
When {{event}}, the Mini Program SHALL {{behavior}}.
|
|
103
|
-
|
|
104
|
-
### TTA-FR-{{nnn}}: {{tta_title}}
|
|
105
|
-
**Description (Event-Driven):**
|
|
106
|
-
When {{event}}, the TikTok Mini Program SHALL {{behavior}}.
|
|
107
|
-
```
|
|
108
|
-
|
|
109
|
-
### EARS Patterns
|
|
110
|
-
|
|
111
|
-
| Pattern | Syntax | When to Use |
|
|
112
|
-
|---------|--------|-------------|
|
|
113
|
-
| Ubiquitous | `The system SHALL ...` | Always-active rules |
|
|
114
|
-
| Event-Driven | `When {event}, the system SHALL ...` | Trigger-based behavior |
|
|
115
|
-
| State-Driven | `While {state}, the system SHALL ...` | Active state conditions |
|
|
116
|
-
| Unwanted | `If {condition}, the system SHALL ...` | Error handling |
|
|
117
|
-
| Optional | `Where {feature} enabled, the system SHALL ...` | Feature flags |
|
|
118
|
-
|
|
119
|
-
## BDD — Behavior-Driven Development
|
|
120
|
-
|
|
121
|
-
### Per-Component Feature Files
|
|
122
|
-
|
|
123
|
-
```gherkin
|
|
124
|
-
@WEB-FR-001
|
|
125
|
-
Feature: Web Login UI
|
|
126
|
-
|
|
127
|
-
@WEB-FR-001 @positive
|
|
128
|
-
Scenario: User logs in successfully
|
|
129
|
-
Given the web app is on the login page
|
|
130
|
-
When the user submits valid credentials
|
|
131
|
-
Then the user is redirected to dashboard
|
|
132
|
-
And the user receives a JWT in storage
|
|
133
|
-
|
|
134
|
-
@WEB-FR-001 @negative
|
|
135
|
-
Scenario: Invalid credentials show error
|
|
136
|
-
...
|
|
137
|
-
|
|
138
|
-
@WEB-FR-001 @edge
|
|
139
|
-
Scenario: Empty fields show validation
|
|
140
|
-
...
|
|
141
|
-
```
|
|
142
|
-
|
|
143
|
-
### Cross-Stack Feature File (mandatory for `affects ≥ 2 components`)
|
|
144
|
-
|
|
145
|
-
```gherkin
|
|
146
|
-
@INT-FR-001
|
|
147
|
-
Feature: Cross-stack login flow
|
|
148
|
-
|
|
149
|
-
@INT-FR-001 @positive
|
|
150
|
-
Scenario: Web login reaches backend and stores token
|
|
151
|
-
Given the web app is on the login page
|
|
152
|
-
When the user submits valid credentials
|
|
153
|
-
Then the backend POST /auth/login returns 200 with JWT
|
|
154
|
-
And the web app stores the token
|
|
155
|
-
And the user is redirected to dashboard
|
|
156
|
-
|
|
157
|
-
@INT-FR-001 @negative
|
|
158
|
-
Scenario: Backend rejects invalid credentials with 401
|
|
159
|
-
...
|
|
160
|
-
|
|
161
|
-
@INT-FR-001 @edge
|
|
162
|
-
Scenario: Backend timeout surfaces a user-friendly error
|
|
163
|
-
...
|
|
164
|
-
```
|
|
165
|
-
|
|
166
|
-
## Artifacts
|
|
167
|
-
|
|
168
|
-
| Artifact | Location | Purpose |
|
|
169
|
-
|----------|----------|---------|
|
|
170
|
-
| Intent | `aidlc/requirements.md` | Business need + `affects` |
|
|
171
|
-
| Spec delta | `aidlc/openspec/changes/{id}/spec-delta.md` | EARS, FR namespaces, `affects` |
|
|
172
|
-
| Per-component BDD | `apps/{component}/features/{domain}/{feature}.feature` | Component behavior |
|
|
173
|
-
| Cross-stack BDD | `aidlc/features/cross-stack/{domain}/{feature}.feature` | End-to-end flow |
|
|
174
|
-
| Contract spec | `aidlc/contracts/{api,events}/{name}.{yaml,graphql}` | INT-FR-NNN source of truth |
|
|
175
|
-
|
|
176
|
-
## Gate
|
|
177
|
-
|
|
178
|
-
**Before advancing to Plan phase:**
|
|
179
|
-
- [ ] `affects: [...]` declared in spec-delta
|
|
180
|
-
- [ ] Spec delta uses EARS format
|
|
181
|
-
- [ ] Per-component FRs: each tagged `@FR-{PREFIX}-NNN` (e.g. `@NATIVE-`, `@DESKTOP-`, `@WEB-`, `@BE-`, `@WXA-`, `@MYA-`, `@TTA-`), ≥3 scenarios (positive/negative/edge)
|
|
182
|
-
- [ ] If `affects` includes ≥2 components: at least one `INT-FR-NNN` and a `aidlc/features/cross-stack/*.feature` with ≥3 scenarios
|
|
183
|
-
- [ ] If `affects` includes contracts: contract file present in `aidlc/contracts/`
|
|
184
|
-
- [ ] Human reviewed and approved
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
# Understand Phase Agent Prompt
|
|
2
|
-
|
|
3
|
-
你是一个 AI-DLC Understand Phase Agent。
|
|
4
|
-
由 Master Agent 委派处理需求分析。
|
|
5
|
-
|
|
6
|
-
## 输入
|
|
7
|
-
- Intent 描述(来自用户 / Master)
|
|
8
|
-
- `affects: [component list]` 声明
|
|
9
|
-
|
|
10
|
-
## 任务
|
|
11
|
-
|
|
12
|
-
1. **SDD: Intent Capture**
|
|
13
|
-
- 在 `aidlc/requirements.md` 记录 Why / What / Success Criteria / Scope
|
|
14
|
-
- 声明 `affects: [native|desktop|web|backend|wxa|mya|tta|contracts]`
|
|
15
|
-
|
|
16
|
-
2. **SDD: Spec Delta (EARS)**
|
|
17
|
-
- 在 `aidlc/openspec/changes/{id}/spec-delta.md` 输出
|
|
18
|
-
- 使用 EARS 格式:Ubiquitous / Event-Driven / State-Driven / Unwanted / Optional
|
|
19
|
-
- FR 必须使用命名空间前缀(BE-FR-001, WEB-FR-001 等)
|
|
20
|
-
|
|
21
|
-
3. **BDD: Feature Files**
|
|
22
|
-
- 每个 FR ≥3 个 scenario(positive / negative / edge)
|
|
23
|
-
- Per-component: `apps/{component}/features/{domain}/{feature}.feature`
|
|
24
|
-
- Cross-stack: `aidlc/features/cross-stack/{domain}/{feature}.feature`
|
|
25
|
-
- Tag 使用 `@FR-PREFIX-NNN`
|
|
26
|
-
|
|
27
|
-
4. **Contract First**(跨组件时)
|
|
28
|
-
- 在 `aidlc/contracts/{api,events}/` 创建合约文件
|
|
29
|
-
- 引用 INT-FR-NNN
|
|
30
|
-
|
|
31
|
-
## 输出产物
|
|
32
|
-
- `aidlc/requirements.md`
|
|
33
|
-
- `aidlc/openspec/changes/{id}/spec-delta.md`
|
|
34
|
-
- `apps/{component}/features/{domain}/{feature}.feature`
|
|
35
|
-
- `aidlc/features/cross-stack/{domain}/{feature}.feature`(跨组件时)
|
|
36
|
-
- `aidlc/contracts/{api,events}/{name}.yaml`(跨组件时)
|
|
37
|
-
|
|
38
|
-
## 约束
|
|
39
|
-
- 遵守 `rules.md` 中的 UND-001 到 UND-006
|
|
40
|
-
- 遵守 `core/security.md`
|
|
41
|
-
- 完成前必须通过 Human Gate 审查
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
# Understand Rules (UND-*)
|
|
2
|
-
|
|
3
|
-
## UND-001: Intent Documentation
|
|
4
|
-
**Severity:** MUST
|
|
5
|
-
**Description:** Before any specification or implementation, the business intent MUST be documented. Intent includes: what is being built, why, and how success is measured.
|
|
6
|
-
**Valid:** Intent captured in `aidlc/requirements.md` with `affects: [...]` before spec delta.
|
|
7
|
-
**Invalid:** Starting spec delta or feature files without documented intent or without an `affects` declaration.
|
|
8
|
-
|
|
9
|
-
## UND-002: EARS Format
|
|
10
|
-
**Severity:** MUST
|
|
11
|
-
**Description:** All functional requirements MUST use EARS syntax (Ubiquitous, Event-Driven, State-Driven, Unwanted, or Optional).
|
|
12
|
-
**Valid:** `When a user submits valid credentials, the system SHALL return a JWT token.`
|
|
13
|
-
**Invalid:** `The login should work well and be fast.`
|
|
14
|
-
|
|
15
|
-
## UND-003: BDD Scenario Coverage
|
|
16
|
-
**Severity:** MUST
|
|
17
|
-
**Description:** Each functional requirement MUST have at least 3 BDD scenarios covering positive, negative, and edge cases. Scenarios MUST be tagged with the FR namespace prefix (`@NATIVE-`, `@DESKTOP-`, `@WEB-`, `@BE-`, `@WXA-`, `@MYA-`, `@TTA-`, or `@INT-`).
|
|
18
|
-
**Valid:** `@WEB-FR-001 @positive` with three scenarios per FR.
|
|
19
|
-
**Invalid:** One scenario per FR, or missing namespace prefix.
|
|
20
|
-
|
|
21
|
-
## UND-004: Affects Declaration
|
|
22
|
-
**Severity:** MUST
|
|
23
|
-
**Description:** Every spec delta MUST declare `affects: [native, desktop, web, backend, wxa, mya, tta, contracts]`.
|
|
24
|
-
**Valid:** `## Change: CHG-001 — User Login\nAffects: [web, backend, contracts]`
|
|
25
|
-
**Invalid:** Spec delta without an `affects` declaration.
|
|
26
|
-
|
|
27
|
-
## UND-005: Cross-Component Feature Decomposition
|
|
28
|
-
**Severity:** MUST
|
|
29
|
-
**Description:** A feature that affects ≥2 components MUST be split into: one FR per component, one or more `INT-*` FRs, and a `aidlc/features/cross-stack/*.feature` file.
|
|
30
|
-
**Valid:** `affects: [web, backend]` → `WEB-FR-001`, `BE-FR-001`, `INT-FR-001`, plus cross-stack feature file.
|
|
31
|
-
**Invalid:** A single feature file claiming to test both web and backend behavior.
|
|
32
|
-
|
|
33
|
-
## UND-006: Contract-First for Cross-Component
|
|
34
|
-
**Severity:** MUST
|
|
35
|
-
**Description:** When a feature introduces or changes a public API or event consumed by another component, a contract file MUST be added or updated in `aidlc/contracts/` before any per-component implementation.
|
|
36
|
-
**Valid:** `aidlc/contracts/api/auth.yaml` defines `POST /auth/login` before any code.
|
|
37
|
-
**Invalid:** Per-component code that depends on a contract not in `aidlc/contracts/`.
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: ai-dlc-verify
|
|
3
|
-
description: "Verify Phase: TDD Red-Green-Refactor → Contract Test → Quality Gates"
|
|
4
|
-
triggers:
|
|
5
|
-
- verify
|
|
6
|
-
- TDD
|
|
7
|
-
- test
|
|
8
|
-
- quality-gate
|
|
9
|
-
---
|
|
10
|
-
|
|
11
|
-
# Verify Phase (验证)
|
|
12
|
-
|
|
13
|
-
Execute TDD per BDD scenario, verify contracts, enforce quality gates.
|
|
14
|
-
|
|
15
|
-
## Entry
|
|
16
|
-
|
|
17
|
-
See `lifecycle.md` for the full phase flow.
|
|
18
|
-
See `rules.md` for enforceable rules (VRF-001 to VRF-006 + INT-001 to INT-006).
|
|
19
|
-
See `prompt.md` for the sub-agent delegation prompt template.
|
|
20
|
-
|
|
21
|
-
## 当被委派时
|
|
22
|
-
|
|
23
|
-
1. 按 DAG 顺序对每个 unit 执行 TDD Red→Green→Refactor
|
|
24
|
-
2. 运行合约测试 + 检查 backward-compat
|
|
25
|
-
3. 运行 cross-stack e2e
|
|
26
|
-
4. 执行质量门禁(cov≥80%, 0 vulns, no TODO)
|
|
@@ -1,192 +0,0 @@
|
|
|
1
|
-
# AI-DLC Phase 3: Verify (验证)
|
|
2
|
-
|
|
3
|
-
Execute TDD red-green-refactor per BDD scenario at the right test layer, verify all scenarios, and run cross-component contract and cross-stack gates.
|
|
4
|
-
|
|
5
|
-
## Goal
|
|
6
|
-
|
|
7
|
-
Ensure every BDD scenario is correctly implemented at the right layer, every contract is backward-compatible, and the full stack e2e flow works — before delivery.
|
|
8
|
-
|
|
9
|
-
## Flow
|
|
10
|
-
|
|
11
|
-
```
|
|
12
|
-
Plan + Tasks approved
|
|
13
|
-
│
|
|
14
|
-
▼
|
|
15
|
-
For each unit in DAG order (within each affected component):
|
|
16
|
-
For each BDD scenario in unit:
|
|
17
|
-
│
|
|
18
|
-
RED: Write test at the right layer → confirm failure
|
|
19
|
-
GREEN: Write minimum implementation → confirm pass
|
|
20
|
-
REFACTOR: Clean up → confirm all tests still pass
|
|
21
|
-
│
|
|
22
|
-
─────────────────────────────────
|
|
23
|
-
Next unit...
|
|
24
|
-
│
|
|
25
|
-
▼
|
|
26
|
-
After per-component units: regenerate shared types + contract tests
|
|
27
|
-
aidlc/tools/generate_shared.py
|
|
28
|
-
pytest aidlc/tests/contract/
|
|
29
|
-
aidlc/tools/contract_diff.py
|
|
30
|
-
│
|
|
31
|
-
▼
|
|
32
|
-
After contracts: cross-stack e2e against unified preview
|
|
33
|
-
pytest aidlc/tests/cross-stack/
|
|
34
|
-
│
|
|
35
|
-
▼
|
|
36
|
-
Gate: All layers green + contracts compatible + cross-stack pass
|
|
37
|
-
```
|
|
38
|
-
|
|
39
|
-
## Test Layers
|
|
40
|
-
|
|
41
|
-
| Layer | When | Test Location | Run Against |
|
|
42
|
-
|-------|------|---------------|-------------|
|
|
43
|
-
| `unit` | Per function / module | `apps/{comp}/tests/unit/` | Local |
|
|
44
|
-
| `integration` | Component + its DB / internal API | `apps/{comp}/tests/integration/` | Local container |
|
|
45
|
-
| `e2e` | Whole component against preview | `apps/{comp}/tests/e2e/` | Component preview URL |
|
|
46
|
-
| `cross-stack` | Full multi-client ↔ backend flow | `aidlc/tests/cross-stack/` | Unified stack preview URL |
|
|
47
|
-
| `contract` | Contract shape + backward compat | `aidlc/tests/contract/` | Generated `aidlc/packages/shared/` |
|
|
48
|
-
|
|
49
|
-
## TDD — Red
|
|
50
|
-
|
|
51
|
-
Write one pytest test per assertion in the BDD scenario, at the layer the test plan specified.
|
|
52
|
-
|
|
53
|
-
```python
|
|
54
|
-
# apps/backend/tests/unit/test_auth.py
|
|
55
|
-
def test_login_valid_credentials():
|
|
56
|
-
result = authenticate("user@example.com", "correct123")
|
|
57
|
-
assert result.token is not None
|
|
58
|
-
assert result.expires_in == 3600
|
|
59
|
-
```
|
|
60
|
-
|
|
61
|
-
```bash
|
|
62
|
-
pytest apps/backend/tests/unit/test_auth.py -v
|
|
63
|
-
# FAILED — authenticate() not defined (RED ✓)
|
|
64
|
-
```
|
|
65
|
-
|
|
66
|
-
**Rule VRF-001:** Test must fail on first run.
|
|
67
|
-
|
|
68
|
-
## TDD — Green
|
|
69
|
-
|
|
70
|
-
Write the minimum code to make the test pass. No premature abstraction.
|
|
71
|
-
|
|
72
|
-
```python
|
|
73
|
-
# apps/backend/src/auth/login.py
|
|
74
|
-
def authenticate(email, password):
|
|
75
|
-
if email == "user@example.com" and password == "correct123":
|
|
76
|
-
return AuthResult(token="jwt_token", expires_in=3600)
|
|
77
|
-
raise AuthError("Invalid credentials")
|
|
78
|
-
```
|
|
79
|
-
|
|
80
|
-
**Rule VRF-002:** Minimum code to pass.
|
|
81
|
-
|
|
82
|
-
## TDD — Refactor
|
|
83
|
-
|
|
84
|
-
```bash
|
|
85
|
-
pytest --cov --cov-fail-under=80
|
|
86
|
-
# All tests passed, coverage ≥80% (REFACTOR ✓)
|
|
87
|
-
```
|
|
88
|
-
|
|
89
|
-
**Rule VRF-003:** Behavior must not change. All existing tests must pass before and after.
|
|
90
|
-
|
|
91
|
-
## Contract Verification (INT-001, INT-002, INT-003)
|
|
92
|
-
|
|
93
|
-
After per-component units pass and before cross-stack e2e:
|
|
94
|
-
|
|
95
|
-
```bash
|
|
96
|
-
# 1. Regenerate shared types from contracts
|
|
97
|
-
aidlc/tools/generate_shared.py
|
|
98
|
-
# → aidlc/packages/shared/{api,events} updated
|
|
99
|
-
|
|
100
|
-
# 2. Run contract tests
|
|
101
|
-
pytest aidlc/tests/contract/ --verbose
|
|
102
|
-
# → All contract scenarios pass (uses packages/shared)
|
|
103
|
-
|
|
104
|
-
# 3. Run contract compat check
|
|
105
|
-
aidlc/tools/contract_diff.py --base main --head HEAD
|
|
106
|
-
# → exit 0 = backward-compatible
|
|
107
|
-
# → exit 1 = breaking change detected, BLOCKED unless human-approved
|
|
108
|
-
```
|
|
109
|
-
|
|
110
|
-
**Rule INT-001:** Contract tests must be 100% pass.
|
|
111
|
-
|
|
112
|
-
**Rule INT-002:** Any breaking contract change (field removed, type changed, status code changed, required field added) is BLOCKED until a human approves the major version bump and a migration note is added to `aidlc/contracts/CHANGELOG.md`.
|
|
113
|
-
|
|
114
|
-
**Rule INT-003:** Shared types must be generated, not hand-written. CI runs `generate_shared` and fails the build if `aidlc/packages/shared/` is out of date.
|
|
115
|
-
|
|
116
|
-
## Cross-Stack E2E (STK-001)
|
|
117
|
-
|
|
118
|
-
```bash
|
|
119
|
-
export STACK_URL=$(deploy_stack --preview --output url)
|
|
120
|
-
pytest aidlc/tests/cross-stack/ --stack-url $STACK_URL --verbose
|
|
121
|
-
# All cross-stack scenarios pass
|
|
122
|
-
```
|
|
123
|
-
|
|
124
|
-
**Rule STK-001:** All `cross-stack` scenarios must pass. A single failure blocks delivery.
|
|
125
|
-
|
|
126
|
-
## BDD Scenario Verification (per layer)
|
|
127
|
-
|
|
128
|
-
```bash
|
|
129
|
-
# Per component
|
|
130
|
-
pytest-bdd apps/backend/features/ --verbose
|
|
131
|
-
pytest-bdd apps/web/features/ --verbose # e.g. via cucumber-js
|
|
132
|
-
pytest-bdd apps/native/features/ --verbose # or via detox/cavy
|
|
133
|
-
pytest-bdd apps/desktop/features/ --verbose # or via spectron
|
|
134
|
-
pytest-bdd apps/wxa/features/ --verbose
|
|
135
|
-
pytest-bdd apps/mya/features/ --verbose
|
|
136
|
-
pytest-bdd apps/tta/features/ --verbose
|
|
137
|
-
|
|
138
|
-
# Cross-stack
|
|
139
|
-
pytest-bdd aidlc/features/cross-stack/ --verbose
|
|
140
|
-
```
|
|
141
|
-
|
|
142
|
-
## Quality Gates (Backpressure)
|
|
143
|
-
|
|
144
|
-
All gates enforced on every attempt to mark a unit / change complete:
|
|
145
|
-
|
|
146
|
-
```bash
|
|
147
|
-
# Per component
|
|
148
|
-
pytest apps/{component}/ --cov --cov-fail-under=80 && \
|
|
149
|
-
pytest-bdd apps/{component}/features/ --verbose && \
|
|
150
|
-
bandit -r apps/{component}/src/ -q && \
|
|
151
|
-
! grep -rn "TODO\|FIXME\|HACK\|XXX" apps/{component}/src/
|
|
152
|
-
|
|
153
|
-
# Cross-component
|
|
154
|
-
pytest aidlc/tests/contract/ && \
|
|
155
|
-
aidlc/tools/contract_diff.py --base main --head HEAD
|
|
156
|
-
|
|
157
|
-
# Stack
|
|
158
|
-
pytest aidlc/tests/cross-stack/ --stack-url $STACK_URL
|
|
159
|
-
```
|
|
160
|
-
|
|
161
|
-
| Gate | Threshold | Rule | Scope |
|
|
162
|
-
|------|-----------|------|-------|
|
|
163
|
-
| Unit/integration coverage | ≥80% | VRF-005 | Per component |
|
|
164
|
-
| BDD scenarios | 100% pass | VRF-004 | Per component |
|
|
165
|
-
| Security | 0 vulns | VRF-005 | Per component |
|
|
166
|
-
| No TODOs | 0 in src/ | VRF-005 | Per component |
|
|
167
|
-
| Contract tests | 100% pass | INT-001 | Cross-component |
|
|
168
|
-
| Contract compat | backward-compat | INT-002 | Cross-component |
|
|
169
|
-
| Shared types | generated, in sync | INT-003 | Cross-component |
|
|
170
|
-
| Cross-stack e2e | 100% pass | STK-001 | Stack |
|
|
171
|
-
|
|
172
|
-
## Artifacts
|
|
173
|
-
|
|
174
|
-
| Artifact | Location |
|
|
175
|
-
|----------|----------|
|
|
176
|
-
| TDD tests (unit/integration) | `apps/{comp}/tests/{unit,integration}/test_{feature}.py` |
|
|
177
|
-
| TDD tests (e2e) | `apps/{comp}/tests/e2e/test_{feature}.py` |
|
|
178
|
-
| BDD step defs (component) | `apps/{comp}/features/steps/test_{feature}_steps.py` |
|
|
179
|
-
| BDD step defs (cross-stack) | `aidlc/features/cross-stack/steps/test_{feature}_steps.py` |
|
|
180
|
-
| Implementation | `apps/{comp}/src/{module}/{feature}.py` |
|
|
181
|
-
| Contract tests | `aidlc/tests/contract/test_{contract}.py` |
|
|
182
|
-
| Cross-stack e2e | `aidlc/tests/cross-stack/test_{flow}.py` |
|
|
183
|
-
| Contract diff | `aidlc/openspec/changes/{id}/contract-diff.md` (filled) |
|
|
184
|
-
|
|
185
|
-
## Gate
|
|
186
|
-
|
|
187
|
-
**Before advancing to Deliver phase:**
|
|
188
|
-
- [ ] Per-component: All BDD scenarios pass (100%), coverage ≥80%, 0 vulns, no TODO
|
|
189
|
-
- [ ] Contracts: `aidlc/tools/contract_diff.py` exits 0; `aidlc/tests/contract/` 100% pass; `aidlc/packages/shared/` regenerated and in sync
|
|
190
|
-
- [ ] Cross-stack: `aidlc/tests/cross-stack/` 100% pass against stack preview
|
|
191
|
-
- [ ] `aidlc/openspec/changes/{id}/contract-diff.md` is filled and reviewed
|
|
192
|
-
- [ ] All existing tests still pass
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
# Verify Phase Agent Prompt
|
|
2
|
-
|
|
3
|
-
你是一个 AI-DLC Verify Phase Agent。
|
|
4
|
-
由 Master Agent 委派处理测试验证。
|
|
5
|
-
|
|
6
|
-
## 输入
|
|
7
|
-
- `aidlc/openspec/changes/{id}/design.md` 和 `task-list.md`
|
|
8
|
-
- BDD feature 文件
|
|
9
|
-
|
|
10
|
-
## 任务
|
|
11
|
-
|
|
12
|
-
1. **TDD Red-Green-Refactor**(按 DAG 顺序)
|
|
13
|
-
- 对每个 unit 的每个 BDD scenario:
|
|
14
|
-
- RED: 写 test → 确认失败
|
|
15
|
-
- GREEN: 写最小实现 → 确认通过
|
|
16
|
-
- REFACTOR: 重构清理 → 全部通过
|
|
17
|
-
- 测试按 layer 分类:unit / integration / e2e
|
|
18
|
-
|
|
19
|
-
2. **Contract Verification**
|
|
20
|
-
- 重新生成 `aidlc/packages/shared/` 类型
|
|
21
|
-
- 运行 `pytest aidlc/tests/contract/`
|
|
22
|
-
- 运行 `aidlc/tools/contract_diff.py`
|
|
23
|
-
|
|
24
|
-
3. **Cross-Stack e2e**
|
|
25
|
-
- 对 unified preview 运行 `aidlc/tests/cross-stack/`
|
|
26
|
-
|
|
27
|
-
4. **Quality Gates**
|
|
28
|
-
- coverage ≥ 80%
|
|
29
|
-
- BDD scenarios 100% pass
|
|
30
|
-
- 0 vulns, no TODO
|
|
31
|
-
|
|
32
|
-
## 输出产物
|
|
33
|
-
- `apps/{component}/tests/{unit,integration,e2e}/test_{feature}.py`
|
|
34
|
-
- `apps/{component}/features/steps/test_{feature}_steps.py`
|
|
35
|
-
- `apps/{component}/src/{module}/{feature}.py`
|
|
36
|
-
- `aidlc/tests/contract/test_{contract}.py`
|
|
37
|
-
- `aidlc/tests/cross-stack/test_{flow}.py`
|
|
38
|
-
- `aidlc/openspec/changes/{id}/contract-diff.md`(填充)
|
|
39
|
-
|
|
40
|
-
## 约束
|
|
41
|
-
- 遵守 `rules.md` 中的 VRF-001 到 VRF-006
|
|
42
|
-
- 遵守 INT-001 到 INT-006
|
|
43
|
-
- 遵守 STK-001 到 STK-006
|
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
# Verify Rules (VRF-*) + Integration Rules (INT-*)
|
|
2
|
-
|
|
3
|
-
## VRF-001: TDD Red Phase
|
|
4
|
-
**Severity:** MUST
|
|
5
|
-
**Description:** Before writing implementation, write a test that asserts expected behavior. The test MUST fail on first run.
|
|
6
|
-
**Valid:** `pytest apps/backend/tests/unit/test_auth.py -k test_login` → FAILED.
|
|
7
|
-
**Invalid:** Test passes on first run.
|
|
8
|
-
|
|
9
|
-
## VRF-002: TDD Green Phase
|
|
10
|
-
**Severity:** MUST
|
|
11
|
-
**Description:** Write the minimum code needed to make the test pass. No premature abstraction.
|
|
12
|
-
**Valid:** Only the code path required by the test is implemented.
|
|
13
|
-
**Invalid:** Adding database, caching, or logging before the test requires it.
|
|
14
|
-
|
|
15
|
-
## VRF-003: TDD Refactor Phase
|
|
16
|
-
**Severity:** MUST
|
|
17
|
-
**Description:** After tests pass, refactor to improve code quality while keeping ALL tests green.
|
|
18
|
-
**Valid:** `pytest --cov --cov-fail-under=80` → all pass.
|
|
19
|
-
**Invalid:** Behavior change during refactoring.
|
|
20
|
-
|
|
21
|
-
## VRF-004: BDD Scenario Pass Gate
|
|
22
|
-
**Severity:** MUST
|
|
23
|
-
**Description:** ALL BDD scenarios MUST pass at every required layer before marking complete.
|
|
24
|
-
**Valid:** `pytest-bdd apps/{component}/features/ --verbose` → all pass.
|
|
25
|
-
**Invalid:** Any failing BDD scenario.
|
|
26
|
-
|
|
27
|
-
## VRF-005: Quality Gate Backpressure
|
|
28
|
-
**Severity:** MUST
|
|
29
|
-
**Description:** On every unit completion, ALL gates must pass: coverage ≥80%, BDD 100%, 0 vulns, no TODO.
|
|
30
|
-
**Valid:** `pytest --cov --cov-fail-under=80 && bandit -r src/ -q && ! grep -rn "TODO" src/`
|
|
31
|
-
**Invalid:** Any single gate fails.
|
|
32
|
-
|
|
33
|
-
## VRF-006: Test Layer Correctness
|
|
34
|
-
**Severity:** MUST
|
|
35
|
-
**Description:** Each BDD scenario MUST be tested at the layer the plan specified. Cross-stack ≠ unit.
|
|
36
|
-
**Valid:** Cross-stack scenarios in `aidlc/tests/cross-stack/` against STACK_URL.
|
|
37
|
-
**Invalid:** Cross-stack scenario implemented as mocked unit test.
|
|
38
|
-
|
|
39
|
-
## INT-001: Contract as Source of Truth
|
|
40
|
-
**Severity:** MUST
|
|
41
|
-
**Description:** All cross-component APIs and events MUST be defined in `contracts/` (OpenAPI/AsyncAPI/GraphQL) and tagged with `INT-FR-*`.
|
|
42
|
-
**Valid:** `aidlc/contracts/api/auth.yaml` defines POST /auth/login; components use generated types.
|
|
43
|
-
**Invalid:** Duplicate hand-written types across components with no contract file.
|
|
44
|
-
|
|
45
|
-
## INT-002: Backward-Compatibility by Default
|
|
46
|
-
**Severity:** MUST
|
|
47
|
-
**Description:** Contract changes MUST be backward-compatible. Breaking = field removed, type changed, status code changed, required field added. BLOCKED until human approves MAJOR bump + CHANGELOG entry.
|
|
48
|
-
**Valid:** Adding a new optional field (MINOR).
|
|
49
|
-
**Invalid:** Removing a field without human approval.
|
|
50
|
-
|
|
51
|
-
## INT-003: Generated Shared Types
|
|
52
|
-
**Severity:** MUST
|
|
53
|
-
**Description:** `aidlc/packages/shared/` generated from `aidlc/contracts/`. Component code MUST import from shared.
|
|
54
|
-
**Valid:** `git diff --exit-code aidlc/packages/shared/` → clean after generation.
|
|
55
|
-
**Invalid:** Hand-edited files under `aidlc/packages/shared/`.
|
|
56
|
-
|
|
57
|
-
## INT-004: Contract Tests at INT FR Level
|
|
58
|
-
**Severity:** MUST
|
|
59
|
-
**Description:** Every `INT-FR-*` MUST have contract tests in `aidlc/tests/contract/` verifying schema.
|
|
60
|
-
**Valid:** Provider-agnostic contract tests using generated shared types.
|
|
61
|
-
**Invalid:** Contract tests calling real production backend.
|
|
62
|
-
|
|
63
|
-
## INT-005: Cross-Stack Feature Coverage
|
|
64
|
-
**Severity:** MUST
|
|
65
|
-
**Description:** Every `INT-FR-*` MUST have ≥3 scenarios in `aidlc/features/cross-stack/` implemented in `aidlc/tests/cross-stack/`.
|
|
66
|
-
**Valid:** Cross-stack scenarios running against unified STACK_URL.
|
|
67
|
-
**Invalid:** INT-FR without cross-stack feature file.
|
|
68
|
-
|
|
69
|
-
## INT-006: Contract Diff Artifact
|
|
70
|
-
**Severity:** MUST
|
|
71
|
-
**Description:** Every contract change MUST produce `aidlc/openspec/changes/{id}/contract-diff.md`.
|
|
72
|
-
**Valid:** Generated by `aidlc/tools/contract_diff.py` with added/removed/changed fields.
|
|
73
|
-
**Invalid:** Contract change merged without contract-diff.md.
|
|
@@ -1,91 +0,0 @@
|
|
|
1
|
-
# Behavior-Driven Development (BDD)
|
|
2
|
-
|
|
3
|
-
BDD is the behavior specification and verification methodology used in Understand and Verify phases.
|
|
4
|
-
|
|
5
|
-
## Role in AI-DLC
|
|
6
|
-
|
|
7
|
-
| Phase | BDD Usage |
|
|
8
|
-
|-------|-----------|
|
|
9
|
-
| Understand | Feature files with Given/When/Then scenarios |
|
|
10
|
-
| Verify | pytest-bdd scenario verification against implementation |
|
|
11
|
-
| Deliver | BDD e2e tests against preview URL |
|
|
12
|
-
|
|
13
|
-
## Gherkin Syntax
|
|
14
|
-
|
|
15
|
-
| Keyword | Purpose |
|
|
16
|
-
|---------|---------|
|
|
17
|
-
| `Feature` | High-level feature description |
|
|
18
|
-
| `Scenario` | Single behavior example |
|
|
19
|
-
| `Given` | Precondition / starting state |
|
|
20
|
-
| `When` | Action performed |
|
|
21
|
-
| `Then` | Expected outcome |
|
|
22
|
-
| `And` / `But` | Additional clause |
|
|
23
|
-
| `Background` | Steps before every scenario |
|
|
24
|
-
| `Scenario Outline` | Template with Examples table |
|
|
25
|
-
| `@tag` | Metadata (FR ID, type) |
|
|
26
|
-
|
|
27
|
-
## Scenario Coverage Rules
|
|
28
|
-
|
|
29
|
-
Each FR must have at least 3 scenarios:
|
|
30
|
-
|
|
31
|
-
| Type | Purpose | Example Tag |
|
|
32
|
-
|------|---------|-------------|
|
|
33
|
-
| Positive | Happy path, should work | `@FR-001 @positive` |
|
|
34
|
-
| Negative | Error handling, should fail | `@FR-001 @negative` |
|
|
35
|
-
| Edge case | Boundary conditions | `@FR-001 @edge` |
|
|
36
|
-
|
|
37
|
-
## Example
|
|
38
|
-
|
|
39
|
-
```gherkin
|
|
40
|
-
@FR-001
|
|
41
|
-
Feature: User Login
|
|
42
|
-
|
|
43
|
-
@FR-001 @positive
|
|
44
|
-
Scenario: Successful login
|
|
45
|
-
Given the user is on the login page
|
|
46
|
-
When the user submits email "user@test.com" and password "correct123"
|
|
47
|
-
Then the user receives a JWT token
|
|
48
|
-
And the user is redirected to dashboard
|
|
49
|
-
|
|
50
|
-
@FR-001 @negative
|
|
51
|
-
Scenario: Login with wrong password
|
|
52
|
-
Given the user is on the login page
|
|
53
|
-
When the user submits email "user@test.com" and password "wrong"
|
|
54
|
-
Then the user sees error "Invalid credentials"
|
|
55
|
-
|
|
56
|
-
@FR-001 @edge
|
|
57
|
-
Scenario: Login with empty fields
|
|
58
|
-
Given the user is on the login page
|
|
59
|
-
When the user submits email "" and password ""
|
|
60
|
-
Then the user sees error "Email and password are required"
|
|
61
|
-
```
|
|
62
|
-
|
|
63
|
-
## pytest-bdd Integration
|
|
64
|
-
|
|
65
|
-
```python
|
|
66
|
-
# features/steps/test_login_steps.py
|
|
67
|
-
from pytest_bdd import scenarios, given, when, then, parsers
|
|
68
|
-
|
|
69
|
-
scenarios("../auth/login.feature")
|
|
70
|
-
|
|
71
|
-
@given("the user is on the login page")
|
|
72
|
-
def login_page():
|
|
73
|
-
return LoginPage()
|
|
74
|
-
|
|
75
|
-
@when(parsers.parse("the user submits email {email} and password {password}"))
|
|
76
|
-
def submit(email, password):
|
|
77
|
-
...
|
|
78
|
-
```
|
|
79
|
-
|
|
80
|
-
## Verification
|
|
81
|
-
|
|
82
|
-
```bash
|
|
83
|
-
# Run all BDD scenarios
|
|
84
|
-
pytest-bdd features/ --verbose
|
|
85
|
-
|
|
86
|
-
# Run scenarios for a specific FR
|
|
87
|
-
pytest-bdd features/ -k "FR-001"
|
|
88
|
-
|
|
89
|
-
# BDD scenario coverage
|
|
90
|
-
pytest-bdd features/ --coverage
|
|
91
|
-
```
|