add-coder 0.3.23 → 0.3.24

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "add-coder",
3
- "version": "0.3.23",
3
+ "version": "0.3.24",
4
4
  "private": false,
5
5
  "description": "[codein2027](https://github.com/xiaomingming92/codein2027) - A complete scaffolding for building the ADD programming paradigm, the implementation layer for AI code governance. Core principle: Audit as Infrastructure. Breaks the black-box programming process and cross-session amnesia, evolving programming paradigms into an auditable, traceable, and convergent new era. npx-ready.\n\n[codein2027](https://github.com/xiaomingming92/codein2027) 快速构建 ADD 编程范式的完整脚手架——AI 代码治理的落地方案。以「审计即基础设施」为核心,彻底打破编程过程黑盒与跨轮失忆,让编程范式进化为可审计、可追溯、可收敛的新时代。npx 即用,人人可体验。",
6
6
  "repository": {
@@ -40,6 +40,7 @@
40
40
  "email": "wujixmm@gmail.com",
41
41
  "license": "AGPL-3.0-only",
42
42
  "dependencies": {
43
+ "@ariga/atlas": "^1.3.0",
43
44
  "@huggingface/transformers": "^3.8.1",
44
45
  "@modelcontextprotocol/server": "2.0.0",
45
46
  "commander": "^13.1.0",
@@ -1,5 +1,5 @@
1
1
  {
2
- "_version": "0.3.23",
2
+ "_version": "0.3.24",
3
3
  "adapters/claude/hooks/doc-format-guard.sh": "ec59ad3f",
4
4
  "adapters/claude/hooks/lib/common.sh": "4f3e64ad",
5
5
  "adapters/claude/hooks/lib/context-inject.sh": "cfc8c65e",
@@ -180,7 +180,7 @@
180
180
  "core/rules/profiles/webapp-profile.md": "e493ae7b",
181
181
  "core/rules/project_rules.md": "82b25e08",
182
182
  "core/rules/theory-practice-map.toml": "b1db99fd",
183
- "core/scripts/db-ensure.sh": "faeb6b92",
183
+ "core/scripts/db-ensure.sh": "1ef7a9f3",
184
184
  "core/scripts/gen-plan-index.sh": "bfc6ad3e",
185
185
  "core/scripts/mcp-server/elicitation/confirm.ts": "924857b8",
186
186
  "core/scripts/mcp-server/elicitation/index.ts": "44c5dc3f",
@@ -252,6 +252,7 @@
252
252
  "core/templates/hitl-template.md": "44989804",
253
253
  "core/templates/hitl-template.schema.json": "e7ecc53e",
254
254
  "core/templates/index.md": "0fb42ea5",
255
+ "core/templates/ports.example.md": "f5a7e436",
255
256
  "core/templates/prd-incremental-template.md": "4a996ad5",
256
257
  "core/templates/prd-incremental-template.schema.json": "bb44f022",
257
258
  "core/templates/prd-standard-template.md": "abf639c2",
@@ -82,3 +82,98 @@ fi
82
82
  if [ "$DO_MIGRATE" = "true" ]; then
83
83
  backup_add_tables
84
84
  fi
85
+
86
+ # ════ Atlas 声明式同步模块(函数式;消费方日常变更同步入口,与 v2 引擎同源逻辑)════
87
+ # 触发:--migrate(init 流程)或宿主手动 `bash db-ensure.sh <engine> <container> --migrate`
88
+ # 依赖环境变量:DB_URL / ADD_DATABASE_URL(可选) / ATLAS_DEV_URL / PROJECT_NAME / DATABASE_USER
89
+
90
+ # ① atlas 可执行解析(三路径:add-coder 包内 → 顶层 .bin → PATH;无则走 npx --no-install)
91
+ resolve_atlas_bin() {
92
+ local b
93
+ for b in \
94
+ "$PROJECT_DIR/node_modules/add-coder/node_modules/.bin/atlas" \
95
+ "$PROJECT_DIR/node_modules/.bin/atlas" \
96
+ "$(command -v atlas 2>/dev/null || true)"; do
97
+ [ -n "$b" ] && [ -x "$b" ] && { echo "$b"; return 0; }
98
+ done
99
+ return 1
100
+ }
101
+
102
+ # ② atlas 命令执行器(本地 bin 或 npx --no-install)
103
+ atlas_cmd() {
104
+ local bin; bin="$(resolve_atlas_bin || true)"
105
+ if [ -n "$bin" ]; then "$bin" "$@"; else npx --no-install @ariga/atlas "$@"; fi
106
+ }
107
+
108
+ # ③ 目标构造(模式判定:分库=ADD 模型 / 共库=宿主 + 动态 exclude 非 ADD 表)
109
+ # 输出全局:TARGET_URL / SCHEMA_TARGET / EXCLUDE_ARGS
110
+ build_target() {
111
+ TARGET_URL=""
112
+ SCHEMA_TARGET="prisma/"
113
+ EXCLUDE_ARGS=()
114
+ local tables
115
+ if [ -n "${ADD_DATABASE_URL:-}" ]; then
116
+ TARGET_URL="${ADD_DATABASE_URL//?schema=public/}"
117
+ SCHEMA_TARGET="prisma/add.prisma"
118
+ echo ">>> Atlas 同步(分库模式: ADD 治理模型)..."
119
+ else
120
+ TARGET_URL="${DB_URL//?schema=public/}"
121
+ # 动态 exclude:库中除 ADD 7 表外的全部表(业务表/checkpoint/_prisma_migrations)——Atlas glob 不生效,需 public. 前缀精确名
122
+ tables="$(podman exec "${PROJECT_NAME:-add-project}-postgres" psql -U "${DATABASE_USER:-admin}" -d "${PROJECT_NAME:-add-project}" -tAc "SELECT string_agg('public.' || table_name, ',') FROM information_schema.tables WHERE table_schema='public' AND table_name NOT IN ('AddUser','DevOperation','AuditLog','HitlRecord','PlanRecord','ReviewRecord','CollabContract');" 2>/dev/null || true)"
123
+ [ -n "$tables" ] && EXCLUDE_ARGS=(--exclude "$tables")
124
+ echo ">>> Atlas 同步(共库模式: 仅 ADD 治理表,其余 $(echo "$tables" | tr ',' '\n' | wc -l) 张表排除)..."
125
+ fi
126
+ TARGET_URL="${TARGET_URL}?sslmode=disable"
127
+ }
128
+
129
+ # ④ baseline 生成(同源:Prisma schema SQL,过滤 Prisma 7 ◇ 提示)
130
+ generate_baseline() {
131
+ BASELINE_SQL="$(mktemp /tmp/atlas-target.XXXXXX.sql)"
132
+ trap 'rm -f "$BASELINE_SQL"' EXIT
133
+ npx prisma migrate diff --from-empty --to-schema "$SCHEMA_TARGET" --script 2>/dev/null | sed '/^◇/d' > "$BASELINE_SQL"
134
+ }
135
+
136
+ # ⑤ diff 检测(SQL 语句特征判定:Atlas 无变更时输出 "Schemas are synced..." 非空,不算变更)
137
+ # 输出全局 DIFF_SQL;返回 0=有变更 / 1=无变更
138
+ run_atlas_diff() {
139
+ DIFF_SQL="$(atlas_cmd schema diff --from "$TARGET_URL" --to "file://$BASELINE_SQL" --dev-url "$ATLAS_DEV_URL" "${EXCLUDE_ARGS[@]}" 2>/dev/null)"
140
+ echo "$DIFF_SQL" | grep -qE "^(CREATE|ALTER|DROP|COMMENT|-- *(Create|Modify|Drop))"
141
+ }
142
+
143
+ # ⑥ apply(确认门槛:交互输出 SQL → 确认 → apply;拒绝则跳过)
144
+ apply_atlas_diff() {
145
+ echo "=== 待应用 diff SQL(前 60 行)==="
146
+ echo "$DIFF_SQL" | head -60
147
+ read -rp "应用以上 schema 变更?[y/N] " ANS
148
+ if [ "$ANS" = "y" ] || [ "$ANS" = "yes" ]; then
149
+ atlas_cmd schema apply --url "$TARGET_URL" --to "file://$BASELINE_SQL" --dev-url "$ATLAS_DEV_URL" "${EXCLUDE_ARGS[@]}"
150
+ echo ">>> Atlas 同步完成"
151
+ else
152
+ echo ">>> 已取消,未应用"
153
+ fi
154
+ }
155
+
156
+ # ⑦ Atlas 同步主流程(探测 → dev-url → 目标 → baseline → diff → apply)
157
+ atlas_sync() {
158
+ [ "$ENGINE" = "sqlite" ] && return 0
159
+ if ! atlas_cmd version > /dev/null 2>&1; then
160
+ echo "!!! Atlas 不可用。add-coder sync --patch 可自动安装 @ariga/atlas;或手动: pnpm add -D @ariga/atlas"
161
+ echo " 降级路径: prisma-diff(免 shadow)→ db-push + 强制备份;文档: README「Atlas 数据库同步能力」"
162
+ return 1
163
+ fi
164
+ if [ -z "${ATLAS_DEV_URL:-}" ]; then
165
+ echo "!!! ATLAS_DEV_URL 未配置。请运行 add-coder init(分库引导自动创建 {project}-add-dev 常驻容器并登记)或手动配置"
166
+ return 1
167
+ fi
168
+ build_target
169
+ generate_baseline
170
+ if run_atlas_diff; then
171
+ apply_atlas_diff
172
+ else
173
+ echo ">>> schema 一致(幂等出口)"
174
+ fi
175
+ }
176
+
177
+ if [ "$DO_MIGRATE" = "true" ]; then
178
+ atlas_sync
179
+ fi
@@ -0,0 +1,49 @@
1
+ # 端口契约登记表({{projectName}})
2
+
3
+ > **定位**:本项目开发环境端口统一登记表,是项目本地端口分配的唯一事实源。
4
+ > **维护**:新增容器/服务端口前必须先查本表;改端口后必须同步更新 `.env.development` 变量、`DATABASE_URL`/`SHADOW_DATABASE_URL`/`ATLAS_DEV_URL` 与本表三处。
5
+ > **最后更新**: (登记日期,按实际填写)
6
+ > ⚠️ 跨项目共享端口(如本机 5433/5434/5437 等)以跨项目事实源 `docs/ports.md`(如 farm-agent)为准,本项目表只登记本项目端口。
7
+
8
+ ---
9
+
10
+ ## 1. 端口分配总表
11
+
12
+ > **init 自动登记**:`add-coder init`(分库引导)与 Atlas 同步会自动为「主库 / ADD 库 / Atlas dev 库」三类容器分配端口并登记本表——分配规则见 §4 约定规则。以下为示例行。
13
+
14
+ | 端口 | 服务 | 用途 | 状态 | 配置位置 |
15
+ |:---:|------|------|:---:|---------|
16
+ | 5432 | PostgreSQL 宿主库 | 宿主业务库(PG 标准端口,示例) | 🟡 示例 | 宿主自有配置 |
17
+ | 5433 | PostgreSQL ADD 配套库 | add-coder 配套容器第一顺位:`{{projectName}}-add-postgres`(宿主 5432 之后从 5433 起,示例) | 🟡 示例 | `.env.development` `ADD_DATABASE_URL` |
18
+ | 5434 | PostgreSQL Atlas dev 库 | Atlas 常驻 dev 空库 `{{projectName}}-add-dev`(可随时重置,示例) | 🟡 示例 | `.env.development` `ATLAS_DEV_URL` |
19
+ | 3000 | Web dev server | 前端/服务开发端口(示例) | 🟡 示例 | `.env.development` `PORT` |
20
+
21
+ > 表头为固定规范;行数据为**示例**,按项目实际情况增删改。
22
+
23
+ ## 2. 已知冲突与处置
24
+
25
+ | # | 端口 | 冲突方 A | 冲突方 B | 处置 |
26
+ |:---:|:---:|---------|---------|------|
27
+ | 1 | 5433 | 本项目默认值 | 其他项目同默认值 | 🟡 示例:已改用空闲端口并登记 |
28
+
29
+ ## 3. 容器快照
30
+
31
+ ### 运行中
32
+
33
+ | 容器 | 端口 | 归属 |
34
+ |------|------|------|
35
+ | `{{projectName}}-add-postgres` | 5433 | 本项目 ADD 治理库(分库引导,示例) |
36
+ | `{{projectName}}-add-dev` | 5434 | 本项目 Atlas dev 空库(可随时重置,示例) |
37
+
38
+ ### Created / Exited(历史容器,端口已释放)
39
+
40
+ `—`(示例:按 `podman ps -a` 实际登记)
41
+
42
+ ## 4. 约定规则
43
+
44
+ 1. **改端口 = 三处同步**:`.env.development` 变量 + `DATABASE_URL`/`ADD_DATABASE_URL`/`SHADOW_DATABASE_URL`/`ATLAS_DEV_URL` + compose 引用,改完更新本表
45
+ 2. **新增服务**:先查本表 + 跨项目事实源取空闲端口;**PG 配套从 5433 起**(宿主标准 5432 之后第一顺位),按服务类型分段(PG=5433+ / Web=3xxx / MCP=30xx),避免默认值撞车
46
+ 3. **init 全局登记(统一分配器)**:`add-coder init` 通过统一端口分配器为「主库 / ADD 库 / Atlas dev 库」一次性分配并登记本表——分配前先读本表已有登记(已登记端口复用不重复分配)与跨项目事实源,再**从 5433 起扫描真实空闲**(podman ps + `portInUse` 探测),分配后写入本表;**禁止各模块自行分散扫描端口**(建议起点可在端口规则 `ports-rules.toml` 调整)
47
+ 4. **Atlas dev 库同表登记**:dev-url 常驻空库与主库同表登记,状态列标注「dev 库」;dev 库**可随时重置,不是数据真源**,重置后无需迁移备份
48
+ 5. **删除容器前**:确认数据卷是否需要保留(容器删了卷还在)
49
+ 6. **端口检测**:`podman ps --format '{{.Names}} {{.Ports}}'` 为准,`ss -tlnp` 为辅