@nebutra/next-unicorn-skill 1.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/CHANGELOG.md +57 -0
- package/LICENSE +21 -0
- package/README.md +316 -0
- package/SKILL.md +318 -0
- package/dist/analyzer/pattern-catalog.d.ts +35 -0
- package/dist/analyzer/pattern-catalog.d.ts.map +1 -0
- package/dist/analyzer/pattern-catalog.js +342 -0
- package/dist/analyzer/pattern-catalog.js.map +1 -0
- package/dist/analyzer/scanner.d.ts +33 -0
- package/dist/analyzer/scanner.d.ts.map +1 -0
- package/dist/analyzer/scanner.js +302 -0
- package/dist/analyzer/scanner.js.map +1 -0
- package/dist/auditor/ux-auditor.d.ts +26 -0
- package/dist/auditor/ux-auditor.d.ts.map +1 -0
- package/dist/auditor/ux-auditor.js +272 -0
- package/dist/auditor/ux-auditor.js.map +1 -0
- package/dist/checker/peer-dependency-checker.d.ts +62 -0
- package/dist/checker/peer-dependency-checker.d.ts.map +1 -0
- package/dist/checker/peer-dependency-checker.js +94 -0
- package/dist/checker/peer-dependency-checker.js.map +1 -0
- package/dist/index.d.ts +78 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +325 -0
- package/dist/index.js.map +1 -0
- package/dist/planner/migration-planner.d.ts +47 -0
- package/dist/planner/migration-planner.d.ts.map +1 -0
- package/dist/planner/migration-planner.js +144 -0
- package/dist/planner/migration-planner.js.map +1 -0
- package/dist/pr-creator/git-operations.d.ts +29 -0
- package/dist/pr-creator/git-operations.d.ts.map +1 -0
- package/dist/pr-creator/git-operations.js +10 -0
- package/dist/pr-creator/git-operations.js.map +1 -0
- package/dist/pr-creator/platform-client.d.ts +47 -0
- package/dist/pr-creator/platform-client.d.ts.map +1 -0
- package/dist/pr-creator/platform-client.js +9 -0
- package/dist/pr-creator/platform-client.js.map +1 -0
- package/dist/pr-creator/pr-description-builder.d.ts +23 -0
- package/dist/pr-creator/pr-description-builder.d.ts.map +1 -0
- package/dist/pr-creator/pr-description-builder.js +187 -0
- package/dist/pr-creator/pr-description-builder.js.map +1 -0
- package/dist/pr-creator/pr-executor.d.ts +30 -0
- package/dist/pr-creator/pr-executor.d.ts.map +1 -0
- package/dist/pr-creator/pr-executor.js +109 -0
- package/dist/pr-creator/pr-executor.js.map +1 -0
- package/dist/pr-creator/pr-strategy.d.ts +56 -0
- package/dist/pr-creator/pr-strategy.d.ts.map +1 -0
- package/dist/pr-creator/pr-strategy.js +125 -0
- package/dist/pr-creator/pr-strategy.js.map +1 -0
- package/dist/schemas/input.schema.d.ts +231 -0
- package/dist/schemas/input.schema.d.ts.map +1 -0
- package/dist/schemas/input.schema.js +159 -0
- package/dist/schemas/input.schema.js.map +1 -0
- package/dist/schemas/output.schema.d.ts +2543 -0
- package/dist/schemas/output.schema.d.ts.map +1 -0
- package/dist/schemas/output.schema.js +199 -0
- package/dist/schemas/output.schema.js.map +1 -0
- package/dist/scorer/impact-scorer.d.ts +45 -0
- package/dist/scorer/impact-scorer.d.ts.map +1 -0
- package/dist/scorer/impact-scorer.js +243 -0
- package/dist/scorer/impact-scorer.js.map +1 -0
- package/dist/security/osv-client.d.ts +72 -0
- package/dist/security/osv-client.d.ts.map +1 -0
- package/dist/security/osv-client.js +36 -0
- package/dist/security/osv-client.js.map +1 -0
- package/dist/security/vuln-report-builder.d.ts +18 -0
- package/dist/security/vuln-report-builder.d.ts.map +1 -0
- package/dist/security/vuln-report-builder.js +141 -0
- package/dist/security/vuln-report-builder.js.map +1 -0
- package/dist/security/vulnerability-scanner.d.ts +65 -0
- package/dist/security/vulnerability-scanner.d.ts.map +1 -0
- package/dist/security/vulnerability-scanner.js +140 -0
- package/dist/security/vulnerability-scanner.js.map +1 -0
- package/dist/updater/changelog-verifier.d.ts +29 -0
- package/dist/updater/changelog-verifier.d.ts.map +1 -0
- package/dist/updater/changelog-verifier.js +80 -0
- package/dist/updater/changelog-verifier.js.map +1 -0
- package/dist/updater/registry-client.d.ts +49 -0
- package/dist/updater/registry-client.d.ts.map +1 -0
- package/dist/updater/registry-client.js +10 -0
- package/dist/updater/registry-client.js.map +1 -0
- package/dist/updater/update-plan-builder.d.ts +23 -0
- package/dist/updater/update-plan-builder.d.ts.map +1 -0
- package/dist/updater/update-plan-builder.js +93 -0
- package/dist/updater/update-plan-builder.js.map +1 -0
- package/dist/updater/update-policy.d.ts +50 -0
- package/dist/updater/update-policy.d.ts.map +1 -0
- package/dist/updater/update-policy.js +118 -0
- package/dist/updater/update-policy.js.map +1 -0
- package/dist/updater/update-scorer.d.ts +51 -0
- package/dist/updater/update-scorer.d.ts.map +1 -0
- package/dist/updater/update-scorer.js +166 -0
- package/dist/updater/update-scorer.js.map +1 -0
- package/dist/utils/constraint-filter.d.ts +44 -0
- package/dist/utils/constraint-filter.d.ts.map +1 -0
- package/dist/utils/constraint-filter.js +69 -0
- package/dist/utils/constraint-filter.js.map +1 -0
- package/dist/utils/serializer.d.ts +17 -0
- package/dist/utils/serializer.d.ts.map +1 -0
- package/dist/utils/serializer.js +24 -0
- package/dist/utils/serializer.js.map +1 -0
- package/dist/utils/skill-parser.d.ts +29 -0
- package/dist/utils/skill-parser.d.ts.map +1 -0
- package/dist/utils/skill-parser.js +175 -0
- package/dist/utils/skill-parser.js.map +1 -0
- package/dist/verifier/context7.d.ts +48 -0
- package/dist/verifier/context7.d.ts.map +1 -0
- package/dist/verifier/context7.js +97 -0
- package/dist/verifier/context7.js.map +1 -0
- package/examples/backend-node/input.json +28 -0
- package/examples/backend-node/output.json +343 -0
- package/examples/frontend-nextjs/input.json +37 -0
- package/examples/frontend-nextjs/output.json +302 -0
- package/package.json +79 -0
- package/templates/deletion-checklist.md +42 -0
- package/templates/migration-plan.md +61 -0
- package/templates/prd-template.md +123 -0
- package/templates/summary-table.md +28 -0
- package/templates/update-plan.md +61 -0
- package/templates/vuln-report.md +50 -0
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
// ---------------------------------------------------------------------------
|
|
2
|
+
// Constants
|
|
3
|
+
// ---------------------------------------------------------------------------
|
|
4
|
+
const RISK_PHASE_MAP = {
|
|
5
|
+
low: { order: 1, name: 'Low-Risk Quick Wins' },
|
|
6
|
+
medium: { order: 2, name: 'Medium-Risk Improvements' },
|
|
7
|
+
high: { order: 3, name: 'High-Risk Transformations' },
|
|
8
|
+
};
|
|
9
|
+
// ---------------------------------------------------------------------------
|
|
10
|
+
// buildMigrationPlan — main entry point
|
|
11
|
+
// ---------------------------------------------------------------------------
|
|
12
|
+
/**
|
|
13
|
+
* Build a phased migration plan from a list of recommendations.
|
|
14
|
+
*
|
|
15
|
+
* Phasing logic:
|
|
16
|
+
* - Phase 1: low-risk items
|
|
17
|
+
* - Phase 2: medium-risk items
|
|
18
|
+
* - Phase 3: high-risk items (with adapter strategies)
|
|
19
|
+
*
|
|
20
|
+
* Within each phase, items are ordered by composite score descending
|
|
21
|
+
* (highest impact first).
|
|
22
|
+
*
|
|
23
|
+
* Only phases that have items are included (empty phases are skipped).
|
|
24
|
+
*
|
|
25
|
+
* High-risk items MUST have an AdapterStrategy generated — if the input
|
|
26
|
+
* recommendation doesn't already have one, a default is generated.
|
|
27
|
+
*
|
|
28
|
+
* The deletion checklist includes EVERY filePath from recommendations.
|
|
29
|
+
*
|
|
30
|
+
* Empty recommendations → empty plan with zero phases.
|
|
31
|
+
*
|
|
32
|
+
* Requirements: 4.1, 4.2, 4.3, 4.4, 9.4
|
|
33
|
+
*/
|
|
34
|
+
export function buildMigrationPlan(recommendations) {
|
|
35
|
+
if (recommendations.length === 0) {
|
|
36
|
+
return { phases: [], deletionChecklist: [] };
|
|
37
|
+
}
|
|
38
|
+
// --- Step 1: Group recommendations by risk level ---
|
|
39
|
+
const groups = {
|
|
40
|
+
low: [],
|
|
41
|
+
medium: [],
|
|
42
|
+
high: [],
|
|
43
|
+
};
|
|
44
|
+
for (let i = 0; i < recommendations.length; i++) {
|
|
45
|
+
const rec = recommendations[i];
|
|
46
|
+
const risk = rec.migrationRisk;
|
|
47
|
+
groups[risk].push({ index: i, rec });
|
|
48
|
+
}
|
|
49
|
+
// --- Step 2: Sort each group by composite score descending ---
|
|
50
|
+
for (const risk of ['low', 'medium', 'high']) {
|
|
51
|
+
groups[risk].sort((a, b) => b.rec.impactScores.composite - a.rec.impactScores.composite);
|
|
52
|
+
}
|
|
53
|
+
// --- Step 3: Build phases (only non-empty groups) ---
|
|
54
|
+
const phases = [];
|
|
55
|
+
let phaseNumber = 1;
|
|
56
|
+
for (const risk of ['low', 'medium', 'high']) {
|
|
57
|
+
const items = groups[risk];
|
|
58
|
+
if (items.length === 0)
|
|
59
|
+
continue;
|
|
60
|
+
const phaseMeta = RISK_PHASE_MAP[risk];
|
|
61
|
+
const steps = items.map((item) => {
|
|
62
|
+
const step = buildMigrationStep(item.index, item.rec, risk);
|
|
63
|
+
return step;
|
|
64
|
+
});
|
|
65
|
+
phases.push({
|
|
66
|
+
phase: phaseNumber,
|
|
67
|
+
name: phaseMeta.name,
|
|
68
|
+
steps,
|
|
69
|
+
});
|
|
70
|
+
phaseNumber++;
|
|
71
|
+
}
|
|
72
|
+
// --- Step 4: Build deletion checklist ---
|
|
73
|
+
const deletionChecklist = buildDeletionChecklist(recommendations);
|
|
74
|
+
return { phases, deletionChecklist };
|
|
75
|
+
}
|
|
76
|
+
// ---------------------------------------------------------------------------
|
|
77
|
+
// Internal helpers
|
|
78
|
+
// ---------------------------------------------------------------------------
|
|
79
|
+
/**
|
|
80
|
+
* Build a single migration step from a recommendation.
|
|
81
|
+
*
|
|
82
|
+
* For high-risk items, ensures an AdapterStrategy is present.
|
|
83
|
+
* If the recommendation already has one, it is used; otherwise a default
|
|
84
|
+
* is generated from the recommendation's metadata.
|
|
85
|
+
*/
|
|
86
|
+
function buildMigrationStep(index, rec, risk) {
|
|
87
|
+
const description = buildStepDescription(rec, risk);
|
|
88
|
+
const step = {
|
|
89
|
+
recommendationIndex: index,
|
|
90
|
+
description,
|
|
91
|
+
};
|
|
92
|
+
if (risk === 'high') {
|
|
93
|
+
step.adapterStrategy = rec.adapterStrategy ?? generateDefaultAdapterStrategy(rec);
|
|
94
|
+
}
|
|
95
|
+
return step;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Build a human-readable description for a migration step.
|
|
99
|
+
*/
|
|
100
|
+
function buildStepDescription(rec, risk) {
|
|
101
|
+
const pattern = rec.currentImplementation.patternCategory;
|
|
102
|
+
const library = rec.recommendedLibrary.name;
|
|
103
|
+
const filePath = rec.currentImplementation.filePath;
|
|
104
|
+
if (risk === 'high') {
|
|
105
|
+
return `Replace ${pattern} in ${filePath} with ${library} using adapter strategy`;
|
|
106
|
+
}
|
|
107
|
+
if (risk === 'medium') {
|
|
108
|
+
return `Replace ${pattern} in ${filePath} with ${library}`;
|
|
109
|
+
}
|
|
110
|
+
return `Replace ${pattern} in ${filePath} with ${library} (quick win)`;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Generate a default AdapterStrategy for a high-risk recommendation
|
|
114
|
+
* that doesn't already have one.
|
|
115
|
+
*
|
|
116
|
+
* Requirements: 4.2, 9.4
|
|
117
|
+
*/
|
|
118
|
+
function generateDefaultAdapterStrategy(rec) {
|
|
119
|
+
const pattern = rec.currentImplementation.patternCategory;
|
|
120
|
+
const library = rec.recommendedLibrary.name;
|
|
121
|
+
const filePath = rec.currentImplementation.filePath;
|
|
122
|
+
return {
|
|
123
|
+
wrapperInterface: `I${pattern}Adapter`,
|
|
124
|
+
legacyCode: filePath,
|
|
125
|
+
targetLibrary: library,
|
|
126
|
+
description: `Adapter wrapping legacy ${pattern} implementation to transition to ${library}`,
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Build the deletion checklist from all recommendations.
|
|
131
|
+
*
|
|
132
|
+
* Every filePath from a recommendation's currentImplementation appears
|
|
133
|
+
* in the checklist.
|
|
134
|
+
*
|
|
135
|
+
* Requirements: 4.3
|
|
136
|
+
*/
|
|
137
|
+
function buildDeletionChecklist(recommendations) {
|
|
138
|
+
return recommendations.map((rec) => ({
|
|
139
|
+
filePath: rec.currentImplementation.filePath,
|
|
140
|
+
lineRange: rec.currentImplementation.lineRange,
|
|
141
|
+
reason: `Replaced ${rec.currentImplementation.patternCategory} with ${rec.recommendedLibrary.name}`,
|
|
142
|
+
}));
|
|
143
|
+
}
|
|
144
|
+
//# sourceMappingURL=migration-planner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migration-planner.js","sourceRoot":"","sources":["../../src/planner/migration-planner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Git Operations — injectable interface for git CLI operations.
|
|
3
|
+
*
|
|
4
|
+
* Real implementation shells out to git CLI.
|
|
5
|
+
* Designed for testability via interface injection.
|
|
6
|
+
*
|
|
7
|
+
* Requirements: 12.2
|
|
8
|
+
*/
|
|
9
|
+
import type { FileChange } from './platform-client.js';
|
|
10
|
+
/**
|
|
11
|
+
* Interface for git operations.
|
|
12
|
+
*/
|
|
13
|
+
export interface GitOperations {
|
|
14
|
+
/** Create a new branch from the current HEAD */
|
|
15
|
+
createBranch(branchName: string): Promise<void>;
|
|
16
|
+
/** Checkout an existing branch */
|
|
17
|
+
checkout(branchName: string): Promise<void>;
|
|
18
|
+
/** Stage and commit file changes */
|
|
19
|
+
commitChanges(changes: FileChange[], message: string): Promise<{
|
|
20
|
+
sha: string;
|
|
21
|
+
}>;
|
|
22
|
+
/** Push a branch to the remote */
|
|
23
|
+
push(branchName: string): Promise<void>;
|
|
24
|
+
/** Check if a branch exists locally or remotely */
|
|
25
|
+
branchExists(branchName: string): Promise<boolean>;
|
|
26
|
+
/** Get the current branch name */
|
|
27
|
+
getCurrentBranch(): Promise<string>;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=git-operations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-operations.d.ts","sourceRoot":"","sources":["../../src/pr-creator/git-operations.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAMvD;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,gDAAgD;IAChD,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEhD,kCAAkC;IAClC,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE5C,oCAAoC;IACpC,aAAa,CACX,OAAO,EAAE,UAAU,EAAE,EACrB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAE5B,kCAAkC;IAClC,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAExC,mDAAmD;IACnD,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAEnD,kCAAkC;IAClC,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;CACrC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Git Operations — injectable interface for git CLI operations.
|
|
3
|
+
*
|
|
4
|
+
* Real implementation shells out to git CLI.
|
|
5
|
+
* Designed for testability via interface injection.
|
|
6
|
+
*
|
|
7
|
+
* Requirements: 12.2
|
|
8
|
+
*/
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=git-operations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-operations.js","sourceRoot":"","sources":["../../src/pr-creator/git-operations.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Platform Client — injectable interface for git hosting platform APIs.
|
|
3
|
+
*
|
|
4
|
+
* Supports GitHub, GitLab, and Bitbucket.
|
|
5
|
+
*
|
|
6
|
+
* Requirements: 12.1, 12.5
|
|
7
|
+
*/
|
|
8
|
+
export type PlatformType = 'github' | 'gitlab' | 'bitbucket';
|
|
9
|
+
export interface PullRequestInput {
|
|
10
|
+
title: string;
|
|
11
|
+
body: string;
|
|
12
|
+
baseBranch: string;
|
|
13
|
+
headBranch: string;
|
|
14
|
+
labels: string[];
|
|
15
|
+
reviewers: string[];
|
|
16
|
+
draft: boolean;
|
|
17
|
+
}
|
|
18
|
+
export interface PullRequestResult {
|
|
19
|
+
id: number;
|
|
20
|
+
url: string;
|
|
21
|
+
number: number;
|
|
22
|
+
status: 'created' | 'updated' | 'failed';
|
|
23
|
+
errorMessage?: string;
|
|
24
|
+
}
|
|
25
|
+
export interface FileChange {
|
|
26
|
+
path: string;
|
|
27
|
+
content: string;
|
|
28
|
+
/** Operation type */
|
|
29
|
+
operation: 'create' | 'update' | 'delete';
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Client interface for git hosting platform APIs.
|
|
33
|
+
* Injectable for testability.
|
|
34
|
+
*/
|
|
35
|
+
export interface PlatformClient {
|
|
36
|
+
/** Which platform this client connects to */
|
|
37
|
+
platform: PlatformType;
|
|
38
|
+
/** Create a new pull request */
|
|
39
|
+
createPullRequest(input: PullRequestInput): Promise<PullRequestResult>;
|
|
40
|
+
/** Update an existing pull request */
|
|
41
|
+
updatePullRequest(prNumber: number, input: Partial<PullRequestInput>): Promise<PullRequestResult>;
|
|
42
|
+
/** Check if a PR already exists for the given branch */
|
|
43
|
+
findExistingPR(headBranch: string): Promise<PullRequestResult | null>;
|
|
44
|
+
/** Get the default branch name */
|
|
45
|
+
getDefaultBranch(): Promise<string>;
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=platform-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"platform-client.d.ts","sourceRoot":"","sources":["../../src/pr-creator/platform-client.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,QAAQ,GAAG,WAAW,CAAC;AAE7D,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAC;IACzC,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,qBAAqB;IACrB,SAAS,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;CAC3C;AAMD;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,6CAA6C;IAC7C,QAAQ,EAAE,YAAY,CAAC;IAEvB,gCAAgC;IAChC,iBAAiB,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAEvE,sCAAsC;IACtC,iBAAiB,CACf,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAC/B,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAE9B,wDAAwD;IACxD,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAAC;IAEtE,kCAAkC;IAClC,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;CACrC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"platform-client.js","sourceRoot":"","sources":["../../src/pr-creator/platform-client.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PR Description Builder — generates rich markdown PR descriptions
|
|
3
|
+
* and titles following conventional commit format.
|
|
4
|
+
*
|
|
5
|
+
* Requirements: 12.4, 12.6
|
|
6
|
+
*/
|
|
7
|
+
import type { PRPlan } from './pr-strategy.js';
|
|
8
|
+
/**
|
|
9
|
+
* Build a PR title following conventional commit format.
|
|
10
|
+
* Property 28: PR title follows conventional commit format.
|
|
11
|
+
*
|
|
12
|
+
* Examples:
|
|
13
|
+
* - "fix(deps): upgrade lodash 4.17.20 -> 4.17.21 (CVE-2026-12345)"
|
|
14
|
+
* - "chore(deps): update @types/react 18.2.0 -> 18.3.1"
|
|
15
|
+
* - "refactor(i18n): replace hand-rolled i18n with next-intl"
|
|
16
|
+
* - "fix(security): patch 3 critical vulnerabilities"
|
|
17
|
+
*/
|
|
18
|
+
export declare function buildPRTitle(plan: PRPlan): string;
|
|
19
|
+
/**
|
|
20
|
+
* Build a rich markdown PR description with embedded analysis.
|
|
21
|
+
*/
|
|
22
|
+
export declare function buildPRDescription(plan: PRPlan): string;
|
|
23
|
+
//# sourceMappingURL=pr-description-builder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pr-description-builder.d.ts","sourceRoot":"","sources":["../../src/pr-creator/pr-description-builder.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAc,MAAM,kBAAkB,CAAC;AAM3D;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAkDjD;AAMD;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAmDvD"}
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PR Description Builder — generates rich markdown PR descriptions
|
|
3
|
+
* and titles following conventional commit format.
|
|
4
|
+
*
|
|
5
|
+
* Requirements: 12.4, 12.6
|
|
6
|
+
*/
|
|
7
|
+
// ---------------------------------------------------------------------------
|
|
8
|
+
// buildPRTitle
|
|
9
|
+
// ---------------------------------------------------------------------------
|
|
10
|
+
/**
|
|
11
|
+
* Build a PR title following conventional commit format.
|
|
12
|
+
* Property 28: PR title follows conventional commit format.
|
|
13
|
+
*
|
|
14
|
+
* Examples:
|
|
15
|
+
* - "fix(deps): upgrade lodash 4.17.20 -> 4.17.21 (CVE-2026-12345)"
|
|
16
|
+
* - "chore(deps): update @types/react 18.2.0 -> 18.3.1"
|
|
17
|
+
* - "refactor(i18n): replace hand-rolled i18n with next-intl"
|
|
18
|
+
* - "fix(security): patch 3 critical vulnerabilities"
|
|
19
|
+
*/
|
|
20
|
+
export function buildPRTitle(plan) {
|
|
21
|
+
switch (plan.type) {
|
|
22
|
+
case 'security-update': {
|
|
23
|
+
const items = plan.items.filter((i) => i.kind === 'security');
|
|
24
|
+
if (items.length === 1) {
|
|
25
|
+
const u = items[0].update;
|
|
26
|
+
return `fix(deps): upgrade ${u.packageName} ${u.currentVersion} -> ${u.targetVersion}`;
|
|
27
|
+
}
|
|
28
|
+
return `fix(security): patch ${items.length} vulnerabilities`;
|
|
29
|
+
}
|
|
30
|
+
case 'dependency-update': {
|
|
31
|
+
const items = plan.items.filter((i) => i.kind === 'update');
|
|
32
|
+
if (items.length === 1) {
|
|
33
|
+
const u = items[0].update;
|
|
34
|
+
return `chore(deps): update ${u.packageName} ${u.currentVersion} -> ${u.targetVersion}`;
|
|
35
|
+
}
|
|
36
|
+
return `chore(deps): update ${items.length} dependencies`;
|
|
37
|
+
}
|
|
38
|
+
case 'grouped-update': {
|
|
39
|
+
const items = plan.items.filter((i) => i.kind === 'update');
|
|
40
|
+
if (items.length > 0) {
|
|
41
|
+
const groupKey = items[0].update.groupKey ?? 'deps';
|
|
42
|
+
return `chore(deps): update ${groupKey} packages (${items.length} updates)`;
|
|
43
|
+
}
|
|
44
|
+
return `chore(deps): update dependency group`;
|
|
45
|
+
}
|
|
46
|
+
case 'migration': {
|
|
47
|
+
const items = plan.items.filter((i) => i.kind === 'migration');
|
|
48
|
+
if (items.length === 1) {
|
|
49
|
+
const rec = items[0].recommendation;
|
|
50
|
+
return `refactor(${rec.domain}): replace ${rec.currentImplementation.patternCategory} with ${rec.recommendedLibrary.name}`;
|
|
51
|
+
}
|
|
52
|
+
const phase = items[0]?.phaseNumber ?? 1;
|
|
53
|
+
return `refactor: migration phase ${phase} (${items.length} changes)`;
|
|
54
|
+
}
|
|
55
|
+
default:
|
|
56
|
+
return `chore: next-unicorn update`;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
// ---------------------------------------------------------------------------
|
|
60
|
+
// buildPRDescription
|
|
61
|
+
// ---------------------------------------------------------------------------
|
|
62
|
+
/**
|
|
63
|
+
* Build a rich markdown PR description with embedded analysis.
|
|
64
|
+
*/
|
|
65
|
+
export function buildPRDescription(plan) {
|
|
66
|
+
const sections = [];
|
|
67
|
+
// Header
|
|
68
|
+
sections.push(`## ${getPRTypeEmoji(plan.type)} ${getPRTypeLabel(plan.type)}`);
|
|
69
|
+
sections.push('');
|
|
70
|
+
// Summary
|
|
71
|
+
sections.push(buildSummarySection(plan));
|
|
72
|
+
sections.push('');
|
|
73
|
+
// Details per item type
|
|
74
|
+
for (const item of plan.items) {
|
|
75
|
+
switch (item.kind) {
|
|
76
|
+
case 'security':
|
|
77
|
+
sections.push(buildSecurityItemSection(item));
|
|
78
|
+
break;
|
|
79
|
+
case 'update':
|
|
80
|
+
sections.push(buildUpdateItemSection(item));
|
|
81
|
+
break;
|
|
82
|
+
case 'migration':
|
|
83
|
+
sections.push(buildMigrationItemSection(item));
|
|
84
|
+
break;
|
|
85
|
+
}
|
|
86
|
+
sections.push('');
|
|
87
|
+
}
|
|
88
|
+
// Reviewer checklist
|
|
89
|
+
sections.push('## Checklist');
|
|
90
|
+
sections.push('');
|
|
91
|
+
sections.push('- [ ] Review changes and verify correctness');
|
|
92
|
+
sections.push('- [ ] Run test suite');
|
|
93
|
+
if (plan.type === 'migration') {
|
|
94
|
+
sections.push('- [ ] Verify adapter strategy works correctly');
|
|
95
|
+
sections.push('- [ ] Check for regressions in affected areas');
|
|
96
|
+
}
|
|
97
|
+
if (plan.type === 'security-update') {
|
|
98
|
+
sections.push('- [ ] Verify vulnerability is patched');
|
|
99
|
+
sections.push('- [ ] Check for breaking changes from the upgrade');
|
|
100
|
+
}
|
|
101
|
+
sections.push('- [ ] Run `pnpm install` to regenerate lockfile');
|
|
102
|
+
sections.push('');
|
|
103
|
+
// Footer
|
|
104
|
+
sections.push('---');
|
|
105
|
+
sections.push('*Auto-generated by [Next-Unicorn](https://github.com/TsekaLuk/Next-Unicorn-Skill) SKILL*');
|
|
106
|
+
return sections.join('\n');
|
|
107
|
+
}
|
|
108
|
+
// ---------------------------------------------------------------------------
|
|
109
|
+
// Internal helpers
|
|
110
|
+
// ---------------------------------------------------------------------------
|
|
111
|
+
function getPRTypeEmoji(type) {
|
|
112
|
+
const map = {
|
|
113
|
+
'security-update': 'Security',
|
|
114
|
+
'dependency-update': 'Dependency Update',
|
|
115
|
+
'grouped-update': 'Grouped Update',
|
|
116
|
+
'migration': 'Migration',
|
|
117
|
+
};
|
|
118
|
+
return map[type] ?? 'Update';
|
|
119
|
+
}
|
|
120
|
+
function getPRTypeLabel(type) {
|
|
121
|
+
return getPRTypeEmoji(type);
|
|
122
|
+
}
|
|
123
|
+
function buildSummarySection(plan) {
|
|
124
|
+
const lines = [];
|
|
125
|
+
lines.push('### Summary');
|
|
126
|
+
lines.push('');
|
|
127
|
+
lines.push(`This PR contains **${plan.items.length}** change(s).`);
|
|
128
|
+
return lines.join('\n');
|
|
129
|
+
}
|
|
130
|
+
function buildSecurityItemSection(item) {
|
|
131
|
+
const u = item.update;
|
|
132
|
+
const lines = [];
|
|
133
|
+
lines.push(`### ${u.packageName}: ${u.currentVersion} -> ${u.targetVersion}`);
|
|
134
|
+
lines.push('');
|
|
135
|
+
lines.push(`| Dimension | Score |`);
|
|
136
|
+
lines.push(`|-----------|-------|`);
|
|
137
|
+
lines.push(`| Security | ${u.impactScores.security}/10 |`);
|
|
138
|
+
lines.push(`| Urgency | **${u.urgency}** |`);
|
|
139
|
+
lines.push(`| Breaking Risk | ${u.breakingRisk} |`);
|
|
140
|
+
lines.push(`| Estimated Effort | ${u.estimatedEffort}h |`);
|
|
141
|
+
if (u.vulnFixCount > 0) {
|
|
142
|
+
lines.push(`| Vulnerabilities Fixed | ${u.vulnFixCount} |`);
|
|
143
|
+
}
|
|
144
|
+
return lines.join('\n');
|
|
145
|
+
}
|
|
146
|
+
function buildUpdateItemSection(item) {
|
|
147
|
+
const u = item.update;
|
|
148
|
+
const lines = [];
|
|
149
|
+
lines.push(`### ${u.packageName}: ${u.currentVersion} -> ${u.targetVersion}`);
|
|
150
|
+
lines.push('');
|
|
151
|
+
lines.push(`- **Update type:** ${u.updateType}`);
|
|
152
|
+
lines.push(`- **Breaking risk:** ${u.breakingRisk}`);
|
|
153
|
+
lines.push(`- **Estimated effort:** ${u.estimatedEffort}h`);
|
|
154
|
+
if (u.hasBreakingChanges && u.breakingChangeSummary) {
|
|
155
|
+
lines.push('');
|
|
156
|
+
lines.push(`> **Breaking Changes:** ${u.breakingChangeSummary}`);
|
|
157
|
+
}
|
|
158
|
+
return lines.join('\n');
|
|
159
|
+
}
|
|
160
|
+
function buildMigrationItemSection(item) {
|
|
161
|
+
const rec = item.recommendation;
|
|
162
|
+
const lines = [];
|
|
163
|
+
lines.push(`### Replace ${rec.currentImplementation.patternCategory} with ${rec.recommendedLibrary.name}`);
|
|
164
|
+
lines.push('');
|
|
165
|
+
lines.push(`- **File:** ${rec.currentImplementation.filePath}`);
|
|
166
|
+
lines.push(`- **Lines:** ${rec.currentImplementation.lineRange.start}-${rec.currentImplementation.lineRange.end}`);
|
|
167
|
+
lines.push(`- **Domain:** ${rec.domain}`);
|
|
168
|
+
lines.push(`- **Migration risk:** ${rec.migrationRisk}`);
|
|
169
|
+
lines.push(`- **Estimated effort:** ${rec.estimatedEffort}h`);
|
|
170
|
+
lines.push(`- **Verification:** ${rec.verificationStatus}`);
|
|
171
|
+
lines.push('');
|
|
172
|
+
lines.push(`| Dimension | Score |`);
|
|
173
|
+
lines.push(`|-----------|-------|`);
|
|
174
|
+
lines.push(`| Composite | ${rec.impactScores.composite}/10 |`);
|
|
175
|
+
lines.push(`| Security | ${rec.impactScores.security}/10 |`);
|
|
176
|
+
lines.push(`| Maintainability | ${rec.impactScores.maintainability}/10 |`);
|
|
177
|
+
lines.push(`| Performance | ${rec.impactScores.performance}/10 |`);
|
|
178
|
+
if (rec.adapterStrategy) {
|
|
179
|
+
lines.push('');
|
|
180
|
+
lines.push(`#### Adapter Strategy`);
|
|
181
|
+
lines.push(`- **Wrapper:** \`${rec.adapterStrategy.wrapperInterface}\``);
|
|
182
|
+
lines.push(`- **Legacy code:** \`${rec.adapterStrategy.legacyCode}\``);
|
|
183
|
+
lines.push(`- **Target library:** \`${rec.adapterStrategy.targetLibrary}\``);
|
|
184
|
+
}
|
|
185
|
+
return lines.join('\n');
|
|
186
|
+
}
|
|
187
|
+
//# sourceMappingURL=pr-description-builder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pr-description-builder.js","sourceRoot":"","sources":["../../src/pr-creator/pr-description-builder.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,8EAA8E;AAC9E,eAAe;AACf,8EAA8E;AAE9E;;;;;;;;;GASG;AACH,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,KAAK,iBAAiB,CAAC,CAAC,CAAC;YACvB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAC7B,CAAC,CAAC,EAAkD,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,CAC7E,CAAC;YACF,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACvB,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC,MAAM,CAAC;gBAC3B,OAAO,sBAAsB,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,cAAc,OAAO,CAAC,CAAC,aAAa,EAAE,CAAC;YACzF,CAAC;YACD,OAAO,wBAAwB,KAAK,CAAC,MAAM,kBAAkB,CAAC;QAChE,CAAC;QAED,KAAK,mBAAmB,CAAC,CAAC,CAAC;YACzB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAC7B,CAAC,CAAC,EAAgD,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CACzE,CAAC;YACF,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACvB,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC,MAAM,CAAC;gBAC3B,OAAO,uBAAuB,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,cAAc,OAAO,CAAC,CAAC,aAAa,EAAE,CAAC;YAC1F,CAAC;YACD,OAAO,uBAAuB,KAAK,CAAC,MAAM,eAAe,CAAC;QAC5D,CAAC;QAED,KAAK,gBAAgB,CAAC,CAAC,CAAC;YACtB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAC7B,CAAC,CAAC,EAAgD,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CACzE,CAAC;YACF,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACrB,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC;gBACrD,OAAO,uBAAuB,QAAQ,cAAc,KAAK,CAAC,MAAM,WAAW,CAAC;YAC9E,CAAC;YACD,OAAO,sCAAsC,CAAC;QAChD,CAAC;QAED,KAAK,WAAW,CAAC,CAAC,CAAC;YACjB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAC7B,CAAC,CAAC,EAAmD,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,CAC/E,CAAC;YACF,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACvB,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC,cAAc,CAAC;gBACrC,OAAO,YAAY,GAAG,CAAC,MAAM,cAAc,GAAG,CAAC,qBAAqB,CAAC,eAAe,SAAS,GAAG,CAAC,kBAAkB,CAAC,IAAI,EAAE,CAAC;YAC7H,CAAC;YACD,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,WAAW,IAAI,CAAC,CAAC;YACzC,OAAO,6BAA6B,KAAK,KAAK,KAAK,CAAC,MAAM,WAAW,CAAC;QACxE,CAAC;QAED;YACE,OAAO,4BAA4B,CAAC;IACxC,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,qBAAqB;AACrB,8EAA8E;AAE9E;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,SAAS;IACT,QAAQ,CAAC,IAAI,CAAC,MAAM,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC9E,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAElB,UAAU;IACV,QAAQ,CAAC,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC;IACzC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAElB,wBAAwB;IACxB,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QAC9B,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;YAClB,KAAK,UAAU;gBACb,QAAQ,CAAC,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,CAAC,CAAC;gBAC9C,MAAM;YACR,KAAK,QAAQ;gBACX,QAAQ,CAAC,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC,CAAC;gBAC5C,MAAM;YACR,KAAK,WAAW;gBACd,QAAQ,CAAC,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,CAAC,CAAC;gBAC/C,MAAM;QACV,CAAC;QACD,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC;IAED,qBAAqB;IACrB,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAC9B,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAClB,QAAQ,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;IAC7D,QAAQ,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;IAEtC,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;QAC9B,QAAQ,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC;QAC/D,QAAQ,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC;IACjE,CAAC;IAED,IAAI,IAAI,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;QACpC,QAAQ,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC;QACvD,QAAQ,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAC;IACrE,CAAC;IAED,QAAQ,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAC;IACjE,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAElB,SAAS;IACT,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrB,QAAQ,CAAC,IAAI,CAAC,0FAA0F,CAAC,CAAC;IAE1G,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC7B,CAAC;AAED,8EAA8E;AAC9E,mBAAmB;AACnB,8EAA8E;AAE9E,SAAS,cAAc,CAAC,IAAY;IAClC,MAAM,GAAG,GAA2B;QAClC,iBAAiB,EAAE,UAAU;QAC7B,mBAAmB,EAAE,mBAAmB;QACxC,gBAAgB,EAAE,gBAAgB;QAClC,WAAW,EAAE,WAAW;KACzB,CAAC;IACF,OAAO,GAAG,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC;AAC/B,CAAC;AAED,SAAS,cAAc,CAAC,IAAY;IAClC,OAAO,cAAc,CAAC,IAAI,CAAC,CAAC;AAC9B,CAAC;AAED,SAAS,mBAAmB,CAAC,IAAY;IACvC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAC1B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,sBAAsB,IAAI,CAAC,KAAK,CAAC,MAAM,eAAe,CAAC,CAAC;IACnE,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,wBAAwB,CAC/B,IAA+C;IAE/C,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;IACtB,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,WAAW,KAAK,CAAC,CAAC,cAAc,OAAO,CAAC,CAAC,aAAa,EAAE,CAAC,CAAC;IAC9E,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;IACpC,KAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;IACpC,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,YAAY,CAAC,QAAQ,OAAO,CAAC,CAAC;IAC3D,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,OAAO,MAAM,CAAC,CAAC;IAC7C,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC;IACpD,KAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC,eAAe,KAAK,CAAC,CAAC;IAC3D,IAAI,CAAC,CAAC,YAAY,GAAG,CAAC,EAAE,CAAC;QACvB,KAAK,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC;IAC9D,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,sBAAsB,CAC7B,IAA6C;IAE7C,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;IACtB,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,WAAW,KAAK,CAAC,CAAC,cAAc,OAAO,CAAC,CAAC,aAAa,EAAE,CAAC,CAAC;IAC9E,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC;IACjD,KAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC;IACrD,KAAK,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC,eAAe,GAAG,CAAC,CAAC;IAC5D,IAAI,CAAC,CAAC,kBAAkB,IAAI,CAAC,CAAC,qBAAqB,EAAE,CAAC;QACpD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC,qBAAqB,EAAE,CAAC,CAAC;IACnE,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,yBAAyB,CAChC,IAAgD;IAEhD,MAAM,GAAG,GAAG,IAAI,CAAC,cAAc,CAAC;IAChC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,CAAC,IAAI,CAAC,eAAe,GAAG,CAAC,qBAAqB,CAAC,eAAe,SAAS,GAAG,CAAC,kBAAkB,CAAC,IAAI,EAAE,CAAC,CAAC;IAC3G,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,eAAe,GAAG,CAAC,qBAAqB,CAAC,QAAQ,EAAE,CAAC,CAAC;IAChE,KAAK,CAAC,IAAI,CAAC,gBAAgB,GAAG,CAAC,qBAAqB,CAAC,SAAS,CAAC,KAAK,IAAI,GAAG,CAAC,qBAAqB,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,CAAC;IACnH,KAAK,CAAC,IAAI,CAAC,iBAAiB,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;IAC1C,KAAK,CAAC,IAAI,CAAC,yBAAyB,GAAG,CAAC,aAAa,EAAE,CAAC,CAAC;IACzD,KAAK,CAAC,IAAI,CAAC,2BAA2B,GAAG,CAAC,eAAe,GAAG,CAAC,CAAC;IAC9D,KAAK,CAAC,IAAI,CAAC,uBAAuB,GAAG,CAAC,kBAAkB,EAAE,CAAC,CAAC;IAC5D,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;IACpC,KAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;IACpC,KAAK,CAAC,IAAI,CAAC,iBAAiB,GAAG,CAAC,YAAY,CAAC,SAAS,OAAO,CAAC,CAAC;IAC/D,KAAK,CAAC,IAAI,CAAC,gBAAgB,GAAG,CAAC,YAAY,CAAC,QAAQ,OAAO,CAAC,CAAC;IAC7D,KAAK,CAAC,IAAI,CAAC,uBAAuB,GAAG,CAAC,YAAY,CAAC,eAAe,OAAO,CAAC,CAAC;IAC3E,KAAK,CAAC,IAAI,CAAC,mBAAmB,GAAG,CAAC,YAAY,CAAC,WAAW,OAAO,CAAC,CAAC;IAEnE,IAAI,GAAG,CAAC,eAAe,EAAE,CAAC;QACxB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;QACpC,KAAK,CAAC,IAAI,CAAC,oBAAoB,GAAG,CAAC,eAAe,CAAC,gBAAgB,IAAI,CAAC,CAAC;QACzE,KAAK,CAAC,IAAI,CAAC,wBAAwB,GAAG,CAAC,eAAe,CAAC,UAAU,IAAI,CAAC,CAAC;QACvE,KAAK,CAAC,IAAI,CAAC,2BAA2B,GAAG,CAAC,eAAe,CAAC,aAAa,IAAI,CAAC,CAAC;IAC/E,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PR Executor — executes PR plans by creating branches, committing changes,
|
|
3
|
+
* and creating/updating pull requests via the platform client.
|
|
4
|
+
*
|
|
5
|
+
* Requirements: 12.5, 12.9
|
|
6
|
+
*/
|
|
7
|
+
import type { PRResult, PRSummary } from '../schemas/output.schema.js';
|
|
8
|
+
import type { PRPlan } from './pr-strategy.js';
|
|
9
|
+
import type { PlatformClient } from './platform-client.js';
|
|
10
|
+
import type { GitOperations } from './git-operations.js';
|
|
11
|
+
export interface PRExecutionResult {
|
|
12
|
+
created: PRResult[];
|
|
13
|
+
summary: PRSummary;
|
|
14
|
+
}
|
|
15
|
+
export interface PRExecutionOptions {
|
|
16
|
+
plans: PRPlan[];
|
|
17
|
+
platformClient: PlatformClient;
|
|
18
|
+
gitOps: GitOperations;
|
|
19
|
+
labels: string[];
|
|
20
|
+
reviewers: string[];
|
|
21
|
+
draft: boolean;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Execute all PR plans — create branches, commits, and pull requests.
|
|
25
|
+
*
|
|
26
|
+
* Each plan is processed independently — a failure for one PR does not
|
|
27
|
+
* affect others (Requirement 12.9).
|
|
28
|
+
*/
|
|
29
|
+
export declare function executePRPlans(options: PRExecutionOptions): Promise<PRExecutionResult>;
|
|
30
|
+
//# sourceMappingURL=pr-executor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pr-executor.d.ts","sourceRoot":"","sources":["../../src/pr-creator/pr-executor.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AACvE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAOzD,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,QAAQ,EAAE,CAAC;IACpB,OAAO,EAAE,SAAS,CAAC;CACpB;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,cAAc,EAAE,cAAc,CAAC;IAC/B,MAAM,EAAE,aAAa,CAAC;IACtB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,KAAK,EAAE,OAAO,CAAC;CAChB;AAMD;;;;;GAKG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,iBAAiB,CAAC,CAuG5B"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PR Executor — executes PR plans by creating branches, committing changes,
|
|
3
|
+
* and creating/updating pull requests via the platform client.
|
|
4
|
+
*
|
|
5
|
+
* Requirements: 12.5, 12.9
|
|
6
|
+
*/
|
|
7
|
+
import { buildPRTitle, buildPRDescription } from './pr-description-builder.js';
|
|
8
|
+
// ---------------------------------------------------------------------------
|
|
9
|
+
// executePRPlans
|
|
10
|
+
// ---------------------------------------------------------------------------
|
|
11
|
+
/**
|
|
12
|
+
* Execute all PR plans — create branches, commits, and pull requests.
|
|
13
|
+
*
|
|
14
|
+
* Each plan is processed independently — a failure for one PR does not
|
|
15
|
+
* affect others (Requirement 12.9).
|
|
16
|
+
*/
|
|
17
|
+
export async function executePRPlans(options) {
|
|
18
|
+
const { plans, platformClient, gitOps, labels, reviewers, draft } = options;
|
|
19
|
+
const results = [];
|
|
20
|
+
let created = 0;
|
|
21
|
+
let updated = 0;
|
|
22
|
+
let skipped = 0;
|
|
23
|
+
let failed = 0;
|
|
24
|
+
// Get default branch for PR base
|
|
25
|
+
let baseBranch;
|
|
26
|
+
try {
|
|
27
|
+
baseBranch = await platformClient.getDefaultBranch();
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
baseBranch = 'main';
|
|
31
|
+
}
|
|
32
|
+
for (const plan of plans) {
|
|
33
|
+
try {
|
|
34
|
+
// Check for existing PR (Property 29: deduplication)
|
|
35
|
+
const existingPR = await platformClient.findExistingPR(plan.branchName);
|
|
36
|
+
if (existingPR) {
|
|
37
|
+
// Update existing PR
|
|
38
|
+
const title = buildPRTitle(plan);
|
|
39
|
+
const body = buildPRDescription(plan);
|
|
40
|
+
const updateResult = await platformClient.updatePullRequest(existingPR.number, { title, body });
|
|
41
|
+
results.push({
|
|
42
|
+
branchName: plan.branchName,
|
|
43
|
+
title,
|
|
44
|
+
type: plan.type,
|
|
45
|
+
status: 'updated',
|
|
46
|
+
url: updateResult.url,
|
|
47
|
+
prNumber: updateResult.number,
|
|
48
|
+
itemCount: plan.items.length,
|
|
49
|
+
});
|
|
50
|
+
updated++;
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
// Create new branch and PR
|
|
54
|
+
const branchExists = await gitOps.branchExists(plan.branchName);
|
|
55
|
+
if (!branchExists) {
|
|
56
|
+
await gitOps.createBranch(plan.branchName);
|
|
57
|
+
}
|
|
58
|
+
await gitOps.checkout(plan.branchName);
|
|
59
|
+
// Commit a placeholder change (actual code transforms are done separately)
|
|
60
|
+
const title = buildPRTitle(plan);
|
|
61
|
+
await gitOps.commitChanges([], title);
|
|
62
|
+
await gitOps.push(plan.branchName);
|
|
63
|
+
// Create PR
|
|
64
|
+
const body = buildPRDescription(plan);
|
|
65
|
+
const prResult = await platformClient.createPullRequest({
|
|
66
|
+
title,
|
|
67
|
+
body,
|
|
68
|
+
baseBranch,
|
|
69
|
+
headBranch: plan.branchName,
|
|
70
|
+
labels,
|
|
71
|
+
reviewers,
|
|
72
|
+
draft,
|
|
73
|
+
});
|
|
74
|
+
results.push({
|
|
75
|
+
branchName: plan.branchName,
|
|
76
|
+
title,
|
|
77
|
+
type: plan.type,
|
|
78
|
+
status: 'created',
|
|
79
|
+
url: prResult.url,
|
|
80
|
+
prNumber: prResult.number,
|
|
81
|
+
itemCount: plan.items.length,
|
|
82
|
+
});
|
|
83
|
+
created++;
|
|
84
|
+
}
|
|
85
|
+
catch (err) {
|
|
86
|
+
const title = buildPRTitle(plan);
|
|
87
|
+
results.push({
|
|
88
|
+
branchName: plan.branchName,
|
|
89
|
+
title,
|
|
90
|
+
type: plan.type,
|
|
91
|
+
status: 'failed',
|
|
92
|
+
errorMessage: err instanceof Error ? err.message : String(err),
|
|
93
|
+
itemCount: plan.items.length,
|
|
94
|
+
});
|
|
95
|
+
failed++;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return {
|
|
99
|
+
created: results,
|
|
100
|
+
summary: {
|
|
101
|
+
totalPlanned: plans.length,
|
|
102
|
+
created,
|
|
103
|
+
updated,
|
|
104
|
+
skipped,
|
|
105
|
+
failed,
|
|
106
|
+
},
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=pr-executor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pr-executor.js","sourceRoot":"","sources":["../../src/pr-creator/pr-executor.ts"],"names":[],"mappings":"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"}
|