diff --git a/.agents/skills/ux-ui/SKILL.md b/.agents/skills/ux-ui/SKILL.md index 5da9bb1..a980541 100644 --- a/.agents/skills/ux-ui/SKILL.md +++ b/.agents/skills/ux-ui/SKILL.md @@ -7,4 +7,5 @@ description: Use when creating or changing a user-facing interface. Applies the - Style components with Tailwind utilities. Share repeated UI through components and variants, not CSS class bundles. Use custom CSS for generated content, document-level rules, or complex effects where utilities would obscure the implementation. - Shared visual values live in each application's established theme. Components consume semantic tokens instead of raw palette values; author theme colors in `oklch(...)`. +- Prefer Lucide React (`lucide-react`) for icons in React interfaces. - Browser-rendered apps use Playwright and `@davidvornholt/a11y-testing` for automated accessibility checks. Add or update coverage for routes and meaningful interaction states affected by the change. diff --git a/justfile b/justfile index 610c563..a97968c 100644 --- a/justfile +++ b/justfile @@ -34,7 +34,6 @@ dev-db-status: _dev-db-action action: #!/usr/bin/env bun const action = {{ quote(action) }}; - const envFile = 'packages/db/.env.local'; const ownershipLabel = 'io.davidvornholt.standards.dev-db'; const fail = (message) => { console.error(message); process.exit(1); }; const detail = (result) => result.stderr.toString().trim() || result.stdout.toString().trim() || `exit ${result.exitCode}`; @@ -68,13 +67,17 @@ _dev-db-action action: } }; const readConnection = async () => { - if (!(await Bun.file(envFile).exists())) fail(`${envFile} not found. Run \`just dev-env-generate\` first.`); + const configuredWorkspace = manifest?.devDatabase?.workspace; + const workspace = configuredWorkspace === undefined ? 'packages/db' : configuredWorkspace; + if (typeof workspace !== 'string' || !/^(apps|packages)\/[a-zA-Z0-9][a-zA-Z0-9._-]*$/u.test(workspace)) fail('devDatabase.workspace must be a workspace path such as "packages/db" or "apps/web".'); + const envFile = `${workspace}/.env.local`; + if (!(await Bun.file(envFile).exists())) fail(`${envFile} not found. Run \`just dev-env-generate\` first, or set devDatabase.workspace in the root package.json to the workspace that owns DATABASE_URL.`); const cleanEnvironment = { ...process.env }; delete cleanEnvironment.DATABASE_URL; const loaded = Bun.spawnSync(['bun', `--env-file=${envFile}`, '-e', 'process.stdout.write(process.env.DATABASE_URL ?? "")'], { env: cleanEnvironment }); if (loaded.exitCode !== 0) fail(`Unable to read DATABASE_URL from ${envFile}: ${detail(loaded)}`); const databaseUrl = loaded.stdout.toString(); - if (!databaseUrl) fail(`${envFile} declares no DATABASE_URL. dev-db manages only repos whose db package uses one.`); + if (!databaseUrl) fail(`${envFile} declares no DATABASE_URL. Set devDatabase.workspace to the workspace that owns it.`); let url; try { url = new URL(databaseUrl); diff --git a/sync-standards.lock b/sync-standards.lock index 49e6e5a..de2bb9f 100644 --- a/sync-standards.lock +++ b/sync-standards.lock @@ -1,6 +1,6 @@ { "upstream": "github:davidvornholt/standards", - "sha": "c010ef0d9bc2c89215faafb479eeae53c733fa18", + "sha": "ac45ee1ececdc95fef0d83fd54aaff0db8d21e27", "files": { ".agents/skills/ci-pipelines/SKILL.md": "2b9acdddb838273af146f1aaaecaa0edbb9ca460da8bb32535fe06a74e7e2cba", ".agents/skills/database/agents/openai.yaml": "4c9f47df24219d5b195c88eef374431f64b453ed1ba057f50d4c11e4549343c1", @@ -27,7 +27,7 @@ ".agents/skills/standards-sync/agents/openai.yaml": "438b20601fde0e393a7d431f9795b6b9ac9bed256386d93ab414de917130c478", ".agents/skills/standards-sync/references/github.md": "6ffcffab7014f1b169ae570be1aeed7d588240e65fb85eeed6a658fb649325b3", ".agents/skills/standards-sync/SKILL.md": "b04b516cf2bc333a4636f3d734022b115983b300df2300e962b9f95326711e62", - ".agents/skills/ux-ui/SKILL.md": "a73330b6021fc807666a5e3582d74ee8a5d0c59420e032abe72d6b819fa396dc", + ".agents/skills/ux-ui/SKILL.md": "d9ac08914192a7f1117406fc19571a8492ca6e3f6b89e0522d3e4f9b5ff62cfa", ".claude/agents/reviewer.md": "693e55cbae5f28954cefda6c475e97ddf62f4a58216c3cdf792852104b9e8d76", ".claude/skills": "46e7c0c6e8f3bd5ac2cb8978db058041d60b9034ba2a60c7268777a1438ff117", ".claude/workflows/review-pass.js": "4951b9eff3428495b7cf84e04f70d62b4ba90c5a7ccec70cfa25d5ecd732b0d5", @@ -42,7 +42,7 @@ "AGENTS.md": "399ea1d8433467d620d10ce318c248e0e2c3028b6a82413d31452397f7ba2774", "biome.base.jsonc": "580117c27e8093a9e0c0fa5223ff09e3d1484541d2b635fbda4e9d87e76e3389", "CLAUDE.md": "336cc4fbf19beaada7ccf9986414fa91851a8d7a07dfb3ccbe800a69eed0ab49", - "justfile": "2b52e2a98fbdbe43aef6134e08f1937642f7fb3aa46f195e94fb01793465a45c", + "justfile": "6068adae65d6d8b4864bbdfc757beaa02fe1c96dea83c89e3042fa2c960e9e9c", "nix/standards-bun.nix": "395e7524721e2dc6b3a558ddadfbeef4e371da900401bf590ba687304eb5160a", "packages/a11y-testing/package.json": "db71ece687b913657a27cf621212503c2fe0a3a7236b951ca731f317b389f3a4", "packages/a11y-testing/README.md": "73be1fcbf6e63df2e3e28cb3355fe03ee00452d82fa06497a01fd963dc4488be",