Initialize Phase 0 monorepo skeleton (T-001)
This commit is contained in:
@@ -0,0 +1,11 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"softbox.local/core"
|
||||
)
|
||||
|
||||
func main() {
|
||||
fmt.Println(core.ProductName)
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
module softbox.local/app-modern
|
||||
|
||||
go 1.25.0
|
||||
|
||||
require (
|
||||
gioui.org v0.10.1
|
||||
softbox.local/core v0.0.0
|
||||
)
|
||||
@@ -0,0 +1,2 @@
|
||||
// Package windows contains modern Windows platform adapters.
|
||||
package windows
|
||||
@@ -0,0 +1,2 @@
|
||||
// Package gio contains the modern Gio UI adapter.
|
||||
package gio
|
||||
@@ -0,0 +1,11 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"softbox.local/core"
|
||||
)
|
||||
|
||||
func main() {
|
||||
fmt.Println(core.ProductName)
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
module softbox.local/app-win7
|
||||
|
||||
go 1.20
|
||||
|
||||
require (
|
||||
gioui.org v0.6.0
|
||||
softbox.local/core v0.0.0
|
||||
)
|
||||
@@ -0,0 +1,8 @@
|
||||
go 1.20
|
||||
|
||||
use (
|
||||
.
|
||||
../core
|
||||
)
|
||||
|
||||
replace softbox.local/core v0.0.0 => ../core
|
||||
@@ -0,0 +1 @@
|
||||
gioui.org v0.6.0/go.mod h1:eUvGo6FAzA7jUqeSu5a+M1W03yc9r1nanIBS8A5+Nng=
|
||||
@@ -0,0 +1,2 @@
|
||||
// Package windows contains Win7-compatible Windows platform adapters.
|
||||
package windows
|
||||
@@ -0,0 +1,2 @@
|
||||
// Package gio contains the Win7-compatible Gio UI adapter.
|
||||
package gio
|
||||
@@ -0,0 +1,2 @@
|
||||
// Package application coordinates SoftBox use cases through injected ports.
|
||||
package application
|
||||
@@ -0,0 +1,2 @@
|
||||
// Package domain contains SoftBox business models and rules.
|
||||
package domain
|
||||
@@ -0,0 +1,3 @@
|
||||
module softbox.local/core
|
||||
|
||||
go 1.20
|
||||
@@ -0,0 +1,5 @@
|
||||
// Package core exposes shared, UI-independent SoftBox functionality.
|
||||
package core
|
||||
|
||||
// ProductName is the stable display name shared by both application targets.
|
||||
const ProductName = "SoftBox"
|
||||
@@ -0,0 +1,9 @@
|
||||
package core
|
||||
|
||||
import "testing"
|
||||
|
||||
func TestProductName(t *testing.T) {
|
||||
if ProductName != "SoftBox" {
|
||||
t.Fatalf("ProductName = %q, want %q", ProductName, "SoftBox")
|
||||
}
|
||||
}
|
||||
@@ -45,7 +45,7 @@ SoftBox 软件盒子是一个使用 Go + Gio 开发的 Windows 桌面客户端,
|
||||
|
||||
## 当前阶段
|
||||
|
||||
当前项目处于:**MVP 起步(Phase 0 工程骨架尚未建立,仓库只有文档)**。
|
||||
当前项目处于:**MVP 起步(Phase 0 工程骨架建设中)**。
|
||||
|
||||
优先路径:
|
||||
|
||||
@@ -133,14 +133,14 @@ MVP 不做:
|
||||
|
||||
## 验证命令
|
||||
|
||||
统一启动与验证入口收敛到根目录 `./init.sh` / `./init.ps1`;T-001 完成前脚本处于未配置状态。骨架建立后的标准命令:
|
||||
统一启动与验证入口收敛到根目录 `./init.sh` / `./init.ps1`;脚本会同步工作区依赖并运行 core 基础验证。标准命令:
|
||||
|
||||
```bash
|
||||
# core 测试(Linux 无头可跑)
|
||||
cd core && go vet ./... && go test -count=1 ./...
|
||||
|
||||
# 现代版构建
|
||||
cd app-modern && GOOS=windows GOARCH=amd64 go build ./cmd/softbox
|
||||
cd app-modern && GOTOOLCHAIN=go1.25.0 GOOS=windows GOARCH=amd64 go build ./cmd/softbox
|
||||
|
||||
# Win7 版构建(强制 Go 1.20)
|
||||
cd app-win7 && GOTOOLCHAIN=go1.20.14 GOOS=windows GOARCH=amd64 go build ./cmd/softbox
|
||||
|
||||
@@ -35,17 +35,19 @@
|
||||
|
||||
## 三、构建与运行命令
|
||||
|
||||
> 工程骨架由 T-001 建立;骨架完成前以下命令不可运行,`init.sh`/`init.ps1` 会主动失败提示。骨架完成后,T-001 必须把真实命令回填到本表、`00-ai-start-here.md`、`current-state.md` 和 init 脚本顶部三个变量。
|
||||
> 工程骨架由 T-001 建立;根目录 `init.sh`/`init.ps1` 统一执行依赖同步与 core 基础验证,并打印双目标构建命令。
|
||||
|
||||
| 用途 | 命令(计划) |
|
||||
| --- | --- |
|
||||
| 同步工作区依赖 | `go work sync` |
|
||||
| core 测试 | `cd core && go test -count=1 ./...` |
|
||||
| core 静态检查 | `cd core && go vet ./...` |
|
||||
| 现代版构建 | `cd app-modern && GOOS=windows GOARCH=amd64 go build -o ../dist/SoftBox.exe ./cmd/softbox` |
|
||||
| 现代版构建 | `cd app-modern && GOTOOLCHAIN=go1.25.0 GOOS=windows GOARCH=amd64 go build -o ../dist/SoftBox.exe ./cmd/softbox` |
|
||||
| Win7 版构建 | `cd app-win7 && GOTOOLCHAIN=go1.20.14 GOOS=windows GOARCH=amd64 go build -o ../dist/SoftBox-win7.exe ./cmd/softbox` |
|
||||
| 本地运行(开发) | Windows 下直接 `go run ./cmd/softbox`(WSL 中构建 EXE 后到 Windows 侧运行) |
|
||||
|
||||
根 `go.work` 纳入三个模块并使用 modern 所需的 Go 1.25 workspace 版本;`app-win7/go.work` 是就近的 Go 1.20 workspace,只纳入 `app-win7` 与 `core`,确保 Go 1.20.14 不需要解析 modern 模块。
|
||||
|
||||
工具链矩阵:
|
||||
|
||||
| 构建目标 | 工具链 | Gio | 支持系统 | 维护策略 |
|
||||
|
||||
+21
-17
@@ -13,26 +13,26 @@
|
||||
## 当前快照
|
||||
|
||||
- 日期:2026-07-16
|
||||
- 阶段:MVP 起步(Phase 0 未开始,仓库只有 harness 文档,无任何 Go 代码)
|
||||
- 技术栈:已定稿于 `03-tech-stack.md`(Go + Gio,双工具链矩阵),尚未落地
|
||||
- 生产代码:无;`core/`、`app-modern/`、`app-win7/`、`schemas/`、`testdata/` 均待 T-001 创建
|
||||
- 测试:无
|
||||
- 阶段:MVP 起步(Phase 0 工程骨架建设中)
|
||||
- 技术栈:根 Go workspace 纳入 core/app-modern/app-win7 三模块;`app-win7/go.work` 隔离 Go 1.20.14 构建;Gio UI 与平台 stub 待后续 Phase 0 任务接入
|
||||
- 生产代码:已有最小 core 包与 modern/win7 命令入口;尚无业务功能
|
||||
- 测试:core 已有最小真实单元测试
|
||||
- 数据:无;Catalog 清单与测试样例待建
|
||||
- 标准启动路径:`./init.sh` / `./init.ps1`(**尚未配置**,顶部三个命令仍为占位符,运行会主动失败提示——T-001 负责替换)
|
||||
- 标准验证路径:同上,未配置
|
||||
- 标准启动路径:`./init.sh` / `./init.ps1`(同步依赖、验证 core、打印 modern/win7 双目标构建命令)
|
||||
- 标准验证路径:`go -C core vet ./...` + `go -C core test -count=1 ./...`;双目标构建命令见下文
|
||||
- 版本管理:git 已初始化,main 分支,远端 origin 为 Gitea `opc/soft_quay`;harness 文档已提交
|
||||
- 当前 blocker:无;下一步即领取 T-001
|
||||
- 当前 blocker:无;下一步按路线图落成并领取 T-002
|
||||
|
||||
## 当前目录要点
|
||||
|
||||
| 路径 | 状态 | 说明 |
|
||||
| --- | --- | --- |
|
||||
| `docs/` | 已有 | harness coding 文档集(本次初始化完成) |
|
||||
| `docs/tasks/` | 已有 | 任务目录;T-001 已落成任务文件待领取 |
|
||||
| `docs/tasks/` | 已有 | 任务目录;T-001 已完成,T-002 待按路线图落成 |
|
||||
| `scripts/` | 已有 | harness 治理脚本(validate_agent_context 等);构建脚本待建 |
|
||||
| `core/` | 待建 | 共享业务核心(T-001) |
|
||||
| `app-modern/` | 待建 | 现代版模块(T-001) |
|
||||
| `app-win7/` | 待建 | Win7 遗留版模块(T-001) |
|
||||
| `core/` | 已建 | Go 1.20 兼容共享模块;当前仅最小包与测试 |
|
||||
| `app-modern/` | 已建 | Go 1.25.0 + Gio v0.10.1 模块;当前为无 UI 命令入口 |
|
||||
| `app-win7/` | 已建 | Go 1.20 + Gio v0.6.0 模块;当前为无 UI 命令入口 |
|
||||
| `schemas/` | 待建 | 协议 JSON Schema(T-201) |
|
||||
| `testdata/` | 待建 | 假数据测试样例(T-101 起) |
|
||||
|
||||
@@ -40,18 +40,22 @@
|
||||
|
||||
任务状态以 `docs/tasks/` 各任务文件 frontmatter 的 `status` 为准。本节只写项目级摘要:
|
||||
|
||||
- 已完成:无。
|
||||
- 已完成:`T-001 初始化 monorepo 骨架`。
|
||||
- 正在进行:无。
|
||||
- 下一个可领取任务:`T-001 初始化 monorepo 骨架`(`docs/tasks/T-001.md`)。
|
||||
- 下一个可领取任务:按路线图落成并领取 `T-002 建立 domain 状态模型与事件总线`。
|
||||
|
||||
## 当前可运行内容
|
||||
|
||||
```bash
|
||||
# 目前仅文档治理检查可运行:
|
||||
python3 scripts/validate_agent_context.py
|
||||
python3 scripts/validate_harness_governance.py
|
||||
# 统一依赖同步 + core 验证:
|
||||
./init.sh
|
||||
# Windows PowerShell 使用 ./init.ps1
|
||||
|
||||
# Go 构建 / 测试:骨架未建立,暂不可运行(见 T-001)
|
||||
# 独立验证:
|
||||
go -C core vet ./...
|
||||
go -C core test -count=1 ./...
|
||||
GOTOOLCHAIN=go1.25.0 GOOS=windows GOARCH=amd64 go -C app-modern build ./cmd/softbox
|
||||
GOTOOLCHAIN=go1.20.14 GOOS=windows GOARCH=amd64 go -C app-win7 build ./cmd/softbox
|
||||
```
|
||||
|
||||
## 开始编码前检查
|
||||
|
||||
+12
-4
@@ -3,12 +3,12 @@ id: T-001
|
||||
title: 初始化 monorepo 骨架(core / app-modern / app-win7 + go.work)
|
||||
phase: 0
|
||||
deps: []
|
||||
status: TODO
|
||||
status: DONE
|
||||
created: 2026-07-16
|
||||
issue: null
|
||||
context_ref: null
|
||||
context_ref: 0184595cccc3a516628fc6077c558b84606ad806
|
||||
claim_branch: null
|
||||
work_branch: null
|
||||
work_branch: agent/codex/T-001
|
||||
write_paths:
|
||||
- docs/tasks/T-001.md
|
||||
- go.work
|
||||
@@ -60,4 +60,12 @@ write_paths:
|
||||
|
||||
## 执行记录
|
||||
|
||||
(做完在此记录:改了哪些文件、跑的验证命令与结果、阻塞、关键决策。)
|
||||
- 2026-07-16:创建根 `go.work`、`core` / `app-modern` / `app-win7` 三个模块、最小命令入口、core 真实单元测试及预留包目录。
|
||||
- 2026-07-16:根 workspace 使用 Go 1.25 并纳入三个模块;额外创建 `app-win7/go.work`(Go 1.20,仅含 win7 + core),使 Go 1.20.14 不必解析 modern 模块,同时保持 app → core 的依赖方向。
|
||||
- 2026-07-16:替换 `init.sh` / `init.ps1` 占位命令并同步 `00-ai-start-here.md`、`03-tech-stack.md`、`current-state.md`。
|
||||
- 验证通过:`go work sync`。
|
||||
- 验证通过:`cd core && go vet ./... && go test -count=1 ./...`。
|
||||
- 验证通过:`cd app-modern && GOTOOLCHAIN=go1.25.0 GOOS=windows GOARCH=amd64 go build -o ../dist/SoftBox.exe ./cmd/softbox`。
|
||||
- 验证通过:`cd app-win7 && GOTOOLCHAIN=go1.20.14 GOOS=windows GOARCH=amd64 go build -o ../dist/SoftBox-win7.exe ./cmd/softbox`。本机镜像下载 toolchain 失败后,使用 Go 官方 `golang.org/dl/go1.20.14` 下载并验证同一版本工具链。
|
||||
- 验证通过:`./init.ps1` 与 Git Bash `./init.sh`。
|
||||
- 验证通过:`python scripts/validate_agent_context.py`、`python scripts/validate_harness_governance.py`。
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
go 1.25.0
|
||||
|
||||
use (
|
||||
./app-modern
|
||||
./app-win7
|
||||
./core
|
||||
)
|
||||
|
||||
replace softbox.local/core v0.0.0 => ./core
|
||||
+12
@@ -0,0 +1,12 @@
|
||||
eliasnaur.com/font v0.0.0-20230308162249-dd43949cb42d/go.mod h1:OYVuxibdk9OSLX8vAqydtRPP87PyTFcT9uH3MlEGBQA=
|
||||
gioui.org v0.6.0/go.mod h1:eUvGo6FAzA7jUqeSu5a+M1W03yc9r1nanIBS8A5+Nng=
|
||||
gioui.org v0.10.1/go.mod h1:MZJZsdEPkTBzChdqeE8CiiQhreUQBj43qusDxQNDf7k=
|
||||
gioui.org/cpu v0.0.0-20210808092351-bfe733dd3334/go.mod h1:A8M0Cn5o+vY5LTMlnRoK3O5kG+rH0kWfJjeKd9QpBmQ=
|
||||
gioui.org/shader v1.0.8/go.mod h1:mWdiME581d/kV7/iEhLmUgUK5iZ09XR5XpduXzbePVM=
|
||||
github.com/go-text/typesetting v0.3.4/go.mod h1:4qZCQphq4KSgGTAeI0uMEkVbROgfah8BuyF5LRYr7XY=
|
||||
golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8=
|
||||
golang.org/x/exp/shiny v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:ygj7T6vSGhhm/9yTpOQQNvuAUFziTH7RUiH74EoE2C8=
|
||||
golang.org/x/image v0.26.0/go.mod h1:lcxbMFAovzpnJxzXS3nyL83K27tmqtKzIJpctK8YO5c=
|
||||
golang.org/x/net v0.48.0/go.mod h1:+ndRgGjkh8FGtu1w1FGbEC31if4VrNVMuKTgcAAnQRY=
|
||||
golang.org/x/sys v0.39.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
|
||||
golang.org/x/text v0.32.0/go.mod h1:o/rUWzghvpD5TXrTIBuJU77MTaN0ljMWE47kxGJQ7jY=
|
||||
@@ -4,32 +4,14 @@
|
||||
# - Windows 原生 PowerShell:用本文件 ./init.ps1
|
||||
# - WSL / Git Bash / macOS / Linux:用 ./init.sh
|
||||
# 一条命令完成:依赖安装 -> 基础验证 -> 打印启动命令。
|
||||
# 复制到新项目后,必须先替换下面三个命令,让每轮会话用同一条路径启动,不靠记忆。
|
||||
# 本文件不绑定任何技术栈;换技术栈时只替换这三个命令,脚本结构不用动。
|
||||
# 三个命令是仓库统一入口;换工具链时同步更新文档与这里。
|
||||
|
||||
$ErrorActionPreference = "Stop"
|
||||
Set-Location -Path $PSScriptRoot
|
||||
|
||||
# 按你的项目实际情况替换这三个命令。未替换前脚本会主动失败。
|
||||
$InstallCmd = "__REPLACE_INSTALL_CMD__" # 依赖安装,如 uv sync / poetry install / npm install
|
||||
$VerifyCmd = "__REPLACE_VERIFY_CMD__" # 基础验证 / smoke,如 python -m pytest / go test ./...
|
||||
$StartCmd = "__REPLACE_START_CMD__" # 开发启动,如 uvicorn app:app --reload / npm run dev
|
||||
|
||||
function Assert-Configured {
|
||||
param(
|
||||
[string]$Name,
|
||||
[string]$Value
|
||||
)
|
||||
|
||||
if ($Value -like "__REPLACE_*") {
|
||||
Write-Error "请先在 init.ps1 中替换 $Name。同步更新 docs/03-tech-stack.md、docs/00-ai-start-here.md 和 docs/current-state.md 中的命令。"
|
||||
exit 2
|
||||
}
|
||||
}
|
||||
|
||||
Assert-Configured -Name "InstallCmd" -Value $InstallCmd
|
||||
Assert-Configured -Name "VerifyCmd" -Value $VerifyCmd
|
||||
Assert-Configured -Name "StartCmd" -Value $StartCmd
|
||||
$InstallCmd = "go work sync"
|
||||
$VerifyCmd = 'go -C core vet ./...; if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }; go -C core test -count=1 ./...'
|
||||
$StartCmd = '$env:GOTOOLCHAIN="go1.25.0"; $env:GOOS="windows"; $env:GOARCH="amd64"; go build -C app-modern -o ../dist/SoftBox.exe ./cmd/softbox; if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }; $env:GOTOOLCHAIN="go1.20.14"; go build -C app-win7 -o ../dist/SoftBox-win7.exe ./cmd/softbox'
|
||||
|
||||
Write-Host "==> 当前目录: $($PWD.Path)"
|
||||
|
||||
|
||||
@@ -1,51 +1,35 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# 标准启动与验证入口(Unix shell 版),与 init.ps1 等价,二选一:
|
||||
# - WSL / Git Bash / macOS / Linux:用本文件 ./init.sh
|
||||
# - WSL / Git Bash / macOS / Linux:用 ./init.sh
|
||||
# - Windows 原生 PowerShell:用 ./init.ps1
|
||||
# 一条命令完成:依赖安装 -> 基础验证 -> 打印启动命令。
|
||||
# 复制到新项目后,必须先替换下面三个变量,让每轮会话用同一条路径启动,不靠记忆。
|
||||
# 本文件不绑定任何技术栈;换技术栈时只替换这三个变量,脚本结构不用动。
|
||||
# 三个命令是仓库统一入口;换工具链时同步更新文档与这里。
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
cd "$ROOT_DIR"
|
||||
|
||||
# 按你的项目实际情况替换这三个命令。未替换前脚本会主动失败。
|
||||
INSTALL_CMD=(__REPLACE_INSTALL_CMD__) # 依赖安装,如 uv sync、poetry install、npm install
|
||||
VERIFY_CMD=(__REPLACE_VERIFY_CMD__) # 基础验证 / smoke,如 python -m pytest、go test ./...
|
||||
START_CMD=(__REPLACE_START_CMD__) # 开发启动,如 uvicorn app:app --reload、npm run dev
|
||||
|
||||
ensure_configured() {
|
||||
local name="$1"
|
||||
local first="$2"
|
||||
if [[ "$first" == __REPLACE_* ]]; then
|
||||
echo "ERROR: 请先在 init.sh 中替换 ${name}。"
|
||||
echo " 同步更新 docs/03-tech-stack.md、docs/00-ai-start-here.md 和 docs/current-state.md 中的命令。"
|
||||
exit 2
|
||||
fi
|
||||
}
|
||||
|
||||
ensure_configured "INSTALL_CMD" "${INSTALL_CMD[0]}"
|
||||
ensure_configured "VERIFY_CMD" "${VERIFY_CMD[0]}"
|
||||
ensure_configured "START_CMD" "${START_CMD[0]}"
|
||||
INSTALL_CMD="go work sync"
|
||||
VERIFY_CMD="go -C core vet ./... && go -C core test -count=1 ./..."
|
||||
START_CMD="GOTOOLCHAIN=go1.25.0 GOOS=windows GOARCH=amd64 go -C app-modern build -o ../dist/SoftBox.exe ./cmd/softbox && GOTOOLCHAIN=go1.20.14 GOOS=windows GOARCH=amd64 go -C app-win7 build -o ../dist/SoftBox-win7.exe ./cmd/softbox"
|
||||
|
||||
echo "==> 当前目录: $PWD"
|
||||
|
||||
echo "==> 同步依赖"
|
||||
"${INSTALL_CMD[@]}"
|
||||
eval "$INSTALL_CMD"
|
||||
|
||||
echo "==> 运行基础验证"
|
||||
"${VERIFY_CMD[@]}"
|
||||
eval "$VERIFY_CMD"
|
||||
|
||||
echo "==> 启动命令"
|
||||
printf ' %q' "${START_CMD[@]}"
|
||||
printf '\n'
|
||||
printf ' %s\n' "$START_CMD"
|
||||
|
||||
if [ "${RUN_START_COMMAND:-0}" = "1" ]; then
|
||||
echo "==> 启动应用"
|
||||
exec "${START_CMD[@]}"
|
||||
eval "$START_CMD"
|
||||
exit $?
|
||||
fi
|
||||
|
||||
echo "如果希望 init.sh 直接启动应用,请设置 RUN_START_COMMAND=1。"
|
||||
|
||||
Reference in New Issue
Block a user