@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.
Files changed (119) hide show
  1. package/CHANGELOG.md +57 -0
  2. package/LICENSE +21 -0
  3. package/README.md +316 -0
  4. package/SKILL.md +318 -0
  5. package/dist/analyzer/pattern-catalog.d.ts +35 -0
  6. package/dist/analyzer/pattern-catalog.d.ts.map +1 -0
  7. package/dist/analyzer/pattern-catalog.js +342 -0
  8. package/dist/analyzer/pattern-catalog.js.map +1 -0
  9. package/dist/analyzer/scanner.d.ts +33 -0
  10. package/dist/analyzer/scanner.d.ts.map +1 -0
  11. package/dist/analyzer/scanner.js +302 -0
  12. package/dist/analyzer/scanner.js.map +1 -0
  13. package/dist/auditor/ux-auditor.d.ts +26 -0
  14. package/dist/auditor/ux-auditor.d.ts.map +1 -0
  15. package/dist/auditor/ux-auditor.js +272 -0
  16. package/dist/auditor/ux-auditor.js.map +1 -0
  17. package/dist/checker/peer-dependency-checker.d.ts +62 -0
  18. package/dist/checker/peer-dependency-checker.d.ts.map +1 -0
  19. package/dist/checker/peer-dependency-checker.js +94 -0
  20. package/dist/checker/peer-dependency-checker.js.map +1 -0
  21. package/dist/index.d.ts +78 -0
  22. package/dist/index.d.ts.map +1 -0
  23. package/dist/index.js +325 -0
  24. package/dist/index.js.map +1 -0
  25. package/dist/planner/migration-planner.d.ts +47 -0
  26. package/dist/planner/migration-planner.d.ts.map +1 -0
  27. package/dist/planner/migration-planner.js +144 -0
  28. package/dist/planner/migration-planner.js.map +1 -0
  29. package/dist/pr-creator/git-operations.d.ts +29 -0
  30. package/dist/pr-creator/git-operations.d.ts.map +1 -0
  31. package/dist/pr-creator/git-operations.js +10 -0
  32. package/dist/pr-creator/git-operations.js.map +1 -0
  33. package/dist/pr-creator/platform-client.d.ts +47 -0
  34. package/dist/pr-creator/platform-client.d.ts.map +1 -0
  35. package/dist/pr-creator/platform-client.js +9 -0
  36. package/dist/pr-creator/platform-client.js.map +1 -0
  37. package/dist/pr-creator/pr-description-builder.d.ts +23 -0
  38. package/dist/pr-creator/pr-description-builder.d.ts.map +1 -0
  39. package/dist/pr-creator/pr-description-builder.js +187 -0
  40. package/dist/pr-creator/pr-description-builder.js.map +1 -0
  41. package/dist/pr-creator/pr-executor.d.ts +30 -0
  42. package/dist/pr-creator/pr-executor.d.ts.map +1 -0
  43. package/dist/pr-creator/pr-executor.js +109 -0
  44. package/dist/pr-creator/pr-executor.js.map +1 -0
  45. package/dist/pr-creator/pr-strategy.d.ts +56 -0
  46. package/dist/pr-creator/pr-strategy.d.ts.map +1 -0
  47. package/dist/pr-creator/pr-strategy.js +125 -0
  48. package/dist/pr-creator/pr-strategy.js.map +1 -0
  49. package/dist/schemas/input.schema.d.ts +231 -0
  50. package/dist/schemas/input.schema.d.ts.map +1 -0
  51. package/dist/schemas/input.schema.js +159 -0
  52. package/dist/schemas/input.schema.js.map +1 -0
  53. package/dist/schemas/output.schema.d.ts +2543 -0
  54. package/dist/schemas/output.schema.d.ts.map +1 -0
  55. package/dist/schemas/output.schema.js +199 -0
  56. package/dist/schemas/output.schema.js.map +1 -0
  57. package/dist/scorer/impact-scorer.d.ts +45 -0
  58. package/dist/scorer/impact-scorer.d.ts.map +1 -0
  59. package/dist/scorer/impact-scorer.js +243 -0
  60. package/dist/scorer/impact-scorer.js.map +1 -0
  61. package/dist/security/osv-client.d.ts +72 -0
  62. package/dist/security/osv-client.d.ts.map +1 -0
  63. package/dist/security/osv-client.js +36 -0
  64. package/dist/security/osv-client.js.map +1 -0
  65. package/dist/security/vuln-report-builder.d.ts +18 -0
  66. package/dist/security/vuln-report-builder.d.ts.map +1 -0
  67. package/dist/security/vuln-report-builder.js +141 -0
  68. package/dist/security/vuln-report-builder.js.map +1 -0
  69. package/dist/security/vulnerability-scanner.d.ts +65 -0
  70. package/dist/security/vulnerability-scanner.d.ts.map +1 -0
  71. package/dist/security/vulnerability-scanner.js +140 -0
  72. package/dist/security/vulnerability-scanner.js.map +1 -0
  73. package/dist/updater/changelog-verifier.d.ts +29 -0
  74. package/dist/updater/changelog-verifier.d.ts.map +1 -0
  75. package/dist/updater/changelog-verifier.js +80 -0
  76. package/dist/updater/changelog-verifier.js.map +1 -0
  77. package/dist/updater/registry-client.d.ts +49 -0
  78. package/dist/updater/registry-client.d.ts.map +1 -0
  79. package/dist/updater/registry-client.js +10 -0
  80. package/dist/updater/registry-client.js.map +1 -0
  81. package/dist/updater/update-plan-builder.d.ts +23 -0
  82. package/dist/updater/update-plan-builder.d.ts.map +1 -0
  83. package/dist/updater/update-plan-builder.js +93 -0
  84. package/dist/updater/update-plan-builder.js.map +1 -0
  85. package/dist/updater/update-policy.d.ts +50 -0
  86. package/dist/updater/update-policy.d.ts.map +1 -0
  87. package/dist/updater/update-policy.js +118 -0
  88. package/dist/updater/update-policy.js.map +1 -0
  89. package/dist/updater/update-scorer.d.ts +51 -0
  90. package/dist/updater/update-scorer.d.ts.map +1 -0
  91. package/dist/updater/update-scorer.js +166 -0
  92. package/dist/updater/update-scorer.js.map +1 -0
  93. package/dist/utils/constraint-filter.d.ts +44 -0
  94. package/dist/utils/constraint-filter.d.ts.map +1 -0
  95. package/dist/utils/constraint-filter.js +69 -0
  96. package/dist/utils/constraint-filter.js.map +1 -0
  97. package/dist/utils/serializer.d.ts +17 -0
  98. package/dist/utils/serializer.d.ts.map +1 -0
  99. package/dist/utils/serializer.js +24 -0
  100. package/dist/utils/serializer.js.map +1 -0
  101. package/dist/utils/skill-parser.d.ts +29 -0
  102. package/dist/utils/skill-parser.d.ts.map +1 -0
  103. package/dist/utils/skill-parser.js +175 -0
  104. package/dist/utils/skill-parser.js.map +1 -0
  105. package/dist/verifier/context7.d.ts +48 -0
  106. package/dist/verifier/context7.d.ts.map +1 -0
  107. package/dist/verifier/context7.js +97 -0
  108. package/dist/verifier/context7.js.map +1 -0
  109. package/examples/backend-node/input.json +28 -0
  110. package/examples/backend-node/output.json +343 -0
  111. package/examples/frontend-nextjs/input.json +37 -0
  112. package/examples/frontend-nextjs/output.json +302 -0
  113. package/package.json +79 -0
  114. package/templates/deletion-checklist.md +42 -0
  115. package/templates/migration-plan.md +61 -0
  116. package/templates/prd-template.md +123 -0
  117. package/templates/summary-table.md +28 -0
  118. package/templates/update-plan.md +61 -0
  119. package/templates/vuln-report.md +50 -0
@@ -0,0 +1,62 @@
1
+ import type { RecommendedChange } from '../schemas/output.schema.js';
2
+ /**
3
+ * Resolved peer dependency metadata for a library.
4
+ * Maps peer dependency name → required version range.
5
+ */
6
+ export type PeerDependencyMap = Record<string, string>;
7
+ /**
8
+ * Interface for resolving peer dependency metadata.
9
+ * Injected for testability — real implementation reads from npm registry or package.json.
10
+ */
11
+ export interface PeerDependencyResolver {
12
+ resolve(libraryName: string, version: string): Promise<PeerDependencyMap>;
13
+ }
14
+ export type WarningSeverity = 'conflict' | 'missing' | 'compatible';
15
+ export interface PeerDependencyWarning {
16
+ recommendedLibrary: string;
17
+ peerDependency: string;
18
+ requiredRange: string;
19
+ installedVersion: string | null;
20
+ severity: WarningSeverity;
21
+ }
22
+ export interface PeerCheckResult {
23
+ warnings: PeerDependencyWarning[];
24
+ recommendations: RecommendedChange[];
25
+ }
26
+ /**
27
+ * Classify the severity of a peer dependency relationship.
28
+ *
29
+ * - If the peer dependency is not installed (undefined), returns "missing"
30
+ * - If the installed version cannot be coerced to a valid semver, returns "conflict"
31
+ * - If the installed version satisfies the required range, returns "compatible"
32
+ * - Otherwise, returns "conflict"
33
+ *
34
+ * Requirements: 2.1, 2.2, 2.3
35
+ */
36
+ export declare function classifySeverity(requiredRange: string, installedVersion: string | undefined): WarningSeverity;
37
+ /**
38
+ * Escalate migration risk when conflict or missing peer dependencies are detected.
39
+ *
40
+ * - If no conflict/missing, preserves current risk
41
+ * - If current risk is "high", preserves "high"
42
+ * - Otherwise bumps to "medium"
43
+ *
44
+ * Requirements: 3.1, 3.2, 3.3
45
+ */
46
+ export declare function escalateRisk(currentRisk: 'low' | 'medium' | 'high', hasConflictOrMissing: boolean): 'low' | 'medium' | 'high';
47
+ /**
48
+ * Check peer dependencies for all recommendations against currentLibraries.
49
+ *
50
+ * For each recommendation:
51
+ * 1. Resolve peer dependency metadata via the resolver
52
+ * 2. For each peer dep, compare against currentLibraries using semver
53
+ * 3. Classify as "compatible", "conflict", or "missing"
54
+ * 4. If any peer dep is "conflict" or "missing", escalate migrationRisk to at least "medium"
55
+ *
56
+ * On resolver error for a specific library: catch error, produce zero warnings,
57
+ * preserve original migrationRisk, and continue processing.
58
+ *
59
+ * Requirements: 1.1, 1.2, 2.1, 2.2, 2.3, 2.4, 3.1, 3.2, 3.3
60
+ */
61
+ export declare function checkPeerDependencies(recommendations: RecommendedChange[], currentLibraries: Record<string, string>, resolver: PeerDependencyResolver): Promise<PeerCheckResult>;
62
+ //# sourceMappingURL=peer-dependency-checker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"peer-dependency-checker.d.ts","sourceRoot":"","sources":["../../src/checker/peer-dependency-checker.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAErE;;;GAGG;AACH,MAAM,MAAM,iBAAiB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAEvD;;;GAGG;AACH,MAAM,WAAW,sBAAsB;IACrC,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;CAC3E;AAED,MAAM,MAAM,eAAe,GAAG,UAAU,GAAG,SAAS,GAAG,YAAY,CAAC;AAEpE,MAAM,WAAW,qBAAqB;IACpC,kBAAkB,EAAE,MAAM,CAAC;IAC3B,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,QAAQ,EAAE,eAAe,CAAC;CAC3B;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,qBAAqB,EAAE,CAAC;IAClC,eAAe,EAAE,iBAAiB,EAAE,CAAC;CACtC;AAED;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAC9B,aAAa,EAAE,MAAM,EACrB,gBAAgB,EAAE,MAAM,GAAG,SAAS,GACnC,eAAe,CAKjB;AAED;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAC1B,WAAW,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,EACtC,oBAAoB,EAAE,OAAO,GAC5B,KAAK,GAAG,QAAQ,GAAG,MAAM,CAI3B;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,qBAAqB,CACzC,eAAe,EAAE,iBAAiB,EAAE,EACpC,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACxC,QAAQ,EAAE,sBAAsB,GAC/B,OAAO,CAAC,eAAe,CAAC,CA0D1B"}
@@ -0,0 +1,94 @@
1
+ import semver from 'semver';
2
+ /**
3
+ * Classify the severity of a peer dependency relationship.
4
+ *
5
+ * - If the peer dependency is not installed (undefined), returns "missing"
6
+ * - If the installed version cannot be coerced to a valid semver, returns "conflict"
7
+ * - If the installed version satisfies the required range, returns "compatible"
8
+ * - Otherwise, returns "conflict"
9
+ *
10
+ * Requirements: 2.1, 2.2, 2.3
11
+ */
12
+ export function classifySeverity(requiredRange, installedVersion) {
13
+ if (installedVersion === undefined)
14
+ return 'missing';
15
+ const coerced = semver.coerce(installedVersion);
16
+ if (!coerced)
17
+ return 'conflict';
18
+ return semver.satisfies(coerced, requiredRange) ? 'compatible' : 'conflict';
19
+ }
20
+ /**
21
+ * Escalate migration risk when conflict or missing peer dependencies are detected.
22
+ *
23
+ * - If no conflict/missing, preserves current risk
24
+ * - If current risk is "high", preserves "high"
25
+ * - Otherwise bumps to "medium"
26
+ *
27
+ * Requirements: 3.1, 3.2, 3.3
28
+ */
29
+ export function escalateRisk(currentRisk, hasConflictOrMissing) {
30
+ if (!hasConflictOrMissing)
31
+ return currentRisk;
32
+ if (currentRisk === 'high')
33
+ return 'high';
34
+ return 'medium';
35
+ }
36
+ /**
37
+ * Check peer dependencies for all recommendations against currentLibraries.
38
+ *
39
+ * For each recommendation:
40
+ * 1. Resolve peer dependency metadata via the resolver
41
+ * 2. For each peer dep, compare against currentLibraries using semver
42
+ * 3. Classify as "compatible", "conflict", or "missing"
43
+ * 4. If any peer dep is "conflict" or "missing", escalate migrationRisk to at least "medium"
44
+ *
45
+ * On resolver error for a specific library: catch error, produce zero warnings,
46
+ * preserve original migrationRisk, and continue processing.
47
+ *
48
+ * Requirements: 1.1, 1.2, 2.1, 2.2, 2.3, 2.4, 3.1, 3.2, 3.3
49
+ */
50
+ export async function checkPeerDependencies(recommendations, currentLibraries, resolver) {
51
+ const allWarnings = [];
52
+ const updatedRecommendations = [];
53
+ for (const rec of recommendations) {
54
+ let peerDeps = {};
55
+ try {
56
+ const resolved = await resolver.resolve(rec.recommendedLibrary.name, rec.recommendedLibrary.version);
57
+ // Validate resolved data — filter out non-string values (malformed data)
58
+ for (const [key, value] of Object.entries(resolved)) {
59
+ if (typeof key === 'string' && typeof value === 'string') {
60
+ peerDeps[key] = value;
61
+ }
62
+ }
63
+ }
64
+ catch {
65
+ // Resolver error: produce zero warnings, preserve original risk, continue
66
+ updatedRecommendations.push(rec);
67
+ continue;
68
+ }
69
+ const recWarnings = [];
70
+ for (const [peerName, requiredRange] of Object.entries(peerDeps)) {
71
+ const installedVersion = currentLibraries[peerName];
72
+ const severity = classifySeverity(requiredRange, installedVersion);
73
+ recWarnings.push({
74
+ recommendedLibrary: rec.recommendedLibrary.name,
75
+ peerDependency: peerName,
76
+ requiredRange,
77
+ installedVersion: installedVersion ?? null,
78
+ severity,
79
+ });
80
+ }
81
+ const hasConflictOrMissing = recWarnings.some((w) => w.severity === 'conflict' || w.severity === 'missing');
82
+ const escalatedRisk = escalateRisk(rec.migrationRisk, hasConflictOrMissing);
83
+ updatedRecommendations.push({
84
+ ...rec,
85
+ migrationRisk: escalatedRisk,
86
+ });
87
+ allWarnings.push(...recWarnings);
88
+ }
89
+ return {
90
+ warnings: allWarnings,
91
+ recommendations: updatedRecommendations,
92
+ };
93
+ }
94
+ //# sourceMappingURL=peer-dependency-checker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"peer-dependency-checker.js","sourceRoot":"","sources":["../../src/checker/peer-dependency-checker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,78 @@
1
+ /**
2
+ * Next-Unicorn SKILL — Analyze and Recommend Third-Party Optimizations
3
+ *
4
+ * Scans codebases and recommends replacing hand-rolled implementations
5
+ * with battle-tested third-party libraries.
6
+ *
7
+ * This is the orchestrator that wires the full pipeline:
8
+ * validate input → scan → verify → score → plan → audit → filter →
9
+ * vuln scan → auto-update → serialize → PR creation
10
+ */
11
+ import { OutputSchema } from './schemas/output.schema.js';
12
+ import { type Context7Client } from './verifier/context7.js';
13
+ import { type ExclusionRecord } from './utils/constraint-filter.js';
14
+ import { type PeerDependencyResolver } from './checker/peer-dependency-checker.js';
15
+ import type { VulnerabilityClient } from './security/osv-client.js';
16
+ import type { RegistryClient } from './updater/registry-client.js';
17
+ import type { PlatformClient } from './pr-creator/platform-client.js';
18
+ import type { GitOperations } from './pr-creator/git-operations.js';
19
+ export declare const VERSION = "2.0.0";
20
+ export interface AnalyzeOptions {
21
+ /** Raw input to be validated against InputSchema */
22
+ input: unknown;
23
+ /** Injected Context7 client for testability — no real HTTP calls in tests */
24
+ context7Client: Context7Client;
25
+ /** Optional — if provided, enables vulnerability scanning */
26
+ vulnClient?: VulnerabilityClient;
27
+ /** Optional — if provided, enables auto-update recommendations */
28
+ registryClient?: RegistryClient;
29
+ /** Required only if prPolicy.enabled is true */
30
+ platformClient?: PlatformClient;
31
+ /** Required only if prPolicy.enabled is true */
32
+ gitOps?: GitOperations;
33
+ /** Optional — if provided, resolves peer dependency metadata for recommended libraries */
34
+ peerDependencyResolver?: PeerDependencyResolver;
35
+ }
36
+ export type AnalyzeResult = {
37
+ success: true;
38
+ output: OutputSchema;
39
+ json: string;
40
+ prettyJson: string;
41
+ exclusions: ExclusionRecord[];
42
+ } | {
43
+ success: false;
44
+ error: string;
45
+ issues?: unknown;
46
+ };
47
+ export type { Context7Client, VerificationResult } from './verifier/context7.js';
48
+ export type { ExclusionRecord } from './utils/constraint-filter.js';
49
+ export type { InputSchema } from './schemas/input.schema.js';
50
+ export type { OutputSchema } from './schemas/output.schema.js';
51
+ export type { VulnerabilityClient } from './security/osv-client.js';
52
+ export type { RegistryClient } from './updater/registry-client.js';
53
+ export type { PlatformClient } from './pr-creator/platform-client.js';
54
+ export type { GitOperations } from './pr-creator/git-operations.js';
55
+ export type { PeerDependencyResolver } from './checker/peer-dependency-checker.js';
56
+ /**
57
+ * Run the full Next-Unicorn analysis pipeline.
58
+ *
59
+ * Pipeline steps:
60
+ * 1. Validate input with InputSchema Zod schema
61
+ * 2. Scan codebase with scanCodebase
62
+ * 3. Verify all detections with Context7
63
+ * 4. Score each detection
64
+ * 5. Build RecommendedChange objects
65
+ * 6. Apply dependency conflict detection
66
+ * 6.5 Vulnerability scanning (optional — Phase 2)
67
+ * 7. Apply license filtering
68
+ * 8. Build migration plan
69
+ * 9. Audit UX completeness
70
+ * 10. Auto-update existing dependencies (optional — Phase 2)
71
+ * 11. Assemble OutputSchema, serialize
72
+ * 12. PR auto-creation (optional — Phase 2)
73
+ * 13. Return result
74
+ *
75
+ * Requirements: 1.1, 7.3, 10.*, 11.*, 12.*
76
+ */
77
+ export declare function analyze(options: AnalyzeOptions): Promise<AnalyzeResult>;
78
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,EACL,YAAY,EAIb,MAAM,4BAA4B,CAAC;AAGpC,OAAO,EAEL,KAAK,cAAc,EACpB,MAAM,wBAAwB,CAAC;AAIhC,OAAO,EAGL,KAAK,eAAe,EACrB,MAAM,8BAA8B,CAAC;AAEtC,OAAO,EAEL,KAAK,sBAAsB,EAE5B,MAAM,sCAAsC,CAAC;AAG9C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAEpE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAOnE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACtE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAMpE,eAAO,MAAM,OAAO,UAAU,CAAC;AAM/B,MAAM,WAAW,cAAc;IAC7B,oDAAoD;IACpD,KAAK,EAAE,OAAO,CAAC;IACf,6EAA6E;IAC7E,cAAc,EAAE,cAAc,CAAC;IAC/B,6DAA6D;IAC7D,UAAU,CAAC,EAAE,mBAAmB,CAAC;IACjC,kEAAkE;IAClE,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,gDAAgD;IAChD,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,gDAAgD;IAChD,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,0FAA0F;IAC1F,sBAAsB,CAAC,EAAE,sBAAsB,CAAC;CACjD;AAED,MAAM,MAAM,aAAa,GACrB;IACE,OAAO,EAAE,IAAI,CAAC;IACd,MAAM,EAAE,YAAY,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,eAAe,EAAE,CAAC;CAC/B,GACD;IACE,OAAO,EAAE,KAAK,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB,CAAC;AAMN,YAAY,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AACjF,YAAY,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AACpE,YAAY,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAC7D,YAAY,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC/D,YAAY,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AACpE,YAAY,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AACnE,YAAY,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACtE,YAAY,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AACpE,YAAY,EAAE,sBAAsB,EAAE,MAAM,sCAAsC,CAAC;AAMnF;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAsB,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC,CAwT7E"}
package/dist/index.js ADDED
@@ -0,0 +1,325 @@
1
+ /**
2
+ * Next-Unicorn SKILL — Analyze and Recommend Third-Party Optimizations
3
+ *
4
+ * Scans codebases and recommends replacing hand-rolled implementations
5
+ * with battle-tested third-party libraries.
6
+ *
7
+ * This is the orchestrator that wires the full pipeline:
8
+ * validate input → scan → verify → score → plan → audit → filter →
9
+ * vuln scan → auto-update → serialize → PR creation
10
+ */
11
+ import { ZodError } from 'zod';
12
+ import { InputSchema } from './schemas/input.schema.js';
13
+ import { scanCodebase } from './analyzer/scanner.js';
14
+ import { getPatternCatalog } from './analyzer/pattern-catalog.js';
15
+ import { verifyAllRecommendations, } from './verifier/context7.js';
16
+ import { computeImpactScore } from './scorer/impact-scorer.js';
17
+ import { buildMigrationPlan } from './planner/migration-planner.js';
18
+ import { auditUxCompleteness } from './auditor/ux-auditor.js';
19
+ import { filterByLicense, detectDependencyConflicts, } from './utils/constraint-filter.js';
20
+ import { serializeOutput, prettyPrint } from './utils/serializer.js';
21
+ import { checkPeerDependencies, } from './checker/peer-dependency-checker.js';
22
+ import { scanVulnerabilities } from './security/vulnerability-scanner.js';
23
+ import { applyUpdatePolicy } from './updater/update-policy.js';
24
+ import { verifyChangelog } from './updater/changelog-verifier.js';
25
+ import { scoreUpdate } from './updater/update-scorer.js';
26
+ import { buildUpdatePlan } from './updater/update-plan-builder.js';
27
+ import { planPRs } from './pr-creator/pr-strategy.js';
28
+ import { executePRPlans } from './pr-creator/pr-executor.js';
29
+ // ---------------------------------------------------------------------------
30
+ // Version
31
+ // ---------------------------------------------------------------------------
32
+ export const VERSION = '2.0.0';
33
+ // ---------------------------------------------------------------------------
34
+ // analyze — main orchestrator
35
+ // ---------------------------------------------------------------------------
36
+ /**
37
+ * Run the full Next-Unicorn analysis pipeline.
38
+ *
39
+ * Pipeline steps:
40
+ * 1. Validate input with InputSchema Zod schema
41
+ * 2. Scan codebase with scanCodebase
42
+ * 3. Verify all detections with Context7
43
+ * 4. Score each detection
44
+ * 5. Build RecommendedChange objects
45
+ * 6. Apply dependency conflict detection
46
+ * 6.5 Vulnerability scanning (optional — Phase 2)
47
+ * 7. Apply license filtering
48
+ * 8. Build migration plan
49
+ * 9. Audit UX completeness
50
+ * 10. Auto-update existing dependencies (optional — Phase 2)
51
+ * 11. Assemble OutputSchema, serialize
52
+ * 12. PR auto-creation (optional — Phase 2)
53
+ * 13. Return result
54
+ *
55
+ * Requirements: 1.1, 7.3, 10.*, 11.*, 12.*
56
+ */
57
+ export async function analyze(options) {
58
+ const { input, context7Client } = options;
59
+ // -------------------------------------------------------------------------
60
+ // Step 1: Validate input
61
+ // -------------------------------------------------------------------------
62
+ let validatedInput;
63
+ try {
64
+ validatedInput = InputSchema.parse(input);
65
+ }
66
+ catch (err) {
67
+ if (err instanceof ZodError) {
68
+ return {
69
+ success: false,
70
+ error: `Input validation failed: ${err.errors.map((e) => e.message).join(', ')}`,
71
+ issues: err.errors,
72
+ };
73
+ }
74
+ return {
75
+ success: false,
76
+ error: `Input validation failed: ${String(err)}`,
77
+ };
78
+ }
79
+ // -------------------------------------------------------------------------
80
+ // Step 2: Scan codebase
81
+ // -------------------------------------------------------------------------
82
+ const scanResult = await scanCodebase(validatedInput);
83
+ // -------------------------------------------------------------------------
84
+ // Step 3: Verify all detections with Context7
85
+ // -------------------------------------------------------------------------
86
+ const verificationMap = await verifyAllRecommendations(context7Client, scanResult.detections);
87
+ // -------------------------------------------------------------------------
88
+ // Step 4 & 5: Score each detection and build RecommendedChange objects
89
+ // -------------------------------------------------------------------------
90
+ const catalog = getPatternCatalog();
91
+ const catalogMap = new Map(catalog.map((p) => [p.id, p]));
92
+ const recommendations = scanResult.detections.map((detection, index) => {
93
+ const verification = verificationMap.get(index) ?? {
94
+ status: 'unavailable',
95
+ note: 'No verification result available',
96
+ };
97
+ const scoringOutput = computeImpactScore({
98
+ detection,
99
+ verification,
100
+ weights: validatedInput.impactWeights,
101
+ priorityFocusAreas: validatedInput.priorityFocusAreas,
102
+ });
103
+ // Look up the pattern definition for version and license info
104
+ const patternDef = catalogMap.get(detection.patternCategory);
105
+ return {
106
+ currentImplementation: {
107
+ filePath: detection.filePath,
108
+ lineRange: detection.lineRange,
109
+ patternCategory: detection.patternCategory,
110
+ confidenceScore: detection.confidenceScore,
111
+ },
112
+ recommendedLibrary: {
113
+ name: detection.suggestedLibrary,
114
+ version: patternDef?.suggestedVersion ?? 'latest',
115
+ license: patternDef?.license ?? 'MIT',
116
+ documentationUrl: verification.documentationUrl,
117
+ },
118
+ domain: detection.domain,
119
+ impactScores: scoringOutput.scores,
120
+ migrationRisk: scoringOutput.migrationRisk,
121
+ estimatedEffort: scoringOutput.estimatedEffort,
122
+ verificationStatus: verification.status,
123
+ verificationNote: verification.note,
124
+ };
125
+ });
126
+ // -------------------------------------------------------------------------
127
+ // Step 6: Apply dependency conflict detection
128
+ // -------------------------------------------------------------------------
129
+ const conflictChecked = detectDependencyConflicts(recommendations, validatedInput.projectMetadata.currentLibraries);
130
+ // -------------------------------------------------------------------------
131
+ // Step 6.25: Check peer dependencies
132
+ // -------------------------------------------------------------------------
133
+ let peerWarnings = [];
134
+ let peerCheckedRecommendations = conflictChecked;
135
+ try {
136
+ const resolver = options.peerDependencyResolver ?? {
137
+ resolve: async () => ({}),
138
+ };
139
+ const peerCheckResult = await checkPeerDependencies(conflictChecked, validatedInput.projectMetadata.currentLibraries, resolver);
140
+ peerWarnings = peerCheckResult.warnings;
141
+ peerCheckedRecommendations = peerCheckResult.recommendations;
142
+ }
143
+ catch {
144
+ // Unexpected error — fall back to empty warnings and original recommendations
145
+ peerWarnings = [];
146
+ peerCheckedRecommendations = conflictChecked;
147
+ }
148
+ // -------------------------------------------------------------------------
149
+ // Step 6.5: Vulnerability scanning (optional — Phase 2)
150
+ // -------------------------------------------------------------------------
151
+ let vulnerabilityReport;
152
+ if (options.vulnClient) {
153
+ const defaultEcosystem = detectDefaultEcosystem(validatedInput.projectMetadata.packageManagers);
154
+ const vulnResult = await scanVulnerabilities({
155
+ currentLibraries: validatedInput.projectMetadata.currentLibraries,
156
+ recommendedChanges: peerCheckedRecommendations,
157
+ target: 'both',
158
+ defaultEcosystem,
159
+ }, options.vulnClient);
160
+ vulnerabilityReport = {
161
+ findings: vulnResult.findings.map((f) => ({
162
+ source: f.source,
163
+ packageName: f.packageName,
164
+ installedVersion: f.installedVersion,
165
+ ecosystem: f.ecosystem,
166
+ vulnerabilityId: f.vulnerability.id,
167
+ aliases: f.vulnerability.aliases,
168
+ severity: f.vulnerability.severity,
169
+ cvssScore: f.vulnerability.cvssScore,
170
+ summary: f.vulnerability.summary,
171
+ fixAvailable: f.fixAvailable,
172
+ recommendationIndex: f.recommendationIndex,
173
+ })),
174
+ summary: vulnResult.summary,
175
+ serviceUnavailable: vulnResult.serviceUnavailable,
176
+ };
177
+ }
178
+ // -------------------------------------------------------------------------
179
+ // Step 7: Apply license filtering
180
+ // -------------------------------------------------------------------------
181
+ const { recommendations: filteredRecommendations, exclusions } = filterByLicense(peerCheckedRecommendations, validatedInput.constraints.licenseAllowlist);
182
+ // -------------------------------------------------------------------------
183
+ // Step 8: Build migration plan
184
+ // -------------------------------------------------------------------------
185
+ const migrationPlan = buildMigrationPlan(filteredRecommendations);
186
+ // -------------------------------------------------------------------------
187
+ // Step 9: Audit UX completeness
188
+ // -------------------------------------------------------------------------
189
+ const uxAuditResult = auditUxCompleteness(scanResult, validatedInput.projectMetadata);
190
+ // -------------------------------------------------------------------------
191
+ // Step 10: Auto-update existing dependencies (optional — Phase 2)
192
+ // -------------------------------------------------------------------------
193
+ let updatePlan;
194
+ if (validatedInput.updatePolicy?.enabled &&
195
+ options.registryClient) {
196
+ const policy = validatedInput.updatePolicy;
197
+ const defaultEcosystem = detectDefaultEcosystem(validatedInput.projectMetadata.packageManagers);
198
+ try {
199
+ // Fetch version info for all current libraries
200
+ const queries = Object.entries(validatedInput.projectMetadata.currentLibraries).map(([name, version]) => ({
201
+ ecosystem: defaultEcosystem,
202
+ packageName: name,
203
+ currentVersion: version,
204
+ }));
205
+ const versionInfoMap = await options.registryClient.getVersionInfoBatch(queries);
206
+ // Apply update policy
207
+ const candidates = applyUpdatePolicy(versionInfoMap, {
208
+ defaultStrategy: policy.defaultStrategy,
209
+ packageOverrides: policy.packageOverrides,
210
+ maxUpdates: policy.maxUpdates,
211
+ minAgeDays: policy.minAgeDays,
212
+ groupRelatedPackages: policy.groupRelatedPackages,
213
+ pinned: policy.pinned,
214
+ }, defaultEcosystem);
215
+ // Verify changelogs via Context7
216
+ const changelogs = await Promise.all(candidates.map((c) => verifyChangelog(context7Client, c.packageName, c.currentVersion, c.targetVersion)));
217
+ // Score each update
218
+ const scores = candidates.map((candidate, index) => scoreUpdate({
219
+ candidate,
220
+ changelog: changelogs[index],
221
+ }));
222
+ // Build update plan
223
+ updatePlan = buildUpdatePlan(candidates, scores, changelogs);
224
+ }
225
+ catch {
226
+ // Registry unavailable — skip update plan silently
227
+ updatePlan = undefined;
228
+ }
229
+ }
230
+ // -------------------------------------------------------------------------
231
+ // Step 11: Assemble OutputSchema
232
+ // -------------------------------------------------------------------------
233
+ // Compute lines saved estimate from deletion checklist
234
+ const linesSavedEstimate = migrationPlan.deletionChecklist.reduce((total, item) => {
235
+ if (item.lineRange) {
236
+ return total + (item.lineRange.end - item.lineRange.start + 1);
237
+ }
238
+ return total;
239
+ }, 0);
240
+ // Collect files to delete from the deletion checklist
241
+ const filesToDelete = [
242
+ ...new Set(migrationPlan.deletionChecklist.map((item) => item.filePath)),
243
+ ];
244
+ const output = {
245
+ recommendedChanges: filteredRecommendations,
246
+ filesToDelete,
247
+ linesSavedEstimate,
248
+ uxAudit: uxAuditResult.items,
249
+ migrationPlan: {
250
+ phases: migrationPlan.phases,
251
+ deletionChecklist: migrationPlan.deletionChecklist,
252
+ peerDependencyWarnings: peerWarnings,
253
+ },
254
+ // Phase 2 optional sections
255
+ vulnerabilityReport,
256
+ updatePlan,
257
+ };
258
+ // -------------------------------------------------------------------------
259
+ // Step 12: PR auto-creation (optional — Phase 2)
260
+ // -------------------------------------------------------------------------
261
+ if (validatedInput.prPolicy?.enabled &&
262
+ options.platformClient &&
263
+ options.gitOps) {
264
+ const prPolicy = validatedInput.prPolicy;
265
+ const prPlans = planPRs({
266
+ output,
267
+ policy: {
268
+ enabled: prPolicy.enabled,
269
+ maxOpenPRs: prPolicy.maxOpenPRs,
270
+ groupUpdates: prPolicy.groupUpdates,
271
+ separateSecurityPRs: prPolicy.separateSecurityPRs,
272
+ createMigrationPRs: prPolicy.createMigrationPRs,
273
+ labels: prPolicy.labels,
274
+ reviewers: prPolicy.reviewers,
275
+ draft: prPolicy.draft,
276
+ branchPrefix: prPolicy.branchPrefix,
277
+ },
278
+ });
279
+ const prResults = await executePRPlans({
280
+ plans: prPlans,
281
+ platformClient: options.platformClient,
282
+ gitOps: options.gitOps,
283
+ labels: prPolicy.labels,
284
+ reviewers: prPolicy.reviewers,
285
+ draft: prPolicy.draft,
286
+ });
287
+ output.pullRequests = prResults;
288
+ }
289
+ // -------------------------------------------------------------------------
290
+ // Step 13: Serialize and return
291
+ // -------------------------------------------------------------------------
292
+ const json = serializeOutput(output);
293
+ const prettyJson = prettyPrint(output);
294
+ return {
295
+ success: true,
296
+ output,
297
+ json,
298
+ prettyJson,
299
+ exclusions,
300
+ };
301
+ }
302
+ // ---------------------------------------------------------------------------
303
+ // Helpers
304
+ // ---------------------------------------------------------------------------
305
+ /**
306
+ * Detect default ecosystem from package manager list.
307
+ */
308
+ function detectDefaultEcosystem(packageManagers) {
309
+ const ecosystemMap = {
310
+ npm: 'npm',
311
+ pnpm: 'npm',
312
+ yarn: 'npm',
313
+ bun: 'npm',
314
+ pip: 'PyPI',
315
+ cargo: 'crates.io',
316
+ go: 'Go',
317
+ };
318
+ for (const pm of packageManagers) {
319
+ const eco = ecosystemMap[pm];
320
+ if (eco)
321
+ return eco;
322
+ }
323
+ return 'npm';
324
+ }
325
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ import type { RecommendedChange, AdapterStrategy } from '../schemas/output.schema.js';
2
+ export interface MigrationPlan {
3
+ phases: MigrationPhase[];
4
+ deletionChecklist: DeletionItem[];
5
+ }
6
+ export interface MigrationPhase {
7
+ phase: number;
8
+ name: string;
9
+ steps: MigrationStep[];
10
+ }
11
+ export interface MigrationStep {
12
+ recommendationIndex: number;
13
+ description: string;
14
+ adapterStrategy?: AdapterStrategy;
15
+ }
16
+ export interface DeletionItem {
17
+ filePath: string;
18
+ lineRange?: {
19
+ start: number;
20
+ end: number;
21
+ };
22
+ reason: string;
23
+ }
24
+ /**
25
+ * Build a phased migration plan from a list of recommendations.
26
+ *
27
+ * Phasing logic:
28
+ * - Phase 1: low-risk items
29
+ * - Phase 2: medium-risk items
30
+ * - Phase 3: high-risk items (with adapter strategies)
31
+ *
32
+ * Within each phase, items are ordered by composite score descending
33
+ * (highest impact first).
34
+ *
35
+ * Only phases that have items are included (empty phases are skipped).
36
+ *
37
+ * High-risk items MUST have an AdapterStrategy generated — if the input
38
+ * recommendation doesn't already have one, a default is generated.
39
+ *
40
+ * The deletion checklist includes EVERY filePath from recommendations.
41
+ *
42
+ * Empty recommendations → empty plan with zero phases.
43
+ *
44
+ * Requirements: 4.1, 4.2, 4.3, 4.4, 9.4
45
+ */
46
+ export declare function buildMigrationPlan(recommendations: RecommendedChange[]): MigrationPlan;
47
+ //# sourceMappingURL=migration-planner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migration-planner.d.ts","sourceRoot":"","sources":["../../src/planner/migration-planner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAMtF,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,cAAc,EAAE,CAAC;IACzB,iBAAiB,EAAE,YAAY,EAAE,CAAC;CACnC;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,aAAa,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,aAAa;IAC5B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,eAAe,CAAC;CACnC;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IAC3C,MAAM,EAAE,MAAM,CAAC;CAChB;AAgBD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,kBAAkB,CAChC,eAAe,EAAE,iBAAiB,EAAE,GACnC,aAAa,CAkDf"}