fix(panel): forms catch up with the backend (#614)

New Project claimed GitLab/Gitea were 'planned' while both providers are
fully shipped, showed a hardcoded GitHub badge, and never sent git_provider
at all — a non-GitHub project could not be created without an immediate
edit. It now carries the same forge Select the edit dialog has; the edit
dialog's own 'GitLab support is planned' tooltip is corrected too.

Also: the git actions panel's hardcoded 'main' (wrong PR-eligibility and
target label for master-default and env-ladder projects) is replaced by the
project's resolved head branch; acceptance criteria become editable in the
edit-task dialog; three feature flags get their missing descriptions; and
three forms swap raw-UUID text inputs for the existing Task/Agent selectors.

Co-authored-by: Renn F <rennf93@users.noreply.github.com>
This commit is contained in:
Renzo F
2026-07-20 20:38:36 +02:00
committed by GitHub
co-authored by Renn F
parent fbec679878
commit 8cb233c1e8
13 changed files with 243 additions and 74 deletions
@@ -154,4 +154,26 @@ describe("FeatureFlagsCard — M42 off-transition confirm + pending-keys Set", (
const unmapped = screen.getByText("Alpha");
expect(unmapped.getAttribute("data-state")).toBeNull();
});
// FLAG_DESCRIPTIONS previously lagged FLAG_TOOLTIPS for three vault/docs
// flags — the always-visible paragraph silently rendered empty for them.
it("renders an always-visible description for every vault/docs-sync flag", async () => {
getFeatureFlags.mockResolvedValueOnce({
flags: [
{ key: "docs_sync_enabled", label: "Docs Sync", enabled: false },
{
key: "obsidian_vault_enabled",
label: "Obsidian Vault",
enabled: false,
},
{ key: "vault_intake_enabled", label: "Vault Intake", enabled: false },
],
note: "Changes take effect on the next backend restart.",
});
render(withQueryClient(<FeatureFlagsCard />));
expect(await screen.findByText(/docs-update task/i)).toBeInTheDocument();
expect(screen.getByText(/wikilinked Obsidian vault/i)).toBeInTheDocument();
expect(screen.getByText(/board-review drafts/i)).toBeInTheDocument();
});
});
@@ -67,6 +67,8 @@ const FLAG_DESCRIPTIONS: Record<string, string> = {
"Periodically probe opted-in projects for dependency updates and open an update task when a lockfile would change (per-project opt-in; never auto-merges).",
env_sync_enabled:
"Cascade each project's declared environment ladder prod→dev via GitHub's merges API so dev never falls behind prod; a conflicted rung opens a sync PR for you to merge (per-project opt-in; never pushes prod).",
docs_sync_enabled:
"When a release publishes and the public docs site (roboco-website) has drifted from what shipped, open ONE docs-update task that rides the normal delivery flow (+ PR-review gate) — release-triggered, not polling; never auto-merges. Needs the docs-site repo registered as a project with a git token.",
release_manager_enabled:
"Run the deterministic release-readiness sweep and propose a release for you to approve or reject — it never publishes without your approval, and the executor is fail-closed on a red gate.",
org_memory_enabled:
@@ -91,6 +93,10 @@ const FLAG_DESCRIPTIONS: Record<string, string> = {
"Also open a video-authoring task when a release publishes. Off by default even with video_engine_enabled on.",
video_on_spotlight:
"Also open a video-authoring task when you approve a feature-spotlight draft that requests one. Off by default even with video_engine_enabled on.",
obsidian_vault_enabled:
"Project tasks, journals, and A2A digests into a human-readable, wikilinked Obsidian vault on disk (RoboCo/Tasks, Journals, A2A, Agents) — a rebuildable, DB-derived projection, never the system of record. Needs ROBOCO_VAULT_PATH set.",
vault_intake_enabled:
"Watch the vault's inbox folder for #roboco-tagged notes and turn them into board-review drafts — the same Product-Owner-reviewed path a chat-confirmed task takes, never straight into delivery. Needs the Obsidian vault projection on.",
vault_report_enabled:
"Materialize a weekly org-report note (velocity, cycle time, rework, cost) in the vault's Reports/ folder and notify you — deterministic numbers, no LLM. Needs the Obsidian vault projection on.",
vault_kb_enabled:
@@ -148,11 +154,11 @@ const FLAG_TOOLTIPS: Record<string, string> = {
video_engine_enabled:
"Authors and renders motion-graphics videos for social posts.",
video_on_release: "Drafts a video whenever a release publishes.",
video_on_spotlight:
"Drafts a video whenever a feature spotlight is drafted.",
video_on_spotlight: "Drafts a video whenever a feature spotlight is drafted.",
roadmap_engine_enabled:
"Weekly has the Board draft a themed roadmap for CEO approval.",
fable_mode_enabled: "Adopts the Fable/Ponytail behavioral doctrine fleet-wide.",
fable_mode_enabled:
"Adopts the Fable/Ponytail behavioral doctrine fleet-wide.",
obsidian_vault_enabled:
"Projects tasks/journals/A2A into a human-readable Obsidian vault.",
vault_intake_enabled:
@@ -297,7 +303,9 @@ export function FeatureFlagsCard() {
trigger itself would clobber its open/closed
data-state (same trap as Switch/TabsTrigger). */}
<HelpTip label="Only takes effect once x_engine_enabled above is on.">
<span className="text-sm">X (Twitter) credentials</span>
<span className="text-sm">
X (Twitter) credentials
</span>
</HelpTip>
{xCredsOpen ? (
<ChevronDown className="h-4 w-4" />