Compare commits

..

92 Commits

Author SHA1 Message Date
f1a0e212e6 bump HarborForge.PlexumPlugin → bc1ab7b
snake_case SlotStatus alignment + scheduler decision logs (see
plugin repo's commit for the sim e2e findings).
2026-06-03 11:42:28 +01:00
459eca66af bump HarborForge.PlexumPlugin → 78b1ec5
Real HF backend contract alignment + sim-discovered bug fixes:
- per-agent heartbeat (header auth) replacing initial-drop guess
- bgCtx capture so background goroutines outlive Init
- toolRestartStatus stub (HF has no restart endpoint)
- scheduler tick + heartbeat outcome logs at info level
2026-06-03 11:28:14 +01:00
ed72bb91ae add HarborForge.PlexumPlugin submodule
Plexum-side counterpart to HarborForge.OpenclawPlugin. Pins to the
plugin repo's main branch (initial commit). Tracked separately from
HarborForge.OpenclawPlugin — the two plugins run side by side during
the OpenClaw → Plexum migration window.

Operator install:

  cd HarborForge.PlexumPlugin
  bash scripts/install.sh

writes a binary + manifest into ~/.plexum/plugins/harbor-forge/.
2026-06-03 11:11:54 +01:00
627ffcf2fa Bump HarborForge.Backend to Tessera bearer support
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-02 16:57:57 +01:00
4c5c948a24 chore: bump Backend/Cli/Frontend → main (KnowledgeBase + security-audit merges)
Backend 88779d2→1a5a3ed, Cli c0ab087→729365c, Frontend 04bb0c6→bcdf1cb.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-01 09:25:28 +01:00
5dda196da2 chore(submodules): bump HarborForge.Backend (users require_admin api-key auth) 2026-05-29 08:55:46 +01:00
5d7d83a433 chore(submodules): bump HarborForge.OpenclawPlugin (#12: installCli git-clone refactor) 2026-05-29 08:52:42 +01:00
71250e2ea1 chore(submodules): bump HarborForge.Cli + HarborForge.OpenclawPlugin
- HarborForge.Cli: pull main → c0ab087 (PR #8: assign-schedule-type dispatch fix)
- HarborForge.OpenclawPlugin: pull main → c8998c6 (PR #11: meta-push perf — cached api.config)
2026-05-29 08:50:00 +01:00
836bc17fd3 chore: bump Backend + Cli (project.create gate trifecta)
* HarborForge.Backend 01f6b56 → HEAD
  fix(projects): perm-gate create + apikey-via-Bearer + introspect with apikey.
  - POST /projects checks project.create perm (was hardcoded is_admin)
  - /auth/me/permissions accepts API key (was JWT-only → broke hf-cli local gate)
  - get_current_user_or_apikey falls back to API-key lookup when Authorization:
    Bearer fails JWT decode (hf-cli only emits Bearer headers)
  - init_bootstrap seeds project.create perm + assigns to mgr role
* HarborForge.Cli      a42ba6f
  fix(cli): gate `hf project create` on project.create (was project.write).

prod e2e verified: nav (mgr) /auth/me/permissions returns 26 perms
including project.create; POST /projects with nav API key returns 201.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-24 22:10:49 +01:00
52de061570 chore: bump Backend → 01f6b56 (seed 3 perms missing from catalog)
* HarborForge.Backend 595391b → 01f6b56
  fix(bootstrap): seed member.remove + schedule_type.read + schedule_type.manage
  into DEFAULT_PERMISSIONS — code enforced them but Role Editor couldn't
  show them. No default-role changes.

prod hf_backend v0.4.3 live; the 3 rows are now in the permissions
table on t1.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-24 21:18:49 +01:00
79be9f34c3 chore: bump Backend + Frontend submodule pointers
* HarborForge.Backend  54feb96 → 595391b
  feat(users): auto-default agent accounts to general-agent role
  (POST /users with agent_id sets role=general-agent, was guest).
  Also seeds general-agent in init_bootstrap _DEFAULT_ROLES.

* HarborForge.Frontend 766474f → 04bb0c6
  feat(role-editor): "Use as template" — copy another role's perm set
  Pick from dropdown → click button → replaces all checkboxes locally
  (save still required to persist).

prod cutover: hf_backend v0.4.2 + hf_frontend v0.4.3 live on t1.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-24 19:40:00 +01:00
45e7615b25 chore: bump HarborForge.Frontend (role editor dark-theme redesign)
* HarborForge.Frontend f587e1e → HEAD
  style(role-editor): rewrite on Foundry Deck tokens — fixes unreadable
  role names + faded check cards + washed-out banner.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-24 19:26:01 +01:00
ed952bdf77 chore: bump HarborForge.Frontend → f587e1e (drop localStorage backend URL)
* HarborForge.Frontend 10771a8 → f587e1e
  fix(frontend): drop localStorage HF_BACKEND_BASE_URL; env-only.
  Fixes new-browser blank MonitorPage / api 404 after v0.4.0 wizard removal
  (api.ts + useAuthConfig still had the old localStorage path; App.tsx had
  been refactored but those two were missed). All 3 read sites now read
  import.meta.env.VITE_HF_BACKEND_BASE_URL only.

prod is on frontend v0.4.1 with this fix.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-24 19:18:33 +01:00
b4856cea05 chore: bump HarborForge.Backend → 54feb96 (CLI model-import fix)
* HarborForge.Backend 5ea2cdf → 54feb96
  fix(cli): import all model modules so SA relationship resolution works
  (hf-cli admin list crashed with KeyError: Agent on prod cutover, fixed
   by mirroring main.py's startup() bulk-import in cli/__main__.py).

prod is on v0.4.1 with this fix in place.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-24 19:11:33 +01:00
87f908f16f chore: bump 4 submodule pointers — wizard removal + supporting work
* HarborForge.Backend  90b494f → 5ea2cdf  feat(backend)!: kill AbstractWizard, env-driven config + hf-cli
* HarborForge.Frontend aaf36a4 → 10771a8  feat(frontend)!: drop SetupWizardPage, backend URL via build-time VITE_*
* HarborForge.Cli      8dd58ba → b0f4aa2  feat(cli): hf user create --agent-id/--claw-identifier + hf user bind-agent
* HarborForge.OpenclawPlugin c9f6141 → c2d00c1  feat(hf-plugin): __hfAgentStatus.hasOnCallCovering(agentId, from, to)

Cuts off AbstractWizard entirely at this submodule snapshot: backend +
frontend bootstrap is operator-driven via `docker exec hf_backend hf-cli
admin create-user ...` and `hf-cli config oidc ...`.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-24 19:04:32 +01:00
5f6c526af2 docs: translate top-level README to English
Match the language of the submodule READMEs; content unchanged
(structure, tables, links, ports, security notes preserved).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-16 18:32:21 +01:00
f7adf66fa4 chore: bump all 7 submodule pointers to latest main
Sync umbrella refs after merging the README refresh (all submodules),
backend security hardening, and frontend Foundry Deck redesign into
their respective mains.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-16 17:57:30 +01:00
05f1af6c0e Merge docs/readme-refresh into main
Rewrite top-level README (full 7-submodule map, corrected architecture/
ports/model, security notes). No conflicts: remote commits touched only
submodule pointers, this branch only README.md.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-16 17:54:09 +01:00
d69bd5213c docs: rewrite top-level README — full component map
List all 7 submodules with stack/role, correct architecture and ports,
replace stale Issues model with tasks/milestones/proposals, add Security
notes (mandatory strong SECRET_KEY) and cross-links to component READMEs.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-16 17:50:52 +01:00
zhi
e8c7f36950 chore: bump HarborForge.OpenclawPlugin submodule to latest main
Submodule changes:
- ESM conversion (type:module + nodenext + .js extensions everywhere)
- Migrated default export to definePluginEntry per current openclaw plugin
  authoring contract; modernized openclaw.plugin.json (drop entry/version,
  add activation.onStartup, declare contracts.tools).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-08 08:29:44 +00:00
h z
0ea665331a Merge pull request 'zhi-2026-04-18' (#8) from zhi-2026-04-18 into main
Reviewed-on: #8
2026-05-08 08:14:23 +00:00
zhi
12faa805c3 chore: update Backend + Cli submodules — schedule type system
Backend: schedule_types table, CRUD API, agent assignment API
Cli: schedule-type list/create/delete + assign-schedule-type commands

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-21 09:26:02 +00:00
zhi
d8564adafb chore: update Backend + OpenclawPlugin submodules
Backend: add /calendar/sync endpoint for multi-agent schedule sync
Plugin: multi-agent scheduler with dispatchInboundMessage wakeup

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-19 09:32:48 +00:00
zhi
482462fa4d chore: update OpenclawPlugin submodule — revert Discord wakeup, keep spawn
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-18 20:45:47 +00:00
zhi
0dc968e625 chore: update OpenclawPlugin submodule — Discord wakeup
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-18 20:29:10 +00:00
zhi
d99bece398 chore: update OpenclawPlugin submodule — schedule cache + sync
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-18 17:45:39 +00:00
zhi
7e0ab6e1fd chore: update OpenclawPlugin submodule ref
Points to zhi-2026-04-18 branch with daily-routine workflow prompts.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-18 17:31:49 +00:00
19174c899e quick fix 2026-04-15 07:14:36 +01:00
zhi
b9242a1588 chore: update HarborForge.Test submodule pointer to main head 2026-04-05 22:18:03 +00:00
zhi
08cae38b42 chore: update HarborForge submodule pointers 2026-04-05 22:14:41 +00:00
h z
e42926ec65 Merge pull request 'dev-2026-03-29' (#7) from dev-2026-03-29 into main
Reviewed-on: #7
2026-04-05 22:11:44 +00:00
27817fb0b9 chore: bump HarborForge component pointers for code-first indexing 2026-04-03 16:25:48 +00:00
zhi
7b3eb7b940 TEST-CLI-CAL-001 TEST-CLI-PR-001 complete CLI test tasks 2026-04-01 12:03:37 +00:00
zhi
fbc88f908b TEST-FE-PR-001: Mark task as completed
- Essential 列表与表单 ✓
- Accept milestone 选择 ✓
- story 创建入口限制 ✓
2026-04-01 11:41:56 +00:00
zhi
bdb8586612 TEST-FE-CAL-001 complete calendar frontend test coverage 2026-04-01 11:06:05 +00:00
zhi
69b2d2774e TEST-BE-CAL-001 record calendar backend test completion 2026-04-01 10:35:57 +00:00
zhi
dced5bbcd3 TEST-BE-PR-001 verify backend proposal tests 2026-04-01 10:04:50 +00:00
zhi
77fc66c0fc PLG-CAL-004: Mark task as complete - ScheduledGatewayRestart handling
- Update submodule to include state persistence and restart handling
- Mark PLG-CAL-004 tasks as complete in TASKLIST.md
2026-04-01 09:41:24 +00:00
zhi
8a886a1dff PLG-CAL-003 complete plugin deferred replanning 2026-04-01 08:52:16 +00:00
zhi
ac94f7aa32 PLG-CAL-002: Mark task as complete
- Update TASKLIST.md to mark PLG-CAL-002 as completed
- Plugin submodule updated with scheduler implementation
2026-04-01 08:45:38 +00:00
zhi
0b7fb3a002 chore: mark PLG-CAL-001 complete in TASKLIST.md
- PLG-CAL-001: Calendar heartbeat format — all 3 sub-items completed:
  claw_identifier 传递方式 / agent_id 传递方式 / slot 列表结构
- Spec documented in HarborForge.OpenclawPlugin/docs/PLG-CAL-001-calendar-heartbeat-format.md
2026-04-01 07:52:39 +00:00
zhi
28b21c96c4 feat(OpenclawPlugin): PLG-CAL-001: Calendar heartbeat format — submodule update
Update HarborForge.OpenclawPlugin to commit 55d7d11:
- plugin/calendar/types.ts: heartbeat request/response TypeScript types
- plugin/calendar/calendar-bridge.ts: CalendarBridgeClient HTTP client
- plugin/calendar/index.ts: module exports
- docs/PLG-CAL-001-calendar-heartbeat-format.md: full format specification
- plugin/openclaw.plugin.json: calendar config options

Ref: HarborForge.NEXT_WAVE_DEV_DIRECTION.md §6, PLG-CAL-001
2026-04-01 07:52:07 +00:00
zhi
fec154f14f CLI-CAL-001/002/003/004/005/006/007/008/009/010: Calendar CLI commands 2026-04-01 07:02:47 +00:00
zhi
15360f2a4b CLI-PR-001/002/003/004: Proposal rename, Essential commands, story restriction 2026-04-01 06:56:30 +00:00
zhi
50fdd0f50b FE-CAL-004/005: Calendar create/edit/cancel + status warnings 2026-04-01 06:50:11 +00:00
zhi
a540506752 FE-CAL-001/002/003: Calendar page skeleton with slot list and plans view 2026-04-01 06:48:22 +00:00
zhi
1bc9ba7dab Update Frontend submodule: FE-PR-005 story restriction 2026-04-01 06:46:27 +00:00
zhi
cd137f3b69 FE-PR-003/004/005: Mark existing Essential forms & Accept modal done; remove story from task creation
- FE-PR-003: Essential create/edit modal with type selector and partial refresh already implemented in ProposalDetailPage
- FE-PR-004: Accept modal with milestone selector and generated tasks display already implemented
- FE-PR-005: Remove 'story' from TASK_TYPES in CreateTaskPage and CreateTaskModal - all story/* must come from Proposal Accept workflow
2026-04-01 06:46:01 +00:00
zhi
75ccb17742 FE-PR-002: Mark task as completed in TASKLIST.md 2026-04-01 06:28:52 +00:00
zhi
235d636fee FE-PR-002: Update Frontend submodule for Essential list feature 2026-04-01 06:25:54 +00:00
zhi
86250e0c0f FE-PR-001: Update Frontend submodule - Propose -> Proposal rename 2026-04-01 04:46:50 +00:00
zhi
c9fe8f1f51 BE-AGT-004 complete exhausted recovery parsing 2026-04-01 04:18:48 +00:00
zhi
fe7b1408ad BE-AGT-003: mark task complete, update Backend submodule ref 2026-04-01 02:50:20 +00:00
zhi
dafac0305d BE-AGT-002: mark task complete, update Backend submodule ref 2026-04-01 00:46:23 +00:00
zhi
b1ea8ccccd BE-AGT-001: mark task complete, update backend submodule 2026-03-31 23:01:52 +00:00
zhi
c73fd07295 BE-CAL-API-007: update submodule ref and mark task complete 2026-03-31 20:46:53 +00:00
zhi
b5cdd5c3c2 BE-CAL-API-006: implement plan-edit and plan-cancel API endpoints
- PATCH /calendar/plans/{plan_id}: edit a recurring schedule plan
  - Validates period-parameter hierarchy after merge
  - Rejects edits to inactive (cancelled) plans
  - Detaches future materialized slots so they keep old data
  - Past materialized slots remain untouched

- POST /calendar/plans/{plan_id}/cancel: cancel (soft-delete) a plan
  - Sets is_active=False
  - Detaches future materialized slots (plan_id -> NULL)
  - Preserves past materialized slots, returns their IDs

- Added SchedulePlanEdit and SchedulePlanCancelResponse schemas
- Imported guard_plan_edit/cancel_no_past_retroaction from slot_immutability
2026-03-31 16:46:22 +00:00
zhi
e74bde118a Update Backend submodule: BE-CAL-API-005 2026-03-31 14:47:21 +00:00
zhi
9378a63af2 BE-CAL-API-005: implement plan-schedule / plan-list API
- Add SchedulePlanCreate, SchedulePlanResponse, SchedulePlanListResponse schemas
- Add DayOfWeekEnum, MonthOfYearEnum schema enums
- Add POST /calendar/plans endpoint (create plan with hierarchy validation)
- Add GET /calendar/plans endpoint (list plans, optional include_inactive)
- Add GET /calendar/plans/{plan_id} endpoint (get single plan)
- Mark BE-CAL-API-005 complete in TASKLIST.md
2026-03-31 14:46:45 +00:00
zhi
82331aeda2 BE-CAL-API-004: Implement Calendar cancel API for real and virtual slots
- Add POST /calendar/slots/{slot_id}/cancel for real slot cancellation
- Add POST /calendar/slots/virtual/{virtual_id}/cancel for virtual slot cancellation
- Virtual cancel materializes the slot first, then marks as Skipped
- Both endpoints enforce past-slot immutability guard
- Both endpoints detach from plan (set plan_id=NULL)
- Status set to SlotStatus.SKIPPED on cancel
- Add TimeSlotCancelResponse schema
- Import guard_cancel_real_slot and guard_cancel_virtual_slot
2026-03-31 12:47:56 +00:00
zhi
fb3fa0ca11 BE-CAL-API-003: implement Calendar edit API for real and virtual slots
- Add TimeSlotEdit schema (partial update, all fields optional)
- Add TimeSlotEditResponse schema
- Add PATCH /calendar/slots/{slot_id} for editing real slots
- Add PATCH /calendar/slots/virtual/{virtual_id} for editing virtual slots
  - Triggers materialization before applying edits
  - Detaches from plan after edit
- Both endpoints enforce:
  - Past-slot immutability guard
  - Overlap detection (excluding self)
  - Plan detachment on edit
  - Workload warnings in response
2026-03-31 10:46:19 +00:00
zhi
cfed3a07ed BE-CAL-API-002: Implement calendar day-view query API
- Add GET /calendar/day endpoint with optional ?date= query param
- Returns unified CalendarDayResponse merging real slots + virtual plan slots
- New CalendarSlotItem schema supports both real (id) and virtual (virtual_id) slots
- Excludes inactive slots (skipped/aborted) from results
- All slots sorted by scheduled_at ascending
2026-03-31 07:19:01 +00:00
zhi
80afdd1c6a BE-CAL-API-001: Update submodule ref + mark task complete 2026-03-31 05:46:03 +00:00
zhi
4309e3d39c BE-CAL-API-001: Implement single slot creation API
- Add TimeSlotCreate, TimeSlotResponse, TimeSlotCreateResponse schemas
- Add SlotConflictItem, SlotTypeEnum, EventTypeEnum, SlotStatusEnum to schemas
- Add POST /calendar/slots endpoint with:
  - Overlap detection (409 on conflict)
  - Workload warning computation (advisory, returned in response)
  - Support for event_type + event_data (job/system/entertainment)
  - Default date to today if not provided
- Add _slot_to_response helper for ORM -> schema conversion
2026-03-31 05:45:51 +00:00
zhi
9deb1bf8d5 BE-CAL-007 + BE-CAL-008: mark completed, update Backend submodule 2026-03-31 04:16:58 +00:00
zhi
b14366ebd1 BE-CAL-006: mark overlap detection task complete in TASKLIST 2026-03-31 01:18:01 +00:00
zhi
bbe651c3e3 Update Backend submodule: BE-CAL-005 plan virtual-slot materialization 2026-03-30 23:47:15 +00:00
zhi
a5ec32656e BE-CAL-005: Implement plan virtual-slot identification and materialization
- Virtual slot ID: plan-{plan_id}-{YYYY-MM-DD} format with parse/make helpers
- Plan-date matching: on_month/on_week/on_day hierarchy with week_of_month calc
- Materialization: convert virtual slot to real TimeSlot row, copy plan template
- Detach: clear plan_id after edit/cancel to break plan association
- Bulk materialization: materialize_all_for_date for daily pre-compute
- 23 tests covering all paths (matching, virtual gen, materialize, detach, bulk)
2026-03-30 23:46:51 +00:00
zhi
8b90c7d7f2 BE-CAL-004: update submodule pointer + mark task complete in TASKLIST 2026-03-30 22:27:15 +00:00
zhi
f984b6ddb4 BE-CAL-003: Agent model with status/heartbeat/exhausted fields (backend submodule) 2026-03-30 20:47:56 +00:00
zhi
6a4e7a7c0f Mark BE-CAL-002 complete in TASKLIST.md 2026-03-30 19:16:33 +00:00
zhi
c33a1e7739 BE-CAL-001: Mark TimeSlot model task complete, update Backend submodule 2026-03-30 17:45:22 +00:00
zhi
963a5dc20d BE-PR-011: Mark Proposal/Essential/Story restricted tests complete
- Updated HarborForge.Backend submodule (test infra fix + 29 passing tests)
- Marked BE-PR-011 complete in TASKLIST.md
2026-03-30 16:17:16 +00:00
zhi
63cb1d284d BE-PR-010: clean up feat_task_id semantics — deprecate with read-only compat
Decision: retain DB column, mark DEPRECATED. Existing rows still return
feat_task_id via API. New accept flow (BE-PR-007) does not write it.
Clients should migrate to generated_tasks / Task.source_proposal_id.

- Backend: model/schema/router deprecation comments updated
- Backend: added docs/BE-PR-010-feat-task-id-deprecation.md
- Tests: updated to work with Essential-based accept flow
- Tests: all 21 proposal tests pass
- TASKLIST: BE-PR-010 marked complete
2026-03-30 12:50:14 +00:00
zhi
03c8b74968 BE-PR-009: restrict all story/* task types + fix test conftest imports 2026-03-30 11:46:28 +00:00
zhi
42703c2401 Mark BE-PR-008 complete in TASKLIST.md 2026-03-30 10:46:38 +00:00
zhi
97031a7a27 Update Backend submodule: BE-PR-008 tracking fields 2026-03-30 10:46:28 +00:00
zhi
45c8d43914 BE-PR-007: mark task complete, update Backend submodule ref 2026-03-30 07:46:28 +00:00
zhi
ce4ce6400f Update Backend submodule ref for BE-PR-006 2026-03-30 07:16:34 +00:00
zhi
f9395fc41c BE-PR-006: Add Essential CRUD API under Proposals
- New router: /projects/{project_id}/proposals/{proposal_id}/essentials
  - GET    (list)   - list all essentials under a proposal
  - POST   (create) - create essential with auto-generated EssentialCode
  - GET    /{id}    - get single essential by id or essential_code
  - PATCH  /{id}    - update essential (title, type, description)
  - DELETE /{id}    - delete essential
- All mutations restricted to open proposals only
- Permission: creator, project owner, or global admin
- Registered essentials router in main.py
- Updated GET /proposals/{id} to return ProposalDetailResponse with
  embedded essentials list
- Activity logging on all CRUD operations
2026-03-30 07:16:21 +00:00
zhi
d52cb44fec Update Backend submodule ref for BE-PR-005 2026-03-30 06:45:30 +00:00
zhi
79b06f2d7d BE-PR-005: Add Essential schema definitions (create/update/response) and ProposalDetailResponse with nested essentials 2026-03-30 06:45:06 +00:00
zhi
b1ddff0743 BE-PR-004: implement EssentialCode encoding rules (submodule update) 2026-03-30 06:16:05 +00:00
zhi
42c59ff62a BE-PR-003: Update Backend submodule ref + mark task complete 2026-03-29 16:33:10 +00:00
zhi
e6c9459e22 BE-PR-003: Add Essential SQLAlchemy model
- New app/models/essential.py with Essential model and EssentialType enum
  (feature, improvement, refactor)
- Fields: id, essential_code (unique), proposal_id (FK to proposes),
  type, title, description, created_by_id (FK to users), created_at, updated_at
- Added essentials relationship to Proposal model (cascade delete-orphan)
- Added essentials table auto-migration in main.py _migrate_schema()
- Registered essential module import in startup()
2026-03-29 16:32:40 +00:00
zhi
619bb07eed chore: update Backend submodule pointer (BE-PR-002) 2026-03-29 16:02:22 +00:00
zhi
86758846bb BE-PR-002: Proposal model naming & field adjustments
- Add comprehensive docstring to Proposal model documenting all relationships
- Add column comments for all fields (title, description, status, project_id, etc.)
- Mark feat_task_id as DEPRECATED (will be replaced by Essential→task mapping in BE-PR-008)
- Add proposal_code hybrid property as preferred alias for DB column propose_code
- Update ProposalResponse schema to include proposal_code alongside propose_code
- Update serializer to emit both proposal_code and propose_code for backward compat
- No DB migration needed — only Python-level changes
2026-03-29 16:02:07 +00:00
zhi
48e52e3419 BE-PR-001: Rename Propose -> Proposal across backend
- Backend: new canonical Proposal model + /proposals router
- Backward-compat shims for old Propose imports and /proposes API
- Tests updated to use /proposals, legacy compat tests added
- Impact checklist: docs/BE-PR-001-rename-impact.md
- TASKLIST.md: BE-PR-001 marked complete

All 21 proposal tests pass.
2026-03-29 15:35:59 +00:00
zhi
0b9767d4a6 DOC-003: 整理 Calendar 验收清单
- 后端验收项: 数据模型、Slot ID 策略与物化、验证规则、不可变性、Calendar API、Agent/心跳协作
- 前端验收项: 页面骨架、日程展示、计划展示、操作交互、状态提示、权限
- CLI 验收项: 命令组、日程/计划操作命令、输出格式、用户创建扩展
- 插件联动验收项: 心跳请求、唤醒逻辑、状态管理、ScheduledGatewayRestart
- 跨模块集成验收项
2026-03-29 15:01:35 +00:00
zhi
ba1349bad4 DOC-002: Proposal/Essential/Story restricted migration guide
- Document Propose → Proposal naming changes across all layers
- Document Proposal Accept semantic change (single task → Essential-based batch)
- Document story/* restricted expansion and impact analysis
- Document feat_task_id deprecation and backward compatibility strategy
- Document migration execution order and rollback plan
2026-03-29 14:32:23 +00:00
zhi
becfc7d719 DOC-001: 整理本波开发范围说明
- 明确 Calendar 为独立功能线,Proposal/Essential 为项目结构调整线
- 明确两条线交叉点仅限 event_data / Agent 调度引用层
- 区分必须本波完成 vs 仅设计保留内容
- 新增 docs/wave-2026-03-scope.md
2026-03-29 14:01:10 +00:00
835605aa42 Merge pull request 'chore/archive-plans-and-next-wave-doc' (#6) from chore/archive-plans-and-next-wave-doc into main
Reviewed-on: #6
2026-03-29 11:45:01 +00:00
10 changed files with 106 additions and 82 deletions

3
.gitmodules vendored
View File

@@ -24,3 +24,6 @@
path = HarborForge.Cli path = HarborForge.Cli
url = https://git.hangman-lab.top/zhi/HarborForge.Cli.git url = https://git.hangman-lab.top/zhi/HarborForge.Cli.git
branch = main branch = main
[submodule "HarborForge.PlexumPlugin"]
path = HarborForge.PlexumPlugin
url = https://git.hangman-lab.top/zhi/HarborForge.PlexumPlugin.git

166
README.md
View File

@@ -1,128 +1,148 @@
# HarborForge # HarborForge
Agent / 人类协同任务管理平台 —— 用严格的状态机管理 提案 → 里程碑 → 任务 的完整生命周期,配套 CLI、监控与 OpenClaw 集成。 Agent / human collaborative task-management platform — manages the full
proposal → milestone → task lifecycle with strict state machines, plus a
CLI, monitoring, and OpenClaw integration.
## 项目结构 ## Repository layout
本仓库是 umbrella 仓库,所有组件以 git 子模块形式组织: This is the umbrella repository; every component is a git submodule:
``` ```
HarborForge/ HarborForge/
├── AbstractWizard/ # Go安全初始化服务SSH 隧道,端口 8080 ├── AbstractWizard/ # Go, secure first-time setup service (SSH tunnel, port 8080)
├── HarborForge.Backend/ # Python/FastAPI,核心 REST API + RBAC(端口 8000 ├── HarborForge.Backend/ # Python/FastAPI, core REST API + RBAC (port 8000)
├── HarborForge.Frontend/ # React + TypeScript + Vite,单页前端(端口 3000 ├── HarborForge.Frontend/ # React + TypeScript + Vite single-page app (port 3000)
├── HarborForge.Cli/ # Go,命令行客户端 `hf` ├── HarborForge.Cli/ # Go command-line client `hf`
├── HarborForge.Monitor/ # Go,主机遥测客户端(可选本地 bridge 9100 ├── HarborForge.Monitor/ # Go host telemetry client (optional local bridge 9100)
├── HarborForge.OpenclawPlugin/ # NodeOpenClaw 插件 `harbor-forge` ├── HarborForge.OpenclawPlugin/ # Node OpenClaw plugin `harbor-forge`
├── HarborForge.Test/ # 集成测试(后端 pytest / 前端 Playwright ├── HarborForge.Test/ # Integration tests (backend pytest / frontend Playwright)
├── docker-compose.yml # Docker 编排配置 ├── docker-compose.yml # Docker orchestration
├── nginx-host.conf.example # 宿主机 nginx 配置示例 ├── nginx-host.conf.example # Host nginx config example
└── .env.example # 环境变量模板 └── .env.example # Environment variable template
``` ```
## 快速开始 ## Quick start
```bash ```bash
# 克隆并初始化所有子模块 # Clone and initialize all submodules
git clone --recurse-submodules https://git.hangman-lab.top/zhi/HarborForge.git git clone --recurse-submodules https://git.hangman-lab.top/zhi/HarborForge.git
cd HarborForge cd HarborForge
# 若已克隆但未初始化子模块: # If already cloned without submodules:
git submodule update --init --recursive git submodule update --init --recursive
# 配置环境变量(不要使用默认值,见“安全”一节) # Configure environment (do NOT use the defaults — see "Security")
cp .env.example .env cp .env.example .env
# 编辑 .env,至少设置强随机 SECRET_KEY 与数据库口令 # Edit .env: set at minimum a strong random SECRET_KEY and DB passwords
# 启动服务 # Start the services
docker compose up -d docker compose up -d
``` ```
## 首次部署 — 初始化向导 ## First deployment — setup wizard
HarborForge 使用 [AbstractWizard](./AbstractWizard) 进行安全初始化。Wizard 仅监听 `127.0.0.1`,必须通过 SSH 隧道访问。 HarborForge uses [AbstractWizard](./AbstractWizard) for secure
initialization. The wizard listens on `127.0.0.1` only and must be
reached over an SSH tunnel.
```bash ```bash
# 1. SSH 隧道映射 wizard 端口到本地 # 1. SSH tunnel: forward the wizard port to your machine
ssh -L 18080:127.0.0.1:18080 user@your-server ssh -L 18080:127.0.0.1:18080 user@your-server
# 2. 浏览器访问前端(或通过宿主机 nginx # 2. Open the frontend in a browser (or via the host nginx).
# 前端检测到后端未就绪 → 自动跳转初始化向导 # If the backend is not initialized, it redirects to the setup wizard.
# 3. 在向导中配置:数据库连接、管理员账号、默认项目(可选) # 3. In the wizard, configure: database connection, admin account,
# default project (optional).
# 4. 配置保存后,后端自动检测到配置并启动;刷新页面 → 登录界面 # 4. Once saved, the backend detects the config and starts; refresh
# the page → login screen.
``` ```
### 启动流程 ### Startup flow
``` ```
docker compose up docker compose up
├── mysql → 数据库启动 ├── mysql → database starts
├── wizard → AbstractWizard 启动(127.0.0.1SSH 隧道访问) ├── wizard → AbstractWizard starts (127.0.0.1, SSH-tunnel access)
├── backend → 阻塞等待配置文件(轮询 /config/harborforge.json ├── backend → blocks waiting for the config file (polls /config/harborforge.json)
└── frontend → 检测后端状态 └── frontend → checks backend state
├── 后端未就绪 → 显示初始化向导SSH 隧道连 wizard ├── backend not ready → shows the setup wizard (SSH tunnel to wizard)
└── 后端就绪 → 正常登录界面 └── backend ready → normal login screen
``` ```
### 安全模型 ### Security model
- Wizard 端口绑定 `127.0.0.1`,不暴露到外部网络;初始化必须经 SSH 隧道完成。 - The wizard port binds to `127.0.0.1` and is never exposed to the
- 配置通过 Docker volume 共享给后端(不走网络),后端以只读方式挂载。 external network; initialization must be done over an SSH tunnel.
- Config is shared with the backend via a Docker volume (never over the
network); the backend mounts it read-only.
## 部署架构 ## Deployment architecture
``` ```
宿主机 nginx (80/443) Host nginx (80/443)
├── / → frontend (Docker, 端口 3000) ├── / → frontend (Docker, port 3000)
└── /api/ → backend (Docker, 端口 8000) └── /api/ → backend (Docker, port 8000)
Docker 内部(不对外): Internal to Docker (not exposed):
wizard (127.0.0.1) → 配置管理SSH 隧道访问 wizard (127.0.0.1) → config management, SSH-tunnel access
wizard_config vol → wizard 写入,backend 只读读取 wizard_config vol → written by wizard, read-only for the backend
mysql (127.0.0.1) → 数据持久化 mysql (127.0.0.1) → data persistence
``` ```
## 子模块 ## Submodules
| 子模块 | 技术栈 | 作用 | | Submodule | Stack | Role |
|--------|--------|------| |-----------|-------|------|
| [AbstractWizard](./AbstractWizard) | Go | 首次安装向导,安全写配置(原子写 + 备份),init/readonly 模式 | | [AbstractWizard](./AbstractWizard) | Go | First-time setup wizard; atomic config writes + backups; init/readonly modes |
| [HarborForge.Backend](./HarborForge.Backend) | Python / FastAPI / SQLAlchemy / MySQL | 核心 API用户、项目、任务、里程碑、提案、RBAC、Webhook、工时、通知 | | [HarborForge.Backend](./HarborForge.Backend) | Python / FastAPI / SQLAlchemy / MySQL | Core API: users, projects, tasks, milestones, proposals, RBAC, webhooks, worklogs, notifications |
| [HarborForge.Frontend](./HarborForge.Frontend) | React 18 / TS / Vite | SPA~20 页面;自动检测未初始化 → 引导安装向导 | | [HarborForge.Frontend](./HarborForge.Frontend) | React 18 / TS / Vite | SPA, ~20 pages; auto-detects an uninitialized backend → setup wizard |
| [HarborForge.Cli](./HarborForge.Cli) | Go | 权限感知命令行客户端 `hf` | | [HarborForge.Cli](./HarborForge.Cli) | Go | Permission-aware command-line client `hf` |
| [HarborForge.Monitor](./HarborForge.Monitor) | Go | 独立主机遥测客户端,心跳上报 | | [HarborForge.Monitor](./HarborForge.Monitor) | Go | Standalone host telemetry client, heartbeat reporting |
| [HarborForge.OpenclawPlugin](./HarborForge.OpenclawPlugin) | Node / TS | OpenClaw 插件,桥接遥测,可安装 `hf` 技能与日历调度 | | [HarborForge.OpenclawPlugin](./HarborForge.OpenclawPlugin) | Node / TS | OpenClaw plugin; bridges telemetry; can install the `hf` skills and calendar scheduling |
| [HarborForge.Test](./HarborForge.Test) | pytest / Playwright | 后端与前端集成测试 | | [HarborForge.Test](./HarborForge.Test) | pytest / Playwright | Backend and frontend integration tests |
## 核心业务模型 ## Core domain model
- **里程碑**`open → freeze → undergoing → completed`freeze 时须恰好 1 个 release 任务) - **Milestone**: `open → freeze → undergoing → completed` (freeze
- **任务**issue / story / test / maintenance / research / review / resolution`pending → open → undergoing → completed`,完成须带评论 requires exactly one release task)
- **提案**:用户提 propose → 管理者 accept → 自动在里程碑内创建 feature story 任务reject 可重开 - **Task** (issue / story / test / maintenance / research / review /
- **RBAC**:细粒度权限 + 项目角色层级guest < viewer < member < dev < mgr < admin resolution): `pending → open → undergoing → completed`; completion
requires a comment
- **Proposal**: a user proposes → a manager accepts → a feature-story
task is auto-created in a milestone; rejected proposals can reopen
- **RBAC**: fine-grained permissions + a project role hierarchy
(guest < viewer < member < dev < mgr < admin)
## 端口 ## Ports
| 服务 | 容器端口 | 绑定 | 环境变量 | | Service | Container port | Bind | Env var |
|------|----------|------|----------| |---------|----------------|------|---------|
| Frontend | 3000 | compose | `FRONTEND_PORT` | | Frontend | 3000 | see compose | `FRONTEND_PORT` |
| Backend | 8000 | compose | `BACKEND_PORT` | | Backend | 8000 | see compose | `BACKEND_PORT` |
| MySQL | 3306 | 127.0.0.1 | `MYSQL_PORT` | | MySQL | 3306 | 127.0.0.1 | `MYSQL_PORT` |
| Wizard | 8080 | 127.0.0.1 | `WIZARD_PORT` | | Wizard | 8080 | 127.0.0.1 | `WIZARD_PORT` |
> SSH 隧道示例使用本地端口 `18080` 转发到服务器 wizard。 > The SSH-tunnel example uses local port `18080` forwarding to the
> server-side wizard.
## 安全 ## Security
部署前务必: Before deploying, you must:
- **设置强随机 `SECRET_KEY`**(如 `openssl rand -hex 32`)。后端在检测到弱/默认/过短密钥时会拒绝启动。 - **Set a strong random `SECRET_KEY`** (e.g. `openssl rand -hex 32`).
- 不要使用 `.env.example` 中的占位口令;为 MySQL 设置强口令。 The backend refuses to start on a weak/default/short key.
- 不要将含真实密钥的 `.env` 提交进版本库。 - Not use the placeholder passwords from `.env.example`; set a strong
MySQL password.
- Never commit a `.env` containing real secrets.
后端的鉴权/RBAC/SSRF 加固详见 [HarborForge.Backend 的 README](./HarborForge.Backend) “Security” 一节。 The backend's auth / RBAC / SSRF hardening is documented in the
"Security" section of the
[HarborForge.Backend README](./HarborForge.Backend).
## 前端 ## Frontend
前端采用集中式自定义设计系统“Foundry Deck” 工业主题),细节见 [HarborForge.Frontend 的 README](./HarborForge.Frontend)。 The frontend uses a centralized custom design system (the industrial
"Foundry Deck" theme); see the
[HarborForge.Frontend README](./HarborForge.Frontend) for details.