chore: archive completed checklist and add CLI go plan
- archive completed ZHI_TASKS checklist - move HarborForge CLI planning into main repository - update backend/frontend submodules for account role changes
This commit is contained in:
Submodule HarborForge.Backend updated: 7d42d567d1...271d5140e6
Submodule HarborForge.Frontend updated: 50563f2b3d...fd28bb6b6f
325
plans/harborforge-cli-go-plan.md
Normal file
325
plans/harborforge-cli-go-plan.md
Normal file
@@ -0,0 +1,325 @@
|
||||
# HarborForge CLI (Go Binary) Plan
|
||||
|
||||
## Goal
|
||||
|
||||
Build a **Go-based HarborForge CLI binary**.
|
||||
|
||||
This CLI is intended to work in two modes:
|
||||
|
||||
1. **With padded-cell / pass_mgr available**
|
||||
- agents can use it directly
|
||||
- secrets and generated credentials can be managed automatically
|
||||
2. **Without padded-cell installed**
|
||||
- humans can still use it by explicitly passing tokens/passwords
|
||||
|
||||
> Important: do **not** directly migrate the old Python CLI from `HarborForge.Backend/cli.py` as-is.
|
||||
> The old CLI is only a reference for existing command coverage.
|
||||
> The new CLI should be implemented as a standalone Go binary.
|
||||
|
||||
---
|
||||
|
||||
## High-Level Direction
|
||||
|
||||
- Language: **Go**
|
||||
- Delivery: **single binary**
|
||||
- Config file: `.hf-config.json`
|
||||
- Config location: **same directory as the CLI binary**
|
||||
- Secret manager integration: `pass_mgr`
|
||||
- Design goal:
|
||||
- compatible with automated agent usage
|
||||
- also usable manually without padded-cell/pass_mgr
|
||||
|
||||
---
|
||||
|
||||
## Binary / Config Model
|
||||
|
||||
Assume CLI name is placeholder `<cli-name>` for now.
|
||||
|
||||
### Config file location
|
||||
|
||||
The command:
|
||||
|
||||
```bash
|
||||
<cli-name> config --url <hf-url>
|
||||
```
|
||||
|
||||
must write:
|
||||
|
||||
```json
|
||||
{
|
||||
"base-url": "<hf-url>"
|
||||
}
|
||||
```
|
||||
|
||||
into:
|
||||
|
||||
```text
|
||||
<binary-dir>/.hf-config.json
|
||||
```
|
||||
|
||||
That means config resolution is based on the **directory where the binary lives**, not cwd and not home directory.
|
||||
|
||||
### Config contents (initial)
|
||||
|
||||
```json
|
||||
{
|
||||
"base-url": "http://127.0.0.1:8000"
|
||||
}
|
||||
```
|
||||
|
||||
Initial config scope is intentionally small.
|
||||
|
||||
---
|
||||
|
||||
## CLI Command Requirements
|
||||
|
||||
## 1. Config command
|
||||
|
||||
### Set HarborForge base URL
|
||||
|
||||
```bash
|
||||
<cli-name> config --url <hf-url>
|
||||
```
|
||||
|
||||
Behavior:
|
||||
- write/update `base-url` in `<binary-dir>/.hf-config.json`
|
||||
|
||||
### Set account-manager token through pass_mgr
|
||||
|
||||
```bash
|
||||
<cli-name> config --acc-mgr-token <token>
|
||||
```
|
||||
|
||||
Behavior:
|
||||
- execute:
|
||||
|
||||
```bash
|
||||
pass_mgr set --public --key hf-acc-mgr-token --secret $token
|
||||
```
|
||||
|
||||
If this fails, terminate with:
|
||||
|
||||
```text
|
||||
--acc-mgr-token can only be set with padded-cell plugin
|
||||
```
|
||||
|
||||
This is intentionally a hard error because this path depends on `pass_mgr` availability.
|
||||
|
||||
---
|
||||
|
||||
## 2. Normal authenticated commands
|
||||
|
||||
General form:
|
||||
|
||||
```bash
|
||||
<cli-name> <command> <arg> [--token <token>]
|
||||
```
|
||||
|
||||
### Token resolution order
|
||||
|
||||
1. If `--token <token>` is explicitly provided, use it.
|
||||
2. Otherwise try:
|
||||
|
||||
```bash
|
||||
pass_mgr get-secret --key hf-token
|
||||
```
|
||||
|
||||
If this fails, print stderr and terminate with exactly:
|
||||
|
||||
```text
|
||||
--token <token> required or execute this with pcexec
|
||||
```
|
||||
|
||||
### Notes
|
||||
|
||||
- Normal API commands should support optional `--token`
|
||||
- They should also support agent-oriented execution when `pass_mgr` exists
|
||||
- They should remain usable manually when users explicitly provide `--token`
|
||||
|
||||
---
|
||||
|
||||
## 3. Special command: create-account
|
||||
|
||||
Command shape:
|
||||
|
||||
```bash
|
||||
<cli-name> create-account --user <username> [--pass <password>] [--acc-mgr-token <account-mgr-token>]
|
||||
```
|
||||
|
||||
### Special rules
|
||||
|
||||
- `create-account` **cannot** accept `--token`
|
||||
- `create-account` should **not** attempt normal token auto-resolution
|
||||
- It uses **account-manager token** instead of the normal user token flow
|
||||
|
||||
### Password resolution
|
||||
|
||||
If `--pass <password>` is not explicitly provided, try:
|
||||
|
||||
```bash
|
||||
pass_mgr generate --key hf --username $username
|
||||
```
|
||||
|
||||
If this fails, print stderr and terminate with exactly:
|
||||
|
||||
```text
|
||||
--pass <password> required or execute with pcexec
|
||||
```
|
||||
|
||||
### Account-manager token resolution
|
||||
|
||||
If `--acc-mgr-token <token>` is not explicitly provided, try:
|
||||
|
||||
```bash
|
||||
pass_mgr get-secret --public --key hf-acc-mgr-token
|
||||
```
|
||||
|
||||
If this fails, print stderr and terminate with exactly:
|
||||
|
||||
```text
|
||||
--acc-mgr-token <token> required or execute with pcexec
|
||||
```
|
||||
|
||||
### Purpose
|
||||
|
||||
This command is meant to work very naturally with padded-cell-driven agent flows while still allowing manual operator input.
|
||||
|
||||
---
|
||||
|
||||
## pass_mgr Integration Rules
|
||||
|
||||
The CLI should treat `pass_mgr` as an optional capability.
|
||||
|
||||
### With padded-cell / pass_mgr
|
||||
|
||||
Expected conveniences:
|
||||
- persistent token lookup from `hf-token`
|
||||
- public account-manager token lookup from `hf-acc-mgr-token`
|
||||
- password generation via `pass_mgr generate`
|
||||
|
||||
### Without padded-cell / pass_mgr
|
||||
|
||||
Expected fallback:
|
||||
- users manually pass `--token`
|
||||
- users manually pass `--pass`
|
||||
- users manually pass `--acc-mgr-token`
|
||||
|
||||
### Error philosophy
|
||||
|
||||
Do not silently ignore secret-manager failures.
|
||||
If the command depends on pass_mgr fallback and it is unavailable, fail with the exact operator-facing messages defined above.
|
||||
|
||||
---
|
||||
|
||||
## Backend / Permission Requirements
|
||||
|
||||
The new CLI plan implies backend support for an **account-manager** capability.
|
||||
|
||||
### New protected default role
|
||||
|
||||
In addition to existing undeletable default roles:
|
||||
- `admin`
|
||||
- `guest`
|
||||
|
||||
add:
|
||||
- `account-manager`
|
||||
|
||||
### account-manager semantics
|
||||
|
||||
- role is part of initial bootstrap/default roles
|
||||
- role cannot be deleted
|
||||
- role permissions should be limited to:
|
||||
- **create account**
|
||||
|
||||
This is intentionally narrow.
|
||||
It should not inherit general admin privileges.
|
||||
|
||||
### Backend work implied by this plan
|
||||
|
||||
- seed `account-manager` during initial role setup
|
||||
- protect it from deletion the same way default protected roles are protected
|
||||
- add a backend permission / route policy for account creation by account-manager
|
||||
- make sure CLI `create-account` maps onto this backend capability cleanly
|
||||
|
||||
---
|
||||
|
||||
## Proposed CLI Implementation Phases
|
||||
|
||||
## Phase 1 — Foundation
|
||||
|
||||
- create Go module
|
||||
- add binary entrypoint
|
||||
- add config loader/saver for `<binary-dir>/.hf-config.json`
|
||||
- add HTTP client wrapper
|
||||
- add token resolution helpers
|
||||
- add pass_mgr execution wrapper
|
||||
- define clear error handling / stderr behavior
|
||||
|
||||
## Phase 2 — Auth + Config Flows
|
||||
|
||||
- implement `config --url`
|
||||
- implement `config --acc-mgr-token`
|
||||
- implement shared `--token` resolution behavior
|
||||
- implement request auth injection
|
||||
|
||||
## Phase 3 — Account Creation Flow
|
||||
|
||||
- implement `create-account`
|
||||
- support `--user`
|
||||
- support optional `--pass`
|
||||
- support optional `--acc-mgr-token`
|
||||
- add pass_mgr-backed fallback logic
|
||||
- enforce exact required error messages
|
||||
|
||||
## Phase 4 — Command Expansion
|
||||
|
||||
Use existing `HarborForge.Backend/cli.py` only as feature inventory reference.
|
||||
Do **not** copy its architecture directly.
|
||||
|
||||
Potential later commands:
|
||||
- projects
|
||||
- users
|
||||
- milestones
|
||||
- tasks
|
||||
- proposes
|
||||
- monitor-related commands
|
||||
- health / version
|
||||
|
||||
## Phase 5 — Hardening
|
||||
|
||||
- tests for config path resolution
|
||||
- tests for pass_mgr failure behavior
|
||||
- tests for explicit token/password override behavior
|
||||
- tests for exact stderr messages
|
||||
- packaging / release pipeline for binary builds
|
||||
|
||||
---
|
||||
|
||||
## Open Questions
|
||||
|
||||
1. Final binary name:
|
||||
- `harborforge`
|
||||
- `hf`
|
||||
- `harborforge-cli`
|
||||
- or another name
|
||||
|
||||
2. `create-account` backend API contract:
|
||||
- new dedicated route?
|
||||
- or reuse/extend current user creation route?
|
||||
|
||||
3. Whether normal token lookup should support additional fallbacks later:
|
||||
- env var
|
||||
- config file token
|
||||
- OS keychain
|
||||
|
||||
Current plan intentionally keeps fallback logic narrow and explicit.
|
||||
|
||||
---
|
||||
|
||||
## Non-Goals (for now)
|
||||
|
||||
- do not directly port old Python CLI architecture
|
||||
- do not require padded-cell for all usage
|
||||
- do not store auth token in `.hf-config.json`
|
||||
- do not make `account-manager` an admin-like role
|
||||
- do not broaden account-manager permissions beyond account creation in the initial design
|
||||
Reference in New Issue
Block a user