@pcoliveira90/pdd 0.2.6 → 0.3.1
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/LICENSE +20 -20
- package/README.en.md +75 -60
- package/README.md +75 -26
- package/README.pt-BR.md +75 -12
- package/bin/pdd-ai.js +24 -23
- package/bin/pdd-pro.js +7 -7
- package/bin/pdd.js +8 -27
- package/package.json +43 -42
- package/src/ai/analyze-change.js +41 -41
- package/src/ai/engine.js +34 -34
- package/src/ai/run-fix-analysis.js +187 -174
- package/src/cli/doctor-command.js +140 -101
- package/src/cli/doctor-fix.js +51 -51
- package/src/cli/index.js +164 -130
- package/src/cli/init-command.js +270 -270
- package/src/cli/status-command.js +33 -33
- package/src/core/fix-runner.js +134 -135
- package/src/core/ide-detector.js +94 -94
- package/src/core/patch-generator.js +125 -126
- package/src/core/pr-manager.js +21 -21
- package/src/core/project-review-agent.js +301 -301
- package/src/core/remediation-advisor.js +91 -91
- package/src/core/state-manager.js +71 -71
- package/src/core/template-registry.js +446 -320
- package/src/core/template-upgrade.js +68 -68
- package/src/core/validator.js +38 -38
- package/src/core/worktree-guard.js +54 -0
|
@@ -1,126 +1,125 @@
|
|
|
1
|
-
import fs from 'fs';
|
|
2
|
-
import path from 'path';
|
|
3
|
-
|
|
4
|
-
function ensureDir(filePath) {
|
|
5
|
-
fs.mkdirSync(path.dirname(filePath), { recursive: true });
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
function writeFile(filePath, content) {
|
|
9
|
-
ensureDir(filePath);
|
|
10
|
-
fs.writeFileSync(filePath, content, 'utf-8');
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
function slugify(value) {
|
|
14
|
-
return value
|
|
15
|
-
.toLowerCase()
|
|
16
|
-
.replace(/[^a-z0-9]+/g, '-')
|
|
17
|
-
.replace(/^-+|-+$/g, '')
|
|
18
|
-
.slice(0, 48);
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
export function generatePatchArtifacts({ issue, baseDir = process.cwd() }) {
|
|
22
|
-
const
|
|
23
|
-
const
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
path.join('changes',
|
|
28
|
-
path.join('changes',
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
}
|
|
1
|
+
import fs from 'fs';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
|
|
4
|
+
function ensureDir(filePath) {
|
|
5
|
+
fs.mkdirSync(path.dirname(filePath), { recursive: true });
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
function writeFile(filePath, content) {
|
|
9
|
+
ensureDir(filePath);
|
|
10
|
+
fs.writeFileSync(filePath, content, 'utf-8');
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
function slugify(value) {
|
|
14
|
+
return value
|
|
15
|
+
.toLowerCase()
|
|
16
|
+
.replace(/[^a-z0-9]+/g, '-')
|
|
17
|
+
.replace(/^-+|-+$/g, '')
|
|
18
|
+
.slice(0, 48);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export function generatePatchArtifacts({ issue, baseDir = process.cwd(), changeId = null }) {
|
|
22
|
+
const resolvedChangeId = changeId || `change-${Date.now()}-${slugify(issue || 'update')}`;
|
|
23
|
+
const changeDir = path.join(baseDir, 'changes', resolvedChangeId);
|
|
24
|
+
|
|
25
|
+
const files = [
|
|
26
|
+
path.join('changes', resolvedChangeId, 'delta-spec.md'),
|
|
27
|
+
path.join('changes', resolvedChangeId, 'patch-plan.md'),
|
|
28
|
+
path.join('changes', resolvedChangeId, 'verification-report.md')
|
|
29
|
+
];
|
|
30
|
+
|
|
31
|
+
writeFile(
|
|
32
|
+
path.join(changeDir, 'delta-spec.md'),
|
|
33
|
+
`# Delta Spec
|
|
34
|
+
|
|
35
|
+
## Change ID
|
|
36
|
+
${resolvedChangeId}
|
|
37
|
+
|
|
38
|
+
## Issue
|
|
39
|
+
${issue}
|
|
40
|
+
|
|
41
|
+
## Type
|
|
42
|
+
bugfix | feature | refactor-safe | hotfix
|
|
43
|
+
|
|
44
|
+
## Context
|
|
45
|
+
|
|
46
|
+
## Current Behavior
|
|
47
|
+
|
|
48
|
+
## Expected Behavior
|
|
49
|
+
|
|
50
|
+
## Evidence
|
|
51
|
+
|
|
52
|
+
## Root Cause Hypothesis
|
|
53
|
+
|
|
54
|
+
## Impacted Areas
|
|
55
|
+
|
|
56
|
+
## Constraints
|
|
57
|
+
|
|
58
|
+
## Minimal Safe Delta
|
|
59
|
+
|
|
60
|
+
## Alternatives Considered
|
|
61
|
+
|
|
62
|
+
## Acceptance Criteria
|
|
63
|
+
|
|
64
|
+
## Verification Strategy
|
|
65
|
+
`
|
|
66
|
+
);
|
|
67
|
+
|
|
68
|
+
writeFile(
|
|
69
|
+
path.join(changeDir, 'patch-plan.md'),
|
|
70
|
+
`# Patch Plan
|
|
71
|
+
|
|
72
|
+
## Change ID
|
|
73
|
+
${resolvedChangeId}
|
|
74
|
+
|
|
75
|
+
## Issue
|
|
76
|
+
${issue}
|
|
77
|
+
|
|
78
|
+
## Files to Inspect
|
|
79
|
+
|
|
80
|
+
## Files to Change
|
|
81
|
+
|
|
82
|
+
## Execution Steps
|
|
83
|
+
1. Reproduce issue
|
|
84
|
+
2. Confirm root cause
|
|
85
|
+
3. Apply minimal change
|
|
86
|
+
4. Adjust tests
|
|
87
|
+
5. Run validations
|
|
88
|
+
|
|
89
|
+
## Regression Risks
|
|
90
|
+
|
|
91
|
+
## Rollback Strategy
|
|
92
|
+
`
|
|
93
|
+
);
|
|
94
|
+
|
|
95
|
+
writeFile(
|
|
96
|
+
path.join(changeDir, 'verification-report.md'),
|
|
97
|
+
`# Verification Report
|
|
98
|
+
|
|
99
|
+
## Change ID
|
|
100
|
+
${resolvedChangeId}
|
|
101
|
+
|
|
102
|
+
## Issue
|
|
103
|
+
${issue}
|
|
104
|
+
|
|
105
|
+
## Reproduction
|
|
106
|
+
|
|
107
|
+
## Changes Made
|
|
108
|
+
|
|
109
|
+
## Tests Run
|
|
110
|
+
|
|
111
|
+
## Manual Validation
|
|
112
|
+
|
|
113
|
+
## Residual Risks
|
|
114
|
+
|
|
115
|
+
## Final Status
|
|
116
|
+
pending
|
|
117
|
+
`
|
|
118
|
+
);
|
|
119
|
+
|
|
120
|
+
return {
|
|
121
|
+
changeId: resolvedChangeId,
|
|
122
|
+
changeDir,
|
|
123
|
+
files
|
|
124
|
+
};
|
|
125
|
+
}
|
package/src/core/pr-manager.js
CHANGED
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
import fs from 'fs';
|
|
2
|
-
import path from 'path';
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
function
|
|
6
|
-
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
export async function openPullRequest({ issue, changeId, changeDir }) {
|
|
10
|
-
const branch = `pdd/${changeId}`;
|
|
11
|
-
const title = `fix: ${issue}`;
|
|
12
|
-
|
|
13
|
-
fs.writeFileSync(path.join(changeDir, 'pr-title.txt'), title);
|
|
14
|
-
fs.writeFileSync(path.join(changeDir, 'pr-body.md'), issue);
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
console.log('PR ready (use IDE to open)');
|
|
21
|
-
}
|
|
1
|
+
import fs from 'fs';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import { execFileSync } from 'child_process';
|
|
4
|
+
|
|
5
|
+
function runGit(args, baseDir = process.cwd()) {
|
|
6
|
+
execFileSync('git', args, { stdio: 'inherit', cwd: baseDir });
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export async function openPullRequest({ issue, changeId, changeDir, baseDir = process.cwd() }) {
|
|
10
|
+
const branch = `pdd/${changeId}`;
|
|
11
|
+
const title = `fix: ${issue}`;
|
|
12
|
+
|
|
13
|
+
fs.writeFileSync(path.join(changeDir, 'pr-title.txt'), title);
|
|
14
|
+
fs.writeFileSync(path.join(changeDir, 'pr-body.md'), issue);
|
|
15
|
+
|
|
16
|
+
runGit(['checkout', '-b', branch], baseDir);
|
|
17
|
+
runGit(['add', '.'], baseDir);
|
|
18
|
+
runGit(['commit', '-m', title], baseDir);
|
|
19
|
+
|
|
20
|
+
console.log('PR ready (use IDE to open)');
|
|
21
|
+
}
|