ccjk 14.2.2 → 15.1.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 +75 -338
- package/dist/cli.js +89 -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 +165 -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 +42 -0
- package/dist/commands/menu.js.map +1 -0
- package/dist/commands/profile.js +138 -0
- package/dist/commands/profile.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/profiles.js +104 -0
- package/dist/core/profiles.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,852 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: python-pep8
|
|
3
|
-
description: Python PEP 8 style guide, type hints, and modern Python 3.12+ best practices
|
|
4
|
-
description_zh: Python PEP 8 风格指南、类型提示和现代 Python 3.12+ 最佳实践
|
|
5
|
-
version: 1.0.0
|
|
6
|
-
category: programming
|
|
7
|
-
triggers: ['/python-pep8', '/python', '/pep8', '/python-style']
|
|
8
|
-
use_when:
|
|
9
|
-
- Writing Python code following PEP 8 standards
|
|
10
|
-
- Implementing type hints and modern Python features
|
|
11
|
-
- Code review for Python projects
|
|
12
|
-
- Setting up Python project structure and tooling
|
|
13
|
-
use_when_zh:
|
|
14
|
-
- 编写遵循 PEP 8 标准的 Python 代码
|
|
15
|
-
- 实现类型提示和现代 Python 功能
|
|
16
|
-
- Python 项目代码审查
|
|
17
|
-
- 设置 Python 项目结构和工具
|
|
18
|
-
auto_activate: true
|
|
19
|
-
priority: 8
|
|
20
|
-
agents: [python-expert, code-reviewer]
|
|
21
|
-
tags: [python, pep8, type-hints, style-guide, best-practices]
|
|
22
|
-
---
|
|
23
|
-
|
|
24
|
-
# Python PEP 8 Best Practices | Python PEP 8 最佳实践
|
|
25
|
-
|
|
26
|
-
## Context | 上下文
|
|
27
|
-
|
|
28
|
-
Use this skill when writing Python code that follows PEP 8 standards, implements modern type hints, and uses Python 3.12+ features. Essential for maintainable and professional Python development.
|
|
29
|
-
|
|
30
|
-
在编写遵循 PEP 8 标准、实现现代类型提示并使用 Python 3.12+ 功能的 Python 代码时使用此技能。对于可维护和专业的 Python 开发至关重要。
|
|
31
|
-
|
|
32
|
-
## Code Style and Formatting | 代码风格和格式化
|
|
33
|
-
|
|
34
|
-
### 1. Naming Conventions | 命名约定
|
|
35
|
-
|
|
36
|
-
```python
|
|
37
|
-
# ✅ Good: Follow PEP 8 naming conventions
|
|
38
|
-
|
|
39
|
-
# Variables and functions: snake_case
|
|
40
|
-
user_name = "john_doe"
|
|
41
|
-
total_count = 42
|
|
42
|
-
|
|
43
|
-
def calculate_total_price(items: list[dict]) -> float:
|
|
44
|
-
"""Calculate total price of items."""
|
|
45
|
-
return sum(item['price'] for item in items)
|
|
46
|
-
|
|
47
|
-
# Constants: UPPER_SNAKE_CASE
|
|
48
|
-
MAX_RETRY_ATTEMPTS = 3
|
|
49
|
-
DEFAULT_TIMEOUT = 30.0
|
|
50
|
-
API_BASE_URL = "https://api.example.com"
|
|
51
|
-
|
|
52
|
-
# Classes: PascalCase
|
|
53
|
-
class UserRepository:
|
|
54
|
-
"""Repository for user data operations."""
|
|
55
|
-
|
|
56
|
-
def __init__(self, database_url: str) -> None:
|
|
57
|
-
self._database_url = database_url
|
|
58
|
-
self._connection = None
|
|
59
|
-
|
|
60
|
-
def find_by_id(self, user_id: int) -> User | None:
|
|
61
|
-
"""Find user by ID."""
|
|
62
|
-
pass
|
|
63
|
-
|
|
64
|
-
# Private attributes: leading underscore
|
|
65
|
-
class BankAccount:
|
|
66
|
-
def __init__(self, initial_balance: float) -> None:
|
|
67
|
-
self._balance = initial_balance # Protected
|
|
68
|
-
self.__account_number = self._generate_account_number() # Private
|
|
69
|
-
|
|
70
|
-
def _generate_account_number(self) -> str:
|
|
71
|
-
"""Generate unique account number."""
|
|
72
|
-
pass
|
|
73
|
-
|
|
74
|
-
# ❌ Bad: Inconsistent naming
|
|
75
|
-
userName = "john" # Should be user_name
|
|
76
|
-
def CalculatePrice(): # Should be calculate_price
|
|
77
|
-
pass
|
|
78
|
-
|
|
79
|
-
class userRepository: # Should be UserRepository
|
|
80
|
-
pass
|
|
81
|
-
```
|
|
82
|
-
|
|
83
|
-
### 2. Line Length and Formatting | 行长度和格式化
|
|
84
|
-
|
|
85
|
-
```python
|
|
86
|
-
# ✅ Good: Proper line breaks and formatting
|
|
87
|
-
|
|
88
|
-
# Function definitions with many parameters
|
|
89
|
-
def create_user_account(
|
|
90
|
-
username: str,
|
|
91
|
-
email: str,
|
|
92
|
-
password: str,
|
|
93
|
-
first_name: str,
|
|
94
|
-
last_name: str,
|
|
95
|
-
date_of_birth: date,
|
|
96
|
-
phone_number: str | None = None,
|
|
97
|
-
address: str | None = None,
|
|
98
|
-
) -> UserAccount:
|
|
99
|
-
"""Create a new user account with provided information."""
|
|
100
|
-
return UserAccount(
|
|
101
|
-
username=username,
|
|
102
|
-
email=email,
|
|
103
|
-
password=hash_password(password),
|
|
104
|
-
profile=UserProfile(
|
|
105
|
-
first_name=first_name,
|
|
106
|
-
last_name=last_name,
|
|
107
|
-
date_of_birth=date_of_birth,
|
|
108
|
-
phone_number=phone_number,
|
|
109
|
-
address=address,
|
|
110
|
-
),
|
|
111
|
-
)
|
|
112
|
-
|
|
113
|
-
# Long expressions
|
|
114
|
-
total_price = (
|
|
115
|
-
base_price
|
|
116
|
-
+ tax_amount
|
|
117
|
-
+ shipping_cost
|
|
118
|
-
- discount_amount
|
|
119
|
-
+ handling_fee
|
|
120
|
-
)
|
|
121
|
-
|
|
122
|
-
# Dictionary formatting
|
|
123
|
-
user_data = {
|
|
124
|
-
"id": 123,
|
|
125
|
-
"username": "john_doe",
|
|
126
|
-
"email": "john@example.com",
|
|
127
|
-
"profile": {
|
|
128
|
-
"first_name": "John",
|
|
129
|
-
"last_name": "Doe",
|
|
130
|
-
"age": 30,
|
|
131
|
-
},
|
|
132
|
-
"preferences": {
|
|
133
|
-
"theme": "dark",
|
|
134
|
-
"notifications": True,
|
|
135
|
-
"language": "en",
|
|
136
|
-
},
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
# List comprehensions
|
|
140
|
-
filtered_users = [
|
|
141
|
-
user for user in users
|
|
142
|
-
if user.is_active and user.age >= 18
|
|
143
|
-
]
|
|
144
|
-
|
|
145
|
-
# ❌ Bad: Long lines and poor formatting
|
|
146
|
-
def create_user_account(username: str, email: str, password: str, first_name: str, last_name: str, date_of_birth: date, phone_number: str | None = None, address: str | None = None) -> UserAccount:
|
|
147
|
-
pass
|
|
148
|
-
|
|
149
|
-
total_price = base_price + tax_amount + shipping_cost - discount_amount + handling_fee
|
|
150
|
-
```
|
|
151
|
-
|
|
152
|
-
### 3. Import Organization | 导入组织
|
|
153
|
-
|
|
154
|
-
```python
|
|
155
|
-
# ✅ Good: Proper import organization
|
|
156
|
-
|
|
157
|
-
# Standard library imports
|
|
158
|
-
import asyncio
|
|
159
|
-
import json
|
|
160
|
-
import logging
|
|
161
|
-
import os
|
|
162
|
-
from collections import defaultdict
|
|
163
|
-
from datetime import datetime, timedelta
|
|
164
|
-
from pathlib import Path
|
|
165
|
-
from typing import Any, Dict, List, Optional, Union
|
|
166
|
-
|
|
167
|
-
# Third-party imports
|
|
168
|
-
import httpx
|
|
169
|
-
import pydantic
|
|
170
|
-
from fastapi import FastAPI, HTTPException
|
|
171
|
-
from sqlalchemy import create_engine
|
|
172
|
-
from sqlalchemy.orm import sessionmaker
|
|
173
|
-
|
|
174
|
-
# Local application imports
|
|
175
|
-
from .config import settings
|
|
176
|
-
from .database import Base, get_db
|
|
177
|
-
from .models import User, UserCreate, UserUpdate
|
|
178
|
-
from .services import UserService, EmailService
|
|
179
|
-
|
|
180
|
-
# ❌ Bad: Mixed import styles and poor organization
|
|
181
|
-
from typing import *
|
|
182
|
-
import os, sys, json
|
|
183
|
-
from fastapi import *
|
|
184
|
-
import httpx, pydantic
|
|
185
|
-
from .models import User
|
|
186
|
-
from .config import settings
|
|
187
|
-
import logging
|
|
188
|
-
```
|
|
189
|
-
|
|
190
|
-
## Type Hints and Modern Python | 类型提示和现代 Python
|
|
191
|
-
|
|
192
|
-
### 1. Type Hints Best Practices | 类型提示最佳实践
|
|
193
|
-
|
|
194
|
-
```python
|
|
195
|
-
from typing import Any, Dict, List, Optional, Union, TypeVar, Generic, Protocol
|
|
196
|
-
from collections.abc import Callable, Iterable, Mapping
|
|
197
|
-
from dataclasses import dataclass
|
|
198
|
-
from enum import Enum
|
|
199
|
-
|
|
200
|
-
# ✅ Good: Comprehensive type hints
|
|
201
|
-
|
|
202
|
-
# Basic types
|
|
203
|
-
def process_user_data(
|
|
204
|
-
user_id: int,
|
|
205
|
-
username: str,
|
|
206
|
-
email: str,
|
|
207
|
-
is_active: bool = True,
|
|
208
|
-
metadata: dict[str, Any] | None = None,
|
|
209
|
-
) -> dict[str, Any]:
|
|
210
|
-
"""Process user data and return result."""
|
|
211
|
-
return {
|
|
212
|
-
"user_id": user_id,
|
|
213
|
-
"username": username,
|
|
214
|
-
"email": email,
|
|
215
|
-
"is_active": is_active,
|
|
216
|
-
"metadata": metadata or {},
|
|
217
|
-
"processed_at": datetime.now().isoformat(),
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
# Generic types
|
|
221
|
-
T = TypeVar('T')
|
|
222
|
-
K = TypeVar('K')
|
|
223
|
-
V = TypeVar('V')
|
|
224
|
-
|
|
225
|
-
class Repository(Generic[T]):
|
|
226
|
-
"""Generic repository pattern."""
|
|
227
|
-
|
|
228
|
-
def __init__(self, model_class: type[T]) -> None:
|
|
229
|
-
self._model_class = model_class
|
|
230
|
-
|
|
231
|
-
def find_by_id(self, id: int) -> T | None:
|
|
232
|
-
"""Find entity by ID."""
|
|
233
|
-
pass
|
|
234
|
-
|
|
235
|
-
def find_all(self) -> list[T]:
|
|
236
|
-
"""Find all entities."""
|
|
237
|
-
pass
|
|
238
|
-
|
|
239
|
-
def save(self, entity: T) -> T:
|
|
240
|
-
"""Save entity."""
|
|
241
|
-
pass
|
|
242
|
-
|
|
243
|
-
# Protocol for structural typing
|
|
244
|
-
class Drawable(Protocol):
|
|
245
|
-
"""Protocol for drawable objects."""
|
|
246
|
-
|
|
247
|
-
def draw(self) -> None:
|
|
248
|
-
"""Draw the object."""
|
|
249
|
-
...
|
|
250
|
-
|
|
251
|
-
def render_objects(objects: Iterable[Drawable]) -> None:
|
|
252
|
-
"""Render all drawable objects."""
|
|
253
|
-
for obj in objects:
|
|
254
|
-
obj.draw()
|
|
255
|
-
|
|
256
|
-
# Union types (Python 3.10+)
|
|
257
|
-
def parse_id(value: str | int) -> int:
|
|
258
|
-
"""Parse ID from string or int."""
|
|
259
|
-
if isinstance(value, str):
|
|
260
|
-
return int(value)
|
|
261
|
-
return value
|
|
262
|
-
|
|
263
|
-
# Optional with None default
|
|
264
|
-
def get_user_by_email(email: str, include_inactive: bool = False) -> User | None:
|
|
265
|
-
"""Get user by email address."""
|
|
266
|
-
pass
|
|
267
|
-
|
|
268
|
-
# Callable types
|
|
269
|
-
def apply_operation(
|
|
270
|
-
data: list[int],
|
|
271
|
-
operation: Callable[[int], int],
|
|
272
|
-
) -> list[int]:
|
|
273
|
-
"""Apply operation to each item in data."""
|
|
274
|
-
return [operation(item) for item in data]
|
|
275
|
-
|
|
276
|
-
# ❌ Bad: Missing or incorrect type hints
|
|
277
|
-
def process_data(data): # Missing type hints
|
|
278
|
-
return data
|
|
279
|
-
|
|
280
|
-
def get_user(id: str) -> dict: # Too generic return type
|
|
281
|
-
pass
|
|
282
|
-
|
|
283
|
-
def calculate(x: Any, y: Any) -> Any: # Overuse of Any
|
|
284
|
-
return x + y
|
|
285
|
-
```
|
|
286
|
-
|
|
287
|
-
### 2. Dataclasses and Pydantic Models | 数据类和 Pydantic 模型
|
|
288
|
-
|
|
289
|
-
```python
|
|
290
|
-
from dataclasses import dataclass, field
|
|
291
|
-
from datetime import datetime
|
|
292
|
-
from enum import Enum
|
|
293
|
-
from pydantic import BaseModel, Field, validator
|
|
294
|
-
|
|
295
|
-
# ✅ Good: Dataclass usage
|
|
296
|
-
@dataclass(frozen=True)
|
|
297
|
-
class Point:
|
|
298
|
-
"""Immutable point in 2D space."""
|
|
299
|
-
x: float
|
|
300
|
-
y: float
|
|
301
|
-
|
|
302
|
-
def distance_to(self, other: 'Point') -> float:
|
|
303
|
-
"""Calculate distance to another point."""
|
|
304
|
-
return ((self.x - other.x) ** 2 + (self.y - other.y) ** 2) ** 0.5
|
|
305
|
-
|
|
306
|
-
@dataclass
|
|
307
|
-
class User:
|
|
308
|
-
"""User data model."""
|
|
309
|
-
id: int
|
|
310
|
-
username: str
|
|
311
|
-
email: str
|
|
312
|
-
created_at: datetime = field(default_factory=datetime.now)
|
|
313
|
-
is_active: bool = True
|
|
314
|
-
tags: list[str] = field(default_factory=list)
|
|
315
|
-
|
|
316
|
-
def __post_init__(self) -> None:
|
|
317
|
-
"""Validate data after initialization."""
|
|
318
|
-
if not self.email or '@' not in self.email:
|
|
319
|
-
raise ValueError("Invalid email address")
|
|
320
|
-
|
|
321
|
-
# ✅ Good: Pydantic models for validation
|
|
322
|
-
class UserStatus(str, Enum):
|
|
323
|
-
"""User status enumeration."""
|
|
324
|
-
ACTIVE = "active"
|
|
325
|
-
INACTIVE = "inactive"
|
|
326
|
-
SUSPENDED = "suspended"
|
|
327
|
-
|
|
328
|
-
class UserCreate(BaseModel):
|
|
329
|
-
"""Model for creating a new user."""
|
|
330
|
-
username: str = Field(..., min_length=3, max_length=50)
|
|
331
|
-
email: str = Field(..., regex=r'^[^@]+@[^@]+\.[^@]+$')
|
|
332
|
-
password: str = Field(..., min_length=8)
|
|
333
|
-
first_name: str = Field(..., min_length=1, max_length=100)
|
|
334
|
-
last_name: str = Field(..., min_length=1, max_length=100)
|
|
335
|
-
|
|
336
|
-
@validator('username')
|
|
337
|
-
def username_must_be_alphanumeric(cls, v: str) -> str:
|
|
338
|
-
"""Validate username contains only alphanumeric characters."""
|
|
339
|
-
if not v.isalnum():
|
|
340
|
-
raise ValueError('Username must be alphanumeric')
|
|
341
|
-
return v.lower()
|
|
342
|
-
|
|
343
|
-
class UserResponse(BaseModel):
|
|
344
|
-
"""Model for user API responses."""
|
|
345
|
-
id: int
|
|
346
|
-
username: str
|
|
347
|
-
email: str
|
|
348
|
-
first_name: str
|
|
349
|
-
last_name: str
|
|
350
|
-
status: UserStatus
|
|
351
|
-
created_at: datetime
|
|
352
|
-
|
|
353
|
-
class Config:
|
|
354
|
-
"""Pydantic configuration."""
|
|
355
|
-
orm_mode = True
|
|
356
|
-
use_enum_values = True
|
|
357
|
-
```
|
|
358
|
-
|
|
359
|
-
### 3. Error Handling and Exceptions | 错误处理和异常
|
|
360
|
-
|
|
361
|
-
```python
|
|
362
|
-
# ✅ Good: Custom exceptions with proper hierarchy
|
|
363
|
-
class ApplicationError(Exception):
|
|
364
|
-
"""Base exception for application errors."""
|
|
365
|
-
|
|
366
|
-
def __init__(self, message: str, error_code: str | None = None) -> None:
|
|
367
|
-
super().__init__(message)
|
|
368
|
-
self.message = message
|
|
369
|
-
self.error_code = error_code
|
|
370
|
-
|
|
371
|
-
class ValidationError(ApplicationError):
|
|
372
|
-
"""Exception raised for validation errors."""
|
|
373
|
-
pass
|
|
374
|
-
|
|
375
|
-
class NotFoundError(ApplicationError):
|
|
376
|
-
"""Exception raised when resource is not found."""
|
|
377
|
-
pass
|
|
378
|
-
|
|
379
|
-
class DatabaseError(ApplicationError):
|
|
380
|
-
"""Exception raised for database operations."""
|
|
381
|
-
pass
|
|
382
|
-
|
|
383
|
-
# ✅ Good: Proper exception handling
|
|
384
|
-
def get_user_by_id(user_id: int) -> User:
|
|
385
|
-
"""Get user by ID with proper error handling."""
|
|
386
|
-
try:
|
|
387
|
-
user = database.query(User).filter(User.id == user_id).first()
|
|
388
|
-
if user is None:
|
|
389
|
-
raise NotFoundError(
|
|
390
|
-
f"User with ID {user_id} not found",
|
|
391
|
-
error_code="USER_NOT_FOUND"
|
|
392
|
-
)
|
|
393
|
-
return user
|
|
394
|
-
except DatabaseError as e:
|
|
395
|
-
logger.error(f"Database error while fetching user {user_id}: {e}")
|
|
396
|
-
raise
|
|
397
|
-
except Exception as e:
|
|
398
|
-
logger.error(f"Unexpected error while fetching user {user_id}: {e}")
|
|
399
|
-
raise ApplicationError(
|
|
400
|
-
"An unexpected error occurred",
|
|
401
|
-
error_code="INTERNAL_ERROR"
|
|
402
|
-
) from e
|
|
403
|
-
|
|
404
|
-
# ✅ Good: Context managers for resource management
|
|
405
|
-
from contextlib import contextmanager
|
|
406
|
-
from typing import Generator
|
|
407
|
-
|
|
408
|
-
@contextmanager
|
|
409
|
-
def database_transaction() -> Generator[None, None, None]:
|
|
410
|
-
"""Context manager for database transactions."""
|
|
411
|
-
transaction = database.begin()
|
|
412
|
-
try:
|
|
413
|
-
yield
|
|
414
|
-
transaction.commit()
|
|
415
|
-
except Exception:
|
|
416
|
-
transaction.rollback()
|
|
417
|
-
raise
|
|
418
|
-
finally:
|
|
419
|
-
transaction.close()
|
|
420
|
-
|
|
421
|
-
# Usage
|
|
422
|
-
def transfer_funds(from_account: int, to_account: int, amount: float) -> None:
|
|
423
|
-
"""Transfer funds between accounts."""
|
|
424
|
-
with database_transaction():
|
|
425
|
-
debit_account(from_account, amount)
|
|
426
|
-
credit_account(to_account, amount)
|
|
427
|
-
log_transaction(from_account, to_account, amount)
|
|
428
|
-
|
|
429
|
-
# ❌ Bad: Poor exception handling
|
|
430
|
-
def get_user(user_id):
|
|
431
|
-
try:
|
|
432
|
-
return database.get(user_id)
|
|
433
|
-
except: # Too broad exception handling
|
|
434
|
-
return None # Silently ignoring errors
|
|
435
|
-
|
|
436
|
-
def process_file(filename):
|
|
437
|
-
file = open(filename) # No proper resource management
|
|
438
|
-
data = file.read()
|
|
439
|
-
return data # File never closed
|
|
440
|
-
```
|
|
441
|
-
|
|
442
|
-
## Documentation and Docstrings | 文档和文档字符串
|
|
443
|
-
|
|
444
|
-
### 1. Docstring Conventions | 文档字符串约定
|
|
445
|
-
|
|
446
|
-
```python
|
|
447
|
-
# ✅ Good: Comprehensive docstrings following Google style
|
|
448
|
-
|
|
449
|
-
def calculate_compound_interest(
|
|
450
|
-
principal: float,
|
|
451
|
-
rate: float,
|
|
452
|
-
time: float,
|
|
453
|
-
compound_frequency: int = 1,
|
|
454
|
-
) -> float:
|
|
455
|
-
"""Calculate compound interest.
|
|
456
|
-
|
|
457
|
-
This function calculates the compound interest based on the principal
|
|
458
|
-
amount, interest rate, time period, and compounding frequency.
|
|
459
|
-
|
|
460
|
-
Args:
|
|
461
|
-
principal: The initial amount of money.
|
|
462
|
-
rate: The annual interest rate as a decimal (e.g., 0.05 for 5%).
|
|
463
|
-
time: The time period in years.
|
|
464
|
-
compound_frequency: Number of times interest is compounded per year.
|
|
465
|
-
Defaults to 1 (annually).
|
|
466
|
-
|
|
467
|
-
Returns:
|
|
468
|
-
The final amount after compound interest.
|
|
469
|
-
|
|
470
|
-
Raises:
|
|
471
|
-
ValueError: If any of the input values are negative.
|
|
472
|
-
|
|
473
|
-
Example:
|
|
474
|
-
>>> calculate_compound_interest(1000, 0.05, 2, 4)
|
|
475
|
-
1104.89
|
|
476
|
-
|
|
477
|
-
Note:
|
|
478
|
-
The formula used is: A = P(1 + r/n)^(nt)
|
|
479
|
-
where A is the amount, P is principal, r is rate,
|
|
480
|
-
n is compound frequency, and t is time.
|
|
481
|
-
"""
|
|
482
|
-
if principal < 0 or rate < 0 or time < 0 or compound_frequency <= 0:
|
|
483
|
-
raise ValueError("All values must be non-negative, compound_frequency must be positive")
|
|
484
|
-
|
|
485
|
-
return principal * (1 + rate / compound_frequency) ** (compound_frequency * time)
|
|
486
|
-
|
|
487
|
-
class UserService:
|
|
488
|
-
"""Service class for user-related operations.
|
|
489
|
-
|
|
490
|
-
This class provides methods for creating, updating, and managing
|
|
491
|
-
user accounts in the system.
|
|
492
|
-
|
|
493
|
-
Attributes:
|
|
494
|
-
repository: The user repository for data access.
|
|
495
|
-
email_service: Service for sending emails.
|
|
496
|
-
|
|
497
|
-
Example:
|
|
498
|
-
>>> service = UserService(user_repo, email_service)
|
|
499
|
-
>>> user = service.create_user("john", "john@example.com")
|
|
500
|
-
"""
|
|
501
|
-
|
|
502
|
-
def __init__(self, repository: UserRepository, email_service: EmailService) -> None:
|
|
503
|
-
"""Initialize the user service.
|
|
504
|
-
|
|
505
|
-
Args:
|
|
506
|
-
repository: Repository for user data operations.
|
|
507
|
-
email_service: Service for sending emails to users.
|
|
508
|
-
"""
|
|
509
|
-
self.repository = repository
|
|
510
|
-
self.email_service = email_service
|
|
511
|
-
|
|
512
|
-
def create_user(self, username: str, email: str) -> User:
|
|
513
|
-
"""Create a new user account.
|
|
514
|
-
|
|
515
|
-
Args:
|
|
516
|
-
username: Unique username for the account.
|
|
517
|
-
email: User's email address.
|
|
518
|
-
|
|
519
|
-
Returns:
|
|
520
|
-
The created user object.
|
|
521
|
-
|
|
522
|
-
Raises:
|
|
523
|
-
ValidationError: If username or email is invalid.
|
|
524
|
-
DuplicateError: If username or email already exists.
|
|
525
|
-
"""
|
|
526
|
-
# Implementation here
|
|
527
|
-
pass
|
|
528
|
-
|
|
529
|
-
# ❌ Bad: Poor or missing docstrings
|
|
530
|
-
def calc(p, r, t):
|
|
531
|
-
# Calculate something
|
|
532
|
-
return p * r * t
|
|
533
|
-
|
|
534
|
-
class User:
|
|
535
|
-
def __init__(self, name):
|
|
536
|
-
self.name = name
|
|
537
|
-
|
|
538
|
-
def save(self):
|
|
539
|
-
pass # No documentation
|
|
540
|
-
```
|
|
541
|
-
|
|
542
|
-
## Testing and Code Quality | 测试和代码质量
|
|
543
|
-
|
|
544
|
-
### 1. Unit Testing with pytest | 使用 pytest 进行单元测试
|
|
545
|
-
|
|
546
|
-
```python
|
|
547
|
-
import pytest
|
|
548
|
-
from unittest.mock import Mock, patch
|
|
549
|
-
from datetime import datetime, timedelta
|
|
550
|
-
|
|
551
|
-
# ✅ Good: Comprehensive test structure
|
|
552
|
-
|
|
553
|
-
class TestUserService:
|
|
554
|
-
"""Test suite for UserService class."""
|
|
555
|
-
|
|
556
|
-
@pytest.fixture
|
|
557
|
-
def mock_repository(self) -> Mock:
|
|
558
|
-
"""Create mock user repository."""
|
|
559
|
-
return Mock(spec=UserRepository)
|
|
560
|
-
|
|
561
|
-
@pytest.fixture
|
|
562
|
-
def mock_email_service(self) -> Mock:
|
|
563
|
-
"""Create mock email service."""
|
|
564
|
-
return Mock(spec=EmailService)
|
|
565
|
-
|
|
566
|
-
@pytest.fixture
|
|
567
|
-
def user_service(self, mock_repository: Mock, mock_email_service: Mock) -> UserService:
|
|
568
|
-
"""Create UserService instance with mocked dependencies."""
|
|
569
|
-
return UserService(mock_repository, mock_email_service)
|
|
570
|
-
|
|
571
|
-
def test_create_user_success(self, user_service: UserService, mock_repository: Mock) -> None:
|
|
572
|
-
"""Test successful user creation."""
|
|
573
|
-
# Arrange
|
|
574
|
-
username = "testuser"
|
|
575
|
-
email = "test@example.com"
|
|
576
|
-
expected_user = User(id=1, username=username, email=email)
|
|
577
|
-
mock_repository.create.return_value = expected_user
|
|
578
|
-
|
|
579
|
-
# Act
|
|
580
|
-
result = user_service.create_user(username, email)
|
|
581
|
-
|
|
582
|
-
# Assert
|
|
583
|
-
assert result == expected_user
|
|
584
|
-
mock_repository.create.assert_called_once_with(username, email)
|
|
585
|
-
|
|
586
|
-
def test_create_user_duplicate_username(
|
|
587
|
-
self,
|
|
588
|
-
user_service: UserService,
|
|
589
|
-
mock_repository: Mock
|
|
590
|
-
) -> None:
|
|
591
|
-
"""Test user creation with duplicate username."""
|
|
592
|
-
# Arrange
|
|
593
|
-
mock_repository.create.side_effect = DuplicateError("Username already exists")
|
|
594
|
-
|
|
595
|
-
# Act & Assert
|
|
596
|
-
with pytest.raises(DuplicateError, match="Username already exists"):
|
|
597
|
-
user_service.create_user("existing_user", "test@example.com")
|
|
598
|
-
|
|
599
|
-
@pytest.mark.parametrize("username,email,expected_error", [
|
|
600
|
-
("", "test@example.com", "Username cannot be empty"),
|
|
601
|
-
("user", "", "Email cannot be empty"),
|
|
602
|
-
("user", "invalid-email", "Invalid email format"),
|
|
603
|
-
])
|
|
604
|
-
def test_create_user_validation_errors(
|
|
605
|
-
self,
|
|
606
|
-
user_service: UserService,
|
|
607
|
-
username: str,
|
|
608
|
-
email: str,
|
|
609
|
-
expected_error: str,
|
|
610
|
-
) -> None:
|
|
611
|
-
"""Test user creation validation errors."""
|
|
612
|
-
with pytest.raises(ValidationError, match=expected_error):
|
|
613
|
-
user_service.create_user(username, email)
|
|
614
|
-
|
|
615
|
-
# ✅ Good: Integration tests
|
|
616
|
-
@pytest.mark.integration
|
|
617
|
-
class TestUserServiceIntegration:
|
|
618
|
-
"""Integration tests for UserService."""
|
|
619
|
-
|
|
620
|
-
@pytest.fixture(scope="class")
|
|
621
|
-
def database(self):
|
|
622
|
-
"""Set up test database."""
|
|
623
|
-
# Database setup code
|
|
624
|
-
yield
|
|
625
|
-
# Database cleanup code
|
|
626
|
-
|
|
627
|
-
def test_user_creation_flow(self, database) -> None:
|
|
628
|
-
"""Test complete user creation flow."""
|
|
629
|
-
# Test with real database
|
|
630
|
-
pass
|
|
631
|
-
|
|
632
|
-
# ✅ Good: Property-based testing
|
|
633
|
-
from hypothesis import given, strategies as st
|
|
634
|
-
|
|
635
|
-
@given(
|
|
636
|
-
principal=st.floats(min_value=0.01, max_value=1000000),
|
|
637
|
-
rate=st.floats(min_value=0.001, max_value=0.2),
|
|
638
|
-
time=st.floats(min_value=0.1, max_value=50),
|
|
639
|
-
)
|
|
640
|
-
def test_compound_interest_properties(principal: float, rate: float, time: float) -> None:
|
|
641
|
-
"""Test compound interest calculation properties."""
|
|
642
|
-
result = calculate_compound_interest(principal, rate, time)
|
|
643
|
-
|
|
644
|
-
# Result should always be greater than principal
|
|
645
|
-
assert result > principal
|
|
646
|
-
|
|
647
|
-
# Result should be finite
|
|
648
|
-
assert math.isfinite(result)
|
|
649
|
-
```
|
|
650
|
-
|
|
651
|
-
### 2. Code Quality Tools Configuration | 代码质量工具配置
|
|
652
|
-
|
|
653
|
-
```python
|
|
654
|
-
# pyproject.toml
|
|
655
|
-
[tool.black]
|
|
656
|
-
line-length = 88
|
|
657
|
-
target-version = ['py312']
|
|
658
|
-
include = '\.pyi?$'
|
|
659
|
-
extend-exclude = '''
|
|
660
|
-
/(
|
|
661
|
-
# directories
|
|
662
|
-
\.eggs
|
|
663
|
-
| \.git
|
|
664
|
-
| \.hg
|
|
665
|
-
| \.mypy_cache
|
|
666
|
-
| \.tox
|
|
667
|
-
| \.venv
|
|
668
|
-
| build
|
|
669
|
-
| dist
|
|
670
|
-
)/
|
|
671
|
-
'''
|
|
672
|
-
|
|
673
|
-
[tool.isort]
|
|
674
|
-
profile = "black"
|
|
675
|
-
multi_line_output = 3
|
|
676
|
-
line_length = 88
|
|
677
|
-
known_first_party = ["myapp"]
|
|
678
|
-
known_third_party = ["fastapi", "pydantic", "sqlalchemy"]
|
|
679
|
-
|
|
680
|
-
[tool.mypy]
|
|
681
|
-
python_version = "3.12"
|
|
682
|
-
warn_return_any = true
|
|
683
|
-
warn_unused_configs = true
|
|
684
|
-
disallow_untyped_defs = true
|
|
685
|
-
disallow_incomplete_defs = true
|
|
686
|
-
check_untyped_defs = true
|
|
687
|
-
disallow_untyped_decorators = true
|
|
688
|
-
no_implicit_optional = true
|
|
689
|
-
warn_redundant_casts = true
|
|
690
|
-
warn_unused_ignores = true
|
|
691
|
-
warn_no_return = true
|
|
692
|
-
warn_unreachable = true
|
|
693
|
-
strict_equality = true
|
|
694
|
-
|
|
695
|
-
[tool.pylint.messages_control]
|
|
696
|
-
disable = [
|
|
697
|
-
"missing-docstring",
|
|
698
|
-
"too-few-public-methods",
|
|
699
|
-
]
|
|
700
|
-
|
|
701
|
-
[tool.pytest.ini_options]
|
|
702
|
-
minversion = "6.0"
|
|
703
|
-
addopts = "-ra -q --strict-markers --strict-config"
|
|
704
|
-
testpaths = ["tests"]
|
|
705
|
-
markers = [
|
|
706
|
-
"slow: marks tests as slow",
|
|
707
|
-
"integration: marks tests as integration tests",
|
|
708
|
-
"unit: marks tests as unit tests",
|
|
709
|
-
]
|
|
710
|
-
|
|
711
|
-
[tool.coverage.run]
|
|
712
|
-
source = ["src"]
|
|
713
|
-
omit = [
|
|
714
|
-
"*/tests/*",
|
|
715
|
-
"*/venv/*",
|
|
716
|
-
"*/__pycache__/*",
|
|
717
|
-
]
|
|
718
|
-
|
|
719
|
-
[tool.coverage.report]
|
|
720
|
-
exclude_lines = [
|
|
721
|
-
"pragma: no cover",
|
|
722
|
-
"def __repr__",
|
|
723
|
-
"raise AssertionError",
|
|
724
|
-
"raise NotImplementedError",
|
|
725
|
-
]
|
|
726
|
-
```
|
|
727
|
-
|
|
728
|
-
## Performance and Best Practices | 性能和最佳实践
|
|
729
|
-
|
|
730
|
-
### 1. Efficient Data Structures | 高效的数据结构
|
|
731
|
-
|
|
732
|
-
```python
|
|
733
|
-
from collections import defaultdict, deque, Counter
|
|
734
|
-
from typing import DefaultDict
|
|
735
|
-
|
|
736
|
-
# ✅ Good: Use appropriate data structures
|
|
737
|
-
|
|
738
|
-
# Use defaultdict to avoid key checks
|
|
739
|
-
def group_users_by_department(users: list[User]) -> DefaultDict[str, list[User]]:
|
|
740
|
-
"""Group users by their department."""
|
|
741
|
-
groups: DefaultDict[str, list[User]] = defaultdict(list)
|
|
742
|
-
for user in users:
|
|
743
|
-
groups[user.department].append(user)
|
|
744
|
-
return groups
|
|
745
|
-
|
|
746
|
-
# Use deque for efficient queue operations
|
|
747
|
-
class TaskQueue:
|
|
748
|
-
"""Efficient task queue using deque."""
|
|
749
|
-
|
|
750
|
-
def __init__(self) -> None:
|
|
751
|
-
self._queue: deque[Task] = deque()
|
|
752
|
-
|
|
753
|
-
def add_task(self, task: Task) -> None:
|
|
754
|
-
"""Add task to the end of queue."""
|
|
755
|
-
self._queue.append(task)
|
|
756
|
-
|
|
757
|
-
def add_priority_task(self, task: Task) -> None:
|
|
758
|
-
"""Add high-priority task to the front."""
|
|
759
|
-
self._queue.appendleft(task)
|
|
760
|
-
|
|
761
|
-
def get_next_task(self) -> Task | None:
|
|
762
|
-
"""Get next task from queue."""
|
|
763
|
-
try:
|
|
764
|
-
return self._queue.popleft()
|
|
765
|
-
except IndexError:
|
|
766
|
-
return None
|
|
767
|
-
|
|
768
|
-
# Use Counter for counting operations
|
|
769
|
-
def analyze_text(text: str) -> dict[str, int]:
|
|
770
|
-
"""Analyze word frequency in text."""
|
|
771
|
-
words = text.lower().split()
|
|
772
|
-
return dict(Counter(words))
|
|
773
|
-
|
|
774
|
-
# ❌ Bad: Inefficient data structure usage
|
|
775
|
-
def group_users_bad(users):
|
|
776
|
-
groups = {}
|
|
777
|
-
for user in users:
|
|
778
|
-
if user.department not in groups: # Unnecessary key check
|
|
779
|
-
groups[user.department] = []
|
|
780
|
-
groups[user.department].append(user)
|
|
781
|
-
return groups
|
|
782
|
-
```
|
|
783
|
-
|
|
784
|
-
### 2. Generator Functions and Memory Efficiency | 生成器函数和内存效率
|
|
785
|
-
|
|
786
|
-
```python
|
|
787
|
-
# ✅ Good: Use generators for memory efficiency
|
|
788
|
-
|
|
789
|
-
def read_large_file(filename: str) -> Generator[str, None, None]:
|
|
790
|
-
"""Read large file line by line using generator."""
|
|
791
|
-
with open(filename, 'r', encoding='utf-8') as file:
|
|
792
|
-
for line in file:
|
|
793
|
-
yield line.strip()
|
|
794
|
-
|
|
795
|
-
def process_users_batch(users: list[User], batch_size: int = 100) -> Generator[list[User], None, None]:
|
|
796
|
-
"""Process users in batches to manage memory."""
|
|
797
|
-
for i in range(0, len(users), batch_size):
|
|
798
|
-
yield users[i:i + batch_size]
|
|
799
|
-
|
|
800
|
-
def fibonacci_sequence(n: int) -> Generator[int, None, None]:
|
|
801
|
-
"""Generate Fibonacci sequence up to n numbers."""
|
|
802
|
-
a, b = 0, 1
|
|
803
|
-
for _ in range(n):
|
|
804
|
-
yield a
|
|
805
|
-
a, b = b, a + b
|
|
806
|
-
|
|
807
|
-
# Usage
|
|
808
|
-
for batch in process_users_batch(all_users, batch_size=50):
|
|
809
|
-
process_batch(batch)
|
|
810
|
-
|
|
811
|
-
# ✅ Good: List comprehensions vs generator expressions
|
|
812
|
-
# Use list comprehension when you need the full list
|
|
813
|
-
squared_numbers = [x**2 for x in range(10)]
|
|
814
|
-
|
|
815
|
-
# Use generator expression for memory efficiency
|
|
816
|
-
sum_of_squares = sum(x**2 for x in range(1000000)) # Memory efficient
|
|
817
|
-
|
|
818
|
-
# ❌ Bad: Loading everything into memory
|
|
819
|
-
def read_large_file_bad(filename):
|
|
820
|
-
with open(filename, 'r') as file:
|
|
821
|
-
return file.readlines() # Loads entire file into memory
|
|
822
|
-
```
|
|
823
|
-
|
|
824
|
-
## Code Quality Checklist | 代码质量检查清单
|
|
825
|
-
|
|
826
|
-
- [ ] All functions and classes have proper type hints
|
|
827
|
-
- [ ] Code follows PEP 8 naming conventions
|
|
828
|
-
- [ ] Line length is kept under 88 characters
|
|
829
|
-
- [ ] Imports are properly organized (stdlib, third-party, local)
|
|
830
|
-
- [ ] Docstrings follow Google or NumPy style
|
|
831
|
-
- [ ] Error handling is comprehensive with custom exceptions
|
|
832
|
-
- [ ] Unit tests cover all critical functionality
|
|
833
|
-
- [ ] Code is formatted with Black and isort
|
|
834
|
-
- [ ] Type checking passes with mypy
|
|
835
|
-
- [ ] No unused imports or variables
|
|
836
|
-
- [ ] Appropriate data structures are used for performance
|
|
837
|
-
- [ ] Memory efficiency is considered for large data processing
|
|
838
|
-
|
|
839
|
-
## 代码质量检查清单
|
|
840
|
-
|
|
841
|
-
- [ ] 所有函数和类都有适当的类型提示
|
|
842
|
-
- [ ] 代码遵循 PEP 8 命名约定
|
|
843
|
-
- [ ] 行长度保持在 88 个字符以下
|
|
844
|
-
- [ ] 导入正确组织(标准库、第三方、本地)
|
|
845
|
-
- [ ] 文档字符串遵循 Google 或 NumPy 风格
|
|
846
|
-
- [ ] 使用自定义异常进行全面的错误处理
|
|
847
|
-
- [ ] 单元测试覆盖所有关键功能
|
|
848
|
-
- [ ] 代码使用 Black 和 isort 格式化
|
|
849
|
-
- [ ] 使用 mypy 通过类型检查
|
|
850
|
-
- [ ] 没有未使用的导入或变量
|
|
851
|
-
- [ ] 使用适当的数据结构以提高性能
|
|
852
|
-
- [ ] 考虑大数据处理的内存效率
|