Files
summercms/.planning/phases/04-cli-scaffolding-i18n-and-mail/04-01-SUMMARY.md
Jakub Zych 6ce67a5d5b docs(04-01): complete CLI scaffolding plan
Tasks completed: 3/3
- Prove and create the compiling Winter-shaped plugin path
- Generate model, migration, and command slices
- Generate jobs and admin controllers, then enforce model imports

SUMMARY: .planning/phases/04-cli-scaffolding-i18n-and-mail/04-01-SUMMARY.md
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-18 13:42:00 +02:00

148 lines
6.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
phase: 04-cli-scaffolding-i18n-and-mail
plan: 01
subsystem: cli
tags: [scaffold, make, registry, gormigrate, bonfire, pact, wintercms]
requires:
- phase: 01-framework-kernel-foundation
provides: make:plugin, plugin:add, summer build, party.Plugin, pact capabilities
provides:
- six make commands that emit compiling Winter-shaped plugin artifacts
- generated per-plugin registry.gen.go accessors
- models-leaf sibling-import check in summer build
- pact Job, AdminController, HasLang, and HasMailTemplates contracts
affects: [04-02-i18n, 04-03-mail, 04-04-tests, plugin-porting]
tech-stack:
added: []
patterns:
- embedded text/template stubs under internal/build/stubs
- atomic registry.gen.go refresh from generated leaf constructors
- models/ is a leaf package enforced at build time
key-files:
created:
- internal/build/registry.go
- internal/build/leaf.go
- internal/build/artifact.go
- internal/build/stubs/plugin.tmpl
- internal/build/stubs/registry.tmpl
- internal/build/stubs/artifacts.tmpl
modified:
- internal/build/scaffold.go
- internal/build/build.go
- internal/build/build_test.go
- cmd/summer/main.go
- cmd/summer/main_test.go
- pact/capabilities.go
- bonfire/command.go
- bonfire/root.go
key-decisions:
- "registry.gen.go is regenerated by scanning Code generated by summer make files, not by rewriting plugin.go"
- "make:model table names are vendor_plugin_plural_snake with explicit gormigrate CREATE/DROP TABLE"
- "models sibling-import check runs in build.App before go build and reports plugin ID, file, and import"
patterns-established:
- "Generated plugin.go calls generatedModels/Migrations/Commands/Jobs/AdminControllers; handwritten plugins get a one-time accessor hint"
- "Stub sources render from named embedded templates and pass go/format before write"
requirements-completed: [CLI-02]
duration: 11 min
completed: 2026-09-18
---
# Phase 4 Plan 01: CLI scaffolding Summary
**Six `summer make:*` commands emit Winter-shaped, vet-clean plugin artifacts wired through `registry.gen.go`, and `summer build` rejects `models/` sibling imports by plugin ID, file, and path**
## Performance
- **Duration:** 11 min
- **Started:** 2026-09-18T11:29:54Z
- **Completed:** 2026-09-18T11:41:29Z
- **Tasks:** 3
- **Files modified:** 14
## Accomplishments
- `make:plugin` now scaffolds the Winter directory shape: root `plugin.go`/`routes.go`, leaf `doc.go` packages, embeddable `config/`, `lang/en/`, and `views/mail/` assets, plus empty `registry.gen.go` accessors
- `make:model`, `make:migration`, `make:command`, `make:job`, and `make:admin-controller` write compiling stubs, infer plugin ID from `plugin.go`, refuse duplicates, and refresh sorted registry slices without touching handwritten `plugin.go`
- `summer build` inspects each manifest plugin's `models/` imports before `go build` and fails when a sibling package is imported
## Task Commits
Each task was committed atomically:
1. **Task 1: Prove and create the compiling Winter-shaped plugin path** - `1edf9d7` (feat)
2. **Task 2: Generate model, migration, and command slices** - `d8c5650` (feat)
3. **Task 3: Generate jobs and admin controllers, then enforce model imports** - `c87bbc3` (feat)
**Plan metadata:** (this commit)
## Files Created/Modified
- `pact/capabilities.go` - Job, AdminController, HasLang, HasMailTemplates contracts
- `internal/build/stubs/plugin.tmpl` - named templates for plugin.go, routes.go, leaf doc.go, go.mod
- `internal/build/stubs/registry.tmpl` - generated registry accessors
- `internal/build/stubs/artifacts.tmpl` - model, migration, command, job, admin controller, YAML templates
- `internal/build/scaffold.go` - template-driven MakePlugin Winter layout
- `internal/build/registry.go` - deterministic atomic registry.gen.go generation and scan
- `internal/build/artifact.go` - MakeModel/Migration/Command/Job/AdminController
- `internal/build/leaf.go` - models sibling-import enforcement
- `internal/build/build.go` - runs the leaf check before go build
- `cmd/summer/main.go` - five new make commands plus --no-migration
- `bonfire/command.go`, `bonfire/root.go` - Bare flags so --no-migration needs no value
- `internal/build/build_test.go` - smoke, core artifacts, all-six, and leaf rejection tests
## Decisions Made
- Registry ownership stays in generated files marked `Code generated by summer make`; handwritten `plugin.go` is never rewritten and existing plugins receive an accessor hint
- Model tables are `{vendor}_{plugin}_{plural_snake}` with timestamps and an explicit gormigrate create/drop migration; `--no-migration` omits only that file
- Job stubs implement `pact.JobArgs.Kind` and `pact.Job.Work` with an unexpected-type error and no River import
- Admin stubs implement ID/ModelName/ConfigDir and write `controllers/<name>/fields.yaml` plus `columns.yaml`
## Deviations from Plan
### Auto-fixed Issues
**1. [Rule 3 - Blocking] Bare flag support for --no-migration**
- **Found during:** Task 2 (make:model --no-migration)
- **Issue:** bonfire only registered cobra string flags, so `--no-migration` required a value and could not match D-13
- **Fix:** Added `Flag.Bare` and cobra `NoOptDefVal=true` so `--no-migration` is a valueless true flag
- **Files modified:** `bonfire/command.go`, `bonfire/root.go`, `cmd/summer/main.go`
- **Verification:** `TestScaffoldCoreArtifacts` omits only the model migration; `go test ./bonfire` still green
- **Committed in:** `d8c5650` (Task 2 commit)
**2. [Rule 2 - Missing Critical] Artifact helpers live in artifact.go**
- **Found during:** Task 2
- **Issue:** Plan listed Make* work on `scaffold.go`; adding five generators there would bury path validation and registry refresh
- **Fix:** Keep MakePlugin in `scaffold.go` and put make:model/migration/command/job/admin-controller in `internal/build/artifact.go`
- **Files modified:** `internal/build/artifact.go`
- **Verification:** All make tests pass through the exported Make* APIs used by cmd/summer
- **Committed in:** `d8c5650` / `c87bbc3`
---
**Total deviations:** 2 auto-fixed (1 blocking, 1 missing critical)
**Impact on plan:** No behavior divergence from D-10–D-17. Bare flags were required for the documented `--no-migration` UX.
## Issues Encountered
None
## User Setup Required
None - no external service configuration required.
## Next Phase Readiness
Ready for 04-02 (phrasebook / i18n). Generated plugins already implement `pact.HasLang` and `pact.HasMailTemplates` with embeddable assets. Unit-test coverage remains the last plan (04-04).
## Verification
- `go test ./internal/build ./cmd/summer -run 'TestScaffoldPluginSmoke|TestScaffoldCoreArtifacts|TestScaffoldAllArtifacts|TestModelsLeaf|TestToolCommandNames' -short -count=1` — PASS
- `go vet ./... && go test ./...` — PASS
## Self-Check: PASSED
---
*Phase: 04-cli-scaffolding-i18n-and-mail*
*Completed: 2026-09-18*