@nebula-skills/nebula-code-standards 0.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/README.md ADDED
@@ -0,0 +1,45 @@
1
+ # @nebula-skills/nebula-code-standards
2
+
3
+ Nebula 企业级框架代码规范 skill。安装后会自动落到本机所有受支持的工具目录:
4
+
5
+ - `~/.claude/skills/nebula-code-standards/`
6
+ - `~/.cursor/skills/nebula-code-standards/`
7
+ - `~/.codex/skills/nebula-code-standards/`
8
+
9
+ ## 安装
10
+
11
+ ```bash
12
+ # 装最新版
13
+ npm install -g @nebula-skills/nebula-code-standards
14
+
15
+ # 显式装 latest
16
+ npm install -g @nebula-skills/nebula-code-standards@latest
17
+
18
+ # 装指定版本
19
+ npm install -g @nebula-skills/nebula-code-standards@0.1.0
20
+ ```
21
+
22
+ `postinstall` 会自动把 skill 内容拷到本机检测到的工具目录。
23
+
24
+ ## 兜底命令(postinstall 没生效时)
25
+
26
+ ```bash
27
+ # 重装到所有检测到的目标
28
+ npx nebula-skill-standards install
29
+
30
+ # 限定目标工具
31
+ npx nebula-skill-standards install --targets claude,cursor
32
+
33
+ # 内部开发:symlink 模式,npm 包内 md 改了立刻生效
34
+ npx nebula-skill-standards install --mode symlink
35
+
36
+ # 卸载
37
+ npx nebula-skill-standards uninstall
38
+
39
+ # 状态
40
+ npx nebula-skill-standards status
41
+ ```
42
+
43
+ ## 内容
44
+
45
+ 参考 [`skill/SKILL.md`](skill/SKILL.md)。
package/bin/cli.cjs ADDED
@@ -0,0 +1,50 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+
4
+ const path = require("node:path");
5
+
6
+ const SKILL_NAME = "nebula-code-standards";
7
+ const SKILL_DIR = path.join(__dirname, "..", "skill");
8
+
9
+ process.env.NEBULA_SKILL_DEFAULT_NAME = SKILL_NAME;
10
+ process.env.NEBULA_SKILL_DEFAULT_DIR = SKILL_DIR;
11
+
12
+ const argv = process.argv.slice(2);
13
+ const sub = argv[0];
14
+
15
+ if (!sub || sub === "help" || sub === "--help" || sub === "-h") {
16
+ console.log(`Usage: nebula-skill-standards <command> [options]
17
+
18
+ Commands:
19
+ install Install this skill into ~/.claude /~/.cursor /~/.codex (detected ones).
20
+ [--mode copy|symlink] copy (default) or symlink (dev mode).
21
+ [--targets claude,cursor,codex] Restrict to specific tools.
22
+ uninstall Remove this skill from tool directories.
23
+ status Show where this skill is currently installed.
24
+ list List all skills installed across detected tools.
25
+
26
+ Equivalent to:
27
+ nebula-skill <command> ${SKILL_NAME} --dir ${SKILL_DIR} [options]
28
+ `);
29
+ process.exit(0);
30
+ }
31
+
32
+ const allowed = new Set(["install", "uninstall", "status", "list"]);
33
+ if (!allowed.has(sub)) {
34
+ console.error(`Unknown command: ${sub}. Run \`nebula-skill-standards help\` for usage.`);
35
+ process.exit(2);
36
+ }
37
+
38
+ const forwarded = [sub];
39
+
40
+ if (sub === "install") {
41
+ forwarded.push(SKILL_NAME, "--dir", SKILL_DIR, ...argv.slice(1));
42
+ } else if (sub === "uninstall" || sub === "status") {
43
+ forwarded.push(SKILL_NAME, ...argv.slice(1));
44
+ } else if (sub === "list") {
45
+ forwarded.push(...argv.slice(1));
46
+ }
47
+
48
+ const cliPath = require.resolve("@nebula-skills/installer/cli");
49
+ process.argv = [process.argv[0], cliPath, ...forwarded];
50
+ require(cliPath);
package/package.json ADDED
@@ -0,0 +1,45 @@
1
+ {
2
+ "name": "@nebula-skills/nebula-code-standards",
3
+ "version": "0.1.0",
4
+ "description": "Nebula 企业级框架代码规范 skill(Claude Code / Cursor / Codex 通用)。",
5
+ "license": "MIT",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "git+https://github.com/lucky-finder/nebula-skills.git",
9
+ "directory": "packages/nebula-code-standards"
10
+ },
11
+ "homepage": "https://github.com/lucky-finder/nebula-skills/tree/main/packages/nebula-code-standards#readme",
12
+ "files": [
13
+ "skill/",
14
+ "bin/",
15
+ "scripts/",
16
+ "README.md"
17
+ ],
18
+ "bin": {
19
+ "nebula-skill-standards": "./bin/cli.cjs"
20
+ },
21
+ "dependencies": {
22
+ "@nebula-skills/installer": "^0.1.0"
23
+ },
24
+ "engines": {
25
+ "node": ">=18"
26
+ },
27
+ "publishConfig": {
28
+ "access": "public"
29
+ },
30
+ "keywords": [
31
+ "nebula",
32
+ "skill",
33
+ "cursor",
34
+ "claude-code",
35
+ "codex",
36
+ "code-standards",
37
+ "java",
38
+ "vue",
39
+ "mybatis-plus"
40
+ ],
41
+ "scripts": {
42
+ "build": "node -e \"process.exit(0)\"",
43
+ "postinstall": "node scripts/postinstall.cjs"
44
+ }
45
+ }
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+
3
+ const path = require("node:path");
4
+
5
+ try {
6
+ const { run } = require("@nebula-skills/installer/postinstall");
7
+ run({
8
+ name: "nebula-code-standards",
9
+ skillDir: path.join(__dirname, "..", "skill"),
10
+ });
11
+ } catch (err) {
12
+ const msg = err && err.message ? err.message : String(err);
13
+ console.warn(
14
+ "[nebula-skill] nebula-code-standards postinstall skipped:",
15
+ msg,
16
+ "\n Run `npx nebula-skill-standards install` later to retry."
17
+ );
18
+ }
package/skill/SKILL.md ADDED
@@ -0,0 +1,133 @@
1
+ ---
2
+ name: nebula-code-standards
3
+ description: >-
4
+ Nebula 企业级框架代码规范。生成 Java Controller、Service、Entity、VO、Mapper 代码时必须参考。
5
+ 生成前端 Vue/TypeScript API 函数、路由配置时必须参考。进行数据库建表、Flyway 脚本编写时必须参考。
6
+ 开发 CRUD 功能、新业务模块时必须参考。涉及分页查询、统一返回值 R<T>、MapStruct 对象转换、
7
+ 多租户隔离、IceStark 微前端子应用开发时必须参考。
8
+ 使用 JSON 工具、分布式锁、Redis 工具(NebulaCacheHelper)时必须参考。
9
+ 新增第三方依赖、管理依赖版本时必须参考。
10
+ 涉及框架层与 Starter 层分层依赖、泛型参数使用、Service/impl 目录规范时必须参考。
11
+ 开发跨服务 RPC 接口(Feign Client)、编写 Constants 常量类、实现 LocalStub 时必须参考。
12
+ 处理文件流下载、IO 异常、StreamUtils 使用场景时必须参考。
13
+ Mapper @Select 注解与多租户安全、LambdaQueryWrapper 放置规范时必须参考。
14
+ 跨模块 Service 协作、多表联动写操作事务规范、引用计数延迟删除模式时必须参考。
15
+ 设计对外 VO/DTO 时(不暴露存储内部细节)、DDL 建表校验 BaseEntity 11 字段完整性时必须参考。
16
+ 配置 Log4j2 日志格式、多环境日志配置(dev/uat/prod)、ELK JSON 日志接入时必须参考。
17
+ 配置 traceId 链路追踪日志打印、HTTP/定时任务/@Scheduled/MQ 消费等场景 traceId 传播时必须参考。
18
+ 涉及 nebula 五大仓库(support/boot/auth/system/web)职责边界、需求落点决策时必须参考。
19
+ 在 nebula-boot 中查找已封装的工具/组件/注解、判断是否需要造轮子时必须参考。
20
+ 调用 nebula-auth 或 nebula-system 跨服务 RPC、查询 RpcService DTO 字段含义时必须参考。
21
+ 评估是否需要在 nebula-boot 中下沉新能力、判断在 boot 升级还是业务自实现时必须参考。
22
+ 开发独立仓库形态的微前端业务子应用、接入 nebula-web 主应用、双仓库本地联调时必须参考。
23
+ 初始化新 nebula 项目(前端/后端/前后端一起)、需要一条指令本地跑起来时必须参考。
24
+ 编写代码前进行避坑自检、code review、问题排查时必须参考。
25
+ ---
26
+
27
+ # Nebula 代码规范
28
+
29
+ Nebula 是企业级 SaaS 框架,核心特性:**多租户(行级隔离)**、**微前端(IceStark)**、**MyBatis-Plus CRUD 基类**、**统一 JWT 认证**。
30
+
31
+ ## 核心原则
32
+
33
+ - Controller:只做参数接收与响应封装,不写 `if` 业务判断
34
+ - Service:只写业务逻辑,不写 `LambdaQueryWrapper` 条件拼装
35
+ - MapperExt:只做 SQL 构建与执行,不含业务判断
36
+ - DO:只映射数据库字段,不含前端展示逻辑
37
+
38
+ ## 框架基类速查
39
+
40
+ | 基类 | 模块 | 用途 |
41
+ |------|------|------|
42
+ | `BaseEntity` | `nebula-framework-mybatis` | 实体基类,含 11 个公共字段及自动填充 |
43
+ | `BaseMapper<T>` | `nebula-framework-mybatis` | Mapper 基类,开箱即用单表 CRUD |
44
+ | `BaseService<T>` | `nebula-framework-mybatis` | Service 接口基类 |
45
+ | `BaseServiceImpl<M, T>` | `nebula-framework-mybatis` | Service 实现基类,含 `getByIdOrThrow` |
46
+ | `PageParam` | `nebula-framework-core` | 分页入参:`pageNo`(默认1)、`pageSize`(默认10)、`sorts` |
47
+ | `PageResult<T>` | `nebula-framework-core` | 分页响应:`total`、`records`、`convert()` 批量转换 |
48
+ | `R<T>` | `nebula-framework-core` | HTTP 响应包装:`R.ok(data)` / `R.ok()` |
49
+ | `BusinessException` | `nebula-framework-core` | 业务异常,含错误码和提示 |
50
+ | `GlobalErrorCode` | `nebula-framework-core` | 错误码:`PARAM_INVALID`、`DATA_NOT_FOUND` 等 |
51
+ | `BaseMapperConfig` | `nebula-framework-core` | MapStruct 全局配置(忽略未映射字段) |
52
+ | `JsonUtils` | `nebula-framework-core` | **JSON 工具**,禁止 `new ObjectMapper()`,统一用此类 |
53
+ | `NebulaLockHelper` | `nebula-boot-starter-redis` | **分布式锁**,禁止 `StringRedisTemplate.setIfAbsent` |
54
+ | `NebulaCacheHelper` | `nebula-boot-starter-redis` | **Redis 缓存工具**,封装 Key 前缀/JSON/Hash/Set/过期,禁止直接用 `StringRedisTemplate` |
55
+ | `SystemException` | `nebula-framework-core` | **系统级异常**(IO/外部调用失败),区别于业务异常 `BusinessException` |
56
+ | `StreamUtils` | `spring-core` | 文件流复制,用 `StreamUtils.copy(in, out)` 替代手动 byte[] 循环 |
57
+ | `TraceContextHolder` | `nebula-framework-trace` | 取当前 traceId / runWithContext 切换上下文 |
58
+ | `TenantContextHolder` | `nebula-framework-tenant` | `getTenantCode()` / `runAsTenant` / `runWithoutTenant` |
59
+ | `SecurityContextHolder` | `nebula-framework-security` | 当前登录用户信息 |
60
+ | `@DistributedLock` | `nebula-boot-starter-redis` | 声明式分布式锁(SpEL Key) |
61
+ | `@RepeatSubmit` | `nebula-framework-web` | 防 HTTP 重复提交(body hash + 用户身份) |
62
+ | `@Idempotent` | `nebula-framework-idempotent` | 业务幂等(SpEL Key + Redis 后端) |
63
+ | `@Desensitize` | `nebula-framework-web` | 响应字段脱敏(手机/邮箱/身份证等) |
64
+ | `@RequiresPermission` | `nebula-framework-security` | 权限校验,支持 AND/OR 与 SpEL |
65
+ | `@TenantSwitch` / `@TenantIgnore` | `nebula-framework-tenant` | 方法级切换租户 / 忽略租户过滤 |
66
+ | `@AuditLog` | `nebula-boot-starter-log` | 审计日志(含 `#_DIFF` 等内置 SpEL 函数) |
67
+ | `IdGenRpcService` | `nebula-system-api` | 业务号发号(订单号、工单号等),**不要** 拿 `IdUtils` 当业务号 |
68
+ | `TenantRpcService` | `nebula-system-api` | 跨服务查租户(推荐用 `tenantCode` 而非 `tenantId`) |
69
+
70
+ ## 命名规范速查
71
+
72
+ | 层次 | 规则 | 示例 |
73
+ |------|------|------|
74
+ | 数据库表 | `t_{业务名蛇形}` | `t_demo` |
75
+ | 实体类 | `{业务名}DO` | `DemoDO` |
76
+ | Mapper 接口 | `{业务名}Mapper` | `DemoMapper` |
77
+ | 动态查询类 | `{业务名}MapperExt` | `DemoMapperExt` |
78
+ | Service 接口 | `I{业务名}Service` | `IDemoService` |
79
+ | Service 实现 | `{业务名}ServiceImpl` | `DemoServiceImpl` |
80
+ | Controller | `{业务名}Controller` | `DemoController` |
81
+ | 分页入参 VO | `{业务名}PageParamVO` | `DemoPageParamVO` |
82
+ | 新增/修改入参 | `{业务名}SaveParamVO` | `DemoSaveParamVO` |
83
+ | 列表响应 VO | `{业务名}RespVO` | `DemoRespVO` |
84
+ | 详情响应 VO | `{业务名}DetailVO` | `DemoDetailVO` |
85
+ | 对象转换 | `{业务名}Convert` | `DemoConvert` |
86
+
87
+ ## REST 接口设计速查
88
+
89
+ | HTTP 方法 | 路径 | 说明 | 入参 | 响应 |
90
+ |-----------|------|------|------|------|
91
+ | `POST` | `/{域}/{资源}/page` | 分页查询 | `@RequestBody XxxPageParamVO` | `R<PageResult<XxxRespVO>>` |
92
+ | `GET` | `/{域}/{资源}/{id}` | 查询详情 | `@PathVariable Long id` | `R<XxxDetailVO>` |
93
+ | `POST` | `/{域}/{资源}` | 新增 | `@Valid @RequestBody XxxSaveParamVO` | `R<Long>`(返回新id) |
94
+ | `PUT` | `/{域}/{资源}` | 修改 | `@Validated(UpdateGroup.class) @RequestBody` | `R<Void>` |
95
+ | `DELETE` | `/{域}/{资源}` | 批量逻辑删除 | `@RequestBody List<Long> ids` | `R<Void>` |
96
+ | `PATCH` | `/{域}/{资源}/{id}/v` | 启用 | `@PathVariable Long id` | `R<Void>` |
97
+ | `PATCH` | `/{域}/{资源}/{id}/x` | 禁用 | `@PathVariable Long id` | `R<Void>` |
98
+
99
+ > 路径前缀约定:`/{业务域}/{资源名}`,例如 `/mes/demo`
100
+
101
+ ## 方法命名约定
102
+
103
+ | 操作 | Service 方法名 | Controller 方法名 |
104
+ |------|--------------|----------------|
105
+ | 分页查询 | `page{业务名}` | `page{业务名}` |
106
+ | 详情查询 | `get{业务名}ById` | `get{业务名}ById` |
107
+ | 新增 | `create{业务名}` | `create{业务名}` |
108
+ | 修改 | `update{业务名}` | `update{业务名}` |
109
+ | 逻辑删除 | `delete{业务名}` | `delete{业务名}` |
110
+ | 启用 | `enable{业务名}` | `enable{业务名}` |
111
+ | 禁用 | `disable{业务名}` | `disable{业务名}` |
112
+
113
+ ## 详细规范文档
114
+
115
+ ### 写代码层(按层次/技术分)
116
+ - 后端规范(分层、DO/VO/MapperExt/Service/Controller):[backend-standards.md](backend-standards.md)
117
+ - 前端规范(技术栈、API封装、路由、共享包):[frontend-standards.md](frontend-standards.md)
118
+ - 数据库规范(DDL建表、Flyway、字段映射):[db-standards.md](db-standards.md)
119
+ - 完整 CRUD 代码示例:[full-crud-example.md](full-crud-example.md)
120
+ - **框架工具使用规范**(JsonUtils/分布式锁/依赖版本/分层约束):[framework-standards.md](framework-standards.md)
121
+
122
+ ### 工作区/架构层(按仓库/能力分)
123
+ - **工作区总览**(五仓库职责、依赖链、需求落点决策):[workspace-overview.md](workspace-overview.md)
124
+ - **boot 组件目录**(framework/starter 全清单 + 速查矩阵):[boot-components-catalog.md](boot-components-catalog.md)
125
+ - **auth/system RPC 字典**(接口签名 + DTO 字段含义):[rpc-api-reference.md](rpc-api-reference.md)
126
+ - **独立仓库子应用接入**(vite 双入口、命名一致性、部署):[microapp-guide.md](microapp-guide.md)
127
+
128
+ ### 工作流层(按场景分)
129
+ - **新项目初始化向导**(前后端骨架 + 连通性检测 + Demo CRUD):[init-new-project.md](init-new-project.md)
130
+ - **boot 升级 vs 自实现 决策**(缺口分析 + 强制询问流程):[upgrade-decision.md](upgrade-decision.md)
131
+ - **避坑清单**(10 大类 80+ 条反模式):[pitfalls-checklist.md](pitfalls-checklist.md)
132
+
133
+ > 不确定从哪开始?先翻 [workspace-overview.md](workspace-overview.md) §三需求落点决策表。