Merge pull request 'Verify record_directive end-to-end against the pm-state repo' (#46) from p4/directive-verify into main
Reviewed-on: #46
This commit is contained in:
32
apps/desktop/e2e/live-directive.spec.ts
Normal file
32
apps/desktop/e2e/live-directive.spec.ts
Normal file
@@ -0,0 +1,32 @@
|
||||
import { dirname, join } from 'node:path'
|
||||
import { fileURLToPath } from 'node:url'
|
||||
|
||||
import { _electron as electron, expect, test } from '@playwright/test'
|
||||
|
||||
const here = dirname(fileURLToPath(import.meta.url))
|
||||
const MAIN = join(here, '..', 'out', 'main', 'index.js')
|
||||
|
||||
// Opt-in (GITEA_LIVE=1 + COMMITEA_MODEL_LIVE=1 + a local model + the commitea-pm-state
|
||||
// repo). Reginald records a standing directive; it's appended to the real pm-state
|
||||
// ledger. The append is idempotent-ish (a fresh line each run); this only reads back
|
||||
// that a directive was consulted, and leaves the ledger intact.
|
||||
test.describe('live record_directive', () => {
|
||||
test('logs a standing directive to the pm-state ledger', async () => {
|
||||
test.skip(!process.env.GITEA_LIVE || !process.env.COMMITEA_MODEL_LIVE, 'live model test — opt-in')
|
||||
test.setTimeout(300_000)
|
||||
const app = await electron.launch({ args: [MAIN], env: { ...process.env } })
|
||||
const win = await app.firstWindow()
|
||||
await win.waitForLoadState('domcontentloaded')
|
||||
await expect(win.getByText(/· local$/)).toBeVisible({ timeout: 20000 })
|
||||
|
||||
const composer = win.getByPlaceholder(/Tell me what to do/)
|
||||
await composer.fill('Record a standing directive: freeze scope for beta, pilots come first.')
|
||||
await composer.press('Enter')
|
||||
|
||||
// the agent logged it to the ledger (record_directive), not applied a change
|
||||
await expect(win.getByText(/consulted the directive ledger/)).toBeVisible({ timeout: 240_000 })
|
||||
await win.screenshot({ path: join(here, '.artifacts', 'screens', 'live-directive.png'), fullPage: true, animations: 'disabled' })
|
||||
|
||||
await app.close()
|
||||
})
|
||||
})
|
||||
@@ -101,7 +101,7 @@ export function ChatPanel({ onOpenDirectives, offline, onApplyChange }: ChatPane
|
||||
{thinking ? <div style={{ font: 'var(--text-agent)', color: 'var(--ink-3)' }}>considering…</div> : null}
|
||||
{!thinking && steps.length ? (
|
||||
<div style={{ font: 'var(--text-caption)', color: 'var(--ink-3)', display: 'flex', alignItems: 'center', gap: 5 }}>
|
||||
<Icon name="eye" size={11} /> consulted {Array.from(new Set(steps.map((s) => s.replace('query_project', 'the project').replace('propose_change', 'the labels')))).join(', ')}
|
||||
<Icon name="eye" size={11} /> consulted {Array.from(new Set(steps.map((s) => s.replace('query_project', 'the project').replace('propose_change', 'the labels').replace('record_directive', 'the directive ledger')))).join(', ')}
|
||||
</div>
|
||||
) : null}
|
||||
{proposals.map((p) => (
|
||||
|
||||
Reference in New Issue
Block a user