从空目录到绿色构建。
/init-project 把 Nerviz 克隆旁边的一个新目录变成 Spring Boot 项目:架构已声明,边界可执行,构建为绿色,且没有业务代码。第一个功能来自 /new-feature。
在克隆旁边,自带 .claude/
会话运行在仓库的一份副本里:一个克隆,或是插件的 /nerviz:new-project 在没有克隆时取回的目录树。项目生成在它旁边,路径为 ../<artifactId>。/init-project、project-bootstrap 和蓝图目录留在副本里;项目只收到自己的 .claude/,由 ArchHook.java export 写入,而它拒绝写入克隆本身。
- Claude Code 在写入会话启动目录之外的位置前会先询问。要一次性批准生成,请先运行
mkdir ../my-api和/add-dir ../my-api。空目录可以通过。 - 开发在生成项目中新开的会话里进行:只有它会加载项目的
settings.json和 hook。
# with the plugin, no clone: in the directory that will hold the projects claude plugin marketplace add nerviz-ai/marketplace claude plugin install nerviz@nerviz cd ~/dev && claude › /nerviz:new-project # or with a clone git clone --depth 1 https://github.com/nerviz-ai/nerviz # approve the generation once, before /init-project mkdir ../my-api › /add-dir ../my-api
只问命令行没说的
整个访谈在主会话中完成,先于任何委派:蓝图、构建工具、功能、坐标、TLS 和 Sonar,每次调用最多四个问题。--blueprint、--groupId、--name 或 --bounded-context 已经给出的内容不会再问。功能只在蓝图将其设为 false 时才询问:hexagonal 已经启用 REST、JPA 加 Flyway、OpenAPI、Testcontainers 和 Actuator,所以它唯一的问题是是否加入 Kafka。限界上下文(bounded context)是单独的一问,默认取 artifactId:它是每个 Kafka 主题名的第一段。
› /arch-doctor › /init-project --blueprint hexagonal --build maven --name my-api
一个 skill、一个智能体、一套流程
init-project 是手动触发的流程:模型绝不会自己触发它。它不亲自干活,而是委派;project-initializer 也不重新实现流程,而是照着执行。
- skill
init-project访谈你,然后把每个回答交给智能体。结束时填写创世记录,并串联
git-publish。 - agent
project-initializer在隔离的上下文中运行,工具受限,使用
sonnet和高强度推理,不提任何问题。 - skill
project-bootstrap逐步的流程。智能体照它执行,而不是重新实现它。
- 基础项目在运行时来自
start.spring.io。版本号绝不凭记忆写入。 - 它按模块或按包重组结构,然后写入 Checkstyle、
lombok.config、logback-spring.xml、Dockerfile 和 compose 文件、边界映射.claude/forbidden-imports.txt、根目录的CLAUDE.md以及 CI 工作流。 - 它用一条命令写入项目的
.claude/,即ArchHook.java export,由extensions.json中的清单驱动。传输安全和 SonarQube 是被串联的 skill,transport-security-setup和sonarqube-setup;它们的问题属于访谈的一部分。 - 验证是唯一的质量关卡:
clean verify,然后是边界测试、lombok.config测试和自治测试。构建为红色时,先修复再出报告。
格式固定的报告
构建通过后,/init-project 把本次运行的记录填入 GENESIS.md,然后才串联 git-publish。后者会问两次:一次是运行 git init 并做第一次提交,一次是创建 GitHub 仓库并推送。没有这两道关卡,什么都不会被提交或推送。
# excerpt of the example report in docs/en/02-init-project.md, a fictional project ✅ Project pedidos-api created — blueprint hexagonal Modules: domain → depends on [] application → depends on [domain] adapters/adapter-in-rest → depends on [application, domain] adapters/adapter-out-persistence → depends on [application, domain] bootstrap → depends on [*] # … Business code: none — by design. 9 package-info.java written Boundaries: 9 rules in .claude/forbidden-imports.txt — blocking verified ✓ # … Build: PASSED # … Next steps: 1. /use-case-design <first-use-case-name>
取自 nerviz 文档中示例报告的节选,是一个虚构项目。名称、版本和数量仅作示意。
在项目内新开一个会话
生成的项目是自包含的:克隆它的人不需要在机器上装 Nerviz。创建类 skill、project-initializer 智能体和蓝图目录被有意留在外面,而当前蓝图会随项目一起带走,这样 /arch-adopt 下次升级时才能解析它。
settings.json只在会话启动时读取一次。在克隆里打开的会话运行的是克隆的 hook,不是项目的:看起来一切正常,实际什么都没有被强制执行。- 接受第一道
git-publish关卡:测试 hook 使用git diff HEAD,在没有任何提交的仓库中,它会不运行任何测试就退出。
# a new session, inside the generated project cd ../my-api claude › /new-feature <what the first use case should do>
- 对应的 skill
它的契约、写入领地,以及 guard 如何处理它。
init-project · skill 页面 → - 完整文档
在 nerviz 仓库中。 (英文)
02-init-project.md →