feat: enforce hard test-tier requirement across all DevPlace workflow agents and feature-builder docs

Update the feature-builder agent prompt, test-maintainer agent, and all four workflow JS files (devii-tool, endpoint, feature, job-service) to codify the DevPlace test standard as a non-optional project requirement: one test file per endpoint, directory tree mirroring the URL/source path, split into three tiers (unit, api, e2e). Add explicit Test phases to devii-tool, endpoint, feature, and job-service workflows, and embed tier-specific test instructions (path mapping, fixture choice, coverage scope) directly in each workflow's meta description and TESTS constant.
This commit is contained in:
2026-06-15 12:10:14 +00:00
parent 3c7527988e
commit e1874f9b6a
71 changed files with 2198 additions and 145 deletions
+13 -4
View File
@@ -1,12 +1,13 @@
// retoor <retoor@molodetz.nl>
export const meta = {
name: 'endpoint',
description: 'Scaffold ONE new DevPlace route across all of its touchpoints (Form model, Out schema, guarded handler with respond, main.py mount, template, Devii action, API docs, SEO, test) and verify it',
description: 'Scaffold ONE new DevPlace route across all of its touchpoints (Form model, Out schema, guarded handler with respond, main.py mount, template, Devii action, API docs, SEO) and verify it, then write its integration test in the matching tier (api for JSON/HTML, e2e for an interactive UI flow)',
phases: [
{ title: 'Understand', detail: 'find the closest existing route to mirror' },
{ title: 'Implement', detail: 'wire the route across every touchpoint' },
{ title: 'Verify', detail: 'completeness and security review of the new route' },
{ title: 'Fix', detail: 'close gaps and write the route test' },
{ title: 'Fix', detail: 'close gaps from the review' },
{ title: 'Test', detail: 'write the route test in the matching tier (api or e2e), mirroring the path' },
],
}
@@ -31,6 +32,14 @@ const TOUCHPOINTS = [
'8. seo.py - base_seo_context for a public page; sitemap entry if indexable.',
].join('\n')
const TESTS = [
'DevPlace test standard (a hard project requirement - one test file per endpoint, the directory tree mirroring the URL path):',
'- tests/api/ - HTTP integration test against the live uvicorn subprocess (app_server/seeded_db, requests/httpx vs BASE_URL) - the right tier for a JSON or HTML route.',
'- tests/e2e/ - Playwright browser test (page/alice/bob) - the right tier for an interactive UI flow.',
'The route path maps to the test path by dropping {param} segments and lowercasing each segment (POST /auth/login -> tests/api/auth/login.py; GET /admin/ai-usage -> tests/e2e/admin/aiusage.py). A collection path that also parents deeper paths uses index.py in its own directory. Create any missing package directories with __init__.py.',
'Required patterns: wait_until="domcontentloaded" on every goto/wait_for_url; scoped selectors; try/finally restore of any flipped global setting; the shared fixtures; test FUNCTIONS are test_-prefixed though files are not. Validate by a clean import only. NEVER run the suite.',
].join('\n')
function endpointBrief() {
if (!args) return ''
if (typeof args === 'string') return args
@@ -132,8 +141,8 @@ if (gaps.length) {
}
const test = await agent(
`Operate in FIX mode. Write the integration test for this new route following the required patterns and the directory-mirrors-path layout. Validate by a clean import only. NEVER run the suite.\n\nEndpoint: ${ask}\nFiles changed:\n${changed.join('\n')}`,
{ agentType: 'test-maintainer', label: 'test', phase: 'Fix' }
`Operate in FIX mode. Write the integration test for this new route in the matching tier (api for a JSON/HTML route, e2e for an interactive UI flow) following the required patterns and the directory-mirrors-path layout. The route is not complete until it has a test. Create any missing package directories the test path needs. Validate by a clean import only. NEVER run the suite.\n\n${TESTS}\n\nEndpoint: ${ask}\nFiles changed:\n${changed.join('\n')}\n\nReturn the test file written and its tier.`,
{ agentType: 'test-maintainer', label: 'test', phase: 'Test' }
)
return { ask, map, build, audit: gaps, gapFix, test }