@link-assistant/hive-mind 1.24.0 → 1.24.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/CHANGELOG.md +24 -0
- package/package.json +1 -1
- package/src/solve.mjs +8 -6
- package/src/solve.repo-setup.lib.mjs +4 -4
- package/src/solve.repository.lib.mjs +8 -7
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,29 @@
|
|
|
1
1
|
# @link-assistant/hive-mind
|
|
2
2
|
|
|
3
|
+
## 1.24.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 4b032ca: fix: use headRepository.name from PR data to construct fork name correctly
|
|
8
|
+
|
|
9
|
+
Previously, when solving a PR from a fork where the fork's repository name
|
|
10
|
+
differs from the base repository name, the tool incorrectly built the fork
|
|
11
|
+
name using the base repo's name instead of the actual head repo name.
|
|
12
|
+
|
|
13
|
+
Example failure scenario (Issue #1332):
|
|
14
|
+
- Base repo: `konard/MILANA808-Milana-backend` (a fork itself)
|
|
15
|
+
- PR head repo: `MILANA808/Milana-backend`
|
|
16
|
+
- Tool tried: `MILANA808/MILANA808-Milana-backend` (wrong, 404)
|
|
17
|
+
- Should try: `MILANA808/Milana-backend` (correct)
|
|
18
|
+
|
|
19
|
+
The fix propagates `forkRepoName` (from `headRepository.name` in PR data)
|
|
20
|
+
through the call chain: `solve.mjs` → `setupRepositoryAndClone` →
|
|
21
|
+
`setupRepository`, where it's used as the correct source of truth for
|
|
22
|
+
building fork repo names. Falls back to base repo name if unavailable.
|
|
23
|
+
|
|
24
|
+
Also improves the error message when a fork cannot be found, clarifying
|
|
25
|
+
that the fork name may differ from the base repo name.
|
|
26
|
+
|
|
3
27
|
## 1.24.0
|
|
4
28
|
|
|
5
29
|
### Minor Changes
|
package/package.json
CHANGED
package/src/solve.mjs
CHANGED
|
@@ -347,6 +347,7 @@ let prBranch;
|
|
|
347
347
|
let mergeStateStatus;
|
|
348
348
|
let prState;
|
|
349
349
|
let forkOwner = null;
|
|
350
|
+
let forkRepoName = null;
|
|
350
351
|
let isContinueMode = false;
|
|
351
352
|
// Auto-continue logic: check for existing PRs if --auto-continue is enabled
|
|
352
353
|
const autoContinueResult = await processAutoContinueForIssue(argv, isIssueUrl, urlNumber, owner, repo);
|
|
@@ -376,9 +377,9 @@ if (autoContinueResult.isContinueMode) {
|
|
|
376
377
|
}
|
|
377
378
|
if (prCheckData.headRepositoryOwner && prCheckData.headRepositoryOwner.login !== owner) {
|
|
378
379
|
forkOwner = prCheckData.headRepositoryOwner.login;
|
|
379
|
-
// Get actual fork repository name (may be prefixed)
|
|
380
|
-
|
|
381
|
-
await log(`🍴 Detected fork PR from ${forkOwner}/${forkRepoName}`);
|
|
380
|
+
// Get actual fork repository name (may be prefixed) and store for use in setupRepository
|
|
381
|
+
forkRepoName = prCheckData.headRepository && prCheckData.headRepository.name ? prCheckData.headRepository.name : null;
|
|
382
|
+
await log(`🍴 Detected fork PR from ${forkOwner}/${forkRepoName || repo}`);
|
|
382
383
|
if (argv.verbose) {
|
|
383
384
|
await log(` Fork owner: ${forkOwner}`, { verbose: true });
|
|
384
385
|
await log(' Will clone fork repository for continue mode', { verbose: true });
|
|
@@ -456,9 +457,9 @@ if (isPrUrl) {
|
|
|
456
457
|
// Check if this is a fork PR
|
|
457
458
|
if (prData.headRepositoryOwner && prData.headRepositoryOwner.login !== owner) {
|
|
458
459
|
forkOwner = prData.headRepositoryOwner.login;
|
|
459
|
-
// Get actual fork repository name
|
|
460
|
-
|
|
461
|
-
await log(`🍴 Detected fork PR from ${forkOwner}/${forkRepoName}`);
|
|
460
|
+
// Get actual fork repository name and store for use in setupRepository
|
|
461
|
+
forkRepoName = prData.headRepository && prData.headRepository.name ? prData.headRepository.name : null;
|
|
462
|
+
await log(`🍴 Detected fork PR from ${forkOwner}/${forkRepoName || repo}`);
|
|
462
463
|
if (argv.verbose) {
|
|
463
464
|
await log(` Fork owner: ${forkOwner}`, { verbose: true });
|
|
464
465
|
await log(' Will clone fork repository for continue mode', { verbose: true });
|
|
@@ -529,6 +530,7 @@ try {
|
|
|
529
530
|
owner,
|
|
530
531
|
repo,
|
|
531
532
|
forkOwner,
|
|
533
|
+
forkRepoName,
|
|
532
534
|
tempDir,
|
|
533
535
|
isContinueMode,
|
|
534
536
|
issueUrl,
|
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
* Handles repository cloning, forking, and remote setup
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
export async function setupRepositoryAndClone({ argv, owner, repo, forkOwner, tempDir, isContinueMode, issueUrl, log, $, needsClone = true }) {
|
|
6
|
+
export async function setupRepositoryAndClone({ argv, owner, repo, forkOwner, forkRepoName, tempDir, isContinueMode, issueUrl, log, $, needsClone = true }) {
|
|
7
7
|
// Set up repository and handle forking
|
|
8
|
-
const { repoToClone, forkedRepo, upstreamRemote, prForkOwner } = await setupRepository(argv, owner, repo, forkOwner, issueUrl);
|
|
8
|
+
const { repoToClone, forkedRepo, upstreamRemote, prForkOwner } = await setupRepository(argv, owner, repo, forkOwner, issueUrl, forkRepoName);
|
|
9
9
|
|
|
10
10
|
// Clone repository and set up remotes (skip if needsClone is false - directory already has repo)
|
|
11
11
|
if (needsClone) {
|
|
@@ -32,10 +32,10 @@ export async function setupRepositoryAndClone({ argv, owner, repo, forkOwner, te
|
|
|
32
32
|
return { repoToClone, forkedRepo, upstreamRemote, prForkRemote, prForkOwner };
|
|
33
33
|
}
|
|
34
34
|
|
|
35
|
-
async function setupRepository(argv, owner, repo, forkOwner, issueUrl) {
|
|
35
|
+
async function setupRepository(argv, owner, repo, forkOwner, issueUrl, forkRepoName) {
|
|
36
36
|
const repository = await import('./solve.repository.lib.mjs');
|
|
37
37
|
const { setupRepository: setupRepoFn } = repository;
|
|
38
|
-
return await setupRepoFn(argv, owner, repo, forkOwner, issueUrl);
|
|
38
|
+
return await setupRepoFn(argv, owner, repo, forkOwner, issueUrl, forkRepoName);
|
|
39
39
|
}
|
|
40
40
|
|
|
41
41
|
async function cloneRepository(repoToClone, tempDir, argv, owner, repo) {
|
|
@@ -387,7 +387,7 @@ const tryInitializeEmptyRepository = async (owner, repo) => {
|
|
|
387
387
|
};
|
|
388
388
|
|
|
389
389
|
// Handle fork creation and repository setup
|
|
390
|
-
export const setupRepository = async (argv, owner, repo, forkOwner = null, issueUrl = null) => {
|
|
390
|
+
export const setupRepository = async (argv, owner, repo, forkOwner = null, issueUrl = null, forkRepoName = null) => {
|
|
391
391
|
let repoToClone = `${owner}/${repo}`;
|
|
392
392
|
let forkedRepo = null;
|
|
393
393
|
let upstreamRemote = null;
|
|
@@ -820,9 +820,10 @@ Thank you!`;
|
|
|
820
820
|
await log(`\n${formatAligned('🍴', 'Fork mode:', 'DETECTED from PR')}`);
|
|
821
821
|
await log(`${formatAligned('', 'Fork owner:', forkOwner)}`);
|
|
822
822
|
|
|
823
|
-
//
|
|
824
|
-
const
|
|
825
|
-
const
|
|
823
|
+
// Use actual head repo name from PR data (headRepository.name) if available, otherwise guess from base repo name
|
|
824
|
+
const headRepoName = forkRepoName || repo;
|
|
825
|
+
const standardForkName = `${forkOwner}/${headRepoName}`;
|
|
826
|
+
const prefixedForkName = `${forkOwner}/${owner}-${headRepoName}`;
|
|
826
827
|
const expectedForkName = argv.prefixForkNameWithOwnerName ? prefixedForkName : standardForkName;
|
|
827
828
|
const alternateForkName = argv.prefixForkNameWithOwnerName ? standardForkName : prefixedForkName;
|
|
828
829
|
|
|
@@ -897,9 +898,9 @@ Thank you!`;
|
|
|
897
898
|
upstreamRemote = `${owner}/${repo}`;
|
|
898
899
|
} else {
|
|
899
900
|
await log(`${formatAligned('❌', 'Error:', 'Fork not accessible')}`);
|
|
900
|
-
await log(`${formatAligned('', 'Fork:', expectedForkName)}`);
|
|
901
|
-
await log(`${formatAligned('', 'Suggestion:',
|
|
902
|
-
await log(`${formatAligned('', 'Hint:', 'Try running with --fork flag to
|
|
901
|
+
await log(`${formatAligned('', 'Fork tried:', expectedForkName)}`);
|
|
902
|
+
await log(`${formatAligned('', 'Suggestion:', forkRepoName ? "The fork's repo name may differ from the base repo name" : `Fork name was guessed from base repo name '${repo}' (headRepository.name unavailable)`)}`);
|
|
903
|
+
await log(`${formatAligned('', 'Hint:', 'Try running with --fork flag to create your own fork instead')}`);
|
|
903
904
|
await safeExit(1, 'Repository setup failed');
|
|
904
905
|
}
|
|
905
906
|
}
|