↑ ↓ 移动 · Enter 打开 · Esc 关闭点按一个结果

← 从哪里开始
新项目 · /init-project

从空目录到绿色构建。

/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 也不重新实现流程,而是照着执行。

  1. skillinit-project

    访谈你,然后把每个回答交给智能体。结束时填写创世记录,并串联 git-publish。

  2. agentproject-initializer

    在隔离的上下文中运行,工具受限,使用 sonnet 和高强度推理,不提任何问题。

  3. skillproject-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>