ccjk 14.2.2 → 15.0.0
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/LICENSE +1 -1
- package/README.md +58 -341
- package/dist/cli.js +59 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/detect.js +15 -0
- package/dist/commands/detect.js.map +1 -0
- package/dist/commands/doctor.js +68 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/git-install.js +50 -0
- package/dist/commands/git-install.js.map +1 -0
- package/dist/commands/init.js +102 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/mcp.js +66 -0
- package/dist/commands/mcp.js.map +1 -0
- package/dist/commands/menu.js +33 -0
- package/dist/commands/menu.js.map +1 -0
- package/dist/core/detect.js +24 -0
- package/dist/core/detect.js.map +1 -0
- package/dist/core/lint.js +49 -0
- package/dist/core/lint.js.map +1 -0
- package/dist/core/mcp.js +41 -0
- package/dist/core/mcp.js.map +1 -0
- package/dist/core/paths.js +9 -0
- package/dist/core/paths.js.map +1 -0
- package/dist/core/providers.js +53 -0
- package/dist/core/providers.js.map +1 -0
- package/dist/core/settings.js +31 -0
- package/dist/core/settings.js.map +1 -0
- package/dist/core/slash-templates.js +56 -0
- package/dist/core/slash-templates.js.map +1 -0
- package/dist/core/tools.js +27 -0
- package/dist/core/tools.js.map +1 -0
- package/package.json +43 -164
- package/README.HONEST.md +0 -176
- package/README.en.md +0 -67
- package/README.ja.md +0 -67
- package/README.ko.md +0 -67
- package/README.zh-CN.md +0 -86
- package/bin/ccjk.mjs +0 -5
- package/bin/ccjk.ts +0 -222
- package/dist/chunks/agent-teams.mjs +0 -145
- package/dist/chunks/agent.mjs +0 -1439
- package/dist/chunks/agents.mjs +0 -3783
- package/dist/chunks/api-cli.mjs +0 -135
- package/dist/chunks/api-config-selector.mjs +0 -159
- package/dist/chunks/api-providers.mjs +0 -144
- package/dist/chunks/api.mjs +0 -115
- package/dist/chunks/auto-bootstrap.mjs +0 -358
- package/dist/chunks/auto-fixer.mjs +0 -95
- package/dist/chunks/auto-updater.mjs +0 -507
- package/dist/chunks/banner.mjs +0 -173
- package/dist/chunks/bash.mjs +0 -187
- package/dist/chunks/boost.mjs +0 -474
- package/dist/chunks/brain-config.mjs +0 -75
- package/dist/chunks/brain-status.mjs +0 -89
- package/dist/chunks/ccjk-agents.mjs +0 -416
- package/dist/chunks/ccjk-all.mjs +0 -1046
- package/dist/chunks/ccjk-config.mjs +0 -445
- package/dist/chunks/ccjk-hooks.mjs +0 -1074
- package/dist/chunks/ccjk-mcp.mjs +0 -763
- package/dist/chunks/ccjk-setup.mjs +0 -765
- package/dist/chunks/ccjk-skills.mjs +0 -518
- package/dist/chunks/ccr.mjs +0 -109
- package/dist/chunks/ccu.mjs +0 -40
- package/dist/chunks/check-updates.mjs +0 -117
- package/dist/chunks/claude-code-incremental-manager.mjs +0 -761
- package/dist/chunks/claude-config.mjs +0 -606
- package/dist/chunks/claude-config2.mjs +0 -62
- package/dist/chunks/claude-wrapper.mjs +0 -85
- package/dist/chunks/clavue-config.mjs +0 -1454
- package/dist/chunks/cleanup-migration.mjs +0 -20
- package/dist/chunks/cli-hook.mjs +0 -4096
- package/dist/chunks/cloud-sync.mjs +0 -29
- package/dist/chunks/code-type-resolver.mjs +0 -880
- package/dist/chunks/codex-config-switch.mjs +0 -452
- package/dist/chunks/codex-provider-manager.mjs +0 -238
- package/dist/chunks/codex-uninstaller.mjs +0 -404
- package/dist/chunks/codex.mjs +0 -2141
- package/dist/chunks/commands.mjs +0 -108
- package/dist/chunks/commands2.mjs +0 -421
- package/dist/chunks/commit.mjs +0 -140
- package/dist/chunks/completion.mjs +0 -517
- package/dist/chunks/config-consolidator.mjs +0 -172
- package/dist/chunks/config-switch.mjs +0 -334
- package/dist/chunks/config.mjs +0 -558
- package/dist/chunks/config2.mjs +0 -484
- package/dist/chunks/config3.mjs +0 -486
- package/dist/chunks/constants.mjs +0 -323
- package/dist/chunks/context-opt.mjs +0 -444
- package/dist/chunks/context.mjs +0 -974
- package/dist/chunks/dashboard.mjs +0 -481
- package/dist/chunks/doctor.mjs +0 -1301
- package/dist/chunks/eval.mjs +0 -502
- package/dist/chunks/evolution.mjs +0 -322
- package/dist/chunks/features.mjs +0 -715
- package/dist/chunks/fish.mjs +0 -181
- package/dist/chunks/fs-operations.mjs +0 -180
- package/dist/chunks/health-alerts.mjs +0 -830
- package/dist/chunks/help.mjs +0 -341
- package/dist/chunks/hook-installer.mjs +0 -48
- package/dist/chunks/impact.mjs +0 -651
- package/dist/chunks/index.mjs +0 -23
- package/dist/chunks/index10.mjs +0 -19
- package/dist/chunks/index11.mjs +0 -1171
- package/dist/chunks/index12.mjs +0 -218
- package/dist/chunks/index13.mjs +0 -679
- package/dist/chunks/index14.mjs +0 -1009
- package/dist/chunks/index15.mjs +0 -194
- package/dist/chunks/index2.mjs +0 -7637
- package/dist/chunks/index3.mjs +0 -171
- package/dist/chunks/index4.mjs +0 -26
- package/dist/chunks/index5.mjs +0 -19
- package/dist/chunks/index6.mjs +0 -19092
- package/dist/chunks/index7.mjs +0 -616
- package/dist/chunks/index8.mjs +0 -1602
- package/dist/chunks/index9.mjs +0 -5384
- package/dist/chunks/init.mjs +0 -1911
- package/dist/chunks/installer.mjs +0 -757
- package/dist/chunks/installer2.mjs +0 -103
- package/dist/chunks/interview.mjs +0 -2927
- package/dist/chunks/json-config.mjs +0 -60
- package/dist/chunks/linux.mjs +0 -3863
- package/dist/chunks/macos.mjs +0 -69
- package/dist/chunks/main.mjs +0 -635
- package/dist/chunks/manager.mjs +0 -1048
- package/dist/chunks/marketplace.mjs +0 -265
- package/dist/chunks/mcp-cli.mjs +0 -205
- package/dist/chunks/mcp-performance.mjs +0 -187
- package/dist/chunks/mcp.mjs +0 -667
- package/dist/chunks/memory-check.mjs +0 -2973
- package/dist/chunks/memory-paths.mjs +0 -259
- package/dist/chunks/memory-sync.mjs +0 -209
- package/dist/chunks/memory.mjs +0 -354
- package/dist/chunks/metrics-display.mjs +0 -153
- package/dist/chunks/monitor.mjs +0 -1856
- package/dist/chunks/notification.mjs +0 -1864
- package/dist/chunks/onboarding.mjs +0 -386
- package/dist/chunks/package.mjs +0 -3
- package/dist/chunks/paradigm.mjs +0 -74
- package/dist/chunks/permission-manager.mjs +0 -250
- package/dist/chunks/permissions.mjs +0 -265
- package/dist/chunks/persistence-manager.mjs +0 -801
- package/dist/chunks/persistence.mjs +0 -707
- package/dist/chunks/platform.mjs +0 -395
- package/dist/chunks/plugin.mjs +0 -1936
- package/dist/chunks/powershell.mjs +0 -213
- package/dist/chunks/prompts.mjs +0 -244
- package/dist/chunks/providers.mjs +0 -263
- package/dist/chunks/quick-actions.mjs +0 -335
- package/dist/chunks/quick-provider.mjs +0 -755
- package/dist/chunks/quick-setup.mjs +0 -421
- package/dist/chunks/remote.mjs +0 -497
- package/dist/chunks/research.mjs +0 -1904
- package/dist/chunks/rollback.mjs +0 -38
- package/dist/chunks/session-manager.mjs +0 -1371
- package/dist/chunks/session.mjs +0 -878
- package/dist/chunks/sessions.mjs +0 -106
- package/dist/chunks/silent-updater.mjs +0 -396
- package/dist/chunks/simple-config.mjs +0 -122
- package/dist/chunks/skill.mjs +0 -117
- package/dist/chunks/skill2.mjs +0 -9052
- package/dist/chunks/skills-sync.mjs +0 -1343
- package/dist/chunks/skills.mjs +0 -577
- package/dist/chunks/slash-commands.mjs +0 -208
- package/dist/chunks/smart-guide.mjs +0 -247
- package/dist/chunks/snapshot.mjs +0 -58
- package/dist/chunks/startup.mjs +0 -487
- package/dist/chunks/stats.mjs +0 -191
- package/dist/chunks/status.mjs +0 -471
- package/dist/chunks/team.mjs +0 -63
- package/dist/chunks/thinking.mjs +0 -626
- package/dist/chunks/trace.mjs +0 -57
- package/dist/chunks/uninstall.mjs +0 -852
- package/dist/chunks/update.mjs +0 -174
- package/dist/chunks/upgrade-manager.mjs +0 -204
- package/dist/chunks/upgrade.mjs +0 -133
- package/dist/chunks/version-checker.mjs +0 -891
- package/dist/chunks/vim.mjs +0 -903
- package/dist/chunks/windows.mjs +0 -14
- package/dist/chunks/workflows.mjs +0 -633
- package/dist/chunks/wsl.mjs +0 -129
- package/dist/chunks/zero-config.mjs +0 -871
- package/dist/chunks/zsh.mjs +0 -182
- package/dist/cli.d.mts +0 -1
- package/dist/cli.d.ts +0 -1
- package/dist/cli.mjs +0 -2684
- package/dist/i18n/locales/en/agent-teams.json +0 -18
- package/dist/i18n/locales/en/agentBrowser.json +0 -80
- package/dist/i18n/locales/en/agents.json +0 -135
- package/dist/i18n/locales/en/api.json +0 -63
- package/dist/i18n/locales/en/ccjk-agents.json +0 -33
- package/dist/i18n/locales/en/ccjk-all.json +0 -23
- package/dist/i18n/locales/en/ccjk-skills.json +0 -22
- package/dist/i18n/locales/en/ccjk.json +0 -276
- package/dist/i18n/locales/en/ccr.json +0 -65
- package/dist/i18n/locales/en/claude-md.json +0 -73
- package/dist/i18n/locales/en/cli.json +0 -148
- package/dist/i18n/locales/en/cloud-setup.json +0 -31
- package/dist/i18n/locales/en/cloud-sync.json +0 -147
- package/dist/i18n/locales/en/cloud.json +0 -40
- package/dist/i18n/locales/en/cloudPlugins.json +0 -118
- package/dist/i18n/locales/en/codex.json +0 -184
- package/dist/i18n/locales/en/cometix.json +0 -29
- package/dist/i18n/locales/en/common.json +0 -68
- package/dist/i18n/locales/en/config.json +0 -108
- package/dist/i18n/locales/en/configuration.json +0 -236
- package/dist/i18n/locales/en/context.json +0 -85
- package/dist/i18n/locales/en/dashboard.json +0 -78
- package/dist/i18n/locales/en/errors.json +0 -26
- package/dist/i18n/locales/en/evolution.json +0 -54
- package/dist/i18n/locales/en/hooks.json +0 -74
- package/dist/i18n/locales/en/hooksSync.json +0 -133
- package/dist/i18n/locales/en/installation.json +0 -83
- package/dist/i18n/locales/en/interview.json +0 -104
- package/dist/i18n/locales/en/language.json +0 -19
- package/dist/i18n/locales/en/lsp.json +0 -78
- package/dist/i18n/locales/en/marketplace.json +0 -116
- package/dist/i18n/locales/en/mcp.json +0 -180
- package/dist/i18n/locales/en/memory.json +0 -23
- package/dist/i18n/locales/en/menu.json +0 -299
- package/dist/i18n/locales/en/multi-config.json +0 -79
- package/dist/i18n/locales/en/notification.json +0 -307
- package/dist/i18n/locales/en/permissions.json +0 -95
- package/dist/i18n/locales/en/persistence.json +0 -127
- package/dist/i18n/locales/en/plugins.json +0 -146
- package/dist/i18n/locales/en/quick-actions.json +0 -78
- package/dist/i18n/locales/en/registry.json +0 -54
- package/dist/i18n/locales/en/remote.json +0 -93
- package/dist/i18n/locales/en/sandbox.json +0 -44
- package/dist/i18n/locales/en/setup.json +0 -44
- package/dist/i18n/locales/en/shencha.json +0 -14
- package/dist/i18n/locales/en/skills.json +0 -100
- package/dist/i18n/locales/en/skillsSync.json +0 -74
- package/dist/i18n/locales/en/smartGuide.json +0 -49
- package/dist/i18n/locales/en/stats.json +0 -20
- package/dist/i18n/locales/en/subagent.json +0 -69
- package/dist/i18n/locales/en/superpowers.json +0 -117
- package/dist/i18n/locales/en/team.json +0 -7
- package/dist/i18n/locales/en/thinking.json +0 -65
- package/dist/i18n/locales/en/tools.json +0 -42
- package/dist/i18n/locales/en/uninstall.json +0 -56
- package/dist/i18n/locales/en/updater.json +0 -29
- package/dist/i18n/locales/en/vim.json +0 -169
- package/dist/i18n/locales/en/workflow.json +0 -55
- package/dist/i18n/locales/en/workspace.json +0 -108
- package/dist/i18n/locales/zh-CN/agent-teams.json +0 -18
- package/dist/i18n/locales/zh-CN/agentBrowser.json +0 -80
- package/dist/i18n/locales/zh-CN/agents.json +0 -135
- package/dist/i18n/locales/zh-CN/api.json +0 -63
- package/dist/i18n/locales/zh-CN/ccjk-agents.json +0 -33
- package/dist/i18n/locales/zh-CN/ccjk-all.json +0 -23
- package/dist/i18n/locales/zh-CN/ccjk-skills.json +0 -22
- package/dist/i18n/locales/zh-CN/ccjk.json +0 -276
- package/dist/i18n/locales/zh-CN/ccr.json +0 -65
- package/dist/i18n/locales/zh-CN/claude-md.json +0 -73
- package/dist/i18n/locales/zh-CN/cli.json +0 -148
- package/dist/i18n/locales/zh-CN/cloud-setup.json +0 -31
- package/dist/i18n/locales/zh-CN/cloud-sync.json +0 -147
- package/dist/i18n/locales/zh-CN/cloud.json +0 -40
- package/dist/i18n/locales/zh-CN/cloudPlugins.json +0 -118
- package/dist/i18n/locales/zh-CN/codex.json +0 -184
- package/dist/i18n/locales/zh-CN/cometix.json +0 -29
- package/dist/i18n/locales/zh-CN/common.json +0 -68
- package/dist/i18n/locales/zh-CN/config.json +0 -108
- package/dist/i18n/locales/zh-CN/configuration.json +0 -234
- package/dist/i18n/locales/zh-CN/context.json +0 -85
- package/dist/i18n/locales/zh-CN/dashboard.json +0 -78
- package/dist/i18n/locales/zh-CN/errors.json +0 -26
- package/dist/i18n/locales/zh-CN/evolution.json +0 -54
- package/dist/i18n/locales/zh-CN/hooks.json +0 -74
- package/dist/i18n/locales/zh-CN/hooksSync.json +0 -133
- package/dist/i18n/locales/zh-CN/installation.json +0 -83
- package/dist/i18n/locales/zh-CN/interview.json +0 -104
- package/dist/i18n/locales/zh-CN/language.json +0 -19
- package/dist/i18n/locales/zh-CN/lsp.json +0 -78
- package/dist/i18n/locales/zh-CN/marketplace.json +0 -116
- package/dist/i18n/locales/zh-CN/mcp.json +0 -180
- package/dist/i18n/locales/zh-CN/memory.json +0 -23
- package/dist/i18n/locales/zh-CN/menu.json +0 -299
- package/dist/i18n/locales/zh-CN/multi-config.json +0 -79
- package/dist/i18n/locales/zh-CN/notification.json +0 -307
- package/dist/i18n/locales/zh-CN/permissions.json +0 -95
- package/dist/i18n/locales/zh-CN/persistence.json +0 -127
- package/dist/i18n/locales/zh-CN/plugins.json +0 -146
- package/dist/i18n/locales/zh-CN/quick-actions.json +0 -78
- package/dist/i18n/locales/zh-CN/registry.json +0 -54
- package/dist/i18n/locales/zh-CN/remote.json +0 -93
- package/dist/i18n/locales/zh-CN/sandbox.json +0 -44
- package/dist/i18n/locales/zh-CN/setup.json +0 -44
- package/dist/i18n/locales/zh-CN/shencha.json +0 -14
- package/dist/i18n/locales/zh-CN/skills.json +0 -100
- package/dist/i18n/locales/zh-CN/skillsSync.json +0 -74
- package/dist/i18n/locales/zh-CN/smartGuide.json +0 -49
- package/dist/i18n/locales/zh-CN/stats.json +0 -20
- package/dist/i18n/locales/zh-CN/subagent.json +0 -69
- package/dist/i18n/locales/zh-CN/superpowers.json +0 -117
- package/dist/i18n/locales/zh-CN/team.json +0 -7
- package/dist/i18n/locales/zh-CN/thinking.json +0 -65
- package/dist/i18n/locales/zh-CN/tools.json +0 -42
- package/dist/i18n/locales/zh-CN/uninstall.json +0 -56
- package/dist/i18n/locales/zh-CN/updater.json +0 -29
- package/dist/i18n/locales/zh-CN/vim.json +0 -169
- package/dist/i18n/locales/zh-CN/workflow.json +0 -55
- package/dist/i18n/locales/zh-CN/workspace.json +0 -108
- package/dist/index.d.mts +0 -5658
- package/dist/index.d.ts +0 -5658
- package/dist/index.mjs +0 -3732
- package/dist/shared/ccjk.5bEolFrk.mjs +0 -254
- package/dist/shared/ccjk.8oaxX4iR.mjs +0 -90
- package/dist/shared/ccjk.B2U7DsPy.mjs +0 -31
- package/dist/shared/ccjk.B2f-cwUP.mjs +0 -468
- package/dist/shared/ccjk.BAGoDD49.mjs +0 -36
- package/dist/shared/ccjk.BBtCGd_g.mjs +0 -899
- package/dist/shared/ccjk.BFQ7yr5S.mjs +0 -16
- package/dist/shared/ccjk.BLsIiTqO.mjs +0 -449
- package/dist/shared/ccjk.BXv8aYs1.mjs +0 -170
- package/dist/shared/ccjk.BnsY5WxD.mjs +0 -171
- package/dist/shared/ccjk.BoApaI4j.mjs +0 -28
- package/dist/shared/ccjk.Bq8TqZG_.mjs +0 -189
- package/dist/shared/ccjk.BtrioX1Z.mjs +0 -25
- package/dist/shared/ccjk.Bx_rmYfN.mjs +0 -69
- package/dist/shared/ccjk.BzPbSEP2.mjs +0 -115
- package/dist/shared/ccjk.C0WLUnFV.mjs +0 -293
- package/dist/shared/ccjk.C1hANZTu.mjs +0 -19
- package/dist/shared/ccjk.C2jHOZVP.mjs +0 -52
- package/dist/shared/ccjk.CNhnT6uQ.mjs +0 -636
- package/dist/shared/ccjk.COweQ1RR.mjs +0 -5
- package/dist/shared/ccjk.CfKKcvWy.mjs +0 -126
- package/dist/shared/ccjk.Cjgrln_h.mjs +0 -297
- package/dist/shared/ccjk.CoCHVXl3.mjs +0 -3951
- package/dist/shared/ccjk.CwGZSTAK.mjs +0 -319
- package/dist/shared/ccjk.CxpGa6MC.mjs +0 -2724
- package/dist/shared/ccjk.D-magaEx.mjs +0 -763
- package/dist/shared/ccjk.D0g2ABGg.mjs +0 -171
- package/dist/shared/ccjk.D6ycHbak.mjs +0 -270
- package/dist/shared/ccjk.D75wivnp.mjs +0 -142
- package/dist/shared/ccjk.DDL-4C-k.mjs +0 -100
- package/dist/shared/ccjk.DFRPtmK_.mjs +0 -75
- package/dist/shared/ccjk.DMV3x5Sd.mjs +0 -299
- package/dist/shared/ccjk.DZ2LLOa-.mjs +0 -2195
- package/dist/shared/ccjk.DbigonEQ.mjs +0 -698
- package/dist/shared/ccjk.DcMvE7lf.mjs +0 -618
- package/dist/shared/ccjk.DeWpAShp.mjs +0 -1828
- package/dist/shared/ccjk.DhJ1kyDR.mjs +0 -30
- package/dist/shared/ccjk.DlTXS9rP.mjs +0 -224
- package/dist/shared/ccjk.DopKzo3z.mjs +0 -305
- package/dist/shared/ccjk.DsZsc4LR.mjs +0 -1280
- package/dist/shared/ccjk.DuzJZlgj.mjs +0 -418
- package/dist/shared/ccjk.Dxgd2vjc.mjs +0 -444
- package/dist/shared/ccjk.J8YiPsOw.mjs +0 -259
- package/dist/shared/ccjk.KfSWcGlE.mjs +0 -38
- package/dist/shared/ccjk.L7yC58_i.mjs +0 -225
- package/dist/shared/ccjk.MwtjAULc.mjs +0 -1447
- package/dist/shared/ccjk.OJKHVSOb.mjs +0 -2005
- package/dist/shared/ccjk.OTnevPNE.mjs +0 -225
- package/dist/shared/ccjk.RyizuzOI.mjs +0 -21
- package/dist/shared/ccjk.T_cX87dY.mjs +0 -15
- package/dist/shared/ccjk.bQ7Dh1g4.mjs +0 -249
- package/dist/shared/ccjk.gDEDGD_t.mjs +0 -38
- package/dist/shared/ccjk.hoqrwWdN.mjs +0 -333
- package/dist/shared/ccjk.i_vn-9C3.mjs +0 -317
- package/dist/shared/ccjk.lG3ccFjm.mjs +0 -885
- package/dist/shared/ccjk.wLJHO0Af.mjs +0 -244
- package/dist/shared/ccjk.y-a_1vK4.mjs +0 -5127
- package/dist/templates/agents/README.md +0 -78
- package/dist/templates/agents/fullstack-developer.json +0 -70
- package/dist/templates/agents/go-expert.json +0 -69
- package/dist/templates/agents/index.json +0 -64
- package/dist/templates/agents/python-expert.json +0 -69
- package/dist/templates/agents/react-specialist.json +0 -69
- package/dist/templates/agents/testing-automation-expert.json +0 -70
- package/dist/templates/agents/typescript-architect.json +0 -69
- package/dist/templates/claude-code/common/settings.json +0 -109
- package/dist/templates/common/error-prevention.md +0 -267
- package/dist/templates/common/karpathy-baseline.md +0 -83
- package/dist/templates/common/output-styles/zh-CN/carmack-mode.md +0 -381
- package/dist/templates/common/output-styles/zh-CN/codex-rigor-mode.md +0 -114
- package/dist/templates/common/output-styles/zh-CN/dhh-mode.md +0 -265
- package/dist/templates/common/output-styles/zh-CN/evan-you-mode.md +0 -539
- package/dist/templates/common/output-styles/zh-CN/jobs-mode.md +0 -369
- package/dist/templates/common/output-styles/zh-CN/linus-mode.md +0 -135
- package/dist/templates/common/output-styles/zh-CN/uncle-bob-mode.md +0 -221
- package/dist/templates/common/workflow/continuousDelivery/en/continuous-delivery.md +0 -628
- package/dist/templates/common/workflow/continuousDelivery/zh-CN/continuous-delivery.md +0 -628
- package/dist/templates/common/workflow/essential/en/agents/ccjk-config-agent.md +0 -187
- package/dist/templates/common/workflow/essential/en/agents/ccjk-mcp-agent.md +0 -191
- package/dist/templates/common/workflow/essential/en/agents/ccjk-skill-agent.md +0 -249
- package/dist/templates/common/workflow/essential/en/agents/ccjk-workflow-agent.md +0 -277
- package/dist/templates/common/workflow/essential/en/agents/get-current-datetime.md +0 -29
- package/dist/templates/common/workflow/essential/en/agents/init-architect.md +0 -115
- package/dist/templates/common/workflow/essential/en/agents/ui-ux-designer.md +0 -91
- package/dist/templates/common/workflow/essential/en/feat.md +0 -92
- package/dist/templates/common/workflow/essential/en/goal.md +0 -147
- package/dist/templates/common/workflow/essential/en/init-project.md +0 -53
- package/dist/templates/common/workflow/essential/zh-CN/agents/get-current-datetime.md +0 -29
- package/dist/templates/common/workflow/essential/zh-CN/agents/init-architect.md +0 -115
- package/dist/templates/common/workflow/essential/zh-CN/agents/ui-ux-designer.md +0 -91
- package/dist/templates/common/workflow/essential/zh-CN/feat.md +0 -315
- package/dist/templates/common/workflow/essential/zh-CN/goal.md +0 -146
- package/dist/templates/common/workflow/essential/zh-CN/init-project.md +0 -53
- package/dist/templates/common/workflow/git/en/git-cleanBranches.md +0 -102
- package/dist/templates/common/workflow/git/en/git-commit.md +0 -205
- package/dist/templates/common/workflow/git/en/git-rollback.md +0 -90
- package/dist/templates/common/workflow/git/en/git-worktree.md +0 -276
- package/dist/templates/common/workflow/git/zh-CN/git-cleanBranches.md +0 -102
- package/dist/templates/common/workflow/git/zh-CN/git-commit.md +0 -205
- package/dist/templates/common/workflow/git/zh-CN/git-rollback.md +0 -90
- package/dist/templates/common/workflow/git/zh-CN/git-worktree.md +0 -276
- package/dist/templates/common/workflow/interview/en/interview.md +0 -67
- package/dist/templates/common/workflow/interview/zh-CN/interview.md +0 -67
- package/dist/templates/common/workflow/linearMethod/en/linear-method.md +0 -651
- package/dist/templates/common/workflow/linearMethod/zh-CN/linear-method.md +0 -752
- package/dist/templates/common/workflow/refactoringMaster/en/refactoring-master.md +0 -516
- package/dist/templates/common/workflow/refactoringMaster/zh-CN/refactoring-master.md +0 -812
- package/dist/templates/common/workflow/sixStep/en/workflow.md +0 -83
- package/dist/templates/common/workflow/sixStep/zh-CN/workflow.md +0 -359
- package/dist/templates/common/workflow/specFirstTDD/en/spec-first-tdd.md +0 -364
- package/dist/templates/common/workflow/specFirstTDD/zh-CN/spec-first-tdd.md +0 -366
- package/dist/templates/hooks/README.md +0 -212
- package/dist/templates/hooks/git-workflow-hooks.md +0 -551
- package/dist/templates/hooks/post-test/coverage.json +0 -21
- package/dist/templates/hooks/post-test/summary.json +0 -21
- package/dist/templates/hooks/post-test-coverage.md +0 -434
- package/dist/templates/hooks/pre-commit/eslint.json +0 -22
- package/dist/templates/hooks/pre-commit/prettier.json +0 -22
- package/dist/templates/hooks/pre-commit-black.md +0 -274
- package/dist/templates/hooks/pre-commit-eslint.md +0 -153
- package/dist/templates/hooks/pre-commit-gofmt.md +0 -284
- package/dist/templates/hooks/pre-commit-prettier.md +0 -212
- package/dist/templates/hooks/pre-commit-type-check.md +0 -377
- package/dist/templates/skills/ccjk-init.md +0 -154
- package/dist/templates/skills/ccjk-mcp-setup.md +0 -205
- package/dist/templates/skills/ccjk-troubleshoot.md +0 -228
- package/dist/templates/skills/django-patterns.md +0 -1016
- package/dist/templates/skills/git-workflow.md +0 -748
- package/dist/templates/skills/go-idioms.md +0 -963
- package/dist/templates/skills/index.json +0 -132
- package/dist/templates/skills/nextjs-optimization.md +0 -694
- package/dist/templates/skills/python-pep8.md +0 -852
- package/dist/templates/skills/react-patterns.md +0 -686
- package/dist/templates/skills/rust-patterns.md +0 -1057
- package/dist/templates/skills/security-best-practices.md +0 -1413
- package/dist/templates/skills/testing-best-practices.md +0 -1315
- package/dist/templates/skills/ts-best-practices.md +0 -354
- package/templates/agents/README.md +0 -78
- package/templates/agents/fullstack-developer.json +0 -70
- package/templates/agents/go-expert.json +0 -69
- package/templates/agents/index.json +0 -64
- package/templates/agents/python-expert.json +0 -69
- package/templates/agents/react-specialist.json +0 -69
- package/templates/agents/testing-automation-expert.json +0 -70
- package/templates/agents/typescript-architect.json +0 -69
- package/templates/claude-code/common/settings.json +0 -109
- package/templates/common/error-prevention.md +0 -267
- package/templates/common/karpathy-baseline.md +0 -83
- package/templates/common/output-styles/zh-CN/carmack-mode.md +0 -381
- package/templates/common/output-styles/zh-CN/codex-rigor-mode.md +0 -114
- package/templates/common/output-styles/zh-CN/dhh-mode.md +0 -265
- package/templates/common/output-styles/zh-CN/evan-you-mode.md +0 -539
- package/templates/common/output-styles/zh-CN/jobs-mode.md +0 -369
- package/templates/common/output-styles/zh-CN/linus-mode.md +0 -135
- package/templates/common/output-styles/zh-CN/uncle-bob-mode.md +0 -221
- package/templates/common/workflow/continuousDelivery/en/continuous-delivery.md +0 -628
- package/templates/common/workflow/continuousDelivery/zh-CN/continuous-delivery.md +0 -628
- package/templates/common/workflow/essential/en/agents/ccjk-config-agent.md +0 -187
- package/templates/common/workflow/essential/en/agents/ccjk-mcp-agent.md +0 -191
- package/templates/common/workflow/essential/en/agents/ccjk-skill-agent.md +0 -249
- package/templates/common/workflow/essential/en/agents/ccjk-workflow-agent.md +0 -277
- package/templates/common/workflow/essential/en/agents/get-current-datetime.md +0 -29
- package/templates/common/workflow/essential/en/agents/init-architect.md +0 -115
- package/templates/common/workflow/essential/en/agents/ui-ux-designer.md +0 -91
- package/templates/common/workflow/essential/en/feat.md +0 -92
- package/templates/common/workflow/essential/en/goal.md +0 -147
- package/templates/common/workflow/essential/en/init-project.md +0 -53
- package/templates/common/workflow/essential/zh-CN/agents/get-current-datetime.md +0 -29
- package/templates/common/workflow/essential/zh-CN/agents/init-architect.md +0 -115
- package/templates/common/workflow/essential/zh-CN/agents/ui-ux-designer.md +0 -91
- package/templates/common/workflow/essential/zh-CN/feat.md +0 -315
- package/templates/common/workflow/essential/zh-CN/goal.md +0 -146
- package/templates/common/workflow/essential/zh-CN/init-project.md +0 -53
- package/templates/common/workflow/git/en/git-cleanBranches.md +0 -102
- package/templates/common/workflow/git/en/git-commit.md +0 -205
- package/templates/common/workflow/git/en/git-rollback.md +0 -90
- package/templates/common/workflow/git/en/git-worktree.md +0 -276
- package/templates/common/workflow/git/zh-CN/git-cleanBranches.md +0 -102
- package/templates/common/workflow/git/zh-CN/git-commit.md +0 -205
- package/templates/common/workflow/git/zh-CN/git-rollback.md +0 -90
- package/templates/common/workflow/git/zh-CN/git-worktree.md +0 -276
- package/templates/common/workflow/interview/en/interview.md +0 -67
- package/templates/common/workflow/interview/zh-CN/interview.md +0 -67
- package/templates/common/workflow/linearMethod/en/linear-method.md +0 -651
- package/templates/common/workflow/linearMethod/zh-CN/linear-method.md +0 -752
- package/templates/common/workflow/refactoringMaster/en/refactoring-master.md +0 -516
- package/templates/common/workflow/refactoringMaster/zh-CN/refactoring-master.md +0 -812
- package/templates/common/workflow/sixStep/en/workflow.md +0 -83
- package/templates/common/workflow/sixStep/zh-CN/workflow.md +0 -359
- package/templates/common/workflow/specFirstTDD/en/spec-first-tdd.md +0 -364
- package/templates/common/workflow/specFirstTDD/zh-CN/spec-first-tdd.md +0 -366
- package/templates/hooks/README.md +0 -212
- package/templates/hooks/git-workflow-hooks.md +0 -551
- package/templates/hooks/post-test/coverage.json +0 -21
- package/templates/hooks/post-test/summary.json +0 -21
- package/templates/hooks/post-test-coverage.md +0 -434
- package/templates/hooks/pre-commit/eslint.json +0 -22
- package/templates/hooks/pre-commit/prettier.json +0 -22
- package/templates/hooks/pre-commit-black.md +0 -274
- package/templates/hooks/pre-commit-eslint.md +0 -153
- package/templates/hooks/pre-commit-gofmt.md +0 -284
- package/templates/hooks/pre-commit-prettier.md +0 -212
- package/templates/hooks/pre-commit-type-check.md +0 -377
- package/templates/skills/basic.hbs +0 -72
- package/templates/skills/ccjk-init.md +0 -154
- package/templates/skills/ccjk-mcp-setup.md +0 -205
- package/templates/skills/ccjk-troubleshoot.md +0 -228
- package/templates/skills/code-refactor.hbs +0 -133
- package/templates/skills/code-review.hbs +0 -141
- package/templates/skills/django-patterns.md +0 -1016
- package/templates/skills/git-workflow.md +0 -748
- package/templates/skills/go-idioms.md +0 -963
- package/templates/skills/index.json +0 -132
- package/templates/skills/nextjs-optimization.md +0 -694
- package/templates/skills/python-pep8.md +0 -852
- package/templates/skills/react-patterns.md +0 -686
- package/templates/skills/rust-patterns.md +0 -1057
- package/templates/skills/security-best-practices.md +0 -1413
- package/templates/skills/testing-best-practices.md +0 -1315
- package/templates/skills/ts-best-practices.md +0 -354
- package/templates/skills/type-fix.hbs +0 -132
|
@@ -1,364 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
description: SPEC-First TDD Workflow - Specification-first test-driven development with AI-assisted RED-GREEN-REFACTOR cycle
|
|
3
|
-
allowed-tools: Read(**), Write(**), Exec(npm test, npm run test:watch, npm run coverage)
|
|
4
|
-
argument-hint: [--watch] [--coverage] [--unit-only] [--integration-only]
|
|
5
|
-
# examples:
|
|
6
|
-
# - /spec-first-tdd # Start complete TDD cycle
|
|
7
|
-
# - /spec-first-tdd --watch # Watch mode for continuous testing
|
|
8
|
-
# - /spec-first-tdd --coverage # Generate test coverage report
|
|
9
|
-
# - /spec-first-tdd --unit-only # Run unit tests only
|
|
10
|
-
---
|
|
11
|
-
|
|
12
|
-
# SPEC-First TDD Workflow
|
|
13
|
-
|
|
14
|
-
Based on Kent Beck's *Test-Driven Development* and Robert C. Martin's *Clean Code*, enhanced with AI capabilities for modern TDD workflow.
|
|
15
|
-
|
|
16
|
-
---
|
|
17
|
-
|
|
18
|
-
## Core Philosophy
|
|
19
|
-
|
|
20
|
-
**SPEC-First**: Before writing any code, define in natural language:
|
|
21
|
-
- **What**: What functionality to implement
|
|
22
|
-
- **Why**: Why this functionality is needed
|
|
23
|
-
- **How**: How to verify correctness
|
|
24
|
-
|
|
25
|
-
**RED-GREEN-REFACTOR**:
|
|
26
|
-
1. 🔴 **RED**: Write a failing test (define expected behavior)
|
|
27
|
-
2. 🟢 **GREEN**: Write simplest code to make test pass
|
|
28
|
-
3. ♻️ **REFACTOR**: Improve code design under test protection
|
|
29
|
-
|
|
30
|
-
---
|
|
31
|
-
|
|
32
|
-
## Workflow Steps
|
|
33
|
-
|
|
34
|
-
### Phase 1: SPEC Definition
|
|
35
|
-
|
|
36
|
-
**Goal**: Clearly define requirements and acceptance criteria in natural language
|
|
37
|
-
|
|
38
|
-
```markdown
|
|
39
|
-
## Feature Specification
|
|
40
|
-
|
|
41
|
-
### User Story
|
|
42
|
-
As a [role], I want [feature] so that [benefit]
|
|
43
|
-
|
|
44
|
-
### Acceptance Criteria
|
|
45
|
-
- Given [context]
|
|
46
|
-
- When [action]
|
|
47
|
-
- Then [expected outcome]
|
|
48
|
-
|
|
49
|
-
### Edge Cases
|
|
50
|
-
- What if [edge case 1]?
|
|
51
|
-
- What if [edge case 2]?
|
|
52
|
-
|
|
53
|
-
### Non-Functional Requirements
|
|
54
|
-
- Performance: [requirement]
|
|
55
|
-
- Security: [requirement]
|
|
56
|
-
- Accessibility: [requirement]
|
|
57
|
-
```
|
|
58
|
-
|
|
59
|
-
**AI Assistance**:
|
|
60
|
-
- Identify missing edge cases
|
|
61
|
-
- Suggest test scenario priorities
|
|
62
|
-
- Generate test data examples
|
|
63
|
-
|
|
64
|
-
---
|
|
65
|
-
|
|
66
|
-
### Phase 2: Test-First
|
|
67
|
-
|
|
68
|
-
**Goal**: Transform SPEC into executable test cases
|
|
69
|
-
|
|
70
|
-
#### 2.1 Write Test Skeleton
|
|
71
|
-
|
|
72
|
-
```typescript
|
|
73
|
-
describe('UserAuthentication', () => {
|
|
74
|
-
describe('login', () => {
|
|
75
|
-
it('should return token when credentials are valid', async () => {
|
|
76
|
-
// Arrange
|
|
77
|
-
const credentials = { email: 'user@example.com', password: 'secret' }
|
|
78
|
-
|
|
79
|
-
// Act
|
|
80
|
-
const result = await auth.login(credentials)
|
|
81
|
-
|
|
82
|
-
// Assert
|
|
83
|
-
expect(result.token).toBeDefined()
|
|
84
|
-
expect(result.user.email).toBe(credentials.email)
|
|
85
|
-
})
|
|
86
|
-
|
|
87
|
-
it('should throw error when credentials are invalid', async () => {
|
|
88
|
-
// Arrange
|
|
89
|
-
const credentials = { email: 'user@example.com', password: 'wrong' }
|
|
90
|
-
|
|
91
|
-
// Act & Assert
|
|
92
|
-
await expect(auth.login(credentials)).rejects.toThrow('Invalid credentials')
|
|
93
|
-
})
|
|
94
|
-
})
|
|
95
|
-
})
|
|
96
|
-
```
|
|
97
|
-
|
|
98
|
-
#### 2.2 Run Tests (Expected to Fail)
|
|
99
|
-
|
|
100
|
-
```bash
|
|
101
|
-
npm test
|
|
102
|
-
# ❌ FAIL: UserAuthentication › login › should return token when credentials are valid
|
|
103
|
-
# ReferenceError: auth is not defined
|
|
104
|
-
```
|
|
105
|
-
|
|
106
|
-
**Key Principles**:
|
|
107
|
-
- Tests must fail first (proves test is valid)
|
|
108
|
-
- Failure reason should be clear
|
|
109
|
-
- Focus on one test case at a time
|
|
110
|
-
|
|
111
|
-
---
|
|
112
|
-
|
|
113
|
-
### Phase 3: Minimal Implementation
|
|
114
|
-
|
|
115
|
-
**Goal**: Write just enough code to make tests pass (no more, no less)
|
|
116
|
-
|
|
117
|
-
```typescript
|
|
118
|
-
class UserAuthentication {
|
|
119
|
-
async login(credentials: Credentials): Promise<AuthResult> {
|
|
120
|
-
// Simplest implementation: hardcoded return
|
|
121
|
-
if (credentials.email === 'user@example.com' && credentials.password === 'secret') {
|
|
122
|
-
return {
|
|
123
|
-
token: 'fake-token',
|
|
124
|
-
user: { email: credentials.email }
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
throw new Error('Invalid credentials')
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
```
|
|
131
|
-
|
|
132
|
-
#### Run Tests (Expected to Pass)
|
|
133
|
-
|
|
134
|
-
```bash
|
|
135
|
-
npm test
|
|
136
|
-
# ✅ PASS: UserAuthentication › login › should return token when credentials are valid
|
|
137
|
-
# ✅ PASS: UserAuthentication › login › should throw error when credentials are invalid
|
|
138
|
-
```
|
|
139
|
-
|
|
140
|
-
**Key Principles**:
|
|
141
|
-
- Don't over-engineer
|
|
142
|
-
- Don't optimize prematurely
|
|
143
|
-
- Only write code that makes tests pass
|
|
144
|
-
|
|
145
|
-
---
|
|
146
|
-
|
|
147
|
-
### Phase 4: Refactor
|
|
148
|
-
|
|
149
|
-
**Goal**: Improve code design under test protection
|
|
150
|
-
|
|
151
|
-
#### 4.1 Identify Code Smells
|
|
152
|
-
|
|
153
|
-
- Hardcoded values
|
|
154
|
-
- Duplicated code
|
|
155
|
-
- Long functions
|
|
156
|
-
- Unclear naming
|
|
157
|
-
- Missing abstractions
|
|
158
|
-
|
|
159
|
-
#### 4.2 Apply Refactoring Patterns
|
|
160
|
-
|
|
161
|
-
```typescript
|
|
162
|
-
class UserAuthentication {
|
|
163
|
-
constructor(
|
|
164
|
-
private userRepository: UserRepository,
|
|
165
|
-
private tokenService: TokenService,
|
|
166
|
-
private passwordHasher: PasswordHasher
|
|
167
|
-
) {}
|
|
168
|
-
|
|
169
|
-
async login(credentials: Credentials): Promise<AuthResult> {
|
|
170
|
-
const user = await this.userRepository.findByEmail(credentials.email)
|
|
171
|
-
|
|
172
|
-
if (!user) {
|
|
173
|
-
throw new Error('Invalid credentials')
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
const isPasswordValid = await this.passwordHasher.verify(
|
|
177
|
-
credentials.password,
|
|
178
|
-
user.passwordHash
|
|
179
|
-
)
|
|
180
|
-
|
|
181
|
-
if (!isPasswordValid) {
|
|
182
|
-
throw new Error('Invalid credentials')
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
const token = await this.tokenService.generate(user.id)
|
|
186
|
-
|
|
187
|
-
return {
|
|
188
|
-
token,
|
|
189
|
-
user: { email: user.email }
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
|
-
```
|
|
194
|
-
|
|
195
|
-
#### 4.3 Continuous Testing
|
|
196
|
-
|
|
197
|
-
```bash
|
|
198
|
-
npm test -- --watch
|
|
199
|
-
# ✅ All tests passing
|
|
200
|
-
```
|
|
201
|
-
|
|
202
|
-
**Key Principles**:
|
|
203
|
-
- Small refactoring steps (run tests after each change)
|
|
204
|
-
- Keep tests green
|
|
205
|
-
- Refactoring doesn't change behavior
|
|
206
|
-
|
|
207
|
-
---
|
|
208
|
-
|
|
209
|
-
### Phase 5: Expand Coverage
|
|
210
|
-
|
|
211
|
-
**Goal**: Add more test cases to cover edge cases
|
|
212
|
-
|
|
213
|
-
```typescript
|
|
214
|
-
describe('UserAuthentication', () => {
|
|
215
|
-
describe('login', () => {
|
|
216
|
-
// ... existing tests ...
|
|
217
|
-
|
|
218
|
-
it('should handle database connection errors gracefully', async () => {
|
|
219
|
-
// Test infrastructure failures
|
|
220
|
-
})
|
|
221
|
-
|
|
222
|
-
it('should rate-limit failed login attempts', async () => {
|
|
223
|
-
// Test security protections
|
|
224
|
-
})
|
|
225
|
-
|
|
226
|
-
it('should log security events', async () => {
|
|
227
|
-
// Test audit requirements
|
|
228
|
-
})
|
|
229
|
-
})
|
|
230
|
-
})
|
|
231
|
-
```
|
|
232
|
-
|
|
233
|
-
#### Check Coverage
|
|
234
|
-
|
|
235
|
-
```bash
|
|
236
|
-
npm run coverage
|
|
237
|
-
# Statements : 95.2% ( 120/126 )
|
|
238
|
-
# Branches : 88.9% ( 24/27 )
|
|
239
|
-
# Functions : 100% ( 15/15 )
|
|
240
|
-
# Lines : 94.8% ( 110/116 )
|
|
241
|
-
```
|
|
242
|
-
|
|
243
|
-
---
|
|
244
|
-
|
|
245
|
-
## TDD Best Practices
|
|
246
|
-
|
|
247
|
-
### 1. Test Naming Convention
|
|
248
|
-
|
|
249
|
-
```typescript
|
|
250
|
-
// ✅ Good: Clear description of behavior and expectation
|
|
251
|
-
it('should return 400 when email format is invalid')
|
|
252
|
-
it('should cache user data for 5 minutes after successful login')
|
|
253
|
-
|
|
254
|
-
// ❌ Bad: Vague
|
|
255
|
-
it('test login')
|
|
256
|
-
it('should work')
|
|
257
|
-
```
|
|
258
|
-
|
|
259
|
-
### 2. AAA Pattern (Arrange-Act-Assert)
|
|
260
|
-
|
|
261
|
-
```typescript
|
|
262
|
-
it('should calculate total price with discount', () => {
|
|
263
|
-
// Arrange: Prepare test data
|
|
264
|
-
const cart = new ShoppingCart()
|
|
265
|
-
cart.addItem({ price: 100, quantity: 2 })
|
|
266
|
-
const discount = new PercentageDiscount(10)
|
|
267
|
-
|
|
268
|
-
// Act: Execute the operation being tested
|
|
269
|
-
const total = cart.calculateTotal(discount)
|
|
270
|
-
|
|
271
|
-
// Assert: Verify the result
|
|
272
|
-
expect(total).toBe(180) // 200 - 10% = 180
|
|
273
|
-
})
|
|
274
|
-
```
|
|
275
|
-
|
|
276
|
-
### 3. Test Isolation
|
|
277
|
-
|
|
278
|
-
```typescript
|
|
279
|
-
// ✅ Good: Each test is independent
|
|
280
|
-
beforeEach(() => {
|
|
281
|
-
database.clear()
|
|
282
|
-
cache.flush()
|
|
283
|
-
})
|
|
284
|
-
|
|
285
|
-
// ❌ Bad: Tests depend on each other
|
|
286
|
-
let userId: string
|
|
287
|
-
it('should create user', () => {
|
|
288
|
-
userId = createUser() // Later tests depend on this ID
|
|
289
|
-
})
|
|
290
|
-
```
|
|
291
|
-
|
|
292
|
-
### 4. Test Pyramid
|
|
293
|
-
|
|
294
|
-
```
|
|
295
|
-
/\
|
|
296
|
-
/ \ E2E Tests (10%)
|
|
297
|
-
/____\ - Critical user flows
|
|
298
|
-
/ \ Integration Tests (20%)
|
|
299
|
-
/ \ - Module interactions
|
|
300
|
-
/__________\ Unit Tests (70%)
|
|
301
|
-
- Individual functions/classes
|
|
302
|
-
```
|
|
303
|
-
|
|
304
|
-
---
|
|
305
|
-
|
|
306
|
-
## AI-Assisted TDD Workflow
|
|
307
|
-
|
|
308
|
-
### AI's Role
|
|
309
|
-
|
|
310
|
-
1. **SPEC Phase**
|
|
311
|
-
- Help refine requirements
|
|
312
|
-
- Identify edge cases
|
|
313
|
-
- Generate test scenarios
|
|
314
|
-
|
|
315
|
-
2. **Test Writing**
|
|
316
|
-
- Generate test skeletons
|
|
317
|
-
- Suggest test data
|
|
318
|
-
- Add missing assertions
|
|
319
|
-
|
|
320
|
-
3. **Implementation**
|
|
321
|
-
- Provide minimal implementation
|
|
322
|
-
- Suggest design patterns
|
|
323
|
-
- Identify potential issues
|
|
324
|
-
|
|
325
|
-
4. **Refactoring**
|
|
326
|
-
- Detect code smells
|
|
327
|
-
- Suggest refactoring techniques
|
|
328
|
-
- Verify refactoring safety
|
|
329
|
-
|
|
330
|
-
### Human's Role
|
|
331
|
-
|
|
332
|
-
- Define business value and priorities
|
|
333
|
-
- Review test coverage completeness
|
|
334
|
-
- Judge code design reasonableness
|
|
335
|
-
- Make architectural and technology decisions
|
|
336
|
-
|
|
337
|
-
---
|
|
338
|
-
|
|
339
|
-
## Command Options
|
|
340
|
-
|
|
341
|
-
- `--watch`: Watch mode, auto-run tests on file changes
|
|
342
|
-
- `--coverage`: Generate test coverage report
|
|
343
|
-
- `--unit-only`: Run unit tests only (fast feedback)
|
|
344
|
-
- `--integration-only`: Run integration tests only
|
|
345
|
-
- `--verbose`: Show detailed test output
|
|
346
|
-
|
|
347
|
-
---
|
|
348
|
-
|
|
349
|
-
## Success Metrics
|
|
350
|
-
|
|
351
|
-
- ✅ Test coverage > 80% (critical paths 100%)
|
|
352
|
-
- ✅ All tests complete in < 10 seconds
|
|
353
|
-
- ✅ Every feature has corresponding tests
|
|
354
|
-
- ✅ Test failures quickly pinpoint issues
|
|
355
|
-
- ✅ Refactoring doesn't break existing functionality
|
|
356
|
-
|
|
357
|
-
---
|
|
358
|
-
|
|
359
|
-
## References
|
|
360
|
-
|
|
361
|
-
- Kent Beck - *Test-Driven Development: By Example*
|
|
362
|
-
- Robert C. Martin - *Clean Code* & *Clean Architecture*
|
|
363
|
-
- Martin Fowler - *Refactoring: Improving the Design of Existing Code*
|
|
364
|
-
- Growing Object-Oriented Software, Guided by Tests
|
|
@@ -1,366 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
description: SPEC-First TDD 工作流 - 规格先行的测试驱动开发,通过 AI 辅助实现红绿重构循环
|
|
3
|
-
allowed-tools: Read(**), Write(**), Exec(npm test, npm run test:watch, npm run coverage)
|
|
4
|
-
argument-hint: [--watch] [--coverage] [--unit-only] [--integration-only]
|
|
5
|
-
# examples:
|
|
6
|
-
# - /spec-first-tdd # 启动完整 TDD 循环
|
|
7
|
-
# - /spec-first-tdd --watch # 监听模式持续运行测试
|
|
8
|
-
# - /spec-first-tdd --coverage # 生成测试覆盖率报告
|
|
9
|
-
# - /spec-first-tdd --unit-only # 仅运行单元测试
|
|
10
|
-
---
|
|
11
|
-
|
|
12
|
-
> **基于 Discipline Baseline**:本 workflow 在 4 条全局原则(Think / Simplicity / Surgical / Goal-driven)之上提供更具体的流程编排。当本文档与 baseline 冲突,**baseline 优先**。
|
|
13
|
-
|
|
14
|
-
# SPEC-First TDD Workflow
|
|
15
|
-
|
|
16
|
-
基于 Kent Beck 的《测试驱动开发》和 Robert C. Martin 的《代码整洁之道》,结合 AI 能力实现的现代化 TDD 工作流。
|
|
17
|
-
|
|
18
|
-
---
|
|
19
|
-
|
|
20
|
-
## 核心理念
|
|
21
|
-
|
|
22
|
-
**SPEC-First(规格先行)**:在编写任何代码之前,先用自然语言明确定义:
|
|
23
|
-
- **What**:要实现什么功能
|
|
24
|
-
- **Why**:为什么需要这个功能
|
|
25
|
-
- **How**:如何验证功能正确性
|
|
26
|
-
|
|
27
|
-
**RED-GREEN-REFACTOR(红绿重构)**:
|
|
28
|
-
1. 🔴 **RED**:编写失败的测试(定义期望行为)
|
|
29
|
-
2. 🟢 **GREEN**:编写最简单的代码让测试通过
|
|
30
|
-
3. ♻️ **REFACTOR**:在测试保护下重构代码
|
|
31
|
-
|
|
32
|
-
---
|
|
33
|
-
|
|
34
|
-
## Workflow Steps
|
|
35
|
-
|
|
36
|
-
### Phase 1: SPEC Definition(规格定义)
|
|
37
|
-
|
|
38
|
-
**目标**:用自然语言清晰定义需求和验收标准
|
|
39
|
-
|
|
40
|
-
```markdown
|
|
41
|
-
## Feature Specification
|
|
42
|
-
|
|
43
|
-
### User Story
|
|
44
|
-
As a [role], I want [feature] so that [benefit]
|
|
45
|
-
|
|
46
|
-
### Acceptance Criteria
|
|
47
|
-
- Given [context]
|
|
48
|
-
- When [action]
|
|
49
|
-
- Then [expected outcome]
|
|
50
|
-
|
|
51
|
-
### Edge Cases
|
|
52
|
-
- What if [edge case 1]?
|
|
53
|
-
- What if [edge case 2]?
|
|
54
|
-
|
|
55
|
-
### Non-Functional Requirements
|
|
56
|
-
- Performance: [requirement]
|
|
57
|
-
- Security: [requirement]
|
|
58
|
-
- Accessibility: [requirement]
|
|
59
|
-
```
|
|
60
|
-
|
|
61
|
-
**AI 辅助**:
|
|
62
|
-
- 帮助识别遗漏的边界条件
|
|
63
|
-
- 建议测试场景优先级
|
|
64
|
-
- 生成测试数据样例
|
|
65
|
-
|
|
66
|
-
---
|
|
67
|
-
|
|
68
|
-
### Phase 2: Test-First(测试先行)
|
|
69
|
-
|
|
70
|
-
**目标**:将 SPEC 转化为可执行的测试用例
|
|
71
|
-
|
|
72
|
-
#### 2.1 编写测试骨架
|
|
73
|
-
|
|
74
|
-
```typescript
|
|
75
|
-
describe('UserAuthentication', () => {
|
|
76
|
-
describe('login', () => {
|
|
77
|
-
it('should return token when credentials are valid', async () => {
|
|
78
|
-
// Arrange
|
|
79
|
-
const credentials = { email: 'user@example.com', password: 'secret' }
|
|
80
|
-
|
|
81
|
-
// Act
|
|
82
|
-
const result = await auth.login(credentials)
|
|
83
|
-
|
|
84
|
-
// Assert
|
|
85
|
-
expect(result.token).toBeDefined()
|
|
86
|
-
expect(result.user.email).toBe(credentials.email)
|
|
87
|
-
})
|
|
88
|
-
|
|
89
|
-
it('should throw error when credentials are invalid', async () => {
|
|
90
|
-
// Arrange
|
|
91
|
-
const credentials = { email: 'user@example.com', password: 'wrong' }
|
|
92
|
-
|
|
93
|
-
// Act & Assert
|
|
94
|
-
await expect(auth.login(credentials)).rejects.toThrow('Invalid credentials')
|
|
95
|
-
})
|
|
96
|
-
})
|
|
97
|
-
})
|
|
98
|
-
```
|
|
99
|
-
|
|
100
|
-
#### 2.2 运行测试(预期失败)
|
|
101
|
-
|
|
102
|
-
```bash
|
|
103
|
-
npm test
|
|
104
|
-
# ❌ FAIL: UserAuthentication › login › should return token when credentials are valid
|
|
105
|
-
# ReferenceError: auth is not defined
|
|
106
|
-
```
|
|
107
|
-
|
|
108
|
-
**关键原则**:
|
|
109
|
-
- 测试必须先失败(证明测试有效)
|
|
110
|
-
- 失败原因应该清晰明确
|
|
111
|
-
- 一次只关注一个测试用例
|
|
112
|
-
|
|
113
|
-
---
|
|
114
|
-
|
|
115
|
-
### Phase 3: Minimal Implementation(最小实现)
|
|
116
|
-
|
|
117
|
-
**目标**:编写刚好让测试通过的代码(不多不少)
|
|
118
|
-
|
|
119
|
-
```typescript
|
|
120
|
-
class UserAuthentication {
|
|
121
|
-
async login(credentials: Credentials): Promise<AuthResult> {
|
|
122
|
-
// 最简单的实现:硬编码返回
|
|
123
|
-
if (credentials.email === 'user@example.com' && credentials.password === 'secret') {
|
|
124
|
-
return {
|
|
125
|
-
token: 'fake-token',
|
|
126
|
-
user: { email: credentials.email }
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
throw new Error('Invalid credentials')
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
```
|
|
133
|
-
|
|
134
|
-
#### 运行测试(预期通过)
|
|
135
|
-
|
|
136
|
-
```bash
|
|
137
|
-
npm test
|
|
138
|
-
# ✅ PASS: UserAuthentication › login › should return token when credentials are valid
|
|
139
|
-
# ✅ PASS: UserAuthentication › login › should throw error when credentials are invalid
|
|
140
|
-
```
|
|
141
|
-
|
|
142
|
-
**关键原则**:
|
|
143
|
-
- 不要过度设计
|
|
144
|
-
- 不要提前优化
|
|
145
|
-
- 只写让测试通过的代码
|
|
146
|
-
|
|
147
|
-
---
|
|
148
|
-
|
|
149
|
-
### Phase 4: Refactor(重构)
|
|
150
|
-
|
|
151
|
-
**目标**:在测试保护下改善代码设计
|
|
152
|
-
|
|
153
|
-
#### 4.1 识别代码坏味道
|
|
154
|
-
|
|
155
|
-
- 硬编码值
|
|
156
|
-
- 重复代码
|
|
157
|
-
- 过长函数
|
|
158
|
-
- 不清晰的命名
|
|
159
|
-
- 缺少抽象
|
|
160
|
-
|
|
161
|
-
#### 4.2 应用重构模式
|
|
162
|
-
|
|
163
|
-
```typescript
|
|
164
|
-
class UserAuthentication {
|
|
165
|
-
constructor(
|
|
166
|
-
private userRepository: UserRepository,
|
|
167
|
-
private tokenService: TokenService,
|
|
168
|
-
private passwordHasher: PasswordHasher
|
|
169
|
-
) {}
|
|
170
|
-
|
|
171
|
-
async login(credentials: Credentials): Promise<AuthResult> {
|
|
172
|
-
const user = await this.userRepository.findByEmail(credentials.email)
|
|
173
|
-
|
|
174
|
-
if (!user) {
|
|
175
|
-
throw new Error('Invalid credentials')
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
const isPasswordValid = await this.passwordHasher.verify(
|
|
179
|
-
credentials.password,
|
|
180
|
-
user.passwordHash
|
|
181
|
-
)
|
|
182
|
-
|
|
183
|
-
if (!isPasswordValid) {
|
|
184
|
-
throw new Error('Invalid credentials')
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
const token = await this.tokenService.generate(user.id)
|
|
188
|
-
|
|
189
|
-
return {
|
|
190
|
-
token,
|
|
191
|
-
user: { email: user.email }
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
```
|
|
196
|
-
|
|
197
|
-
#### 4.3 持续运行测试
|
|
198
|
-
|
|
199
|
-
```bash
|
|
200
|
-
npm test -- --watch
|
|
201
|
-
# ✅ All tests passing
|
|
202
|
-
```
|
|
203
|
-
|
|
204
|
-
**关键原则**:
|
|
205
|
-
- 小步重构(每次改动后立即运行测试)
|
|
206
|
-
- 保持测试绿色
|
|
207
|
-
- 重构不改变行为
|
|
208
|
-
|
|
209
|
-
---
|
|
210
|
-
|
|
211
|
-
### Phase 5: Expand Coverage(扩展覆盖)
|
|
212
|
-
|
|
213
|
-
**目标**:添加更多测试用例覆盖边界条件
|
|
214
|
-
|
|
215
|
-
```typescript
|
|
216
|
-
describe('UserAuthentication', () => {
|
|
217
|
-
describe('login', () => {
|
|
218
|
-
// ... 已有测试 ...
|
|
219
|
-
|
|
220
|
-
it('should handle database connection errors gracefully', async () => {
|
|
221
|
-
// 测试基础设施故障
|
|
222
|
-
})
|
|
223
|
-
|
|
224
|
-
it('should rate-limit failed login attempts', async () => {
|
|
225
|
-
// 测试安全防护
|
|
226
|
-
})
|
|
227
|
-
|
|
228
|
-
it('should log security events', async () => {
|
|
229
|
-
// 测试审计需求
|
|
230
|
-
})
|
|
231
|
-
})
|
|
232
|
-
})
|
|
233
|
-
```
|
|
234
|
-
|
|
235
|
-
#### 检查覆盖率
|
|
236
|
-
|
|
237
|
-
```bash
|
|
238
|
-
npm run coverage
|
|
239
|
-
# Statements : 95.2% ( 120/126 )
|
|
240
|
-
# Branches : 88.9% ( 24/27 )
|
|
241
|
-
# Functions : 100% ( 15/15 )
|
|
242
|
-
# Lines : 94.8% ( 110/116 )
|
|
243
|
-
```
|
|
244
|
-
|
|
245
|
-
---
|
|
246
|
-
|
|
247
|
-
## TDD Best Practices
|
|
248
|
-
|
|
249
|
-
### 1. 测试命名规范
|
|
250
|
-
|
|
251
|
-
```typescript
|
|
252
|
-
// ✅ Good: 清晰描述行为和预期
|
|
253
|
-
it('should return 400 when email format is invalid')
|
|
254
|
-
it('should cache user data for 5 minutes after successful login')
|
|
255
|
-
|
|
256
|
-
// ❌ Bad: 模糊不清
|
|
257
|
-
it('test login')
|
|
258
|
-
it('should work')
|
|
259
|
-
```
|
|
260
|
-
|
|
261
|
-
### 2. AAA 模式(Arrange-Act-Assert)
|
|
262
|
-
|
|
263
|
-
```typescript
|
|
264
|
-
it('should calculate total price with discount', () => {
|
|
265
|
-
// Arrange: 准备测试数据
|
|
266
|
-
const cart = new ShoppingCart()
|
|
267
|
-
cart.addItem({ price: 100, quantity: 2 })
|
|
268
|
-
const discount = new PercentageDiscount(10)
|
|
269
|
-
|
|
270
|
-
// Act: 执行被测试的操作
|
|
271
|
-
const total = cart.calculateTotal(discount)
|
|
272
|
-
|
|
273
|
-
// Assert: 验证结果
|
|
274
|
-
expect(total).toBe(180) // 200 - 10% = 180
|
|
275
|
-
})
|
|
276
|
-
```
|
|
277
|
-
|
|
278
|
-
### 3. 测试隔离
|
|
279
|
-
|
|
280
|
-
```typescript
|
|
281
|
-
// ✅ Good: 每个测试独立
|
|
282
|
-
beforeEach(() => {
|
|
283
|
-
database.clear()
|
|
284
|
-
cache.flush()
|
|
285
|
-
})
|
|
286
|
-
|
|
287
|
-
// ❌ Bad: 测试之间有依赖
|
|
288
|
-
let userId: string
|
|
289
|
-
it('should create user', () => {
|
|
290
|
-
userId = createUser() // 后续测试依赖这个 ID
|
|
291
|
-
})
|
|
292
|
-
```
|
|
293
|
-
|
|
294
|
-
### 4. 测试金字塔
|
|
295
|
-
|
|
296
|
-
```
|
|
297
|
-
/\
|
|
298
|
-
/ \ E2E Tests (10%)
|
|
299
|
-
/____\ - 关键用户流程
|
|
300
|
-
/ \ Integration Tests (20%)
|
|
301
|
-
/ \ - 模块间交互
|
|
302
|
-
/__________\ Unit Tests (70%)
|
|
303
|
-
- 单个函数/类
|
|
304
|
-
```
|
|
305
|
-
|
|
306
|
-
---
|
|
307
|
-
|
|
308
|
-
## AI-Assisted TDD Workflow
|
|
309
|
-
|
|
310
|
-
### AI 的角色
|
|
311
|
-
|
|
312
|
-
1. **SPEC 阶段**
|
|
313
|
-
- 帮助细化需求
|
|
314
|
-
- 识别边界条件
|
|
315
|
-
- 生成测试场景
|
|
316
|
-
|
|
317
|
-
2. **测试编写**
|
|
318
|
-
- 生成测试骨架
|
|
319
|
-
- 建议测试数据
|
|
320
|
-
- 补充遗漏的断言
|
|
321
|
-
|
|
322
|
-
3. **实现阶段**
|
|
323
|
-
- 提供最小实现
|
|
324
|
-
- 建议设计模式
|
|
325
|
-
- 识别潜在问题
|
|
326
|
-
|
|
327
|
-
4. **重构阶段**
|
|
328
|
-
- 检测代码坏味道
|
|
329
|
-
- 建议重构手法
|
|
330
|
-
- 验证重构安全性
|
|
331
|
-
|
|
332
|
-
### 人类的角色
|
|
333
|
-
|
|
334
|
-
- 定义业务价值和优先级
|
|
335
|
-
- 审查测试覆盖的完整性
|
|
336
|
-
- 判断代码设计的合理性
|
|
337
|
-
- 决策架构和技术选型
|
|
338
|
-
|
|
339
|
-
---
|
|
340
|
-
|
|
341
|
-
## Command Options
|
|
342
|
-
|
|
343
|
-
- `--watch`:监听模式,文件变化时自动运行测试
|
|
344
|
-
- `--coverage`:生成测试覆盖率报告
|
|
345
|
-
- `--unit-only`:仅运行单元测试(快速反馈)
|
|
346
|
-
- `--integration-only`:仅运行集成测试
|
|
347
|
-
- `--verbose`:显示详细测试输出
|
|
348
|
-
|
|
349
|
-
---
|
|
350
|
-
|
|
351
|
-
## Success Metrics
|
|
352
|
-
|
|
353
|
-
- ✅ 测试覆盖率 > 80%(关键路径 100%)
|
|
354
|
-
- ✅ 所有测试 < 10 秒运行完成
|
|
355
|
-
- ✅ 每个功能都有对应的测试
|
|
356
|
-
- ✅ 测试失败时能快速定位问题
|
|
357
|
-
- ✅ 重构不破坏现有功能
|
|
358
|
-
|
|
359
|
-
---
|
|
360
|
-
|
|
361
|
-
## References
|
|
362
|
-
|
|
363
|
-
- Kent Beck - *Test-Driven Development: By Example*
|
|
364
|
-
- Robert C. Martin - *Clean Code* & *Clean Architecture*
|
|
365
|
-
- Martin Fowler - *Refactoring: Improving the Design of Existing Code*
|
|
366
|
-
- Growing Object-Oriented Software, Guided by Tests
|