Loading...
Loading...
Compare original and translation side by side
typeinterfaceLoggertypeinterfaceLoggerassets/check-reply.pyassets/claude-settings.jsonreferences/workflow.mdreferences/workflow.mdsrc/test-helpers/**assets/check-reply.pyassets/claude-settings.jsonreferences/workflow.mdreferences/workflow.mdsrc/test-helpers/**references/behavioural-examples.mdBun.filecrypto.subtlefetchURLpackage.jsonResultreferences/complexity.md.claude/PLAN.md.claude/LESSONS.mdreferences/workflow.mdpackage.jsonreferences/behavioural-examples.mdBun.filecrypto.subtlefetchURLpackage.jsonResultreferences/complexity.md.claude/PLAN.md.claude/LESSONS.mdreferences/workflow.mdpackage.json.claude/LESSONS.md.claude/lessons.local.md.claude/PLAN.md[mistake][decision][gotcha][decision]references/lessons.md.claude/LESSONS.md.claude/lessons.local.md.claude/PLAN.md[mistake][decision][gotcha][decision]references/lessons.mdclassno-restricted-syntaxClassDeclarationClassExpressionreferences/design-patterns.mdfunctionexport const fn = (...) => {...}func-style: expressioninterfacetype Foo = {...}consistent-type-definitions: typeconsole.*Loggerscripts/**src/lib/utils/logger.tsno-consoleSystemPrintlnNoPrintStackTracereferences/bun-typescript.mdnpmpnpmyarnnodevitebun installbun runbunxbun run src/main.tscheck-package-json.shscriptsreferences/workflow.mdexplicit-function-return-typeimport type { Foo } from './foo';typeno-restricted-syntaxImportSpecifier[importKind="type"]lf"type": "module"requiremodule.exportsErrorunknown.messagestringreferences/security.mdmockbun:testmock()mock.module()spyOnjestvino-restricted-imports.toHaveBeenCalled*no-restricted-syntaxmock.moduleXApiglobalThis.fetchinstallFetchMockreferences/testing-infra.mdreferences/testing.md// eslint-disable*// @ts-ignore// @ts-expect-errorlinterOptions.noInlineConfigban-ts-comment@ts-no-warning-commentscheck-no-suppressions.shNoSuppressWarningsNOPMDreferences/workflow.mdResult<T, E>Promise<Result<T, PortError>>Promise<Result<Summary, StepError>>main.tsreferences/result-type.mdtry/catchsrc/infra/**Resultsrc/main.tssrc/use-cases/**src/test-helpers/**no-restricted-syntaxTryStatementsrc/use-cases/**references/result-type.mdcreateX = (deps) => (input) => ...no-restricted-syntaxcreate[A-Z]references/clean-code.md"latest""*"package.jsonbun addbun updatereferences/workflow.mdBun.fileBun.writesrc/**node:fssrc/test-helpers/**node:pathno-restricted-syntaxfssrc/**src/test-helpers/**src/infra/**src/infra/**domainuse-casesLayerRulesTestjava.nio.filejava.iodomainusecasesreferences/bun-typescript.mdsrc/components/{atoms,molecules,organisms}next/*ComponentTypereferences/atomic-design.mdsrc/components/**app/globals.cssclassNamereferences/atomic-design.mdtype(scope)!: subjectcommit-msg--no-verifyreferences/workflow.md*.test.tssrc/test-helpers/**src/test/java/**references/workflow.mdreferences/workflow.md.mailmapcheck-identity.sh--all.github/visibilityprivatereferences/workflow.mdreferences/privacy.mdreferences/isolation.mdretryOnErrreferences/reliability.mddeletedAtreferences/reliability.mdreferences/privacy.mdreferences/reliability.mdevals/<capability>/cases.json--min-scoreevalsreferences/ai.mdreferences/security.mdreferences/delivery.mdreferences/privacy.mdcomplexity: ['error', 10]CyclomaticComplexity&&??switchreferences/workflow.mdbun test --randomizeMethodOrderer$RandomClassOrderer$Randomjunit-platform.properties--seed=<n>-Djunit.jupiter.execution.order.random.seedreferences/testing.mddomain/src/use-cases/domain/ports/infra/domain/presenter/domain/composition/src/test-helpers/**no-restricted-importseslint.config.jseslint.config.mjsLayerRulesTestmvn testreferences/architecture.mdreferences/java-quarkus.mdmaingit init -b mainmainmainmainmainmaincheck-commit-range.shbranches.ymlcheck-branches.shmainmaincheck-host.py--applyreferences/workflow.mdclassno-restricted-syntaxClassDeclarationClassExpressionreferences/design-patterns.mdexport const fn = (...) => {...}func-style: expressioninterfacetype Foo = {...}consistent-type-definitions: typeconsole.*Loggerscripts/**src/lib/utils/logger.tsno-consoleSystemPrintlnNoPrintStackTracereferences/bun-typescript.mdnpmpnpmyarnnodevitebun installbun runbunxbun run src/main.tscheck-package-json.shscriptsreferences/workflow.mdexplicit-function-return-typeimport type { Foo } from './foo';typeno-restricted-syntaxImportSpecifier[importKind="type"]lf"type": "module"requiremodule.exportsError.messageunknownreferences/security.mdstringreferences/security.mdbun:testmockmock()mock.module()spyOnjestvino-restricted-imports.toHaveBeenCalled*no-restricted-syntaxmock.moduleXApiglobalThis.fetchinstallFetchMockreferences/testing-infra.mdreferences/testing.md// eslint-disable*// @ts-ignore// @ts-expect-errorlinterOptions.noInlineConfigban-ts-comment@ts-no-warning-commentscheck-no-suppressions.shNoSuppressWarningsNOPMDreferences/workflow.mdResult<T, E>Promise<Result<T, PortError>>Promise<Result<Summary, StepError>>main.tsreferences/result-type.mdtry/catchsrc/infra/**Resultsrc/main.tssrc/use-cases/**src/test-helpers/**no-restricted-syntaxsrc/use-cases/**TryStatementreferences/result-type.mdcreateX = (deps) => (input) => ...no-restricted-syntaxcreate[A-Z]references/clean-code.mdpackage.json"latest""*"bun addbun updatereferences/workflow.mdsrc/**Bun.fileBun.writenode:fssrc/test-helpers/**node:pathno-restricted-syntaxsrc/**src/test-helpers/**src/infra/**fssrc/infra/**domainuse-casesLayerRulesTestdomainusecasesjava.nio.filejava.ioreferences/bun-typescript.mdsrc/components/{atoms,molecules,organisms}next/*ComponentTypereferences/atomic-design.mdsrc/components/**app/globals.cssclassNamereferences/atomic-design.mdtype(scope)!: subjectcommit-msg--no-verifyreferences/workflow.md*.test.tssrc/test-helpers/**src/test/java/**references/workflow.mdreferences/workflow.md.mailmapcheck-identity.sh--allprivate.github/visibilityreferences/workflow.mdreferences/privacy.mdreferences/isolation.mdretryOnErrreferences/reliability.mddeletedAtreferences/reliability.mdreferences/privacy.mdreferences/reliability.mdevals/<capability>/cases.json--min-scoreevalsreferences/ai.mdreferences/security.mdreferences/delivery.mdreferences/privacy.mdcomplexity: ['error', 10]CyclomaticComplexity&&??switchreferences/workflow.mdbun test --randomizejunit-platform.propertiesMethodOrderer$RandomClassOrderer$Random--seed=<n>-Djunit.jupiter.execution.order.random.seedreferences/testing.mddomain/src/use-cases/domain/ports/infra/domain/presenter/domain/composition/src/test-helpers/**eslint.config.jsno-restricted-importseslint.config.mjsmvn testLayerRulesTestreferences/architecture.mdreferences/java-quarkus.mdmaingit init -b mainmainmainmainmainmaincheck-commit-range.shbranches.ymlmainmaincheck-branches.shcheck-host.py--applyreferences/workflow.mdbun run testsrc/lib/**src/config/**references/testing.mdbun run testsrc/lib/**src/config/**references/testing.mdif/elsereferences/solid-principles.mddatainfomanagerhandlerprocessorutilselseObject.hasOwninreferences/clean-code.mdparseX(raw)Resultx(value)assets/java/Email.javaSafeUrlSanitizedHtmlEnvVarSafePathreferences/clean-code.mdreferences/object-design.mdreferences/security.mdreferences/design-patterns.mdreferences/object-design.mdreferences/complexity.mdreferences/code-smells.mdreferences/architecture.mdsrc/components/**src/page/src/lib/hooks/src/config/src/lib/layout/wrappers.tsxnext/linknext/imagereferences/atomic-design.mdprocess.envprocess.envNEXT_PUBLIC_*references/security.mdif/elsereferences/solid-principles.mddatainfomanagerhandlerprocessorutilselseObject.hasOwninreferences/clean-code.mdparseX(raw)Resultx(value)assets/java/Email.javaSafeUrlSanitizedHtmlEnvVarSafePathreferences/clean-code.mdreferences/object-design.mdreferences/security.mdreferences/design-patterns.mdreferences/object-design.mdreferences/complexity.mdreferences/code-smells.mdreferences/architecture.mdsrc/components/**src/page/src/lib/hooks/src/config/src/lib/layout/wrappers.tsxnext/linknext/imagereferences/atomic-design.mdprocess.envprocess.envNEXT_PUBLIC_*references/security.mdreferences/privacy.mdreferences/isolation.mdreferences/reliability.mdreferences/observability.mdreferences/delivery.mdreferences/metrics.mdreferences/ai.mdreferences/governance.mdreferences/product.mdassets/check-pii-channels.shcheck-io-deadlines.shcheck-data-lifecycle.shcheck-isolation-tests.shreferences/workflow.mdreferences/privacy.mdreferences/isolation.mdreferences/reliability.mdreferences/observability.mdreferences/delivery.mdreferences/metrics.mdreferences/ai.mdreferences/governance.mdreferences/product.mdassets/check-pii-channels.shcheck-io-deadlines.shcheck-data-lifecycle.shcheck-isolation-tests.shreferences/workflow.mdreferences/nextjs-monorepo.mdreferences/atomic-design.mdpackages/*next.config.tsapp/(en)/tailwindcssoutput: 'export'output: 'export'app/**/route.tsreferences/nextjs-monorepo.mdreferences/bun-typescript.mdsrc/main.ts"module": "src/main.ts"src/{domain,use-cases,infra,presenter,composition,test-helpers}references/java-quarkus.mdpom.xmlsrc/main/java/**./mvnwreferences/nextjs-monorepo.mdreferences/atomic-design.mdpackages/*next.config.tsapp/(en)/tailwindcssoutput: 'export'output: 'export'app/**/route.tsreferences/nextjs-monorepo.mdreferences/bun-typescript.mdsrc/main.ts"module": "src/main.ts"src/{domain,use-cases,infra,presenter,composition,test-helpers}references/java-quarkus.mdpom.xmlsrc/main/java/**./mvnw| Concern | Bun script repo | Next.js monorepo | Java (Quarkus) |
|---|---|---|---|
| TDD + test runner | Everything (rule 11, full loop), | | Everything; JUnit 5, unit ring container-free, |
| Coverage tiers | Yes: | No | Yes: JaCoCo per-package rules, 100 on |
| Mutation testing | Stryker, CI-enforced ( | No | PIT: |
| Pre-commit | Fast-gate | | Fast shell hook |
| Commit message (rule 23) | | | Same shipped |
| Logger | | Client/static: sanctioned singleton | Constructor-injected JBoss/SLF4J, JSON output, redaction filter; never |
| Every IO port | Static: | Sealed |
| Mock ban (rule 13) | | Same rules, in the skeleton config and repeated in every zone | Enforcer |
| Rules 21–22 (design system, styling seal) | n/a (no UI) | Mandatory, lint-enforced (design-system ESLint block) | n/a (no UI) |
| Rules 27–34 (production disciplines) | Apply when the concern exists; | The same wrapper third in the | The same wrapper as hook gate 6 and a |
| Complexity cap (rule 35) | ESLint | The same rule in | PMD |
| Random test order (rule 36) | | The same script per package | |
| No inline ignores (rule 15) | | The same three in | |
| Style bans (rules 1, 7, 10, 17, 18, 20) | | | n/a for 7 and 18 (TypeScript bindings); 1 and 10 translate to records, sealed types and |
| Layer zones (rule 37) | | | |
| Identity (rule 26: blocks in a public repository, warns in a private one) | | The same script second in the | The same script as hook gate 5 and a |
| Reply gate (Interaction) | | The same pair at the repo root | The same pair |
| Branch lifecycle (rule 38) | | The same, | The same, |
| 关注点 | Bun 脚本仓库 | Next.js monorepo | Java(Quarkus) |
|---|---|---|---|
| TDD 和 test runner | 全部适用(规则 11,完整循环), | | 全部适用;JUnit 5,unit ring 不带 container,仅 integration ring 使用 |
| Coverage tiers | 适用: | 不适用 | 适用:JaCoCo 按 package 设置规则, |
| Mutation testing | Stryker,由 CI 强制执行,每次 PR 和 push 都运行 | 不适用 | PIT:每个 class 的 |
| Pre-commit | 快速 gate | | 快速 shell hook |
| Commit message(规则 23) | | | 使用相同的随附 |
| Logger | | Client/static: 唯一获准的单例 | Constructor 注入 JBoss/SLF4J,JSON 输出,redaction filter;绝不使用 |
| 每个 IO port | Static: | 每个 IO port 使用 sealed |
| Mock ban(规则 13) | | 在 skeleton config 和每个 zone 中重复使用相同规则 | Enforcer |
| 规则 21 至 22(design system、样式封装) | 不适用(无 UI) | 强制执行并由 lint 保证(design-system ESLint block) | 不适用(无 UI) |
| 规则 27 至 34(生产纪律) | 存在相应关注点时适用; | 相同 wrapper 在 | 相同 wrapper 作为 hook gate 6,并由 |
| Complexity cap(规则 35) | | | PMD |
| Random test order(规则 36) | | 每个 package 使用相同 script | 在 |
| No inline ignores(规则 15) | | | |
| Style bans(规则 1、7、10、17、18、20) | | | 规则 7 和 18 不适用(TypeScript bindings);规则 1 和 10 转换为 records、sealed types 和 |
| Layer zones(规则 37) | | | |
| Identity(规则 26:公开仓库阻止,私有仓库警告) | | 相同 script 在 | 相同 script 作为 hook gate 5,并由 |
| Reply gate(Interaction) | | 相同文件对位于 repo 根目录 | 相同文件对 |
| Branch lifecycle(规则 38) | | 相同规则,由执行 range gate 的 | 相同规则,由执行 range gate 的 |
docs/global-rules/| Reference | Read when | Skip when |
|---|---|---|
| | Next.js or Java repo |
| | no |
| touching | no React |
| | no Java sources |
| a new directory under | the change stays inside one module |
| any | never (rule 11 puts a test in every feature diff) |
| adding or testing a | no infra file touched |
| a new port, use-case, | a pure function with no IO |
| input reaches SQL, shell, filesystem, HTTP, HTML, or a redirect; env or secrets read; an auth surface; rules 12, 33 | no external input, no sink |
| a function over 10 lines, a module over 50, a file over 100 after the change; naming a module; rule 18 | under the numbers |
| a new value object, entity, aggregate, or dispatch over kinds; a SOLID question | no new domain type |
| a SOLID question the object-design summary does not settle | otherwise |
| reaching for a GoF pattern or translating a | no class in sight |
| review flags a smell; a refactor spans more than one module | greenfield code |
| tempted to add an abstraction, dependency, or config knob (guideline 2) | a one-line change |
| a guideline 1-5 call is unclear | otherwise |
| touching hooks, CI, coverage, mutation, or lint config; suppressing a warning (15); commit size or message; creating, landing or deleting a branch; rules 5, 19, 23-26, 35, 38; the confirmation gates | an inner-loop edit with the gates green |
| the first session in a repo; proposing entries at wrap-up | otherwise |
| the diff holds a name, email, phone, free-text field, log line, or query string; rules 27, 34 | no personal data |
| any query or route scoped by user, tenant, or org; rule 28 | a single-user CLI |
| a fetch, SDK, or driver call; a retry; a migration; a delete; a mutable shared record; rules 29-31 | no IO, no schema |
| a new service, route, or job reaches production; adding a log, metric, or alert | a throwaway script |
| delivery or flow metrics, cost dashboards | otherwise |
| touching | an inner-loop code change |
| an ADR, CODEOWNERS, README claims, API docs, a vendored-standard re-sync | otherwise |
| an LLM SDK import, prompt, model name, or eval; rule 32 | no model call |
| user-facing copy, an error state, a form, accessibility; a new feature's go/no-go | backend only |
docs/global-rules/| Reference | 何时读取 | 何时跳过 |
|---|---|---|
| 存在 | Next.js 或 Java repo |
| 存在 | 任何 |
| 涉及 | 没有 React |
| 存在 | 没有 Java 源码 |
| 在 | 变更始终位于单个模块内部 |
| diff 中存在任何 | 永不跳过,因为规则 11 要求每个功能 diff 都包含测试 |
| 新增或测试 | 未涉及 infra 文件 |
| 新增 port、use case、 | 不含 IO 的纯函数 |
| 输入进入 SQL、shell、filesystem、HTTP、HTML 或 redirect;读取 env 或 secrets;涉及 auth surface;规则 12、33 | 没有外部输入,也没有 sink |
| 变更后函数超过 10 行、模块超过 50 行、文件超过 100 行;为模块命名;规则 18 | 低于对应限制 |
| 新增 value object、entity、aggregate,或对多种 kind 进行 dispatch;存在 SOLID 问题 | 没有新增 domain type |
| 存在 object-design summary 无法解决的 SOLID 问题 | 其他情况 |
| 准备使用 GoF pattern,或转换一个 class(规则 1) | 不涉及 class |
| review 标记了 smell;或重构跨越多个模块 | 全新代码 |
| 准备添加 abstraction、dependency 或 config knob(准则 2) | 只有一行变更 |
| 准则 1 至 5 的含义不明确 | 其他情况 |
| 涉及 hooks、CI、coverage、mutation 或 lint config;抑制 warning(规则 15);commit 大小或 message;创建、落地或删除 branch;规则 5、19、23 至 26、35、38;confirmation gates | 内部循环中的普通编辑且相关 gates 均已通过 |
| 在 repo 中的首次会话;收尾时提出记录 | 其他情况 |
| diff 中包含 name、email、phone、free-text field、log line 或 query string;规则 27、34 | 没有个人数据 |
| 任何由 user、tenant 或 org 限制范围的 query 或 route;规则 28 | 单用户 CLI |
| fetch、SDK 或 driver call;retry;migration;delete;mutable shared record;规则 29 至 31 | 没有 IO,也没有 schema 变更 |
| 新 service、route 或 job 进入生产环境;添加 log、metric 或 alert | 一次性脚本 |
| 涉及 delivery 或 flow metrics、cost dashboard | 其他情况 |
| 涉及 | 内部循环中的代码变更 |
| 涉及 ADR、CODEOWNERS、README claims、API docs、vendored-standard re-sync | 其他情况 |
| 导入 LLM SDK、prompt、model name,或涉及 eval;规则 32 | 没有 model call |
| 面向用户的文案、错误状态、表单、accessibility;新功能的 go/no-go | 仅涉及 backend |
.claude/LESSONS.md.claude/lessons.local.md.claude/PLAN.md.claude/PLAN.md*.test.tsmainmainland.ymlreferences/workflow.mdCLAUDE.mdassets/claude-md-pointer.md.claude/PLAN.md[mistake][decision][gotcha]references/lessons.md.claude/LESSONS.md.claude/lessons.local.md.claude/PLAN.md.claude/PLAN.md*.test.tsmainmainland.ymlreferences/workflow.mdCLAUDE.mdassets/claude-md-pointer.md.claude/PLAN.md[mistake][decision][gotcha]references/lessons.mdreferences/product.mdbun run testbun run lintbun run typecheckbun run coveragesrc/domain/**src/use-cases/**compositioninfrapresentermutate:changedbun run mutate:changedResult<T, PortError>Result<Summary, StepError>--min-scoresrc/infra/src/composition/src/presenter/scripts/coverage-preload.tsreferences/workflow.mdreferences/product.mdbun run testbun run lintbun run typecheckbun run coveragesrc/domain/**src/use-cases/**compositioninfrapresentermutate:changedbun run mutate:changedResult<T, PortError>Result<Summary, StepError>--min-scoresrc/infra/src/composition/src/presenter/scripts/coverage-preload.tspackage.jsonreferences/workflow.mdprocess.envreferences/workflow.mdprocess.envreferences/workflow.md