@scemoon/cdh 1.0.6 → 1.0.8
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 +2 -1
- 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 -807
- 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
package/cdh/scaffold.py
DELETED
|
@@ -1,728 +0,0 @@
|
|
|
1
|
-
from __future__ import annotations
|
|
2
|
-
|
|
3
|
-
from dataclasses import dataclass
|
|
4
|
-
from pathlib import Path
|
|
5
|
-
|
|
6
|
-
import yaml
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
SKILL_NAME = "ai-dlc-skill"
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
@dataclass(frozen=True)
|
|
13
|
-
class ComponentSpec:
|
|
14
|
-
id: str
|
|
15
|
-
kind: str
|
|
16
|
-
owns: str
|
|
17
|
-
fr_prefix: str
|
|
18
|
-
tech: str
|
|
19
|
-
label: str
|
|
20
|
-
description: str
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
@dataclass(frozen=True)
|
|
24
|
-
class CrossCutSpec:
|
|
25
|
-
id: str
|
|
26
|
-
paths: tuple[str, ...]
|
|
27
|
-
label: str
|
|
28
|
-
description: str
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
COMPONENTS: tuple[ComponentSpec, ...] = (
|
|
32
|
-
ComponentSpec(
|
|
33
|
-
id="native",
|
|
34
|
-
kind="mobile",
|
|
35
|
-
owns="apps/native",
|
|
36
|
-
fr_prefix="NATIVE",
|
|
37
|
-
tech="react-native | flutter",
|
|
38
|
-
label="Mobile App",
|
|
39
|
-
description="iOS/Android cross-platform (RN/Flutter)",
|
|
40
|
-
),
|
|
41
|
-
ComponentSpec(
|
|
42
|
-
id="desktop",
|
|
43
|
-
kind="desktop",
|
|
44
|
-
owns="apps/desktop",
|
|
45
|
-
fr_prefix="DESKTOP",
|
|
46
|
-
tech="electron | tauri",
|
|
47
|
-
label="Desktop App",
|
|
48
|
-
description="Cross-platform desktop (Electron/Tauri)",
|
|
49
|
-
),
|
|
50
|
-
ComponentSpec(
|
|
51
|
-
id="web",
|
|
52
|
-
kind="frontend",
|
|
53
|
-
owns="apps/web",
|
|
54
|
-
fr_prefix="WEB",
|
|
55
|
-
tech="react | vue | svelte",
|
|
56
|
-
label="Web Frontend",
|
|
57
|
-
description="Browser SPA/SSR (React/Vue/Svelte)",
|
|
58
|
-
),
|
|
59
|
-
ComponentSpec(
|
|
60
|
-
id="backend",
|
|
61
|
-
kind="service",
|
|
62
|
-
owns="apps/backend",
|
|
63
|
-
fr_prefix="BE",
|
|
64
|
-
tech="python | node | go",
|
|
65
|
-
label="Backend Service",
|
|
66
|
-
description="HTTP API/microservice (Python/Node/Go)",
|
|
67
|
-
),
|
|
68
|
-
ComponentSpec(
|
|
69
|
-
id="wxa",
|
|
70
|
-
kind="mini-program",
|
|
71
|
-
owns="apps/wxa",
|
|
72
|
-
fr_prefix="WXA",
|
|
73
|
-
tech="miniprogram",
|
|
74
|
-
label="WeChat Mini-Program",
|
|
75
|
-
description="WeChat ecosystem mini-program",
|
|
76
|
-
),
|
|
77
|
-
ComponentSpec(
|
|
78
|
-
id="mya",
|
|
79
|
-
kind="mini-program",
|
|
80
|
-
owns="apps/mya",
|
|
81
|
-
fr_prefix="MYA",
|
|
82
|
-
tech="miniprogram",
|
|
83
|
-
label="Alipay Mini-Program",
|
|
84
|
-
description="Alipay ecosystem mini-program",
|
|
85
|
-
),
|
|
86
|
-
ComponentSpec(
|
|
87
|
-
id="tta",
|
|
88
|
-
kind="mini-program",
|
|
89
|
-
owns="apps/tta",
|
|
90
|
-
fr_prefix="TTA",
|
|
91
|
-
tech="miniprogram",
|
|
92
|
-
label="TikTok Mini-Program",
|
|
93
|
-
description="TikTok/Douyin ecosystem mini-program",
|
|
94
|
-
),
|
|
95
|
-
)
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
COMPONENT_BY_ID: dict[str, ComponentSpec] = {c.id: c for c in COMPONENTS}
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
CROSS_CUTTING: tuple[CrossCutSpec, ...] = (
|
|
102
|
-
CrossCutSpec(
|
|
103
|
-
id="contracts",
|
|
104
|
-
paths=("aidlc/contracts/CHANGELOG.md",),
|
|
105
|
-
label="Interface Contracts",
|
|
106
|
-
description="API/event contracts and changelog",
|
|
107
|
-
),
|
|
108
|
-
CrossCutSpec(
|
|
109
|
-
id="shared",
|
|
110
|
-
paths=("aidlc/packages/shared",),
|
|
111
|
-
label="Shared Types",
|
|
112
|
-
description="Cross-component shared types package",
|
|
113
|
-
),
|
|
114
|
-
CrossCutSpec(
|
|
115
|
-
id="openspec",
|
|
116
|
-
paths=(),
|
|
117
|
-
label="OpenSpec Changes",
|
|
118
|
-
description="OpenSpec change proposals",
|
|
119
|
-
),
|
|
120
|
-
CrossCutSpec(
|
|
121
|
-
id="cross_stack_features",
|
|
122
|
-
paths=(),
|
|
123
|
-
label="Cross-Stack BDD",
|
|
124
|
-
description="End-to-end BDD features across components",
|
|
125
|
-
),
|
|
126
|
-
CrossCutSpec(
|
|
127
|
-
id="cross_stack_tests",
|
|
128
|
-
paths=("aidlc/tests/contract", "aidlc/tests/cross-stack"),
|
|
129
|
-
label="Cross-Stack Tests",
|
|
130
|
-
description="Contract tests and cross-stack integration tests",
|
|
131
|
-
),
|
|
132
|
-
CrossCutSpec(
|
|
133
|
-
id="provider",
|
|
134
|
-
paths=(
|
|
135
|
-
"aidlc/providers/tcb/provider.yaml",
|
|
136
|
-
"aidlc/providers/tcb/deployment.yaml",
|
|
137
|
-
"aidlc/providers/tcb/preview.yaml",
|
|
138
|
-
),
|
|
139
|
-
label="Cloud Provider",
|
|
140
|
-
description="TCB (Tencent CloudBase) provider config",
|
|
141
|
-
),
|
|
142
|
-
CrossCutSpec(
|
|
143
|
-
id="tools",
|
|
144
|
-
paths=(
|
|
145
|
-
"aidlc/tools/deploy_stack.py",
|
|
146
|
-
"aidlc/tools/contract_diff.py",
|
|
147
|
-
"aidlc/tools/generate_shared.py",
|
|
148
|
-
),
|
|
149
|
-
label="Tooling Scripts",
|
|
150
|
-
description="deploy_stack / contract_diff / generate_shared stubs",
|
|
151
|
-
),
|
|
152
|
-
)
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
CROSS_CUTTING_BY_ID: dict[str, CrossCutSpec] = {c.id: c for c in CROSS_CUTTING}
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
TCB_PROVIDER_YAML = """provider:
|
|
159
|
-
name: tcb
|
|
160
|
-
display_name: Tencent CloudBase
|
|
161
|
-
default: true
|
|
162
|
-
version: 3.0.0
|
|
163
|
-
|
|
164
|
-
storage:
|
|
165
|
-
object_storage: cloudbase-storage
|
|
166
|
-
document_db: docdb
|
|
167
|
-
relational_db: mysql
|
|
168
|
-
cdn: tencent-cloud-cdn
|
|
169
|
-
"""
|
|
170
|
-
|
|
171
|
-
TCB_DEPLOYMENT_YAML = """environments:
|
|
172
|
-
preview:
|
|
173
|
-
orchestrator: deploy_stack
|
|
174
|
-
strategy: unified
|
|
175
|
-
ttl: 24h
|
|
176
|
-
staging:
|
|
177
|
-
orchestrator: deploy_stack
|
|
178
|
-
production:
|
|
179
|
-
orchestrator: deploy_stack
|
|
180
|
-
pre_conditions:
|
|
181
|
-
- human-approval-gate
|
|
182
|
-
"""
|
|
183
|
-
|
|
184
|
-
TCB_PREVIEW_YAML = """preview:
|
|
185
|
-
orchestrator: deploy_stack
|
|
186
|
-
strategy: unified
|
|
187
|
-
ttl: 24h
|
|
188
|
-
auto_cleanup: true
|
|
189
|
-
db_sandbox: true
|
|
190
|
-
"""
|
|
191
|
-
|
|
192
|
-
TOOL_STUB = """#!/usr/bin/env python3
|
|
193
|
-
\"\"\"Stub — auto-generated by cdh scaffold.\"\"\"
|
|
194
|
-
import sys
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
def main():
|
|
198
|
-
print(f"{__file__}: not yet implemented")
|
|
199
|
-
sys.exit(1)
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
if __name__ == "__main__":
|
|
203
|
-
main()
|
|
204
|
-
"""
|
|
205
|
-
|
|
206
|
-
GITIGNORE_CONTENT = """# Python
|
|
207
|
-
__pycache__/
|
|
208
|
-
*.py[cod]
|
|
209
|
-
*.egg-info/
|
|
210
|
-
dist/
|
|
211
|
-
build/
|
|
212
|
-
.venv/
|
|
213
|
-
venv/
|
|
214
|
-
*.egg
|
|
215
|
-
|
|
216
|
-
# Node
|
|
217
|
-
node_modules/
|
|
218
|
-
.next/
|
|
219
|
-
dist/
|
|
220
|
-
.nuxt/
|
|
221
|
-
.cache/
|
|
222
|
-
|
|
223
|
-
# IDE
|
|
224
|
-
.vscode/
|
|
225
|
-
.idea/
|
|
226
|
-
*.swp
|
|
227
|
-
*.swo
|
|
228
|
-
*~
|
|
229
|
-
|
|
230
|
-
# OS
|
|
231
|
-
.DS_Store
|
|
232
|
-
Thumbs.db
|
|
233
|
-
|
|
234
|
-
# CDH
|
|
235
|
-
.cdh/
|
|
236
|
-
"""
|
|
237
|
-
|
|
238
|
-
CHANGELOG_MD = "# Changelog\n\n## [0.1.0] - Initial scaffold\n\n- Project created via cdh scaffold\n"
|
|
239
|
-
|
|
240
|
-
AGENTS_MD_TEMPLATE = """# AGENTS.md — Project Constitution
|
|
241
|
-
|
|
242
|
-
Hard rules every AI agent must follow when working in this repo.
|
|
243
|
-
Read once per session; behavior is enforced by the agent runtime.
|
|
244
|
-
|
|
245
|
-
## Project Overview
|
|
246
|
-
|
|
247
|
-
- **Name**: {project_name}
|
|
248
|
-
- **Description**: {description}
|
|
249
|
-
- **Type**: monorepo — AI-DLC multi-component stack
|
|
250
|
-
{component_list}
|
|
251
|
-
|
|
252
|
-
## AI-DLC Core Cycle
|
|
253
|
-
|
|
254
|
-
```
|
|
255
|
-
① Understand (SDD+BDD) Intent → Spec Delta → BDD Feature Files
|
|
256
|
-
② Plan (SDD+TDD) Design Doc → Task DAG → Test Plan
|
|
257
|
-
③ Verify (BDD+TDD) Red → Green → Refactor per scenario
|
|
258
|
-
④ Deliver (SDD+Cloud) Stack Preview → e2e → Production + BVT
|
|
259
|
-
```
|
|
260
|
-
|
|
261
|
-
Reference skill: `~/.cdh/skills/ai-dlc-skill/SKILL.md` (full AI-DLC methodology; installed by cdh platform bootstrap).
|
|
262
|
-
|
|
263
|
-
## Component Mapping
|
|
264
|
-
|
|
265
|
-
Work is partitioned by component prefix. Place new code in the matching directory:
|
|
266
|
-
|
|
267
|
-
| Prefix | Component | Directory |
|
|
268
|
-
|--------|-----------|-----------|
|
|
269
|
-
{component_table}
|
|
270
|
-
|
|
271
|
-
> **Note**: FR namespaces are used in AI-DLC lifecycle only.
|
|
272
|
-
|
|
273
|
-
## Quality Gates
|
|
274
|
-
|
|
275
|
-
Hard thresholds every agent must respect:
|
|
276
|
-
|
|
277
|
-
| Gate | Threshold |
|
|
278
|
-
|------|-----------|
|
|
279
|
-
| Unit/integration coverage | >= 80% |
|
|
280
|
-
| BDD scenarios pass | 100% |
|
|
281
|
-
| Contract tests pass | 100% |
|
|
282
|
-
| Cross-stack e2e pass | 100% |
|
|
283
|
-
| Security vulns | 0 |
|
|
284
|
-
|
|
285
|
-
## File / Path Hygiene
|
|
286
|
-
|
|
287
|
-
**Never read, write, or modify** any of these (they're local-only / secrets / build artifacts):
|
|
288
|
-
|
|
289
|
-
- `.cdh/` — project-level runtime state (managed by CLI; never hand-edit)
|
|
290
|
-
- `.opencode/`, `.claude/`, `.agents/` — tool configs (owned by user)
|
|
291
|
-
- `.qwen/`, `.idea/` — IDE / tool caches
|
|
292
|
-
- `dist/`, `*.egg-info/`, `__pycache__/`, `build/`, `.venv/`
|
|
293
|
-
- `node_modules/`, `.next/`, `.nuxt/`
|
|
294
|
-
- `.python-version`, `uv.lock` — Python toolchain pinning (user-managed)
|
|
295
|
-
- `aidlc/contracts/CHANGELOG.md` — contract changelog (managed by CLI)
|
|
296
|
-
- `aidlc/providers/` — provider config (managed by CLI)
|
|
297
|
-
|
|
298
|
-
**Global state directories** (managed at runtime, do not hand-edit):
|
|
299
|
-
- `~/.cdh/` — cdh platform global state (projects/, skills/, mcps/, state/, logs/, sessions/)
|
|
300
|
-
- `~/.onecode/` — onecode engine private state (traces, memory, mcps, skills, config)
|
|
301
|
-
|
|
302
|
-
## Forbidden Actions
|
|
303
|
-
|
|
304
|
-
- Commit secrets (API keys, tokens, passwords) — use env vars or vault
|
|
305
|
-
- Force-push to `main` / `master`
|
|
306
|
-
- Modify files outside the project root
|
|
307
|
-
- Run `npm publish` / `pip upload` without explicit user approval
|
|
308
|
-
- Hand-edit `.cdh/state.json`, `.cdh/todos.json`, `.cdh/last_session.json` — use CLI / slash commands
|
|
309
|
-
- Delete tracked files outside `dist/`, `build/`, `__pycache__/` without confirmation
|
|
310
|
-
|
|
311
|
-
## Working Conventions
|
|
312
|
-
|
|
313
|
-
This project follows the **AI-DLC (AI-Driven Lifecycle)** methodology shown above.
|
|
314
|
-
|
|
315
|
-
- **Plan first**: Use task management (TodoCreate) for any non-trivial task (3+ steps)
|
|
316
|
-
- **Route execution**:
|
|
317
|
-
- Single-step (1 tool, 1 file) → direct tool call
|
|
318
|
-
- Multi-step / multi-file / research → delegate to sub-agent
|
|
319
|
-
- **Language**: Chinese for explanations to user, English for code / comments / commit messages
|
|
320
|
-
- **Verification**: After non-trivial edits, run applicable lint/typecheck/test commands before declaring done
|
|
321
|
-
|
|
322
|
-
## Where to Find More
|
|
323
|
-
|
|
324
|
-
- **AI-DLC methodology**: `~/.cdh/skills/ai-dlc-skill/SKILL.md` (load via Skill tool; installed by cdh bootstrap)
|
|
325
|
-
- **Human-readable README**: `README.md`
|
|
326
|
-
- **Architecture / practices**: `docs/` if present, or ask the user
|
|
327
|
-
"""
|
|
328
|
-
|
|
329
|
-
REQUIREMENTS_MD = """# {project_name}
|
|
330
|
-
|
|
331
|
-
## Intent
|
|
332
|
-
|
|
333
|
-
{description}
|
|
334
|
-
|
|
335
|
-
## Stack Topology
|
|
336
|
-
|
|
337
|
-
Monorepo multi-component stack with the following components:
|
|
338
|
-
|
|
339
|
-
| Component | FR Prefix | Default Language | Default UI Framework | Directory |
|
|
340
|
-
|-----------|-----------|-----------------|---------------------|-----------|
|
|
341
|
-
{component_table}
|
|
342
|
-
|
|
343
|
-
## Quality Gates
|
|
344
|
-
|
|
345
|
-
| Gate | Threshold |
|
|
346
|
-
|------|-----------|
|
|
347
|
-
| Unit/integration coverage | >= 80% |
|
|
348
|
-
| BDD scenarios pass | 100% |
|
|
349
|
-
| Contract tests pass | 100% |
|
|
350
|
-
| Cross-stack e2e pass | 100% |
|
|
351
|
-
| Security vulns | 0 |
|
|
352
|
-
|
|
353
|
-
Default cloud provider: TCB (Tencent CloudBase).
|
|
354
|
-
"""
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
def _detect_dlc_skill(workspace_root: Path) -> bool:
|
|
358
|
-
from cdh.cdh_skill_manager import CDH_PLATFORM_SKILLS_DIR
|
|
359
|
-
return (CDH_PLATFORM_SKILLS_DIR / SKILL_NAME / "SKILL.md").exists()
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
def _mkdir(path: Path) -> None:
|
|
363
|
-
path.mkdir(parents=True, exist_ok=True)
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
def _gitkeep(path: Path) -> None:
|
|
367
|
-
keep = path / ".gitkeep"
|
|
368
|
-
if not keep.exists():
|
|
369
|
-
keep.write_text("", encoding="utf-8")
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
def _write(path: Path, content: str) -> None:
|
|
373
|
-
path.parent.mkdir(parents=True, exist_ok=True)
|
|
374
|
-
path.write_text(content.lstrip("\n"), encoding="utf-8")
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
def _build_agents_component_list(active: list[ComponentSpec]) -> str:
|
|
378
|
-
if not active:
|
|
379
|
-
return ""
|
|
380
|
-
items = (f" - **{c.label}** (`{c.owns}`)" for c in active)
|
|
381
|
-
return "- **Components**:\n" + "\n".join(items)
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
def _build_agents_component_table(active: list[ComponentSpec]) -> str:
|
|
385
|
-
rows = []
|
|
386
|
-
for c in active:
|
|
387
|
-
rows.append(f"| {c.fr_prefix:7s} | {c.label:14s} | {c.owns:20s} |")
|
|
388
|
-
rows.append("| INT | Contracts, Shared | aidlc/contracts/, aidlc/packages/shared/ |")
|
|
389
|
-
return "\n".join(rows)
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
def _write_agents_and_claude_md(
|
|
393
|
-
root: Path,
|
|
394
|
-
project_name: str,
|
|
395
|
-
description: str,
|
|
396
|
-
active: list[ComponentSpec],
|
|
397
|
-
) -> None:
|
|
398
|
-
content = AGENTS_MD_TEMPLATE.format(
|
|
399
|
-
project_name=project_name,
|
|
400
|
-
description=description or f"AI-DLC monorepo project: {project_name}",
|
|
401
|
-
component_list=_build_agents_component_list(active),
|
|
402
|
-
component_table=_build_agents_component_table(active),
|
|
403
|
-
)
|
|
404
|
-
_write(root / "AGENTS.md", content)
|
|
405
|
-
_write(root / "CLAUDE.md", content)
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
def _component_to_dict(c: ComponentSpec) -> dict:
|
|
409
|
-
out = {
|
|
410
|
-
"id": c.id,
|
|
411
|
-
"kind": c.kind,
|
|
412
|
-
"tech": c.tech,
|
|
413
|
-
"owns": c.owns,
|
|
414
|
-
"fr_prefix": c.fr_prefix,
|
|
415
|
-
}
|
|
416
|
-
return out
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
def _build_project_yaml(
|
|
420
|
-
active: list[ComponentSpec],
|
|
421
|
-
cross_cutting_ids: list[str],
|
|
422
|
-
name: str = "",
|
|
423
|
-
description: str = "",
|
|
424
|
-
) -> dict:
|
|
425
|
-
cross_cutting: dict = {"fr_prefix": "INT"}
|
|
426
|
-
if "contracts" in cross_cutting_ids:
|
|
427
|
-
cross_cutting["contracts"] = "aidlc/contracts/"
|
|
428
|
-
if "shared" in cross_cutting_ids:
|
|
429
|
-
cross_cutting["shared_types"] = "aidlc/packages/shared/"
|
|
430
|
-
doc: dict = {
|
|
431
|
-
"name": name,
|
|
432
|
-
"description": description,
|
|
433
|
-
"stack": {
|
|
434
|
-
"topology": "monorepo",
|
|
435
|
-
"components": [_component_to_dict(c) for c in active],
|
|
436
|
-
"cross_cutting": cross_cutting,
|
|
437
|
-
},
|
|
438
|
-
}
|
|
439
|
-
return doc
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
def _build_component_table(active: list[ComponentSpec]) -> str:
|
|
443
|
-
if not active:
|
|
444
|
-
return "| (none) | - | - | - | - |"
|
|
445
|
-
return "\n".join(
|
|
446
|
-
f"| {c.id:8s} | {c.fr_prefix + '-FR-*':14s} | {'-':17s} | {'-':21s} | {c.owns:20s} |"
|
|
447
|
-
for c in active
|
|
448
|
-
)
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
def _scaffold_component(c: ComponentSpec, root: Path) -> None:
|
|
452
|
-
comp_dir = root / c.owns
|
|
453
|
-
_mkdir(comp_dir / "src")
|
|
454
|
-
_mkdir(comp_dir / "tests" / "unit")
|
|
455
|
-
_mkdir(comp_dir / "tests" / "e2e")
|
|
456
|
-
_mkdir(comp_dir / "features")
|
|
457
|
-
_gitkeep(comp_dir / "src")
|
|
458
|
-
_gitkeep(comp_dir / "tests" / "unit")
|
|
459
|
-
_gitkeep(comp_dir / "tests" / "e2e")
|
|
460
|
-
_gitkeep(comp_dir / "features")
|
|
461
|
-
_gitkeep(comp_dir)
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
def _scaffold_cross_cutting(cross_ids: list[str], root: Path) -> None:
|
|
465
|
-
for cid in cross_ids:
|
|
466
|
-
spec = CROSS_CUTTING_BY_ID.get(cid)
|
|
467
|
-
if spec is None:
|
|
468
|
-
continue
|
|
469
|
-
for p in spec.paths:
|
|
470
|
-
target = root / p
|
|
471
|
-
if p.endswith((".yaml", ".py", ".md")):
|
|
472
|
-
if p == "aidlc/contracts/CHANGELOG.md":
|
|
473
|
-
_write(target, CHANGELOG_MD)
|
|
474
|
-
elif p == "aidlc/providers/tcb/provider.yaml":
|
|
475
|
-
_write(target, TCB_PROVIDER_YAML)
|
|
476
|
-
elif p == "aidlc/providers/tcb/deployment.yaml":
|
|
477
|
-
_write(target, TCB_DEPLOYMENT_YAML)
|
|
478
|
-
elif p == "aidlc/providers/tcb/preview.yaml":
|
|
479
|
-
_write(target, TCB_PREVIEW_YAML)
|
|
480
|
-
elif p.startswith("aidlc/tools/") and p.endswith(".py"):
|
|
481
|
-
_write(target, TOOL_STUB)
|
|
482
|
-
target.chmod(0o755)
|
|
483
|
-
else:
|
|
484
|
-
_write(target, "")
|
|
485
|
-
else:
|
|
486
|
-
_mkdir(target)
|
|
487
|
-
_gitkeep(target)
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
def _write_project_yaml(
|
|
491
|
-
root: Path,
|
|
492
|
-
project_name: str,
|
|
493
|
-
active: list[ComponentSpec],
|
|
494
|
-
cross_cutting_ids: list[str],
|
|
495
|
-
description: str,
|
|
496
|
-
) -> None:
|
|
497
|
-
_write(
|
|
498
|
-
root / "aidlc" / "project.yaml",
|
|
499
|
-
yaml.dump(
|
|
500
|
-
_build_project_yaml(active, cross_cutting_ids, name=project_name, description=description),
|
|
501
|
-
default_flow_style=False,
|
|
502
|
-
),
|
|
503
|
-
)
|
|
504
|
-
_write(
|
|
505
|
-
root / "aidlc" / "requirements.md",
|
|
506
|
-
REQUIREMENTS_MD.format(
|
|
507
|
-
project_name=project_name,
|
|
508
|
-
description=description or f"AI-DLC monorepo project: {project_name}",
|
|
509
|
-
component_table=_build_component_table(active),
|
|
510
|
-
),
|
|
511
|
-
)
|
|
512
|
-
_write(root / ".gitignore", GITIGNORE_CONTENT)
|
|
513
|
-
_write(root / "aidlc" / "CHANGELOG.md", CHANGELOG_MD)
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
def init_dlc_project(
|
|
517
|
-
workspace_root: Path,
|
|
518
|
-
project_name: str,
|
|
519
|
-
description: str = "",
|
|
520
|
-
) -> bool:
|
|
521
|
-
"""Scaffold project metadata only (no apps/*, no cross-cutting dirs).
|
|
522
|
-
|
|
523
|
-
Writes project.yaml (with empty components list), aidlc/requirements.md,
|
|
524
|
-
.gitignore, and aidlc/CHANGELOG.md. The user is expected to add components
|
|
525
|
-
and cross-cutting items later via add_component / add_cross_cutting.
|
|
526
|
-
|
|
527
|
-
Returns True if scaffolding was performed.
|
|
528
|
-
|
|
529
|
-
Raises RuntimeError if ai-dlc-skill is not available — the directory
|
|
530
|
-
is left untouched in that case so callers don't end up with a
|
|
531
|
-
half-initialized project (.cdh/ written but no aidlc/project.yaml).
|
|
532
|
-
"""
|
|
533
|
-
if not _detect_dlc_skill(workspace_root):
|
|
534
|
-
raise RuntimeError(
|
|
535
|
-
"ai-dlc-skill is not available; install it before "
|
|
536
|
-
"initializing a cdh project."
|
|
537
|
-
)
|
|
538
|
-
|
|
539
|
-
root = workspace_root.resolve()
|
|
540
|
-
_write_project_yaml(
|
|
541
|
-
root=root,
|
|
542
|
-
project_name=project_name,
|
|
543
|
-
active=[],
|
|
544
|
-
cross_cutting_ids=[],
|
|
545
|
-
description=description,
|
|
546
|
-
)
|
|
547
|
-
_write_agents_and_claude_md(root, project_name, description, [])
|
|
548
|
-
return True
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
def scaffold_dlc_project(
|
|
552
|
-
workspace_root: Path,
|
|
553
|
-
project_name: str,
|
|
554
|
-
components: list[str],
|
|
555
|
-
description: str = "",
|
|
556
|
-
) -> bool:
|
|
557
|
-
"""Scaffold a full ai-dlc-skill monorepo project structure.
|
|
558
|
-
|
|
559
|
-
The user must explicitly select at least one application component.
|
|
560
|
-
All cross-cutting items (contracts, shared types, openspec, etc.)
|
|
561
|
-
are always created.
|
|
562
|
-
|
|
563
|
-
Args:
|
|
564
|
-
components: list of component ids (e.g. ["web", "backend"]).
|
|
565
|
-
Must be non-empty.
|
|
566
|
-
|
|
567
|
-
Returns True if scaffolding was performed, False if ai-dlc-skill
|
|
568
|
-
is not available and the project was left untouched.
|
|
569
|
-
|
|
570
|
-
Raises ValueError if components is empty or contains unknown ids.
|
|
571
|
-
"""
|
|
572
|
-
if not components:
|
|
573
|
-
raise ValueError(
|
|
574
|
-
"At least one application component is required "
|
|
575
|
-
"(e.g. 'web', 'backend', 'native')."
|
|
576
|
-
)
|
|
577
|
-
|
|
578
|
-
unknown = [c for c in components if c not in COMPONENT_BY_ID]
|
|
579
|
-
if unknown:
|
|
580
|
-
raise ValueError(
|
|
581
|
-
f"Unknown component id(s): {', '.join(unknown)}. "
|
|
582
|
-
f"Valid ids: {', '.join(COMPONENT_BY_ID)}."
|
|
583
|
-
)
|
|
584
|
-
|
|
585
|
-
if not _detect_dlc_skill(workspace_root):
|
|
586
|
-
return False
|
|
587
|
-
|
|
588
|
-
root = workspace_root.resolve()
|
|
589
|
-
active = [COMPONENT_BY_ID[cid] for cid in components]
|
|
590
|
-
all_cross_ids = [
|
|
591
|
-
c.id for c in CROSS_CUTTING if c.id not in ("provider", "tools")
|
|
592
|
-
]
|
|
593
|
-
|
|
594
|
-
_write_project_yaml(
|
|
595
|
-
root=root,
|
|
596
|
-
project_name=project_name,
|
|
597
|
-
active=active,
|
|
598
|
-
cross_cutting_ids=all_cross_ids,
|
|
599
|
-
description=description,
|
|
600
|
-
)
|
|
601
|
-
|
|
602
|
-
for c in active:
|
|
603
|
-
_scaffold_component(c, root)
|
|
604
|
-
|
|
605
|
-
_scaffold_cross_cutting(all_cross_ids, root)
|
|
606
|
-
_write_agents_and_claude_md(root, project_name, description, active)
|
|
607
|
-
|
|
608
|
-
return True
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
def _regenerate_agents_and_claude_md(root: Path) -> None:
|
|
612
|
-
project_yaml = root / "aidlc" / "project.yaml"
|
|
613
|
-
if not project_yaml.exists():
|
|
614
|
-
return
|
|
615
|
-
data = yaml.safe_load(project_yaml.read_text(encoding="utf-8")) or {}
|
|
616
|
-
name = data.get("name", root.name)
|
|
617
|
-
description = data.get("description", "")
|
|
618
|
-
components = data.get("stack", {}).get("components", []) or []
|
|
619
|
-
active = []
|
|
620
|
-
for c in components:
|
|
621
|
-
spec = COMPONENT_BY_ID.get(c.get("id", ""))
|
|
622
|
-
if spec:
|
|
623
|
-
active.append(spec)
|
|
624
|
-
_write_agents_and_claude_md(root, name, description, active)
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
def add_component(
|
|
628
|
-
workspace_root: Path,
|
|
629
|
-
component_id: str,
|
|
630
|
-
) -> bool:
|
|
631
|
-
"""Add a single application component to an existing project.
|
|
632
|
-
|
|
633
|
-
Creates apps/<owns>/{src,tests/unit,tests/e2e,features} with
|
|
634
|
-
.gitkeep files and updates aidlc/project.yaml's stack.components list.
|
|
635
|
-
|
|
636
|
-
Returns True if the component was added, False if it was already
|
|
637
|
-
present. Raises ValueError on unknown component id.
|
|
638
|
-
"""
|
|
639
|
-
spec = COMPONENT_BY_ID.get(component_id)
|
|
640
|
-
if spec is None:
|
|
641
|
-
raise ValueError(
|
|
642
|
-
f"Unknown component id: {component_id}. "
|
|
643
|
-
f"Valid ids: {', '.join(COMPONENT_BY_ID)}."
|
|
644
|
-
)
|
|
645
|
-
|
|
646
|
-
root = workspace_root.resolve()
|
|
647
|
-
project_yaml = root / "aidlc" / "project.yaml"
|
|
648
|
-
if not project_yaml.exists():
|
|
649
|
-
raise FileNotFoundError(
|
|
650
|
-
f"aidlc/project.yaml not found at {root}. Run 'cdh project init' first."
|
|
651
|
-
)
|
|
652
|
-
|
|
653
|
-
data = yaml.safe_load(project_yaml.read_text(encoding="utf-8")) or {}
|
|
654
|
-
components = data.get("stack", {}).get("components", []) or []
|
|
655
|
-
if any(c.get("id") == component_id for c in components):
|
|
656
|
-
return False
|
|
657
|
-
|
|
658
|
-
_scaffold_component(spec, root)
|
|
659
|
-
|
|
660
|
-
components.append(_component_to_dict(spec))
|
|
661
|
-
data["stack"]["components"] = components
|
|
662
|
-
project_yaml.write_text(
|
|
663
|
-
yaml.dump(data, default_flow_style=False),
|
|
664
|
-
encoding="utf-8",
|
|
665
|
-
)
|
|
666
|
-
_regenerate_agents_and_claude_md(root)
|
|
667
|
-
return True
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
def add_cross_cutting(
|
|
671
|
-
workspace_root: Path,
|
|
672
|
-
cross_id: str,
|
|
673
|
-
) -> bool:
|
|
674
|
-
"""Add a single cross-cutting item to an existing project.
|
|
675
|
-
|
|
676
|
-
Creates the relevant directories/files and updates aidlc/project.yaml
|
|
677
|
-
so that stack.cross_cutting references the new path.
|
|
678
|
-
|
|
679
|
-
Returns True if the item was added, False if it was already present.
|
|
680
|
-
Raises ValueError on unknown cross-cutting id.
|
|
681
|
-
"""
|
|
682
|
-
spec = CROSS_CUTTING_BY_ID.get(cross_id)
|
|
683
|
-
if spec is None:
|
|
684
|
-
raise ValueError(
|
|
685
|
-
f"Unknown cross-cutting id: {cross_id}. "
|
|
686
|
-
f"Valid ids: {', '.join(CROSS_CUTTING_BY_ID)}."
|
|
687
|
-
)
|
|
688
|
-
|
|
689
|
-
root = workspace_root.resolve()
|
|
690
|
-
project_yaml = root / "aidlc" / "project.yaml"
|
|
691
|
-
if not project_yaml.exists():
|
|
692
|
-
raise FileNotFoundError(
|
|
693
|
-
f"aidlc/project.yaml not found at {root}. Run 'cdh project init' first."
|
|
694
|
-
)
|
|
695
|
-
|
|
696
|
-
cross_paths = [root / p for p in spec.paths]
|
|
697
|
-
if all(p.exists() for p in cross_paths):
|
|
698
|
-
return False
|
|
699
|
-
|
|
700
|
-
_scaffold_cross_cutting([cross_id], root)
|
|
701
|
-
|
|
702
|
-
data = yaml.safe_load(project_yaml.read_text(encoding="utf-8")) or {}
|
|
703
|
-
cross_cutting = data.setdefault("stack", {}).setdefault("cross_cutting", {})
|
|
704
|
-
if cross_id == "contracts":
|
|
705
|
-
cross_cutting["contracts"] = "aidlc/contracts/"
|
|
706
|
-
elif cross_id == "shared":
|
|
707
|
-
cross_cutting["shared_types"] = "packages/shared/"
|
|
708
|
-
|
|
709
|
-
project_yaml.write_text(
|
|
710
|
-
yaml.dump(data, default_flow_style=False),
|
|
711
|
-
encoding="utf-8",
|
|
712
|
-
)
|
|
713
|
-
_regenerate_agents_and_claude_md(root)
|
|
714
|
-
return True
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
__all__ = [
|
|
718
|
-
"COMPONENTS",
|
|
719
|
-
"COMPONENT_BY_ID",
|
|
720
|
-
"CROSS_CUTTING",
|
|
721
|
-
"CROSS_CUTTING_BY_ID",
|
|
722
|
-
"ComponentSpec",
|
|
723
|
-
"CrossCutSpec",
|
|
724
|
-
"init_dlc_project",
|
|
725
|
-
"scaffold_dlc_project",
|
|
726
|
-
"add_component",
|
|
727
|
-
"add_cross_cutting",
|
|
728
|
-
]
|