popeye-cli 1.5.0 → 1.7.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/CHANGELOG.md +54 -0
- package/README.md +184 -31
- package/dist/cli/commands/create.d.ts.map +1 -1
- package/dist/cli/commands/create.js +54 -4
- package/dist/cli/commands/create.js.map +1 -1
- package/dist/cli/interactive.d.ts +29 -0
- package/dist/cli/interactive.d.ts.map +1 -1
- package/dist/cli/interactive.js +90 -7
- package/dist/cli/interactive.js.map +1 -1
- package/dist/generators/all.d.ts +4 -1
- package/dist/generators/all.d.ts.map +1 -1
- package/dist/generators/all.js +36 -316
- package/dist/generators/all.js.map +1 -1
- package/dist/generators/doc-parser.d.ts +18 -3
- package/dist/generators/doc-parser.d.ts.map +1 -1
- package/dist/generators/doc-parser.js +81 -10
- package/dist/generators/doc-parser.js.map +1 -1
- package/dist/generators/frontend-design-analyzer.d.ts +30 -0
- package/dist/generators/frontend-design-analyzer.d.ts.map +1 -0
- package/dist/generators/frontend-design-analyzer.js +208 -0
- package/dist/generators/frontend-design-analyzer.js.map +1 -0
- package/dist/generators/shared-packages.d.ts +45 -0
- package/dist/generators/shared-packages.d.ts.map +1 -0
- package/dist/generators/shared-packages.js +456 -0
- package/dist/generators/shared-packages.js.map +1 -0
- package/dist/generators/templates/index.d.ts +4 -0
- package/dist/generators/templates/index.d.ts.map +1 -1
- package/dist/generators/templates/index.js +4 -0
- package/dist/generators/templates/index.js.map +1 -1
- package/dist/generators/templates/website-components.d.ts.map +1 -1
- package/dist/generators/templates/website-components.js +36 -11
- package/dist/generators/templates/website-components.js.map +1 -1
- package/dist/generators/templates/website-config.d.ts +15 -1
- package/dist/generators/templates/website-config.d.ts.map +1 -1
- package/dist/generators/templates/website-config.js +155 -13
- package/dist/generators/templates/website-config.js.map +1 -1
- package/dist/generators/templates/website-landing.d.ts +24 -0
- package/dist/generators/templates/website-landing.d.ts.map +1 -0
- package/dist/generators/templates/website-landing.js +276 -0
- package/dist/generators/templates/website-landing.js.map +1 -0
- package/dist/generators/templates/website-layout.d.ts +42 -0
- package/dist/generators/templates/website-layout.d.ts.map +1 -0
- package/dist/generators/templates/website-layout.js +408 -0
- package/dist/generators/templates/website-layout.js.map +1 -0
- package/dist/generators/templates/website-pricing.d.ts +11 -0
- package/dist/generators/templates/website-pricing.d.ts.map +1 -0
- package/dist/generators/templates/website-pricing.js +313 -0
- package/dist/generators/templates/website-pricing.js.map +1 -0
- package/dist/generators/templates/website-sections.d.ts +102 -0
- package/dist/generators/templates/website-sections.d.ts.map +1 -0
- package/dist/generators/templates/website-sections.js +444 -0
- package/dist/generators/templates/website-sections.js.map +1 -0
- package/dist/generators/templates/website.d.ts +10 -50
- package/dist/generators/templates/website.d.ts.map +1 -1
- package/dist/generators/templates/website.js +12 -788
- package/dist/generators/templates/website.js.map +1 -1
- package/dist/generators/website-content-scanner.d.ts +37 -0
- package/dist/generators/website-content-scanner.d.ts.map +1 -0
- package/dist/generators/website-content-scanner.js +165 -0
- package/dist/generators/website-content-scanner.js.map +1 -0
- package/dist/generators/website-context.d.ts +38 -2
- package/dist/generators/website-context.d.ts.map +1 -1
- package/dist/generators/website-context.js +179 -19
- package/dist/generators/website-context.js.map +1 -1
- package/dist/generators/website-debug.d.ts +68 -0
- package/dist/generators/website-debug.d.ts.map +1 -0
- package/dist/generators/website-debug.js +93 -0
- package/dist/generators/website-debug.js.map +1 -0
- package/dist/generators/website.d.ts +2 -0
- package/dist/generators/website.d.ts.map +1 -1
- package/dist/generators/website.js +66 -4
- package/dist/generators/website.js.map +1 -1
- package/dist/generators/workspace-root.d.ts +27 -0
- package/dist/generators/workspace-root.d.ts.map +1 -0
- package/dist/generators/workspace-root.js +100 -0
- package/dist/generators/workspace-root.js.map +1 -0
- package/dist/state/index.d.ts +8 -0
- package/dist/state/index.d.ts.map +1 -1
- package/dist/state/index.js +11 -0
- package/dist/state/index.js.map +1 -1
- package/dist/types/consensus.d.ts +3 -0
- package/dist/types/consensus.d.ts.map +1 -1
- package/dist/types/consensus.js +1 -0
- package/dist/types/consensus.js.map +1 -1
- package/dist/types/index.d.ts +1 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -1
- package/dist/types/tester.d.ts +138 -0
- package/dist/types/tester.d.ts.map +1 -0
- package/dist/types/tester.js +110 -0
- package/dist/types/tester.js.map +1 -0
- package/dist/types/workflow.d.ts +151 -0
- package/dist/types/workflow.d.ts.map +1 -1
- package/dist/types/workflow.js +14 -0
- package/dist/types/workflow.js.map +1 -1
- package/dist/upgrade/handlers.d.ts +15 -0
- package/dist/upgrade/handlers.d.ts.map +1 -1
- package/dist/upgrade/handlers.js +52 -0
- package/dist/upgrade/handlers.js.map +1 -1
- package/dist/workflow/auto-fix-bundler.d.ts +37 -0
- package/dist/workflow/auto-fix-bundler.d.ts.map +1 -0
- package/dist/workflow/auto-fix-bundler.js +320 -0
- package/dist/workflow/auto-fix-bundler.js.map +1 -0
- package/dist/workflow/auto-fix.d.ts.map +1 -1
- package/dist/workflow/auto-fix.js +10 -3
- package/dist/workflow/auto-fix.js.map +1 -1
- package/dist/workflow/execution-mode.js +2 -2
- package/dist/workflow/execution-mode.js.map +1 -1
- package/dist/workflow/index.d.ts +2 -0
- package/dist/workflow/index.d.ts.map +1 -1
- package/dist/workflow/index.js +13 -0
- package/dist/workflow/index.js.map +1 -1
- package/dist/workflow/overview.d.ts.map +1 -1
- package/dist/workflow/overview.js +4 -0
- package/dist/workflow/overview.js.map +1 -1
- package/dist/workflow/plan-mode.d.ts +4 -3
- package/dist/workflow/plan-mode.d.ts.map +1 -1
- package/dist/workflow/plan-mode.js +69 -5
- package/dist/workflow/plan-mode.js.map +1 -1
- package/dist/workflow/task-workflow.d.ts +5 -0
- package/dist/workflow/task-workflow.d.ts.map +1 -1
- package/dist/workflow/task-workflow.js +172 -6
- package/dist/workflow/task-workflow.js.map +1 -1
- package/dist/workflow/tester.d.ts +120 -0
- package/dist/workflow/tester.d.ts.map +1 -0
- package/dist/workflow/tester.js +589 -0
- package/dist/workflow/tester.js.map +1 -0
- package/dist/workflow/website-strategy.d.ts +9 -0
- package/dist/workflow/website-strategy.d.ts.map +1 -1
- package/dist/workflow/website-strategy.js +73 -1
- package/dist/workflow/website-strategy.js.map +1 -1
- package/dist/workflow/website-updater.d.ts.map +1 -1
- package/dist/workflow/website-updater.js +15 -4
- package/dist/workflow/website-updater.js.map +1 -1
- package/dist/workflow/workflow-logger.d.ts +1 -1
- package/dist/workflow/workflow-logger.d.ts.map +1 -1
- package/dist/workflow/workflow-logger.js.map +1 -1
- package/package.json +1 -1
- package/src/cli/commands/create.ts +58 -4
- package/src/cli/interactive.ts +96 -7
- package/src/generators/all.ts +44 -332
- package/src/generators/doc-parser.ts +87 -10
- package/src/generators/frontend-design-analyzer.ts +261 -0
- package/src/generators/shared-packages.ts +500 -0
- package/src/generators/templates/index.ts +4 -0
- package/src/generators/templates/website-components.ts +36 -11
- package/src/generators/templates/website-config.ts +166 -13
- package/src/generators/templates/website-landing.ts +331 -0
- package/src/generators/templates/website-layout.ts +443 -0
- package/src/generators/templates/website-pricing.ts +330 -0
- package/src/generators/templates/website-sections.ts +541 -0
- package/src/generators/templates/website.ts +38 -851
- package/src/generators/website-content-scanner.ts +208 -0
- package/src/generators/website-context.ts +248 -20
- package/src/generators/website-debug.ts +130 -0
- package/src/generators/website.ts +71 -3
- package/src/generators/workspace-root.ts +113 -0
- package/src/state/index.ts +15 -0
- package/src/types/consensus.ts +3 -0
- package/src/types/index.ts +21 -0
- package/src/types/tester.ts +136 -0
- package/src/types/workflow.ts +32 -0
- package/src/upgrade/handlers.ts +65 -0
- package/src/workflow/auto-fix-bundler.ts +392 -0
- package/src/workflow/auto-fix.ts +11 -3
- package/src/workflow/execution-mode.ts +2 -2
- package/src/workflow/index.ts +13 -0
- package/src/workflow/overview.ts +6 -0
- package/src/workflow/plan-mode.ts +81 -7
- package/src/workflow/task-workflow.ts +227 -5
- package/src/workflow/tester.ts +723 -0
- package/src/workflow/website-strategy.ts +75 -1
- package/src/workflow/website-updater.ts +17 -6
- package/src/workflow/workflow-logger.ts +2 -0
- package/tests/cli/project-naming.test.ts +136 -0
- package/tests/generators/doc-parser.test.ts +121 -0
- package/tests/generators/frontend-design-analyzer.test.ts +90 -0
- package/tests/generators/quality-gate.test.ts +183 -0
- package/tests/generators/shared-packages.test.ts +83 -0
- package/tests/generators/website-components.test.ts +1 -1
- package/tests/generators/website-config.test.ts +84 -0
- package/tests/generators/website-content-scanner.test.ts +181 -0
- package/tests/generators/website-context.test.ts +109 -0
- package/tests/generators/website-debug.test.ts +77 -0
- package/tests/generators/website-landing.test.ts +188 -0
- package/tests/generators/website-pricing.test.ts +98 -0
- package/tests/generators/website-sections.test.ts +245 -0
- package/tests/generators/workspace-root.test.ts +105 -0
- package/tests/types/tester.test.ts +174 -0
- package/tests/upgrade/handlers.test.ts +162 -0
- package/tests/workflow/auto-fix-bundler.test.ts +242 -0
- package/tests/workflow/plan-mode.test.ts +111 -1
- package/tests/workflow/tester.test.ts +401 -0
- package/tests/workflow/website-strategy.test.ts +55 -0
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tester (QA) skill module
|
|
3
|
+
* Provides test planning, review, and fix plan capabilities.
|
|
4
|
+
* Provider-agnostic -- uses whichever AI provider is configured.
|
|
5
|
+
*/
|
|
6
|
+
import type { ProjectState, Task, Milestone } from '../types/workflow.js';
|
|
7
|
+
import type { ConsensusConfig } from '../types/consensus.js';
|
|
8
|
+
import type { TestPlanOutput, TestRunReview, DiscoveredTestCommands } from '../types/tester.js';
|
|
9
|
+
import type { OutputLanguage } from '../types/project.js';
|
|
10
|
+
import { type ConsensusProcessResult } from './consensus.js';
|
|
11
|
+
import type { TestResult } from './test-runner.js';
|
|
12
|
+
/**
|
|
13
|
+
* Inspect the project directory to discover available test/lint/build commands.
|
|
14
|
+
* Checks package.json scripts, pyproject.toml, Makefile, and common config files.
|
|
15
|
+
*
|
|
16
|
+
* @param projectDir - Root of the project
|
|
17
|
+
* @param language - Project language
|
|
18
|
+
* @returns Discovered command references
|
|
19
|
+
*/
|
|
20
|
+
export declare function discoverTestCommands(projectDir: string, language: OutputLanguage): Promise<DiscoveredTestCommands>;
|
|
21
|
+
/**
|
|
22
|
+
* Return language-specific testing guidance for the Tester persona.
|
|
23
|
+
*
|
|
24
|
+
* @param language - Project output language
|
|
25
|
+
* @returns Playbook text to embed in the Tester prompt
|
|
26
|
+
*/
|
|
27
|
+
export declare function getComponentPlaybook(language: OutputLanguage): string;
|
|
28
|
+
/**
|
|
29
|
+
* Build the prompt for the Tester to create a TestPlan.
|
|
30
|
+
* Provider-agnostic -- refers to "the Tester", not any specific AI.
|
|
31
|
+
*/
|
|
32
|
+
export declare function buildTestPlanPrompt(task: Task, milestone: Milestone, state: ProjectState, approvedCodePlan: string, discoveredCommands: DiscoveredTestCommands): string;
|
|
33
|
+
/**
|
|
34
|
+
* Build the prompt for the Tester to review test execution results.
|
|
35
|
+
* Provider-agnostic.
|
|
36
|
+
*/
|
|
37
|
+
export declare function buildTestRunReviewPrompt(task: Task, approvedTestPlan: string, testResult: TestResult, state: ProjectState): string;
|
|
38
|
+
/**
|
|
39
|
+
* Build the prompt for the Tester to create a fix plan after test failures.
|
|
40
|
+
* Provider-agnostic.
|
|
41
|
+
*/
|
|
42
|
+
export declare function buildTestFixPlanPrompt(task: Task, approvedTestPlan: string, testResult: TestResult, review: TestRunReview, state: ProjectState): string;
|
|
43
|
+
/**
|
|
44
|
+
* Result of the test planning phase
|
|
45
|
+
*/
|
|
46
|
+
export interface TestPlanningResult {
|
|
47
|
+
testPlanText: string;
|
|
48
|
+
testPlanParsed: TestPlanOutput | null;
|
|
49
|
+
consensusResult: ConsensusProcessResult;
|
|
50
|
+
error?: string;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Run the test planning phase: discover commands -> create test plan -> consensus.
|
|
54
|
+
*
|
|
55
|
+
* @param task - The task to plan tests for
|
|
56
|
+
* @param milestone - Parent milestone
|
|
57
|
+
* @param state - Current project state
|
|
58
|
+
* @param approvedCodePlan - The consensus-approved code plan
|
|
59
|
+
* @param options - Workflow options (projectDir, consensusConfig, onProgress)
|
|
60
|
+
* @returns Test plan result with consensus outcome
|
|
61
|
+
*/
|
|
62
|
+
export declare function runTestPlanningPhase(task: Task, milestone: Milestone, state: ProjectState, approvedCodePlan: string, options: {
|
|
63
|
+
projectDir: string;
|
|
64
|
+
consensusConfig?: Partial<ConsensusConfig>;
|
|
65
|
+
onProgress?: (phase: string, message: string) => void;
|
|
66
|
+
}): Promise<TestPlanningResult>;
|
|
67
|
+
/**
|
|
68
|
+
* Run the test review phase: AI reviews test results and issues a verdict.
|
|
69
|
+
* ONLY the Tester decides PASS/FAIL -- the coder cannot bypass this.
|
|
70
|
+
*
|
|
71
|
+
* @param task - The task whose tests were run
|
|
72
|
+
* @param approvedTestPlan - The approved test plan text
|
|
73
|
+
* @param testResult - Test execution results
|
|
74
|
+
* @param state - Current project state
|
|
75
|
+
* @param onProgress - Progress callback
|
|
76
|
+
* @returns Structured TestRunReview
|
|
77
|
+
*/
|
|
78
|
+
export declare function runTestReviewPhase(task: Task, approvedTestPlan: string, testResult: TestResult, state: ProjectState, onProgress?: (phase: string, message: string) => void): Promise<TestRunReview>;
|
|
79
|
+
/**
|
|
80
|
+
* Create a fix plan from the Tester when tests fail.
|
|
81
|
+
*
|
|
82
|
+
* @param task - The task whose tests failed
|
|
83
|
+
* @param approvedTestPlan - The approved test plan text
|
|
84
|
+
* @param testResult - Test execution results
|
|
85
|
+
* @param review - The Tester's review with verdict
|
|
86
|
+
* @param state - Current project state
|
|
87
|
+
* @param onProgress - Progress callback
|
|
88
|
+
* @returns Fix plan text for consensus review
|
|
89
|
+
*/
|
|
90
|
+
export declare function createTesterFixPlan(task: Task, approvedTestPlan: string, testResult: TestResult, review: TestRunReview, state: ProjectState, onProgress?: (phase: string, message: string) => void): Promise<string>;
|
|
91
|
+
/**
|
|
92
|
+
* Document an approved test plan to docs/qa/test-plans/
|
|
93
|
+
*
|
|
94
|
+
* @param projectDir - Project root
|
|
95
|
+
* @param milestone - Parent milestone
|
|
96
|
+
* @param task - The task
|
|
97
|
+
* @param testPlan - Test plan text
|
|
98
|
+
* @param consensusResult - Consensus outcome
|
|
99
|
+
* @returns Relative path to the doc
|
|
100
|
+
*/
|
|
101
|
+
export declare function documentTestPlan(projectDir: string, milestone: Milestone, task: Task, testPlan: string, consensusResult: ConsensusProcessResult): Promise<string>;
|
|
102
|
+
/**
|
|
103
|
+
* Document a test run review to docs/qa/test-runs/
|
|
104
|
+
*
|
|
105
|
+
* @param projectDir - Project root
|
|
106
|
+
* @param milestone - Parent milestone
|
|
107
|
+
* @param task - The task
|
|
108
|
+
* @param review - Tester's review
|
|
109
|
+
* @returns Relative path to the doc
|
|
110
|
+
*/
|
|
111
|
+
export declare function documentTestReview(projectDir: string, milestone: Milestone, task: Task, review: TestRunReview): Promise<string>;
|
|
112
|
+
/**
|
|
113
|
+
* Check whether QA is enabled for the given project state.
|
|
114
|
+
* Defaults to false for existing projects (undefined), true only when explicitly set.
|
|
115
|
+
*
|
|
116
|
+
* @param state - Current project state
|
|
117
|
+
* @returns Whether the QA Tester skill is active
|
|
118
|
+
*/
|
|
119
|
+
export declare function isQaEnabled(state: ProjectState): boolean;
|
|
120
|
+
//# sourceMappingURL=tester.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tester.d.ts","sourceRoot":"","sources":["../../src/workflow/tester.ts"],"names":[],"mappings":"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"}
|