create-hq 5.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/deps.d.ts +4 -0
- package/dist/deps.d.ts.map +1 -0
- package/dist/deps.js +65 -0
- package/dist/deps.js.map +1 -0
- package/dist/git.d.ts +3 -0
- package/dist/git.d.ts.map +1 -0
- package/dist/git.js +19 -0
- package/dist/git.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +23 -0
- package/dist/index.js.map +1 -0
- package/dist/scaffold.d.ts +8 -0
- package/dist/scaffold.d.ts.map +1 -0
- package/dist/scaffold.js +130 -0
- package/dist/scaffold.js.map +1 -0
- package/dist/ui.d.ts +7 -0
- package/dist/ui.d.ts.map +1 -0
- package/dist/ui.js +36 -0
- package/dist/ui.js.map +1 -0
- package/package.json +41 -0
- package/template/.claude/CLAUDE.md +202 -0
- package/template/.claude/commands/checkpoint.md +127 -0
- package/template/.claude/commands/cleanup.md +307 -0
- package/template/.claude/commands/execute-task.md +440 -0
- package/template/.claude/commands/exit-plan.md +41 -0
- package/template/.claude/commands/handoff.md +97 -0
- package/template/.claude/commands/learn.md +218 -0
- package/template/.claude/commands/metrics.md +118 -0
- package/template/.claude/commands/newworker.md +162 -0
- package/template/.claude/commands/nexttask.md +67 -0
- package/template/.claude/commands/prd.md +238 -0
- package/template/.claude/commands/reanchor.md +51 -0
- package/template/.claude/commands/remember.md +126 -0
- package/template/.claude/commands/run-project.md +348 -0
- package/template/.claude/commands/run.md +110 -0
- package/template/.claude/commands/search-reindex.md +62 -0
- package/template/.claude/commands/search.md +100 -0
- package/template/.claude/commands/setup.md +381 -0
- package/template/.claude/scripts/pure-ralph-loop.ps1 +312 -0
- package/template/.claude/scripts/pure-ralph-loop.sh +859 -0
- package/template/CHANGELOG.md +220 -0
- package/template/LICENSE +21 -0
- package/template/MIGRATION.md +259 -0
- package/template/README.md +368 -0
- package/template/data/journal/.gitkeep +0 -0
- package/template/docs/images/ascii-banner-options.md +122 -0
- package/template/docs/images/hq-banner.svg +105 -0
- package/template/knowledge/Ralph/01-overview.md +71 -0
- package/template/knowledge/Ralph/02-core-concepts.md +114 -0
- package/template/knowledge/Ralph/03-how-ralph-works.md +184 -0
- package/template/knowledge/Ralph/04-back-pressure.md +222 -0
- package/template/knowledge/Ralph/05-specifications.md +210 -0
- package/template/knowledge/Ralph/06-agents-md.md +222 -0
- package/template/knowledge/Ralph/07-implementation.md +316 -0
- package/template/knowledge/Ralph/08-economics.md +182 -0
- package/template/knowledge/Ralph/09-resources.md +145 -0
- package/template/knowledge/Ralph/10-claude-code-workflow.md +212 -0
- package/template/knowledge/Ralph/11-team-training-guide.md +383 -0
- package/template/knowledge/Ralph/README.md +40 -0
- package/template/knowledge/ai-security-framework/CONTRIBUTING.md +139 -0
- package/template/knowledge/ai-security-framework/GLOSSARY.md +176 -0
- package/template/knowledge/ai-security-framework/LICENSE +21 -0
- package/template/knowledge/ai-security-framework/QUICK-START.md +172 -0
- package/template/knowledge/ai-security-framework/README.md +232 -0
- package/template/knowledge/ai-security-framework/checklists/browser-security.md +301 -0
- package/template/knowledge/ai-security-framework/checklists/credential-isolation.md +322 -0
- package/template/knowledge/ai-security-framework/checklists/incident-response.md +288 -0
- package/template/knowledge/ai-security-framework/checklists/pre-flight.md +249 -0
- package/template/knowledge/ai-security-framework/checklists/weekly-audit.md +159 -0
- package/template/knowledge/ai-security-framework/configs/audit-logging.md +372 -0
- package/template/knowledge/ai-security-framework/configs/kill-switches.md +354 -0
- package/template/knowledge/ai-security-framework/docs/01-core-principles.md +256 -0
- package/template/knowledge/ai-security-framework/docs/02-threat-landscape.md +326 -0
- package/template/knowledge/ai-security-framework/docs/03-security-posture.md +250 -0
- package/template/knowledge/ai-security-framework/templates/agents-security.md +233 -0
- package/template/knowledge/design-styles/README.md +42 -0
- package/template/knowledge/design-styles/american-industrial.md +136 -0
- package/template/knowledge/design-styles/ethereal-abstract.md +133 -0
- package/template/knowledge/design-styles/liminal-portal.md +111 -0
- package/template/knowledge/design-styles/swipes/american-industrial/G-3m4YPW0AADdu2.jpeg +0 -0
- package/template/knowledge/design-styles/swipes/american-industrial/G-JJlt5WwAABK3K.png +0 -0
- package/template/knowledge/design-styles/swipes/american-industrial/G-JJmj5W0AEbJ-7.png +0 -0
- package/template/knowledge/design-styles/swipes/american-industrial/G59fgNuXkAAKLJQ (1).jpeg +0 -0
- package/template/knowledge/design-styles/swipes/american-industrial/G59fgNuXkAAKLJQ.jpeg +0 -0
- package/template/knowledge/design-styles/swipes/american-industrial/G7fVkn3WEAAM-ST.jpeg +0 -0
- package/template/knowledge/design-styles/swipes/american-industrial/G8ECO5JWEAIksyn.png +0 -0
- package/template/knowledge/design-styles/swipes/american-industrial/G9-3GQSWoAA8eqZ.png +0 -0
- package/template/knowledge/design-styles/swipes/american-industrial/G9xEOqrXkAEZRcs.png +0 -0
- package/template/knowledge/design-styles/swipes/american-industrial/G_MVeJrXQAA8sx4.jpeg +0 -0
- package/template/knowledge/design-styles/swipes/american-industrial/G_RSkmGXkAAgAVZ.png +0 -0
- package/template/knowledge/design-styles/swipes/american-industrial/README.md +31 -0
- package/template/knowledge/design-styles/swipes/american-industrial/qyqtg7Dq.png +0 -0
- package/template/knowledge/dev-team/README.md +35 -0
- package/template/knowledge/dev-team/patterns/README.md +34 -0
- package/template/knowledge/dev-team/patterns/frontend/react-best-practices.md +178 -0
- package/template/knowledge/dev-team/troubleshooting/README.md +31 -0
- package/template/knowledge/dev-team/workflows/README.md +49 -0
- package/template/knowledge/hq/checkpoint-schema.json +51 -0
- package/template/knowledge/hq/index-md-spec.md +74 -0
- package/template/knowledge/hq/thread-schema.md +153 -0
- package/template/knowledge/hq-core/checkpoint-schema.json +51 -0
- package/template/knowledge/hq-core/index-md-spec.md +74 -0
- package/template/knowledge/hq-core/thread-schema.md +153 -0
- package/template/knowledge/loom/README.md +51 -0
- package/template/knowledge/loom/architecture.md +125 -0
- package/template/knowledge/loom/code-style.md +169 -0
- package/template/knowledge/loom/llm-proxy.md +132 -0
- package/template/knowledge/loom/state-machine.md +131 -0
- package/template/knowledge/loom/thread-system.md +117 -0
- package/template/knowledge/loom/tools.md +94 -0
- package/template/knowledge/loom/weaver.md +96 -0
- package/template/knowledge/loom/web-frontend.md +131 -0
- package/template/knowledge/projects/README.md +72 -0
- package/template/knowledge/projects/templates/README.template.md +28 -0
- package/template/knowledge/workers/README.md +195 -0
- package/template/knowledge/workers/ralph-loop-pattern.md +157 -0
- package/template/knowledge/workers/skill-schema.md +182 -0
- package/template/knowledge/workers/state-machine.md +102 -0
- package/template/knowledge/workers/templates/base-worker.yaml +73 -0
- package/template/knowledge/workers/templates/code-worker.yaml +85 -0
- package/template/knowledge/workers/templates/skill.yaml +49 -0
- package/template/knowledge/workers/templates/social-worker.yaml +70 -0
- package/template/modules/examples/full-manifest.yaml +92 -0
- package/template/modules/examples/minimal.yaml +14 -0
- package/template/modules/modules.yaml +59 -0
- package/template/projects/.gitkeep +0 -0
- package/template/projects/incorporate-workers-into-pure-ralph/prd.json +88 -0
- package/template/projects/pure-ralph-branch-isolation/README.md +114 -0
- package/template/projects/pure-ralph-branch-isolation/prd.json +123 -0
- package/template/projects/purist-ralph-loop/README.md +148 -0
- package/template/projects/purist-ralph-loop/prd.json +135 -0
- package/template/projects/ralph-test/prd.json +50 -0
- package/template/prompts/pure-ralph-base.md +551 -0
- package/template/settings/.gitkeep +0 -0
- package/template/settings/pure-ralph.json +42 -0
- package/template/social-content/drafts/INDEX.md +21 -0
- package/template/social-content/drafts/linkedin/.gitkeep +1 -0
- package/template/social-content/drafts/x/.gitkeep +1 -0
- package/template/social-content/images/.gitkeep +1 -0
- package/template/starter-projects/code-worker/README.md +97 -0
- package/template/starter-projects/code-worker/prd.json +45 -0
- package/template/starter-projects/personal-assistant/README.md +42 -0
- package/template/starter-projects/personal-assistant/prd.json +43 -0
- package/template/starter-projects/social-media/README.md +60 -0
- package/template/starter-projects/social-media/prd.json +43 -0
- package/template/workers/content-brand/README.md +59 -0
- package/template/workers/content-brand/skills/messaging-alignment.md +91 -0
- package/template/workers/content-brand/skills/tone-check.md +76 -0
- package/template/workers/content-brand/skills/voice-analysis.md +68 -0
- package/template/workers/content-brand/worker.yaml +81 -0
- package/template/workers/content-legal/README.md +80 -0
- package/template/workers/content-legal/skills/claim-substantiation.md +150 -0
- package/template/workers/content-legal/skills/compliance-scan.md +123 -0
- package/template/workers/content-legal/skills/disclaimer-check.md +146 -0
- package/template/workers/content-legal/worker.yaml +118 -0
- package/template/workers/content-product/README.md +77 -0
- package/template/workers/content-product/skills/claim-verification.md +96 -0
- package/template/workers/content-product/skills/feature-accuracy.md +117 -0
- package/template/workers/content-product/skills/stats-check.md +128 -0
- package/template/workers/content-product/worker.yaml +97 -0
- package/template/workers/content-sales/README.md +70 -0
- package/template/workers/content-sales/skills/conversion-analysis.md +96 -0
- package/template/workers/content-sales/skills/cta-audit.md +107 -0
- package/template/workers/content-sales/skills/value-prop-check.md +114 -0
- package/template/workers/content-sales/worker.yaml +93 -0
- package/template/workers/content-shared/cli.ts +242 -0
- package/template/workers/content-shared/index.ts +234 -0
- package/template/workers/content-shared/lib/accuracy-analyzer.ts +661 -0
- package/template/workers/content-shared/lib/analyze.ts +370 -0
- package/template/workers/content-shared/lib/brand-analyzer.ts +526 -0
- package/template/workers/content-shared/lib/cms-integration.ts +446 -0
- package/template/workers/content-shared/lib/compliance-analyzer.ts +655 -0
- package/template/workers/content-shared/lib/conversion-analyzer.ts +555 -0
- package/template/workers/content-shared/lib/github-integration.ts +582 -0
- package/template/workers/content-shared/lib/output.ts +373 -0
- package/template/workers/content-shared/lib/parser.ts +771 -0
- package/template/workers/content-shared/lib/priority.ts +439 -0
- package/template/workers/content-shared/lib/recommendations.ts +512 -0
- package/template/workers/content-shared/lib/reporter.ts +749 -0
- package/template/workers/content-shared/lib/restructure.ts +664 -0
- package/template/workers/content-shared/lib/scorer.ts +140 -0
- package/template/workers/content-shared/lib/types.ts +227 -0
- package/template/workers/content-shared/lib/variants.ts +595 -0
- package/template/workers/content-shared/package.json +51 -0
- package/template/workers/content-shared/pnpm-lock.yaml +39 -0
- package/template/workers/content-shared/test/sample-page.json +115 -0
- package/template/workers/content-shared/tsconfig.json +20 -0
- package/template/workers/dev-team/README.md +166 -0
- package/template/workers/dev-team/_template.yaml +70 -0
- package/template/workers/dev-team/architect/package.json +27 -0
- package/template/workers/dev-team/architect/skills/api-design.md +89 -0
- package/template/workers/dev-team/architect/skills/refactor-plan.md +96 -0
- package/template/workers/dev-team/architect/skills/system-design.md +100 -0
- package/template/workers/dev-team/architect/src/index.ts +49 -0
- package/template/workers/dev-team/architect/src/mcp-server.ts +122 -0
- package/template/workers/dev-team/architect/src/skills/api-design.ts +316 -0
- package/template/workers/dev-team/architect/src/skills/refactor-plan.ts +264 -0
- package/template/workers/dev-team/architect/src/skills/system-design.ts +212 -0
- package/template/workers/dev-team/architect/tsconfig.json +19 -0
- package/template/workers/dev-team/architect/worker.yaml +128 -0
- package/template/workers/dev-team/backend-dev/package-lock.json +1252 -0
- package/template/workers/dev-team/backend-dev/package.json +27 -0
- package/template/workers/dev-team/backend-dev/skills/implement-endpoint.md +70 -0
- package/template/workers/dev-team/backend-dev/skills/implement-service.md +62 -0
- package/template/workers/dev-team/backend-dev/src/index.ts +51 -0
- package/template/workers/dev-team/backend-dev/src/mcp-server.ts +109 -0
- package/template/workers/dev-team/backend-dev/src/skills/implement-endpoint.ts +122 -0
- package/template/workers/dev-team/backend-dev/src/skills/implement-service.ts +126 -0
- package/template/workers/dev-team/backend-dev/tsconfig.json +19 -0
- package/template/workers/dev-team/backend-dev/worker.yaml +128 -0
- package/template/workers/dev-team/code-reviewer/package-lock.json +1080 -0
- package/template/workers/dev-team/code-reviewer/package.json +24 -0
- package/template/workers/dev-team/code-reviewer/skills/merge-to-production.md +61 -0
- package/template/workers/dev-team/code-reviewer/skills/merge-to-staging.md +54 -0
- package/template/workers/dev-team/code-reviewer/skills/request-changes.md +63 -0
- package/template/workers/dev-team/code-reviewer/skills/review-pr.md +77 -0
- package/template/workers/dev-team/code-reviewer/src/index.ts +56 -0
- package/template/workers/dev-team/code-reviewer/src/mcp-server.ts +101 -0
- package/template/workers/dev-team/code-reviewer/tsconfig.json +19 -0
- package/template/workers/dev-team/code-reviewer/worker.yaml +90 -0
- package/template/workers/dev-team/database-dev/package.json +22 -0
- package/template/workers/dev-team/database-dev/skills/create-schema.md +48 -0
- package/template/workers/dev-team/database-dev/src/index.ts +50 -0
- package/template/workers/dev-team/database-dev/src/mcp-server.ts +76 -0
- package/template/workers/dev-team/database-dev/tsconfig.json +18 -0
- package/template/workers/dev-team/database-dev/worker.yaml +90 -0
- package/template/workers/dev-team/frontend-dev/package.json +22 -0
- package/template/workers/dev-team/frontend-dev/skills/create-component.md +26 -0
- package/template/workers/dev-team/frontend-dev/src/index.ts +50 -0
- package/template/workers/dev-team/frontend-dev/src/mcp-server.ts +77 -0
- package/template/workers/dev-team/frontend-dev/tsconfig.json +18 -0
- package/template/workers/dev-team/frontend-dev/worker.yaml +132 -0
- package/template/workers/dev-team/infra-dev/package.json +24 -0
- package/template/workers/dev-team/infra-dev/skills/add-monitoring.md +73 -0
- package/template/workers/dev-team/infra-dev/skills/configure-deployment.md +80 -0
- package/template/workers/dev-team/infra-dev/skills/create-dockerfile.md +62 -0
- package/template/workers/dev-team/infra-dev/skills/setup-cicd.md +63 -0
- package/template/workers/dev-team/infra-dev/src/index.ts +55 -0
- package/template/workers/dev-team/infra-dev/src/mcp-server.ts +82 -0
- package/template/workers/dev-team/infra-dev/tsconfig.json +19 -0
- package/template/workers/dev-team/infra-dev/worker.yaml +92 -0
- package/template/workers/dev-team/knowledge-curator/package.json +24 -0
- package/template/workers/dev-team/knowledge-curator/skills/curate-troubleshooting.md +63 -0
- package/template/workers/dev-team/knowledge-curator/skills/process-learnings.md +61 -0
- package/template/workers/dev-team/knowledge-curator/skills/sync-documentation.md +76 -0
- package/template/workers/dev-team/knowledge-curator/skills/update-patterns.md +63 -0
- package/template/workers/dev-team/knowledge-curator/src/index.ts +53 -0
- package/template/workers/dev-team/knowledge-curator/src/mcp-server.ts +92 -0
- package/template/workers/dev-team/knowledge-curator/tsconfig.json +19 -0
- package/template/workers/dev-team/knowledge-curator/worker.yaml +80 -0
- package/template/workers/dev-team/motion-designer/package.json +22 -0
- package/template/workers/dev-team/motion-designer/skills/add-animation.md +25 -0
- package/template/workers/dev-team/motion-designer/skills/generate-image.md +36 -0
- package/template/workers/dev-team/motion-designer/src/index.ts +63 -0
- package/template/workers/dev-team/motion-designer/src/mcp-server.ts +79 -0
- package/template/workers/dev-team/motion-designer/tsconfig.json +18 -0
- package/template/workers/dev-team/motion-designer/worker.yaml +84 -0
- package/template/workers/dev-team/product-planner/queue.json +4 -0
- package/template/workers/dev-team/product-planner/worker.yaml +220 -0
- package/template/workers/dev-team/project-manager/package-lock.json +1252 -0
- package/template/workers/dev-team/project-manager/package.json +27 -0
- package/template/workers/dev-team/project-manager/skills/create-prd.md +66 -0
- package/template/workers/dev-team/project-manager/skills/next-issue.md +51 -0
- package/template/workers/dev-team/project-manager/skills/project-status.md +59 -0
- package/template/workers/dev-team/project-manager/skills/update-learnings.md +65 -0
- package/template/workers/dev-team/project-manager/src/index.ts +54 -0
- package/template/workers/dev-team/project-manager/src/mcp-server.ts +207 -0
- package/template/workers/dev-team/project-manager/src/skills/create-prd.ts +86 -0
- package/template/workers/dev-team/project-manager/src/skills/next-issue.ts +137 -0
- package/template/workers/dev-team/project-manager/src/skills/project-status.ts +131 -0
- package/template/workers/dev-team/project-manager/src/skills/update-learnings.ts +94 -0
- package/template/workers/dev-team/project-manager/tsconfig.json +19 -0
- package/template/workers/dev-team/project-manager/worker.yaml +96 -0
- package/template/workers/dev-team/qa-tester/package.json +24 -0
- package/template/workers/dev-team/qa-tester/skills/create-demo-account.md +36 -0
- package/template/workers/dev-team/qa-tester/skills/run-tests.md +36 -0
- package/template/workers/dev-team/qa-tester/skills/write-test.md +27 -0
- package/template/workers/dev-team/qa-tester/src/index.ts +61 -0
- package/template/workers/dev-team/qa-tester/src/mcp-server.ts +88 -0
- package/template/workers/dev-team/qa-tester/tsconfig.json +18 -0
- package/template/workers/dev-team/qa-tester/worker.yaml +116 -0
- package/template/workers/dev-team/task-executor/package-lock.json +1252 -0
- package/template/workers/dev-team/task-executor/package.json +27 -0
- package/template/workers/dev-team/task-executor/skills/analyze-issue.md +101 -0
- package/template/workers/dev-team/task-executor/skills/execute.md +133 -0
- package/template/workers/dev-team/task-executor/skills/report-learnings.md +106 -0
- package/template/workers/dev-team/task-executor/skills/validate-completion.md +121 -0
- package/template/workers/dev-team/task-executor/src/index.ts +54 -0
- package/template/workers/dev-team/task-executor/src/mcp-server.ts +139 -0
- package/template/workers/dev-team/task-executor/src/skills/analyze-issue.ts +219 -0
- package/template/workers/dev-team/task-executor/src/skills/execute.ts +132 -0
- package/template/workers/dev-team/task-executor/src/skills/report-learnings.ts +119 -0
- package/template/workers/dev-team/task-executor/src/skills/validate-completion.ts +142 -0
- package/template/workers/dev-team/task-executor/tsconfig.json +19 -0
- package/template/workers/dev-team/task-executor/worker.yaml +110 -0
- package/template/workers/registry.yaml +171 -0
- package/template/workers/security-scanner/README.md +73 -0
- package/template/workers/security-scanner/skills/pre-deploy-check.md +205 -0
- package/template/workers/security-scanner/worker.yaml +26 -0
- package/template/workspace/checkpoints/.gitkeep +0 -0
- package/template/workspace/content-ideas/inbox.jsonl +0 -0
- package/template/workspace/drafts/.gitkeep +0 -0
- package/template/workspace/learnings/.gitkeep +3 -0
- package/template/workspace/orchestrator/.gitkeep +0 -0
- package/template/workspace/ralph-test/COMPLETE.md +18 -0
- package/template/workspace/ralph-test/hello.txt +2 -0
- package/template/workspace/reports/.gitkeep +0 -0
- package/template/workspace/scratch/.gitkeep +0 -0
- package/template/workspace/threads/.gitkeep +3 -0
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import * as fs from 'fs';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
import { execSync } from 'child_process';
|
|
4
|
+
|
|
5
|
+
interface Story {
|
|
6
|
+
id: string;
|
|
7
|
+
title: string;
|
|
8
|
+
description?: string;
|
|
9
|
+
acceptance_criteria: string[];
|
|
10
|
+
priority: number;
|
|
11
|
+
passes: boolean;
|
|
12
|
+
dependsOn?: string[];
|
|
13
|
+
worker_hints?: string[];
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
interface Epic {
|
|
17
|
+
id: string;
|
|
18
|
+
title: string;
|
|
19
|
+
stories: Story[];
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
interface PRD {
|
|
23
|
+
project: string;
|
|
24
|
+
epics: Epic[];
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
interface NextIssueOptions {
|
|
28
|
+
project: string;
|
|
29
|
+
filter?: string;
|
|
30
|
+
priority?: string;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export async function nextIssue(options: NextIssueOptions): Promise<void> {
|
|
34
|
+
const { project, filter, priority } = options;
|
|
35
|
+
|
|
36
|
+
// Find PRD file
|
|
37
|
+
const prdPath = path.join(process.cwd(), '..', '..', '..', 'projects', project, 'prd.json');
|
|
38
|
+
|
|
39
|
+
if (!fs.existsSync(prdPath)) {
|
|
40
|
+
console.error(`PRD not found at ${prdPath}`);
|
|
41
|
+
console.log('\nTo create a new PRD, run:');
|
|
42
|
+
console.log(` project-manager create-prd --name ${project} --input requirements.md`);
|
|
43
|
+
process.exit(1);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
const prd: PRD = JSON.parse(fs.readFileSync(prdPath, 'utf-8'));
|
|
47
|
+
|
|
48
|
+
// Collect all stories with their pass status
|
|
49
|
+
const allStories: (Story & { epicId: string; epicTitle: string })[] = [];
|
|
50
|
+
for (const epic of prd.epics) {
|
|
51
|
+
for (const story of epic.stories) {
|
|
52
|
+
allStories.push({ ...story, epicId: epic.id, epicTitle: epic.title });
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// Build pass map for dependency checking
|
|
57
|
+
const passMap = new Map<string, boolean>();
|
|
58
|
+
for (const story of allStories) {
|
|
59
|
+
passMap.set(story.id, story.passes);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// Filter to incomplete stories with met dependencies
|
|
63
|
+
let candidates = allStories.filter(story => {
|
|
64
|
+
if (story.passes) return false;
|
|
65
|
+
|
|
66
|
+
// Check dependencies
|
|
67
|
+
if (story.dependsOn && story.dependsOn.length > 0) {
|
|
68
|
+
for (const dep of story.dependsOn) {
|
|
69
|
+
if (!passMap.get(dep)) return false;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
return true;
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
// Apply optional filters
|
|
77
|
+
if (priority) {
|
|
78
|
+
const priorityMap: Record<string, number> = { high: 1, medium: 2, low: 3 };
|
|
79
|
+
const priorityValue = priorityMap[priority.toLowerCase()];
|
|
80
|
+
if (priorityValue) {
|
|
81
|
+
candidates = candidates.filter(s => s.priority <= priorityValue);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
if (candidates.length === 0) {
|
|
86
|
+
console.log('No eligible issues found.');
|
|
87
|
+
console.log('\nPossible reasons:');
|
|
88
|
+
console.log(' - All stories are complete (passes: true)');
|
|
89
|
+
console.log(' - Remaining stories have unmet dependencies');
|
|
90
|
+
process.exit(0);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// Score and sort candidates
|
|
94
|
+
candidates.sort((a, b) => {
|
|
95
|
+
// Priority first (lower number = higher priority)
|
|
96
|
+
if (a.priority !== b.priority) return a.priority - b.priority;
|
|
97
|
+
|
|
98
|
+
// Then by number of stories blocked by this one
|
|
99
|
+
const aBlocks = allStories.filter(s => s.dependsOn?.includes(a.id)).length;
|
|
100
|
+
const bBlocks = allStories.filter(s => s.dependsOn?.includes(b.id)).length;
|
|
101
|
+
return bBlocks - aBlocks;
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
// Present top candidates
|
|
105
|
+
const top = candidates.slice(0, 3);
|
|
106
|
+
const recommended = top[0];
|
|
107
|
+
|
|
108
|
+
console.log(`\n=== Next Issue Selection for ${project} ===\n`);
|
|
109
|
+
console.log(`Recommended: ${recommended.id} "${recommended.title}"`);
|
|
110
|
+
console.log(` Epic: ${recommended.epicTitle}`);
|
|
111
|
+
console.log(` Priority: ${recommended.priority}`);
|
|
112
|
+
|
|
113
|
+
const blocksCount = allStories.filter(s => s.dependsOn?.includes(recommended.id)).length;
|
|
114
|
+
if (blocksCount > 0) {
|
|
115
|
+
console.log(` Blocks: ${blocksCount} other stories`);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
if (recommended.worker_hints && recommended.worker_hints.length > 0) {
|
|
119
|
+
console.log(` Workers: ${recommended.worker_hints.join(' → ')}`);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
console.log('\n Acceptance Criteria:');
|
|
123
|
+
for (const criterion of recommended.acceptance_criteria) {
|
|
124
|
+
console.log(` - ${criterion}`);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
if (top.length > 1) {
|
|
128
|
+
console.log('\nAlternatives:');
|
|
129
|
+
for (let i = 1; i < top.length; i++) {
|
|
130
|
+
const alt = top[i];
|
|
131
|
+
console.log(` - ${alt.id}: "${alt.title}" (Priority: ${alt.priority})`);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
console.log('\n[Human approval required to proceed]');
|
|
136
|
+
console.log('To execute, run task-executor with the selected issue.');
|
|
137
|
+
}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import * as fs from 'fs';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
|
|
4
|
+
interface Story {
|
|
5
|
+
id: string;
|
|
6
|
+
title: string;
|
|
7
|
+
passes: boolean;
|
|
8
|
+
dependsOn?: string[];
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
interface Epic {
|
|
12
|
+
id: string;
|
|
13
|
+
title: string;
|
|
14
|
+
stories: Story[];
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
interface PRD {
|
|
18
|
+
project: string;
|
|
19
|
+
epics: Epic[];
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
interface ProjectStatusOptions {
|
|
23
|
+
project: string;
|
|
24
|
+
verbose?: boolean;
|
|
25
|
+
format?: string;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export async function projectStatus(options: ProjectStatusOptions): Promise<void> {
|
|
29
|
+
const { project, verbose, format = 'table' } = options;
|
|
30
|
+
|
|
31
|
+
const prdPath = path.join(process.cwd(), '..', '..', '..', 'projects', project, 'prd.json');
|
|
32
|
+
|
|
33
|
+
if (!fs.existsSync(prdPath)) {
|
|
34
|
+
console.error(`PRD not found at ${prdPath}`);
|
|
35
|
+
process.exit(1);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
const prd: PRD = JSON.parse(fs.readFileSync(prdPath, 'utf-8'));
|
|
39
|
+
|
|
40
|
+
// Collect all stories
|
|
41
|
+
const allStories: (Story & { epicTitle: string })[] = [];
|
|
42
|
+
for (const epic of prd.epics) {
|
|
43
|
+
for (const story of epic.stories) {
|
|
44
|
+
allStories.push({ ...story, epicTitle: epic.title });
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// Calculate stats
|
|
49
|
+
const total = allStories.length;
|
|
50
|
+
const completed = allStories.filter(s => s.passes).length;
|
|
51
|
+
const pending = allStories.filter(s => !s.passes).length;
|
|
52
|
+
const percentage = Math.round((completed / total) * 100);
|
|
53
|
+
|
|
54
|
+
// Build pass map for dependency checking
|
|
55
|
+
const passMap = new Map<string, boolean>();
|
|
56
|
+
for (const story of allStories) {
|
|
57
|
+
passMap.set(story.id, story.passes);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// Find blocked stories
|
|
61
|
+
const blocked = allStories.filter(story => {
|
|
62
|
+
if (story.passes) return false;
|
|
63
|
+
if (!story.dependsOn || story.dependsOn.length === 0) return false;
|
|
64
|
+
return story.dependsOn.some(dep => !passMap.get(dep));
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
// Find ready stories (not passed, dependencies met)
|
|
68
|
+
const ready = allStories.filter(story => {
|
|
69
|
+
if (story.passes) return false;
|
|
70
|
+
if (!story.dependsOn || story.dependsOn.length === 0) return true;
|
|
71
|
+
return story.dependsOn.every(dep => passMap.get(dep));
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
// Output
|
|
75
|
+
if (format === 'json') {
|
|
76
|
+
console.log(JSON.stringify({
|
|
77
|
+
project,
|
|
78
|
+
total,
|
|
79
|
+
completed,
|
|
80
|
+
pending,
|
|
81
|
+
percentage,
|
|
82
|
+
blocked: blocked.map(s => s.id),
|
|
83
|
+
ready: ready.map(s => s.id)
|
|
84
|
+
}, null, 2));
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// Progress bar
|
|
89
|
+
const barLength = 20;
|
|
90
|
+
const filledLength = Math.round((percentage / 100) * barLength);
|
|
91
|
+
const bar = '█'.repeat(filledLength) + '░'.repeat(barLength - filledLength);
|
|
92
|
+
|
|
93
|
+
console.log(`\n=== ${project} ===`);
|
|
94
|
+
console.log(`Progress: ${bar} ${percentage}% (${completed}/${total} stories)\n`);
|
|
95
|
+
|
|
96
|
+
if (completed > 0) {
|
|
97
|
+
console.log(`✅ Completed (${completed}):`);
|
|
98
|
+
for (const story of allStories.filter(s => s.passes)) {
|
|
99
|
+
console.log(` - ${story.id}: ${story.title}`);
|
|
100
|
+
}
|
|
101
|
+
console.log();
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
if (ready.length > 0) {
|
|
105
|
+
console.log(`⏳ Ready (${ready.length}):`);
|
|
106
|
+
for (const story of ready) {
|
|
107
|
+
console.log(` - ${story.id}: ${story.title}`);
|
|
108
|
+
}
|
|
109
|
+
console.log();
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
if (blocked.length > 0) {
|
|
113
|
+
console.log(`🚫 Blocked (${blocked.length}):`);
|
|
114
|
+
for (const story of blocked) {
|
|
115
|
+
const blockedBy = story.dependsOn?.filter(dep => !passMap.get(dep)) || [];
|
|
116
|
+
console.log(` - ${story.id}: ${story.title}`);
|
|
117
|
+
console.log(` blocked by: ${blockedBy.join(', ')}`);
|
|
118
|
+
}
|
|
119
|
+
console.log();
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
// Next recommendation
|
|
123
|
+
if (ready.length > 0) {
|
|
124
|
+
console.log(`Next: Run task-executor on ${ready[0].id}`);
|
|
125
|
+
console.log(` task-executor execute --issue ${ready[0].id} --project ${project}`);
|
|
126
|
+
} else if (pending > 0) {
|
|
127
|
+
console.log('⚠️ All pending stories are blocked. Resolve dependencies first.');
|
|
128
|
+
} else {
|
|
129
|
+
console.log('🎉 All stories complete!');
|
|
130
|
+
}
|
|
131
|
+
}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import * as fs from 'fs';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
|
|
4
|
+
interface Learning {
|
|
5
|
+
type: 'project' | 'pattern' | 'troubleshoot' | 'workflow';
|
|
6
|
+
category?: string;
|
|
7
|
+
content: string;
|
|
8
|
+
task?: string;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
interface UpdateLearningsOptions {
|
|
12
|
+
project?: string;
|
|
13
|
+
dryRun?: boolean;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
const KNOWLEDGE_BASE = path.join(process.cwd(), '..', '..', '..', 'knowledge', 'dev-team');
|
|
17
|
+
|
|
18
|
+
export async function updateLearnings(options: UpdateLearningsOptions): Promise<void> {
|
|
19
|
+
const { project, dryRun } = options;
|
|
20
|
+
|
|
21
|
+
// Read learnings from stdin or prompt
|
|
22
|
+
console.log('=== Update Learnings ===\n');
|
|
23
|
+
console.log('Paste learning report (JSON format), then press Ctrl+D:\n');
|
|
24
|
+
|
|
25
|
+
// In practice, this would read from stdin or a file
|
|
26
|
+
// For now, show the expected format
|
|
27
|
+
console.log('Expected format:');
|
|
28
|
+
console.log(JSON.stringify({
|
|
29
|
+
task: 'US-001',
|
|
30
|
+
learnings: [
|
|
31
|
+
{ type: 'pattern', category: 'backend', content: 'Use retry wrapper for external APIs' },
|
|
32
|
+
{ type: 'troubleshoot', content: 'Redis must connect before auth middleware' }
|
|
33
|
+
]
|
|
34
|
+
}, null, 2));
|
|
35
|
+
|
|
36
|
+
console.log('\n[This skill processes learnings from task-executor]');
|
|
37
|
+
console.log('\nRouting destinations:');
|
|
38
|
+
console.log(' - project → projects/{name}/learnings/');
|
|
39
|
+
console.log(' - pattern → knowledge/dev-team/patterns/{category}/');
|
|
40
|
+
console.log(' - troubleshoot → knowledge/dev-team/troubleshooting/');
|
|
41
|
+
console.log(' - workflow → knowledge/dev-team/workflows/');
|
|
42
|
+
|
|
43
|
+
if (dryRun) {
|
|
44
|
+
console.log('\n[Dry run mode - no files will be written]');
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export function routeLearning(learning: Learning, project?: string): string {
|
|
49
|
+
const date = new Date().toISOString().split('T')[0];
|
|
50
|
+
const slug = learning.content
|
|
51
|
+
.toLowerCase()
|
|
52
|
+
.replace(/[^a-z0-9]+/g, '-')
|
|
53
|
+
.substring(0, 40);
|
|
54
|
+
|
|
55
|
+
switch (learning.type) {
|
|
56
|
+
case 'project':
|
|
57
|
+
if (!project) throw new Error('Project required for project-specific learnings');
|
|
58
|
+
return path.join('projects', project, 'learnings', `${date}-${slug}.md`);
|
|
59
|
+
|
|
60
|
+
case 'pattern':
|
|
61
|
+
const category = learning.category || 'general';
|
|
62
|
+
return path.join(KNOWLEDGE_BASE, 'patterns', category, `${slug}.md`);
|
|
63
|
+
|
|
64
|
+
case 'troubleshoot':
|
|
65
|
+
return path.join(KNOWLEDGE_BASE, 'troubleshooting', `${slug}.md`);
|
|
66
|
+
|
|
67
|
+
case 'workflow':
|
|
68
|
+
return path.join(KNOWLEDGE_BASE, 'workflows', `${slug}.md`);
|
|
69
|
+
|
|
70
|
+
default:
|
|
71
|
+
throw new Error(`Unknown learning type: ${learning.type}`);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
export function formatLearning(learning: Learning, task?: string): string {
|
|
76
|
+
const lines = [
|
|
77
|
+
`# ${learning.content.split('.')[0]}`,
|
|
78
|
+
'',
|
|
79
|
+
`## Content`,
|
|
80
|
+
learning.content,
|
|
81
|
+
''
|
|
82
|
+
];
|
|
83
|
+
|
|
84
|
+
if (task) {
|
|
85
|
+
lines.push(`## Source`);
|
|
86
|
+
lines.push(`Learned from task: ${task}`);
|
|
87
|
+
lines.push('');
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
lines.push(`## Date`);
|
|
91
|
+
lines.push(new Date().toISOString().split('T')[0]);
|
|
92
|
+
|
|
93
|
+
return lines.join('\n');
|
|
94
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"target": "ES2022",
|
|
4
|
+
"module": "commonjs",
|
|
5
|
+
"lib": ["ES2022"],
|
|
6
|
+
"outDir": "./dist",
|
|
7
|
+
"rootDir": "./src",
|
|
8
|
+
"strict": true,
|
|
9
|
+
"esModuleInterop": true,
|
|
10
|
+
"skipLibCheck": true,
|
|
11
|
+
"forceConsistentCasingInFileNames": true,
|
|
12
|
+
"resolveJsonModule": true,
|
|
13
|
+
"declaration": true,
|
|
14
|
+
"declarationMap": true,
|
|
15
|
+
"sourceMap": true
|
|
16
|
+
},
|
|
17
|
+
"include": ["src/**/*"],
|
|
18
|
+
"exclude": ["node_modules", "dist"]
|
|
19
|
+
}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
worker:
|
|
2
|
+
id: project-manager
|
|
3
|
+
name: "Project Manager"
|
|
4
|
+
type: OpsWorker
|
|
5
|
+
version: "1.0"
|
|
6
|
+
|
|
7
|
+
execution:
|
|
8
|
+
mode: on_demand
|
|
9
|
+
max_runtime: 10m
|
|
10
|
+
retry_attempts: 1
|
|
11
|
+
|
|
12
|
+
context:
|
|
13
|
+
base:
|
|
14
|
+
- workers/public/dev-team/project-manager/
|
|
15
|
+
- workers/public/dev-team/project-manager/skills/
|
|
16
|
+
- knowledge/public/dev-team/workflows/
|
|
17
|
+
dynamic:
|
|
18
|
+
- pattern: "projects/{project}/"
|
|
19
|
+
when: always
|
|
20
|
+
exclude:
|
|
21
|
+
- node_modules/
|
|
22
|
+
- dist/
|
|
23
|
+
- "*.log"
|
|
24
|
+
|
|
25
|
+
verification:
|
|
26
|
+
post_execute:
|
|
27
|
+
- check: typescript
|
|
28
|
+
command: npm run typecheck
|
|
29
|
+
approval_required: true
|
|
30
|
+
|
|
31
|
+
output:
|
|
32
|
+
destination: workspace/reports/dev-team/
|
|
33
|
+
format: both
|
|
34
|
+
naming: "{date}-project-manager-{skill}.{ext}"
|
|
35
|
+
|
|
36
|
+
mcp:
|
|
37
|
+
server:
|
|
38
|
+
command: node
|
|
39
|
+
args:
|
|
40
|
+
- dist/mcp-server.js
|
|
41
|
+
cwd: workers/public/dev-team/project-manager
|
|
42
|
+
tools:
|
|
43
|
+
- next_issue
|
|
44
|
+
- create_prd
|
|
45
|
+
- update_learnings
|
|
46
|
+
- project_status
|
|
47
|
+
|
|
48
|
+
# State Machine (Loom pattern)
|
|
49
|
+
state_machine:
|
|
50
|
+
enabled: true
|
|
51
|
+
max_retries: 1
|
|
52
|
+
hooks:
|
|
53
|
+
post_execute:
|
|
54
|
+
- auto_checkpoint
|
|
55
|
+
- log_metrics
|
|
56
|
+
on_error:
|
|
57
|
+
- log_error
|
|
58
|
+
- checkpoint_error_state
|
|
59
|
+
|
|
60
|
+
instructions: |
|
|
61
|
+
# Project Manager
|
|
62
|
+
|
|
63
|
+
Orchestrates project execution: PRD lifecycle, issue selection, learning aggregation.
|
|
64
|
+
|
|
65
|
+
## Skills
|
|
66
|
+
|
|
67
|
+
| Skill | Description |
|
|
68
|
+
|-------|-------------|
|
|
69
|
+
| next-issue | Select next issue from PRD/beads to work on |
|
|
70
|
+
| create-prd | Create new PRD from requirements |
|
|
71
|
+
| update-learnings | Route learnings to appropriate knowledge locations |
|
|
72
|
+
| project-status | Show project progress and blockers |
|
|
73
|
+
|
|
74
|
+
## CLI Usage
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
cd workers/public/dev-team/project-manager
|
|
78
|
+
node dist/index.js next-issue --project my-feature
|
|
79
|
+
node dist/index.js create-prd --name "New Feature" --input requirements.md
|
|
80
|
+
node dist/index.js project-status --project my-feature
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
## Workflow
|
|
84
|
+
|
|
85
|
+
1. Read PRD/beads for project
|
|
86
|
+
2. Select next issue (passes=false, dependencies met)
|
|
87
|
+
3. Spawn task-executor with selected issue
|
|
88
|
+
4. Receive learnings from task-executor
|
|
89
|
+
5. Route learnings via update-learnings skill
|
|
90
|
+
6. Repeat until all issues pass
|
|
91
|
+
|
|
92
|
+
## Human-in-the-loop
|
|
93
|
+
|
|
94
|
+
- Before issue selection: Show candidates, get approval
|
|
95
|
+
- After task completion: Show learnings, confirm routing
|
|
96
|
+
- On project completion: Summarize outcomes
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@hq/qa-tester",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Testing, browser automation, and accessibility verification",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"bin": { "qa-tester": "dist/index.js" },
|
|
7
|
+
"scripts": {
|
|
8
|
+
"build": "tsc",
|
|
9
|
+
"typecheck": "tsc --noEmit",
|
|
10
|
+
"dev": "ts-node src/index.ts",
|
|
11
|
+
"mcp": "node dist/mcp-server.js"
|
|
12
|
+
},
|
|
13
|
+
"dependencies": {
|
|
14
|
+
"@modelcontextprotocol/sdk": "^1.0.0",
|
|
15
|
+
"@playwright/test": "^1.57.0",
|
|
16
|
+
"@axe-core/playwright": "^4.10.0",
|
|
17
|
+
"commander": "^12.1.0"
|
|
18
|
+
},
|
|
19
|
+
"devDependencies": {
|
|
20
|
+
"@types/node": "^22.10.0",
|
|
21
|
+
"typescript": "^5.7.2",
|
|
22
|
+
"ts-node": "^10.9.2"
|
|
23
|
+
}
|
|
24
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# create-demo-account
|
|
2
|
+
|
|
3
|
+
Create a demo account for testing purposes.
|
|
4
|
+
|
|
5
|
+
## Arguments
|
|
6
|
+
|
|
7
|
+
`$ARGUMENTS` = `--platform <shopify|stripe|etc>` (required)
|
|
8
|
+
|
|
9
|
+
Optional:
|
|
10
|
+
- `--name <string>` - Account name
|
|
11
|
+
- `--project <name>` - Project context
|
|
12
|
+
|
|
13
|
+
## Process
|
|
14
|
+
|
|
15
|
+
1. Identify platform requirements
|
|
16
|
+
2. Generate demo credentials
|
|
17
|
+
3. Create account via API/UI
|
|
18
|
+
4. Store credentials safely
|
|
19
|
+
5. Verify account works
|
|
20
|
+
|
|
21
|
+
## Output
|
|
22
|
+
|
|
23
|
+
Demo account details stored in:
|
|
24
|
+
`projects/{project}/test-env/demo-accounts.json`
|
|
25
|
+
|
|
26
|
+
## Platforms Supported
|
|
27
|
+
|
|
28
|
+
- Shopify (development store)
|
|
29
|
+
- Stripe (test mode)
|
|
30
|
+
- Custom platforms (via config)
|
|
31
|
+
|
|
32
|
+
## Human-in-the-loop
|
|
33
|
+
|
|
34
|
+
- Approve account creation
|
|
35
|
+
- Confirm platform selection
|
|
36
|
+
- Review stored credentials
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# run-tests
|
|
2
|
+
|
|
3
|
+
Run test suite and report results.
|
|
4
|
+
|
|
5
|
+
## Arguments
|
|
6
|
+
|
|
7
|
+
`$ARGUMENTS` = `--suite <name>` or `--file <path>` (optional)
|
|
8
|
+
|
|
9
|
+
Optional:
|
|
10
|
+
- `--repo <path>` - Target repository
|
|
11
|
+
- `--type <unit|e2e|all>` - Test type
|
|
12
|
+
- `--watch` - Watch mode
|
|
13
|
+
|
|
14
|
+
## Process
|
|
15
|
+
|
|
16
|
+
1. Detect test framework (Jest, Vitest, Playwright)
|
|
17
|
+
2. Run specified tests
|
|
18
|
+
3. Capture results
|
|
19
|
+
4. Format report
|
|
20
|
+
5. Surface failures with context
|
|
21
|
+
|
|
22
|
+
## Output
|
|
23
|
+
|
|
24
|
+
Test report:
|
|
25
|
+
```
|
|
26
|
+
✅ 42 passed
|
|
27
|
+
❌ 2 failed
|
|
28
|
+
⏭️ 3 skipped
|
|
29
|
+
|
|
30
|
+
Failed tests:
|
|
31
|
+
1. src/api/auth.test.ts:42 - login should return token
|
|
32
|
+
Error: Expected 200, got 401
|
|
33
|
+
|
|
34
|
+
2. src/components/Button.test.tsx:18 - renders correctly
|
|
35
|
+
Error: Snapshot mismatch
|
|
36
|
+
```
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# write-test
|
|
2
|
+
|
|
3
|
+
Write a new test for a feature or function.
|
|
4
|
+
|
|
5
|
+
## Arguments
|
|
6
|
+
|
|
7
|
+
`$ARGUMENTS` = `--target <file|function>` (required)
|
|
8
|
+
|
|
9
|
+
Optional:
|
|
10
|
+
- `--repo <path>` - Target repository
|
|
11
|
+
- `--type <unit|integration|e2e>` - Test type
|
|
12
|
+
|
|
13
|
+
## Process
|
|
14
|
+
|
|
15
|
+
1. Analyze target code
|
|
16
|
+
2. Identify test cases
|
|
17
|
+
3. Generate test file
|
|
18
|
+
4. Add to test suite
|
|
19
|
+
5. Verify tests pass
|
|
20
|
+
|
|
21
|
+
## Output
|
|
22
|
+
|
|
23
|
+
New test file with:
|
|
24
|
+
- Setup/teardown
|
|
25
|
+
- Happy path tests
|
|
26
|
+
- Edge cases
|
|
27
|
+
- Error handling tests
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Command } from 'commander';
|
|
3
|
+
|
|
4
|
+
const program = new Command();
|
|
5
|
+
|
|
6
|
+
program
|
|
7
|
+
.name('qa-tester')
|
|
8
|
+
.description('Testing, browser automation, and accessibility verification')
|
|
9
|
+
.version('1.0.0');
|
|
10
|
+
|
|
11
|
+
program
|
|
12
|
+
.command('run-tests')
|
|
13
|
+
.description('Run test suite')
|
|
14
|
+
.option('--suite <name>', 'Test suite name')
|
|
15
|
+
.option('--file <path>', 'Specific test file')
|
|
16
|
+
.option('--repo <path>', 'Target repository')
|
|
17
|
+
.option('--type <type>', 'Test type: unit|e2e|all')
|
|
18
|
+
.option('--watch', 'Watch mode')
|
|
19
|
+
.action(async (options) => {
|
|
20
|
+
console.log('run-tests:', options);
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
program
|
|
24
|
+
.command('write-test')
|
|
25
|
+
.description('Write new test for feature')
|
|
26
|
+
.requiredOption('--target <path>', 'Target file or function')
|
|
27
|
+
.option('--repo <path>', 'Target repository')
|
|
28
|
+
.option('--type <type>', 'Test type: unit|integration|e2e')
|
|
29
|
+
.action(async (options) => {
|
|
30
|
+
console.log('write-test:', options);
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
program
|
|
34
|
+
.command('visual-regression')
|
|
35
|
+
.description('Run visual regression tests')
|
|
36
|
+
.option('--url <url>', 'Target URL')
|
|
37
|
+
.option('--repo <path>', 'Target repository')
|
|
38
|
+
.action(async (options) => {
|
|
39
|
+
console.log('visual-regression:', options);
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
program
|
|
43
|
+
.command('accessibility-scan')
|
|
44
|
+
.description('Run accessibility audit')
|
|
45
|
+
.requiredOption('--url <url>', 'Target URL')
|
|
46
|
+
.option('--standard <wcag>', 'WCAG standard: 2.0|2.1|2.2')
|
|
47
|
+
.action(async (options) => {
|
|
48
|
+
console.log('accessibility-scan:', options);
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
program
|
|
52
|
+
.command('create-demo-account')
|
|
53
|
+
.description('Create demo account for testing')
|
|
54
|
+
.requiredOption('--platform <name>', 'Platform: shopify|stripe|etc')
|
|
55
|
+
.option('--name <string>', 'Account name')
|
|
56
|
+
.option('--project <name>', 'Project context')
|
|
57
|
+
.action(async (options) => {
|
|
58
|
+
console.log('create-demo-account:', options);
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
program.parse();
|