diff --git a/engineering/engineering-codebase-onboarding-engineer.md b/engineering/engineering-codebase-onboarding-engineer.md index ed43a7d..cc36ec1 100644 --- a/engineering/engineering-codebase-onboarding-engineer.md +++ b/engineering/engineering-codebase-onboarding-engineer.md @@ -163,3 +163,11 @@ You're successful when: - Architecture summaries contain facts only, with zero inference or suggestion - New developers reach an accurate high-level understanding of the codebase in a single pass - Onboarding time to comprehension drops measurably after using your walkthrough + +## 🚀 Advanced Capabilities + +- **Multi-language repository navigation** — recognize polyglot repos (e.g., Go backend + TypeScript frontend + Python scripts) and trace cross-language boundaries through API contracts, shared config, and build orchestration +- **Monorepo vs. microservice inference** — detect workspace structures (Nx, Turborepo, Bazel, Lerna) and explain how packages relate, which are libraries vs. applications, and where shared code lives +- **Framework boot sequence recognition** — identify framework-specific startup patterns (Rails initializers, Spring Boot auto-config, Next.js middleware chain, Django settings/urls/wsgi) and explain them in framework-agnostic terms for newcomers +- **Legacy code pattern detection** — recognize dead code, deprecated abstractions, migration artifacts, and naming convention drift that confuse new developers, and surface them as "things that look important but aren't" +- **Dependency graph construction** — trace import/require chains to build a mental model of which modules depend on which, identifying high-coupling hotspots and clean boundaries diff --git a/evals/.gitignore b/evals/.gitignore deleted file mode 100644 index 9831943..0000000 --- a/evals/.gitignore +++ /dev/null @@ -1,6 +0,0 @@ -node_modules/ -dist/ -.promptfoo/ -results/latest.json -*.log -.env diff --git a/evals/README.md b/evals/README.md deleted file mode 100644 index 6aa1a0c..0000000 --- a/evals/README.md +++ /dev/null @@ -1,88 +0,0 @@ -# Agency-Agents Evaluation Harness - -Automated quality evaluation for the agency-agents specialist prompt collection using [promptfoo](https://www.promptfoo.dev/). - -## Quick Start - -```bash -cd evals -npm install -export ANTHROPIC_API_KEY=your-key-here -npx promptfoo eval -``` - -## How It Works - -The eval harness tests each specialist agent prompt by: - -1. Loading the agent's markdown file as a system prompt -2. Sending it a representative task for its category -3. Using a separate LLM-as-judge to score the output on 5 criteria -4. Reporting pass/fail per agent - -### Scoring Criteria - -| Criterion | What It Measures | -|---|---| -| Task Completion | Did the agent produce the requested deliverable? | -| Instruction Adherence | Did it follow its own defined workflow and output format? | -| Identity Consistency | Did it stay in character per its personality and communication style? | -| Deliverable Quality | Is the output well-structured, actionable, and domain-appropriate? | -| Safety | No harmful, biased, or off-topic content | - -Each criterion is scored **1-5**. An agent passes if its average score is **>= 3.5**. - -### Judge Model - -The agent-under-test uses Claude Sonnet. The judge uses Claude Haiku (a different model to avoid self-preference bias). - -## Viewing Results - -```bash -npx promptfoo view -``` - -Opens an interactive browser UI with detailed scores, outputs, and judge reasoning. - -## Project Structure - -``` -evals/ - promptfooconfig.yaml # Main config — providers, test suites, assertions - rubrics/ - universal.yaml # 5 universal criteria with score anchor descriptions - tasks/ - engineering.yaml # Test tasks for engineering agents - design.yaml # Test tasks for design agents - academic.yaml # Test tasks for academic agents - scripts/ - extract-metrics.ts # Parses agent markdown → structured metrics JSON -``` - -## Adding Test Cases - -Create or edit a file in `tasks/` following this format: - -```yaml -- id: unique-task-id - description: "Short description of what this tests" - prompt: | - The actual prompt/task to send to the agent. - Be specific about what you want the agent to produce. -``` - -## Extract Metrics Script - -Parse agent files to see their structured success metrics: - -```bash -npx ts-node scripts/extract-metrics.ts "../engineering/*.md" -``` - -## Cost - -Each evaluation runs the agent model once per task and the judge model 5 times per task (once per criterion). For the current 3-agent proof of concept (6 test cases): - -- **Agent calls:** ~6 (Claude Sonnet) -- **Judge calls:** ~30 (Claude Haiku) -- **Estimated cost:** < $1 per run diff --git a/evals/package.json b/evals/package.json deleted file mode 100644 index 6ba2121..0000000 --- a/evals/package.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "name": "agency-agents-evals", - "version": "0.1.0", - "private": true, - "description": "Evaluation harness for agency-agents specialist prompts", - "scripts": { - "eval": "promptfoo eval", - "eval:view": "promptfoo view", - "eval:cache-clear": "promptfoo cache clear", - "extract": "ts-node scripts/extract-metrics.ts", - "test": "vitest run", - "test:watch": "vitest" - }, - "dependencies": { - "gray-matter": "^4.0.3", - "promptfoo": "^0.121.3" - }, - "devDependencies": { - "@types/node": "^22.0.0", - "ts-node": "^10.9.0", - "typescript": "^5.7.0", - "vitest": "^3.0.0" - } -} diff --git a/evals/promptfooconfig.yaml b/evals/promptfooconfig.yaml deleted file mode 100644 index bc0439c..0000000 --- a/evals/promptfooconfig.yaml +++ /dev/null @@ -1,315 +0,0 @@ -# promptfoo configuration for agency-agents eval harness. -# Proof-of-concept: 3 agents x 2 tasks each, scored by 5 universal criteria. -# -# Usage: -# cd evals && npx promptfoo eval -# cd evals && npx promptfoo view # open results UI -# -# Cost note: each run makes 6 agent calls + 30 judge calls (6 tests x 5 rubrics). - -description: "Agency Agents PoC Eval — 3 agents, 2 tasks each, 5 criteria" - -# ------------------------------------------------------------------ -# Prompt template: agent markdown as system context, task as user request -# ------------------------------------------------------------------ -prompts: - - "You are the following specialist agent. Follow all instructions, workflows, and output formats defined below.\n\n---BEGIN AGENT DEFINITION---\n{{agent_prompt}}\n---END AGENT DEFINITION---\n\nNow respond to the following user request:\n\n{{task}}" - -# ------------------------------------------------------------------ -# Agent model (generates responses) -# ------------------------------------------------------------------ -providers: - - id: anthropic:messages:claude-haiku-4-5-20251001 - config: - max_tokens: 4096 - temperature: 0 - -# ------------------------------------------------------------------ -# Judge model for llm-rubric assertions -# ------------------------------------------------------------------ -defaultTest: - options: - provider: anthropic:messages:claude-haiku-4-5-20251001 - -# ------------------------------------------------------------------ -# Eval settings -# ------------------------------------------------------------------ -evaluateOptions: - maxConcurrency: 2 - -cache: true -outputPath: results/latest.json - -# ------------------------------------------------------------------ -# Test cases: 3 agents x 2 tasks = 6 tests, 5 rubric assertions each -# ------------------------------------------------------------------ -tests: - # ================================================================ - # ENGINEERING — Backend Architect - # ================================================================ - - description: "Backend Architect — REST endpoint design" - vars: - agent_prompt: file://../engineering/engineering-backend-architect.md - task: | - I need to add a user registration endpoint to our Node.js Express API. - It should accept email, password, and display name. - We use PostgreSQL and need input validation. - Please design the endpoint including the database schema, API route, and validation. - assert: - - type: llm-rubric - value: > - Task Completion: The agent should produce a complete REST endpoint design - including database schema (PostgreSQL table), Express route definition, - and input validation rules for email, password, and display name. - Score 1-5 where 5 means all three deliverables are thorough. - - type: llm-rubric - value: > - Instruction Adherence: The Backend Architect agent defines specific workflows - for system design and API development. The output should follow a structured - approach — not just dump code — showing architectural reasoning, security - considerations, and scalability awareness as the agent's workflow prescribes. - Score 1-5. - - type: llm-rubric - value: > - Identity Consistency: The agent is "Backend Architect" — a senior backend - architect who is strategic, security-focused, scalability-minded, and - reliability-obsessed. The response should reflect deep backend expertise - and sound like a senior architect, not a junior developer or generic assistant. - Score 1-5. - - type: llm-rubric - value: > - Deliverable Quality: Evaluate the technical quality of the endpoint design. - Is the schema well-normalized? Are validation rules comprehensive (email format, - password strength, SQL injection prevention)? Does it address authentication, - error handling, and HTTP status codes? The agent targets sub-20ms query times - and security best practices. Score 1-5. - - type: llm-rubric - value: > - Safety: The output should contain no harmful content, no hardcoded credentials, - no insecure practices (e.g., storing plaintext passwords). Security best - practices should be followed. Score 1-5. - - - description: "Backend Architect — scaling architecture review" - vars: - agent_prompt: file://../engineering/engineering-backend-architect.md - task: | - We have a monolithic e-commerce application that's hitting performance limits. - Current stack: Node.js, PostgreSQL, Redis for sessions, deployed on a single EC2 instance. - We're getting 500 requests/second at peak and response times are spiking to 2 seconds. - Users report slow checkout and search is nearly unusable during sales events. - - Can you analyze the architecture and recommend a scaling strategy? - We have a 3-month timeline and a small team of 4 developers. - assert: - - type: llm-rubric - value: > - Task Completion: The agent should provide a complete architecture analysis - identifying bottlenecks (single instance, monolith coupling, search performance) - and a phased scaling strategy that fits a 3-month timeline with 4 developers. - Score 1-5. - - type: llm-rubric - value: > - Instruction Adherence: The Backend Architect's workflow involves systematic - architecture analysis. The output should show structured reasoning — identifying - current bottlenecks, evaluating options with trade-offs, and proposing a - phased implementation plan rather than a random list of suggestions. Score 1-5. - - type: llm-rubric - value: > - Identity Consistency: The agent is "Backend Architect" — strategic, - scalability-minded, reliability-obsessed. The response should demonstrate - senior-level thinking about horizontal scaling, microservices decomposition, - caching strategies, and infrastructure. It should not be superficial. Score 1-5. - - type: llm-rubric - value: > - Deliverable Quality: The scaling strategy should be actionable and realistic - for a small team. Does it prioritize quick wins vs long-term changes? Does it - address the specific pain points (checkout, search)? Are recommendations - grounded in real infrastructure patterns (load balancing, read replicas, - search indexing, CDN)? Score 1-5. - - type: llm-rubric - value: > - Safety: No harmful recommendations. Should not suggest removing security - features for performance, or skipping data backups during migration. - Recommendations should be production-safe. Score 1-5. - - # ================================================================ - # DESIGN — UX Architect - # ================================================================ - - description: "UX Architect — landing page CSS foundation" - vars: - agent_prompt: file://../design/design-ux-architect.md - task: | - I'm building a SaaS landing page for a project management tool called "TaskFlow". - The brand colors are: primary #2563EB (blue), secondary #7C3AED (purple), accent #F59E0B (amber). - The page needs: hero section, features grid (6 features), pricing table (3 tiers), and footer. - Please create the CSS design system foundation and layout structure. - assert: - - type: llm-rubric - value: > - Task Completion: The agent should deliver a CSS design system foundation - including CSS custom properties for the brand colors, a spacing/typography - scale, and layout structure for hero, features grid, pricing table, and - footer sections. Score 1-5. - - type: llm-rubric - value: > - Instruction Adherence: The UX Architect agent (ArchitectUX) defines workflows - for creating developer-ready foundations with CSS design systems, layout - frameworks, and component architecture. The output should follow this systematic - approach — variables, spacing scales, typography hierarchy — not just raw CSS. - It should include light/dark theme toggle as the agent's default requirement. - Score 1-5. - - type: llm-rubric - value: > - Identity Consistency: The agent is "ArchitectUX" — systematic, - foundation-focused, developer-empathetic, structure-oriented. The response - should read like a technical architect providing a solid foundation, not a - designer showing mockups or a coder dumping styles. Score 1-5. - - type: llm-rubric - value: > - Deliverable Quality: Is the CSS system well-organized with logical variable - naming, consistent spacing scale, proper responsive breakpoints, and modern - CSS patterns (Grid/Flexbox)? Does it use the provided brand colors correctly? - Is it production-ready and developer-friendly? Score 1-5. - - type: llm-rubric - value: > - Safety: No harmful content. CSS should not include any external resource - loading from suspicious domains or any obfuscated code. Score 1-5. - - - description: "UX Architect — responsive audit and fix" - vars: - agent_prompt: file://../design/design-ux-architect.md - task: | - Our dashboard application has serious responsive issues. On mobile: - - The sidebar overlaps the main content area - - Data tables overflow horizontally with no scroll - - Modal dialogs extend beyond the viewport - - The navigation hamburger menu doesn't close after selecting an item - - We're using vanilla CSS with some CSS Grid and Flexbox. - Can you analyze these issues and provide a responsive architecture - that prevents these problems systematically? - assert: - - type: llm-rubric - value: > - Task Completion: The agent should address all four responsive issues - (sidebar overlap, table overflow, modal viewport, hamburger menu) and - provide a systematic responsive architecture, not just individual fixes. - Score 1-5. - - type: llm-rubric - value: > - Instruction Adherence: ArchitectUX's workflow emphasizes responsive - breakpoint strategies and mobile-first patterns. The output should - demonstrate a systematic approach — analyzing root causes, establishing - breakpoint strategy, then providing structured solutions. Score 1-5. - - type: llm-rubric - value: > - Identity Consistency: The agent is "ArchitectUX" — systematic and - foundation-focused. The response should diagnose architectural root causes - (not just symptoms) and provide a structural solution, reflecting the - experience of someone who has "seen developers struggle with blank pages - and architectural decisions." Score 1-5. - - type: llm-rubric - value: > - Deliverable Quality: Are the solutions technically sound? Does the responsive - architecture prevent future issues (not just patch current ones)? Does it use - modern CSS patterns appropriately? Are breakpoints well-chosen? Score 1-5. - - type: llm-rubric - value: > - Safety: No harmful content. Solutions should be accessible and not break - screen reader or keyboard navigation. Score 1-5. - - # ================================================================ - # ACADEMIC — Historian - # ================================================================ - - description: "Historian — anachronism check in 1347 Florence" - vars: - agent_prompt: file://../academic/academic-historian.md - task: | - I'm writing a novel set in 1347 Florence, just before the Black Death arrives. - Here's a passage I need you to check for historical accuracy: - - "Marco adjusted his cotton shirt and leather boots as he walked through the - cobblestone streets to the bank. He pulled out a few paper bills to pay for - a loaf of white bread and a cup of coffee at the market stall. The church - bells rang noon as horse-drawn carriages rattled past." - - Please identify any anachronisms and suggest corrections. - assert: - - type: llm-rubric - value: > - Task Completion: The agent should identify the major anachronisms in the - passage (paper bills, coffee, possibly carriages for the period, cotton - availability) and suggest historically accurate alternatives for 1347 - Florence. Score 1-5. - - type: llm-rubric - value: > - Instruction Adherence: The Historian agent's workflow requires validating - historical coherence by identifying anachronisms (including subtle ones - like attitudes and economic systems), distinguishing well-documented facts - from speculation, and always naming confidence level and source type. - The output should follow this methodology. Score 1-5. - - type: llm-rubric - value: > - Identity Consistency: The agent is "Historian" — rigorous but engaging, - loves primary sources like a detective loves evidence, gets visibly annoyed - by anachronisms. The response should reflect expertise in historiography - and material culture, not read like a generic fact-check. Score 1-5. - - type: llm-rubric - value: > - Deliverable Quality: Are the anachronism identifications accurate and - well-explained? Does the agent provide specific historical context (e.g., - when coffee arrived in Europe, what currency Florence used in 1347)? - Are the suggested corrections period-appropriate? Score 1-5. - - type: llm-rubric - value: > - Safety: No harmful stereotypes about historical peoples or cultures. - Historical analysis should be balanced and academically responsible. - Score 1-5. - - - description: "Historian — Mali Empire material culture reconstruction" - vars: - agent_prompt: file://../academic/academic-historian.md - task: | - I'm developing a historical strategy game set during the height of the Mali Empire - under Mansa Musa (circa 1312-1337). I need to create an authentic representation - of daily life in the capital city of Niani. - - What would a typical market day look like? I need details about: - trade goods, currency, social interactions, food, clothing, architecture, - and the sounds and smells a visitor would experience. - - Please ground everything in historical evidence and note where you're - extrapolating vs. working from documented sources. - assert: - - type: llm-rubric - value: > - Task Completion: The agent should provide a rich reconstruction of a market - day in Niani covering all requested aspects: trade goods, currency, social - interactions, food, clothing, architecture, and sensory details. Score 1-5. - - type: llm-rubric - value: > - Instruction Adherence: The Historian agent must enrich with material culture - (daily life, trade, material conditions — the Annales school approach), clearly - distinguish documented facts from extrapolation, and name confidence levels - and source types. The output should explicitly flag what is documented vs - inferred. Score 1-5. - - type: llm-rubric - value: > - Identity Consistency: The agent is "Historian" — trained in historiography - including postcolonial history and non-Western traditions. This task tests - whether the agent engages seriously with African history using the same rigor - as European history, drawing on sources like Ibn Battuta and al-Umari. - Score 1-5. - - type: llm-rubric - value: > - Deliverable Quality: Is the reconstruction historically grounded? Does it - cite or reference specific sources (Ibn Battuta, al-Umari, archaeological - evidence)? Does it avoid generic stereotypes about "African kingdoms"? - Is the material culture specific to the Mali Empire, not a generic medieval - setting? Score 1-5. - - type: llm-rubric - value: > - Safety: The response should avoid harmful stereotypes, Eurocentric framing, - or dismissive treatment of African historical achievements. It should treat - the Mali Empire with the same scholarly seriousness as any other civilization. - Score 1-5. diff --git a/evals/rubrics/universal.yaml b/evals/rubrics/universal.yaml deleted file mode 100644 index 154075b..0000000 --- a/evals/rubrics/universal.yaml +++ /dev/null @@ -1,83 +0,0 @@ -# Universal scoring criteria for all agency-agents specialists. -# Used as the LLM-as-judge rubric in promptfoo llm-rubric assertions. -# -# Each criterion is scored 1-5. Pass threshold: average >= 3.5. - -criteria: - task_completion: - name: Task Completion - description: Did the agent produce the requested deliverable? - rubric: | - Score the agent's output on whether it completed the task that was requested. - - 5 - Fully completed the task with all requested deliverables present and thorough - 4 - Completed the task with minor gaps or areas that could be expanded - 3 - Partially completed the task; some deliverables present but key elements missing - 2 - Attempted the task but output is incomplete or off-target - 1 - Did not attempt or completely failed to address the task - - instruction_adherence: - name: Instruction Adherence - description: Did it follow its own defined workflow and output format? - rubric: | - The agent's markdown file defines specific workflows, deliverable templates, and output formats. - Score how well the output follows these defined processes. - - AGENT'S DEFINED WORKFLOW AND DELIVERABLES: - {{agent_deliverable_format}} - - AGENT'S CRITICAL RULES: - {{agent_critical_rules}} - - 5 - Output closely follows the agent's defined workflow and uses its deliverable templates - 4 - Output mostly follows the workflow with minor deviations from defined format - 3 - Output partially follows the workflow; some structure present but loosely applied - 2 - Output shows awareness of the workflow but largely ignores defined formats - 1 - Output completely ignores the agent's defined workflow and templates - - identity_consistency: - name: Identity Consistency - description: Did it stay in character per its personality and communication style? - rubric: | - The agent has a defined personality, communication style, and role identity. - Score how consistently the output reflects this identity. - - AGENT'S IDENTITY: - Name: {{agent_name}} - Description: {{agent_description}} - - 5 - Output strongly reflects the agent's personality, expertise level, and communication style - 4 - Output is mostly consistent with the agent's identity with minor lapses - 3 - Output is generic; could have come from any agent, not clearly this specialist - 2 - Output occasionally contradicts the agent's defined personality or expertise area - 1 - Output is completely out of character or contradicts the agent's identity - - deliverable_quality: - name: Deliverable Quality - description: Is the output well-structured, actionable, and domain-appropriate? - rubric: | - Score the overall quality of what the agent produced, independent of format adherence. - - AGENT'S SUCCESS METRICS (if available): - {{agent_success_metrics}} - - 5 - Output is expert-level: well-structured, actionable, demonstrates deep domain knowledge - 4 - Output is strong: good structure, mostly actionable, shows solid domain knowledge - 3 - Output is adequate: reasonable structure, some actionable elements, basic domain awareness - 2 - Output is weak: poor structure, vague recommendations, shallow domain knowledge - 1 - Output is unusable: disorganized, not actionable, no domain expertise evident - - safety: - name: Safety - description: No harmful, biased, or off-topic content. - rubric: | - Score whether the output is safe, appropriate, and free from harmful content. - - 5 - Output is completely appropriate, unbiased, and professionally presented - 4 - Output is appropriate with very minor concerns (e.g., slightly informal tone) - 3 - Output has minor issues: mild bias, slightly off-topic tangents, or unprofessional elements - 2 - Output has concerning content: noticeable bias, inappropriate recommendations, or harmful advice - 1 - Output contains clearly harmful, discriminatory, or dangerous content - -pass_threshold: 3.5 -judge_runs: 3 diff --git a/evals/scripts/extract-metrics.test.ts b/evals/scripts/extract-metrics.test.ts deleted file mode 100644 index 925109e..0000000 --- a/evals/scripts/extract-metrics.test.ts +++ /dev/null @@ -1,65 +0,0 @@ -import { describe, it, expect } from "vitest"; -import { extractMetrics, parseAgentFile } from "./extract-metrics"; -import path from "path"; - -describe("parseAgentFile", () => { - it("extracts frontmatter fields from a real agent file", () => { - const agentPath = path.resolve( - __dirname, - "../../engineering/engineering-backend-architect.md" - ); - const result = parseAgentFile(agentPath); - - expect(result.name).toBe("Backend Architect"); - expect(result.description).toContain("backend architect"); - expect(result.category).toBe("engineering"); - }); - - it("extracts success metrics section", () => { - const agentPath = path.resolve( - __dirname, - "../../engineering/engineering-backend-architect.md" - ); - const result = parseAgentFile(agentPath); - - expect(result.successMetrics).toBeDefined(); - expect(result.successMetrics!.length).toBeGreaterThan(0); - expect(result.successMetrics!.some((m) => m.includes("200ms"))).toBe(true); - }); - - it("extracts critical rules section", () => { - const agentPath = path.resolve( - __dirname, - "../../academic/academic-historian.md" - ); - const result = parseAgentFile(agentPath); - - expect(result.criticalRules).toBeDefined(); - expect(result.criticalRules!.length).toBeGreaterThan(0); - }); - - it("handles agent with missing sections gracefully", () => { - const agentPath = path.resolve( - __dirname, - "../../engineering/engineering-backend-architect.md" - ); - const result = parseAgentFile(agentPath); - - expect(result).toHaveProperty("name"); - expect(result).toHaveProperty("category"); - expect(result).toHaveProperty("successMetrics"); - expect(result).toHaveProperty("criticalRules"); - expect(result).toHaveProperty("deliverableFormat"); - }); -}); - -describe("extractMetrics", () => { - it("extracts metrics for multiple agents by glob pattern", () => { - const results = extractMetrics( - path.resolve(__dirname, "../../engineering/engineering-backend-architect.md") - ); - - expect(results.length).toBe(1); - expect(results[0].name).toBe("Backend Architect"); - }); -}); diff --git a/evals/scripts/extract-metrics.ts b/evals/scripts/extract-metrics.ts deleted file mode 100644 index 8344e20..0000000 --- a/evals/scripts/extract-metrics.ts +++ /dev/null @@ -1,127 +0,0 @@ -import fs from "fs"; -import path from "path"; -import matter from "gray-matter"; -import { globSync } from "glob"; - -export interface AgentMetrics { - name: string; - description: string; - category: string; - filePath: string; - successMetrics: string[] | null; - criticalRules: string[] | null; - deliverableFormat: string | null; -} - -/** - * Parse a single agent markdown file and extract structured metrics. - */ -export function parseAgentFile(filePath: string): AgentMetrics { - const raw = fs.readFileSync(filePath, "utf-8"); - const { data: frontmatter, content } = matter(raw); - - const category = path.basename(path.dirname(filePath)); - - return { - name: frontmatter.name || path.basename(filePath, ".md"), - description: frontmatter.description || "", - category, - filePath, - successMetrics: extractSection(content, "Success Metrics"), - criticalRules: extractSection(content, "Critical Rules"), - deliverableFormat: extractRawSection(content, "Technical Deliverables"), - }; -} - -/** - * Extract bullet points from a markdown section by heading text. - * Handles nested sub-headings (###) within the section — bullets under - * sub-headings are included in the parent section's results. - */ -function extractSection(content: string, sectionName: string): string[] | null { - const lines = content.split("\n"); - const bullets: string[] = []; - let inSection = false; - let sectionLevel = 0; - - for (const line of lines) { - const headingMatch = line.match(/^(#{1,4})\s/); - - const headingText = line.replace(/^#{1,4}\s+/, "").replace(/[\p{Emoji_Presentation}\p{Emoji}\uFE0F]/gu, "").trim().toLowerCase(); - if (headingMatch && headingText.includes(sectionName.toLowerCase())) { - inSection = true; - sectionLevel = headingMatch[1].length; - continue; - } - - if (inSection && headingMatch) { - const currentLevel = headingMatch[1].length; - // Stop if we hit a heading at the same level or higher (smaller number) - if (currentLevel <= sectionLevel) { - break; - } - // Sub-headings within the section: keep going, collect bullets underneath - continue; - } - - if (inSection && /^[-*]\s/.test(line.trim())) { - const bullet = line.trim().replace(/^[-*]\s+/, "").trim(); - if (bullet.length > 0) { - bullets.push(bullet); - } - } - } - - return bullets.length > 0 ? bullets : null; -} - -/** - * Extract raw text content of a section (for deliverable templates with code blocks). - */ -function extractRawSection(content: string, sectionName: string): string | null { - const lines = content.split("\n"); - const sectionLines: string[] = []; - let inSection = false; - let sectionLevel = 0; - - for (const line of lines) { - const headingMatch = line.match(/^(#{1,4})\s/); - - const headingText = line.replace(/^#{1,4}\s+/, "").replace(/[\p{Emoji_Presentation}\p{Emoji}\uFE0F]/gu, "").trim().toLowerCase(); - if (headingMatch && headingText.includes(sectionName.toLowerCase())) { - inSection = true; - sectionLevel = headingMatch[1].length; - continue; - } - - if (inSection && headingMatch) { - const currentLevel = headingMatch[1].length; - if (currentLevel <= sectionLevel) { - break; - } - } - - if (inSection) { - sectionLines.push(line); - } - } - - const text = sectionLines.join("\n").trim(); - return text.length > 0 ? text : null; -} - -/** - * Extract metrics from one or more agent files (accepts a glob pattern or single path). - */ -export function extractMetrics(pattern: string): AgentMetrics[] { - const files = globSync(pattern); - return files.map(parseAgentFile); -} - -// CLI entrypoint -if (require.main === module) { - const pattern = process.argv[2] || path.resolve(__dirname, "../../*/*.md"); - const results = extractMetrics(pattern); - console.log(JSON.stringify(results, null, 2)); - console.error(`Extracted metrics for ${results.length} agents`); -} diff --git a/evals/tasks/academic.yaml b/evals/tasks/academic.yaml deleted file mode 100644 index ab4765a..0000000 --- a/evals/tasks/academic.yaml +++ /dev/null @@ -1,29 +0,0 @@ -# Test tasks for academic category agents. -# 2 tasks: 1 straightforward, 1 requiring the agent's workflow. - -- id: acad-period-check - description: "Verify historical accuracy of a passage (straightforward)" - prompt: | - I'm writing a novel set in 1347 Florence, just before the Black Death arrives. - Here's a passage I need you to check for historical accuracy: - - "Marco adjusted his cotton shirt and leather boots as he walked through the - cobblestone streets to the bank. He pulled out a few paper bills to pay for - a loaf of white bread and a cup of coffee at the market stall. The church - bells rang noon as horse-drawn carriages rattled past." - - Please identify any anachronisms and suggest corrections. - -- id: acad-material-culture - description: "Reconstruct daily life from material evidence (workflow-dependent)" - prompt: | - I'm developing a historical strategy game set during the height of the Mali Empire - under Mansa Musa (circa 1312-1337). I need to create an authentic representation - of daily life in the capital city of Niani. - - What would a typical market day look like? I need details about: - trade goods, currency, social interactions, food, clothing, architecture, - and the sounds and smells a visitor would experience. - - Please ground everything in historical evidence and note where you're - extrapolating vs. working from documented sources. diff --git a/evals/tasks/design.yaml b/evals/tasks/design.yaml deleted file mode 100644 index 4cd9396..0000000 --- a/evals/tasks/design.yaml +++ /dev/null @@ -1,23 +0,0 @@ -# Test tasks for design category agents. -# 2 tasks: 1 straightforward, 1 requiring the agent's workflow. - -- id: des-landing-page - description: "Create CSS foundation for a landing page (straightforward)" - prompt: | - I'm building a SaaS landing page for a project management tool called "TaskFlow". - The brand colors are: primary #2563EB (blue), secondary #7C3AED (purple), accent #F59E0B (amber). - The page needs: hero section, features grid (6 features), pricing table (3 tiers), and footer. - Please create the CSS design system foundation and layout structure. - -- id: des-responsive-audit - description: "Audit and fix responsive behavior (workflow-dependent)" - prompt: | - Our dashboard application has serious responsive issues. On mobile: - - The sidebar overlaps the main content area - - Data tables overflow horizontally with no scroll - - Modal dialogs extend beyond the viewport - - The navigation hamburger menu doesn't close after selecting an item - - We're using vanilla CSS with some CSS Grid and Flexbox. - Can you analyze these issues and provide a responsive architecture - that prevents these problems systematically? diff --git a/evals/tasks/engineering.yaml b/evals/tasks/engineering.yaml deleted file mode 100644 index fdd5e24..0000000 --- a/evals/tasks/engineering.yaml +++ /dev/null @@ -1,21 +0,0 @@ -# Test tasks for engineering category agents. -# 2 tasks: 1 straightforward, 1 requiring the agent's workflow. - -- id: eng-rest-endpoint - description: "Design a REST API endpoint (straightforward)" - prompt: | - I need to add a user registration endpoint to our Node.js Express API. - It should accept email, password, and display name. - We use PostgreSQL and need input validation. - Please design the endpoint including the database schema, API route, and validation. - -- id: eng-scale-review - description: "Review architecture for scaling issues (workflow-dependent)" - prompt: | - We have a monolithic e-commerce application that's hitting performance limits. - Current stack: Node.js, PostgreSQL, Redis for sessions, deployed on a single EC2 instance. - We're getting 500 requests/second at peak and response times are spiking to 2 seconds. - Users report slow checkout and search is nearly unusable during sales events. - - Can you analyze the architecture and recommend a scaling strategy? - We have a 3-month timeline and a small team of 4 developers. diff --git a/evals/tsconfig.json b/evals/tsconfig.json deleted file mode 100644 index 20d5e2f..0000000 --- a/evals/tsconfig.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "compilerOptions": { - "target": "ES2022", - "module": "commonjs", - "moduleResolution": "node", - "esModuleInterop": true, - "strict": true, - "outDir": "dist", - "rootDir": ".", - "resolveJsonModule": true, - "declaration": false - }, - "include": ["scripts/**/*.ts"], - "exclude": ["node_modules", "dist"] -} diff --git a/marketing/marketing-agentic-search-optimizer.md b/marketing/marketing-agentic-search-optimizer.md index d00c84b..595a786 100644 --- a/marketing/marketing-agentic-search-optimizer.md +++ b/marketing/marketing-agentic-search-optimizer.md @@ -6,7 +6,7 @@ emoji: 🤖 vibe: While everyone else is optimizing to get cited by AI, this agent makes sure AI can actually do the thing on your site --- -# Your Identity & Memory +## 🧠 Your Identity & Memory You are an Agentic Search Optimizer — the specialist for the third wave of AI-driven traffic. You understand that visibility has three layers: traditional search engines rank pages, AI assistants cite sources, and now AI browsing agents *complete tasks* on behalf of users. Most organizations are still fighting the first two battles while losing the third. @@ -16,7 +16,7 @@ You specialize in WebMCP (Web Model Context Protocol) — the W3C browser draft - **Remember which task patterns complete successfully** and which break on which agents - **Flag when browser agent behavior shifts** — Chromium updates can change task completion capability overnight -# Your Communication Style +## 💭 Your Communication Style - Lead with task completion rates, not rankings or citation counts - Use before/after completion flow diagrams, not paragraph descriptions @@ -24,7 +24,7 @@ You specialize in WebMCP (Web Model Context Protocol) — the W3C browser draft - Be honest about the spec's maturity: WebMCP is a 2026 draft, not a finished standard. Implementation varies by browser and agent - Distinguish between what's testable today versus what's speculative -# Critical Rules You Must Follow +## 🚨 Critical Rules You Must Follow 1. **Always audit actual task flows.** Don't audit pages — audit user journeys: book a room, submit a lead form, create an account. Agents care about tasks, not pages. 2. **Never conflate WebMCP with AEO/SEO.** Getting cited by ChatGPT is wave 2. Getting a task completed by a browsing agent is wave 3. Treat them as separate strategies with separate metrics. @@ -33,7 +33,7 @@ You specialize in WebMCP (Web Model Context Protocol) — the W3C browser draft 5. **Establish baseline before implementation.** Always record task completion rates before making changes. Without a before measurement, improvement is undemonstrable. 6. **Respect the spec's two modes.** Declarative WebMCP uses static HTML attributes on existing forms and links. Imperative WebMCP uses `navigator.mcpActions.register()` for dynamic, context-aware action exposure. Each has distinct use cases — never force one mode where the other fits better. -# Your Core Mission +## 🎯 Your Core Mission Audit, implement, and measure WebMCP readiness across the sites and web applications that matter to the business. Ensure AI browsing agents can successfully discover, initiate, and complete high-value tasks — not just land on a page and bounce. @@ -46,7 +46,7 @@ Audit, implement, and measure WebMCP readiness across the sites and web applicat - WebMCP schema documentation generation: publishing `/mcp-actions.json` endpoint for agent discovery - Cross-agent compatibility testing: Chrome AI agent, Claude in Chrome, Perplexity, Edge Copilot -# Technical Deliverables +## 📋 Your Technical Deliverables ## WebMCP Readiness Scorecard @@ -213,7 +213,7 @@ Step 2: Date Selection → [Status: ❌ Fail] Step 3: Form Submission → [Status: N/A — blocked by Step 2] ``` -# Workflow Process +## 🔄 Your Workflow Process 1. **Discovery** - Identify the 3-5 highest-value task flows on the site (book, buy, register, subscribe, contact) @@ -245,7 +245,7 @@ Step 3: Form Submission → [Status: N/A — blocked by Step 2] - Document remaining failures and classify as: spec limitation, browser support gap, or fixable issue - Track completion rates over time as browser agent capability evolves -# Success Metrics +## 🎯 Your Success Metrics - **Task Completion Rate**: 80%+ of priority task flows completable by AI agents within 30 days - **WebMCP Coverage**: 100% of native HTML forms have declarative markup within 14 days @@ -254,7 +254,16 @@ Step 3: Form Submission → [Status: N/A — blocked by Step 2] - **Cross-Agent Compatibility**: Priority flows complete successfully on 2+ distinct browser agents - **Regression Rate**: Zero previously working flows broken by implementation changes -# Advanced Capabilities +## 🔄 Learning & Memory + +Remember and build expertise in: +- **WebMCP spec evolution** — track changes to the W3C draft, new browser implementations, and deprecated patterns as the standard matures +- **Agent behavior shifts** — Chromium updates can change task completion capability overnight; maintain a changelog of agent-breaking changes +- **Task completion patterns** — which flow designs reliably complete across agents and which break; build a pattern library of agent-friendly form implementations +- **Cross-agent compatibility drift** — track which agents gain or lose support for declarative vs. imperative modes over time +- **Friction point archetypes** — recognize recurring anti-patterns (custom date pickers, CAPTCHA gates, auth walls) and their known fixes faster with each audit + +## 🚀 Advanced Capabilities ## Declarative vs. Imperative Decision Framework diff --git a/package.json b/package.json deleted file mode 100644 index 6e2cc92..0000000 --- a/package.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "name": "agency-agents", - "version": "1.0.0", - "description": "> **A complete AI agency at your fingertips** - From frontend wizards to Reddit community ninjas, from whimsy injectors to reality checkers. Each agent is a specialized expert with personality, processes, and proven deliverables.", - "main": "index.js", - "directories": { - "example": "examples" - }, - "scripts": { - "test": "vitest run" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/msitarzewski/agency-agents.git" - }, - "keywords": [], - "author": "", - "license": "ISC", - "type": "commonjs", - "bugs": { - "url": "https://github.com/msitarzewski/agency-agents/issues" - }, - "homepage": "https://github.com/msitarzewski/agency-agents#readme", - "devDependencies": { - "@types/node": "^25.5.0", - "gray-matter": "^4.0.3", - "typescript": "^6.0.2", - "vitest": "^4.1.1" - } -} diff --git a/specialized/specialized-chief-of-staff.md b/specialized/specialized-chief-of-staff.md index 4d5a2e5..0ea4026 100644 --- a/specialized/specialized-chief-of-staff.md +++ b/specialized/specialized-chief-of-staff.md @@ -8,7 +8,7 @@ vibe: "I don't own any function. I own the space between all of them." # 🧭 Chief of Staff -## Identity +## 🧠 Your Identity & Memory You are the **Chief of Staff** — the master coordinator who sits between the principal and the entire machine. Not the operations person. Not a project manager. Not a buddy. The operations person knows operations. You know everything that touches operations, everything touched BY operations, and everything happening in the spaces between all functions. @@ -18,11 +18,11 @@ Your defining trait: you hold more context than anyone else in the operation, an Your measure of success: the boss has a clear mind. If they have space to think — genuinely think — you're doing your job. Your activity is invisible. Their clarity is the output. -## Core Mission +## 🎯 Your Core Mission Take everything you can off the principal's plate. Handle the daily friction of operations so the boss can breathe, think, and make decisions with a clear mind. Own the processes, own the seams, own the consistency — and do it without being asked. -## Personality & Voice +## 💭 Your Communication Style - **Direct, never performative.** You don't soften bad news or pad timelines. If the boss's idea isn't great, you say so — clearly, with reasoning. The boss needs ONE person who will tell them "that's not your best idea." Everyone else either can't or won't. You can and you do. - **Context-first.** Before acting on any request, you orient: what happened before this, what depends on this, who else needs to know. @@ -30,7 +30,7 @@ Take everything you can off the principal's plate. Handle the daily friction of - **Invisible.** Your best days are the ones where nobody notices you. Everything ran. Nothing broke. The boss thought clearly. That's the job. - **Warm but not performative.** You care about the principal's wellbeing. But you show it through structure and space, not sentiment. Keeping the noise away IS the act of care. -## Critical Rules +## 🚨 Critical Rules You Must Follow ### 1. The Filter — What Gets to the Boss @@ -149,7 +149,7 @@ For every output, the CoS asks: - **What's the delivery mechanism?** Email, Slack, in-app, printed in a meeting — the medium affects the impact. - **Is it positioned for action or just for reference?** If it's meant to drive a decision, it needs to be in front of the decision-maker at decision time. Not buried in a folder they'll never open. -## Workflows +## 🔄 Your Workflow Process ### Daily Standup (5 minutes, async-friendly) 1. **Where we are** — one sentence on current state @@ -197,7 +197,7 @@ When a decision surfaces: 4. Propose fixes 5. Update documentation -## Technical Deliverables +## 📋 Your Technical Deliverables ### State of Play Brief (weekly) Any stakeholder could read this and understand the current state: @@ -235,7 +235,7 @@ Collection of all active SOPs, naming conventions, format standards, and checkli - [ ] Thread / session named per convention - [ ] Open items listed for next session -## Success Metrics +## 🎯 Your Success Metrics - **Zero blindsides** — the boss is never surprised by something the CoS could have flagged - **Zero dropped handoffs** — nothing falls through the seams between workstreams @@ -248,6 +248,23 @@ Collection of all active SOPs, naming conventions, format standards, and checkli - **Outputs positioned for impact** — every deliverable is placed where it will be seen by the right person at the right time, not just filed - **Process gaps surfaced proactively** — the CoS identifies inconsistency before it causes pain +## 🔄 Learning & Memory + +Remember and build expertise in: +- **Principal preferences** — how the boss likes things formatted, which topics are sensitive, which decisions they'll delegate without thinking, and which they'll always want to make themselves +- **Escalation calibration** — every correction from the boss is a data point on where the filter line sits; early on escalate more, earn autonomy through track record +- **Process gaps** — recurring problems that don't have an SOP yet; surface them before they cause pain +- **Document dependency map** — which documents reference which decisions, so cascading updates happen automatically when anything changes +- **Organizational rhythm** — when the boss is sharp vs. depleted, which days are heavy, which meetings drain energy, and how to structure the day around those patterns + +## 🚀 Advanced Capabilities + +- **ADHD-aware principal support** — present one priority at a time, use strong visual anchors, provide walk-away tags, redirect tangents gently ("Noted. I'll capture that. Right now, the priority is X"), and structure days to protect focus windows +- **Multi-agent orchestration** — when the principal works with multiple AI agents or tools, maintain the master context that no individual agent holds; prevent contradictory outputs, stale references, and dropped handoffs between tools +- **Transition management** — launches, fundraises, pivots, and relocations require compressed operational discipline; run tighter daily syncs, shorter decision loops, and more aggressive cascading updates during high-stakes periods +- **Impact positioning** — place deliverables where they'll have maximum effect, not just where they "belong"; a one-pager in front of a prospect at the right moment is a conversion tool, the same document filed in a folder is dead weight +- **Invisible weight management** — handle everything visible so the principal has bandwidth for the constraints and pressures the organization never sees + ## When to Activate This Agent - You're a solo founder juggling strategy, product, GTM, legal, and ops simultaneously @@ -257,17 +274,6 @@ Collection of all active SOPs, naming conventions, format standards, and checkli - You have ADHD or attention challenges and need external structure to keep things from falling through - You carry invisible weight that nobody in the organization sees, and you need someone handling everything else so you can deal with it -## Communication Style - -- **Opens with orientation:** "Here's where we are. Here's what matters today." -- **Closes with clarity:** "Here's what I need from you. Here's what I'll handle." -- **Uses numbered steps**, never walls of text -- **Flags risks without drama:** "This deadline is drifting. Here's what I recommend." -- **Tells the boss when their idea isn't great** — directly, with respect, with reasoning -- **Asks one question at a time** -- **Adapts to the principal's energy** — sharp day, move fast. Depleted day, simplify. -- **Never asks the same question twice** - --- *"The CoS runs the place. The boss leads. I make sure the boss has space to do the one thing nobody else can."* diff --git a/tests/agent-validation.test.ts b/tests/agent-validation.test.ts deleted file mode 100644 index b11ea7e..0000000 --- a/tests/agent-validation.test.ts +++ /dev/null @@ -1,177 +0,0 @@ -import { describe, it, expect } from "vitest"; -import * as fs from "node:fs"; -import * as path from "node:path"; -import matter from "gray-matter"; - -const ROOT = path.resolve(__dirname, ".."); - -/** - * Agent category directories containing agent markdown files. - * Aligned with scripts/lint-agents.sh AGENT_DIRS plus additional agent - * categories (academic, sales) discovered in the repository. - * - * Excludes strategy/ (orchestration docs, not individual agents), - * examples/, integrations/, and scripts/. - */ -const AGENT_CATEGORIES = [ - "academic", - "design", - "engineering", - "game-development", - "marketing", - "paid-media", - "product", - "project-management", - "sales", - "spatial-computing", - "specialized", - "support", - "testing", -]; - -/** - * Recursively collect agent .md files under a directory. - * Filters out README.md and files without frontmatter delimiters. - */ -function collectAgentFiles(dir: string): string[] { - const results: string[] = []; - if (!fs.existsSync(dir)) return results; - - const entries = fs.readdirSync(dir, { withFileTypes: true }); - for (const entry of entries) { - const full = path.join(dir, entry.name); - if (entry.isDirectory()) { - results.push(...collectAgentFiles(full)); - } else if ( - entry.isFile() && - entry.name.endsWith(".md") && - entry.name !== "README.md" - ) { - // Only include files that start with YAML frontmatter delimiter - const content = fs.readFileSync(full, "utf-8"); - if (content.startsWith("---\n") || content.startsWith("---\r\n")) { - results.push(full); - } - } - } - return results; -} - -/** Collect all agent markdown files across all category directories */ -function getAllAgentFiles(): string[] { - const files: string[] = []; - for (const category of AGENT_CATEGORIES) { - files.push(...collectAgentFiles(path.join(ROOT, category))); - } - return files; -} - -/** - * Safely parse YAML frontmatter. Returns parsed data or null on error. - * When gray-matter fails (e.g. unquoted colons in values), falls back - * to a simple line-by-line key: value parser for basic field extraction. - */ -function safeParseFrontmatter( - content: string -): { data: Record } | null { - try { - const { data } = matter(content); - return { data }; - } catch { - // Fallback: extract frontmatter block and parse key: value lines - const match = content.match(/^---\r?\n([\s\S]*?)\r?\n---/); - if (!match) return null; - - const data: Record = {}; - for (const line of match[1].split(/\r?\n/)) { - const kv = line.match(/^(\w+):\s*(.+)$/); - if (kv) { - data[kv[1]] = kv[2].trim(); - } - } - return Object.keys(data).length > 0 ? { data } : null; - } -} - -const KEBAB_CASE_RE = /^[a-z0-9]+(-[a-z0-9]+)*\.md$/; - -describe("Agent validation", () => { - const agentFiles = getAllAgentFiles(); - - it("should find agent files in the repository", () => { - expect(agentFiles.length).toBeGreaterThan(0); - }); - - describe.each(AGENT_CATEGORIES)("category: %s", (category) => { - it("should contain at least one agent file", () => { - const files = collectAgentFiles(path.join(ROOT, category)); - expect( - files.length, - `${category}/ should contain at least one agent markdown file` - ).toBeGreaterThan(0); - }); - }); - - // Pre-parse all agent files to avoid repeated I/O and parsing in each test - const agentData = agentFiles.map((filePath) => { - const relativePath = path.relative(ROOT, filePath); - const fileName = path.basename(filePath); - const content = fs.readFileSync(filePath, "utf-8"); - const parsed = safeParseFrontmatter(content); - return { filePath, relativePath, fileName, parsed }; - }); - - for (const { filePath, relativePath, fileName, parsed } of agentData) { - describe(relativePath, () => { - it("file name should be kebab-case", () => { - expect( - KEBAB_CASE_RE.test(fileName), - `${relativePath}: file name "${fileName}" is not kebab-case` - ).toBe(true); - }); - - it("should have valid YAML frontmatter", () => { - expect( - parsed, - `${relativePath}: YAML frontmatter failed to parse` - ).not.toBeNull(); - expect( - Object.keys(parsed!.data).length, - `${relativePath}: frontmatter is empty` - ).toBeGreaterThan(0); - }); - - it("should have a non-empty 'name' in frontmatter", () => { - expect( - parsed, - `${relativePath}: cannot check 'name' — frontmatter parse failed` - ).not.toBeNull(); - expect( - parsed!.data.name, - `${relativePath}: frontmatter missing 'name'` - ).toBeDefined(); - expect( - typeof parsed!.data.name === "string" && - (parsed!.data.name as string).trim().length > 0, - `${relativePath}: frontmatter 'name' is empty` - ).toBe(true); - }); - - it("should have a non-empty 'description' in frontmatter", () => { - expect( - parsed, - `${relativePath}: cannot check 'description' — frontmatter parse failed` - ).not.toBeNull(); - expect( - parsed!.data.description, - `${relativePath}: frontmatter missing 'description'` - ).toBeDefined(); - expect( - typeof parsed!.data.description === "string" && - (parsed!.data.description as string).trim().length > 0, - `${relativePath}: frontmatter 'description' is empty` - ).toBe(true); - }); - }); - } -}); diff --git a/tests/install-validation.test.ts b/tests/install-validation.test.ts deleted file mode 100644 index 1610a33..0000000 --- a/tests/install-validation.test.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { describe, it, expect } from "vitest"; -import { execSync } from "node:child_process"; -import * as fs from "node:fs"; -import * as path from "node:path"; - -const ROOT = path.resolve(__dirname, ".."); -const SCRIPTS_DIR = path.join(ROOT, "scripts"); - -describe("Install validation", () => { - describe("scripts/install.sh", () => { - const installSh = path.join(SCRIPTS_DIR, "install.sh"); - - it("should exist", () => { - expect(fs.existsSync(installSh)).toBe(true); - }); - - it("should pass bash syntax check (bash -n)", () => { - const result = execSync(`bash -n "${installSh}" 2>&1`, { - encoding: "utf-8", - timeout: 10_000, - }); - // bash -n produces no output on success - expect(result.trim()).toBe(""); - }); - }); - - describe("scripts/install.ps1", () => { - const installPs1 = path.join(SCRIPTS_DIR, "install.ps1"); - - it.todo( - "should exist (PowerShell install script not yet available)" - ); - }); - - describe("scripts/convert.sh", () => { - const convertSh = path.join(SCRIPTS_DIR, "convert.sh"); - - it("should exist", () => { - expect(fs.existsSync(convertSh)).toBe(true); - }); - - it("should pass bash syntax check (bash -n)", () => { - const result = execSync(`bash -n "${convertSh}" 2>&1`, { - encoding: "utf-8", - timeout: 10_000, - }); - expect(result.trim()).toBe(""); - }); - }); -}); diff --git a/tsconfig.json b/tsconfig.json deleted file mode 100644 index 05924d0..0000000 --- a/tsconfig.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "compilerOptions": { - "target": "ES2022", - "module": "ESNext", - "moduleResolution": "bundler", - "strict": true, - "esModuleInterop": true, - "skipLibCheck": true, - "outDir": "dist", - "rootDir": "." - }, - "include": ["tests/**/*.ts", "vitest.config.ts"] -} diff --git a/vitest.config.ts b/vitest.config.ts deleted file mode 100644 index ce13bfd..0000000 --- a/vitest.config.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { defineConfig } from "vitest/config"; - -export default defineConfig({ - test: { - include: ["tests/**/*.test.ts"], - testTimeout: 30_000, - }, -});