Skip to content

Stable project identity from git remote + default remember to project scope#738

Open
devon3000 wants to merge 3 commits into
rohitg00:mainfrom
devon3000:fix/git-remote-project-identity
Open

Stable project identity from git remote + default remember to project scope#738
devon3000 wants to merge 3 commits into
rohitg00:mainfrom
devon3000:fix/git-remote-project-identity

Conversation

@devon3000
Copy link
Copy Markdown

@devon3000 devon3000 commented May 30, 2026

Summary

Fixes #733. Project identity was the git-toplevel basename, so the same repo checked out on two machines/paths (or two different repos sharing a name) collided or fragmented across project-scoped surfaces (session lists, the rolling profile, session-start auto-context). This adds an opt-in, stable identity and makes the remember path participate in project scoping the same way sessions do.

Three commits:

  1. feat(project) — opt-in stable identity from git remote. New AGENTMEMORY_PROJECT_FROM_REMOTE=1 makes resolveProject() derive a host/org/repo identity from remote.origin.url (via normalizeGitRemote, handling scp/ssh/https/git URLs, credentials, ports, nested groups). Off by default — behavior is unchanged unless the flag is set. Resolution order: AGENTMEMORY_PROJECT_NAME → git remote (when enabled) → git-toplevel basename → cwd basename.

  2. feat(scripts) — one-time backfill. scripts/backfill-project-identity.mjs consolidates legacy fragmented project tags onto a canonical identity in the standalone JSON store. Dry-run by default; --apply writes a timestamped .bak first.

  3. feat(remember) — default memory_save to project scope. Previously memory_save only set a project when the caller passed one explicitly (which the model rarely does), so remembered facts landed unscoped (project=null) while hook-written sessions/observations carried the resolved project. That asymmetry silently excluded remembered facts from mem::context and the profile. Now: explicit project wins; scope:"global" stores unscoped for genuinely cross-project facts; otherwise default to resolveProject(). Applied to both MCP entry points (the standalone client proxy/local paths and the in-container SDK handler).

Notes

  • Fully backward-compatible: the remote-identity flag is opt-in, and scope/default only affect memories that previously had no project at all.
  • normalizeGitRemote + resolveProject covered by test/hook-project.test.ts (21 cases); the new memory_save scoping by test/mcp-standalone.test.ts (explicit-wins / global-unscoped / default-to-project).

Test plan

  • AGENTMEMORY_PROJECT_FROM_REMOTE=1 yields host/org/repo; unset preserves basename behavior.
  • memory_save with no project defaults to the current project; scope:"global" stays unscoped; explicit project wins.
  • Backfill dry-run reports correctly and --apply writes a .bak.

🤖 Generated with Claude Code

Summary by CodeRabbit

Release Notes

  • New Features

    • Project identification now supports deriving stable identifiers from Git remote origin URLs when enabled via new environment variable.
    • Added new utility to consolidate fragmented project identifiers across data stores.
  • Documentation

    • Enhanced tool schema descriptions for project scoping guidance.
  • Tests

    • Added comprehensive test coverage for Git remote-based project resolution.

Review Change Stack

devon3000 and others added 3 commits May 30, 2026 10:36
resolveProject() derived project scope from the git toplevel basename
(or cwd basename), so the same repo checked out under different directory
names — or two unrelated repos sharing a directory name — could not be
distinguished or unified reliably across machines.

Add an opt-in AGENTMEMORY_PROJECT_FROM_REMOTE flag: when set, resolveProject
derives a stable "host/org/repo" identity from remote.origin.url, normalizing
scp-style SSH, ssh://, git://, https://, and credentialed URLs. Falls back to
the existing git-toplevel/cwd basename behavior when there is no remote, so
default behavior is unchanged. AGENTMEMORY_PROJECT_NAME still overrides.

Shared resolver, so all nine hooks pick this up; server stores the value
verbatim. Adds normalizeGitRemote unit tests and remote-mode coverage.

Refs: rohitg00#733
Consolidate fragmented legacy `project` tags (full-path / basename) onto a
single canonical identity. Re-tags sessions/summaries/memories/lessons/actions
and renames+merges profile keys (kept newest on collision). Dry-run by default;
--apply writes a timestamped backup first. Companion to the
AGENTMEMORY_PROJECT_FROM_REMOTE fix. See rohitg00#733.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
memory_save previously stored a memory with a project only when the
caller passed one explicitly — which Claude almost never does — so
remembered facts landed unscoped (project=null) while sessions and
observations (written by the session-start hook) carried the resolved
project. That asymmetry silently excluded remembered facts from
project-scoped surfaces (mem::context, the rolling profile).

Resolve project the same way the hook does: an explicit project always
wins; scope:"global" stores unscoped for genuinely cross-project facts;
otherwise default to resolveProject() so memories unify with the
session's project. Applied to both MCP entry points — the standalone
client proxy/local paths (the runtime npx surface, which has the repo
cwd) and the in-container SDK handler.

Companion to the git-remote project identity work (rohitg00#733).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
@vercel
Copy link
Copy Markdown

vercel Bot commented May 30, 2026

@devon3000 is attempting to deploy a commit to the rohitg00's projects Team on Vercel.

A member of the Team first needs to authorize it.

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented May 30, 2026

📝 Walkthrough

Walkthrough

This PR implements optional git remote-based project identity resolution across the codebase. When AGENTMEMORY_PROJECT_FROM_REMOTE is enabled, project scopes are derived from normalized origin remote URLs (host/org/repo) instead of git toplevel directory basenames, reducing fragmentation when the same repository is checked out under different directory names or on different machines. Changes include core helpers, 8 hook script refactorings, MCP integration, tests, and a backfill utility for consolidating existing project identifiers.

Changes

Git Remote-Based Project Identity

Layer / File(s) Summary
Core project resolution helpers
src/hooks/_project.ts
gitToplevelBasename() encapsulates git toplevel resolution; new exported normalizeGitRemote() canonicalizes SSH/HTTPS/SCP remote URLs to host/org/repo form; resolveProject() updated to optionally return normalized remote identity when flag enabled, with fallback chain: env override → remote identity → git toplevel basename → cwd basename.
Hook script migration to shared resolution
plugin/scripts/notification.mjs, post-tool-failure.mjs, post-tool-use.mjs, pre-compact.mjs, prompt-submit.mjs, session-start.mjs, subagent-start.mjs, subagent-stop.mjs, task-completed.mjs
All 8 hook scripts updated with identical pattern: added gitToplevelBasename() helper, refactored resolveProject() to use remote-identity resolution when AGENTMEMORY_PROJECT_FROM_REMOTE is enabled, with normalizeGitRemote(), gitRemoteIdentity(), and remoteIdentityEnabled() gatekeeping.
MCP tool integration with project scoping
src/mcp/server.ts, src/mcp/standalone.ts
Server imports resolveProject() and applies precedence for memory_save (explicit arg > non-global scope default); standalone extends Validated interface with optional project field, applies same resolution during validation, conditionally includes project in proxy/fallback paths only when defined.
Test coverage and tool schema
src/mcp/tools-registry.ts, test/hook-project.test.ts, test/mcp-standalone.test.ts
Hook tests add remote-flag coverage (default behavior, remote-derived, fallback, env precedence) and comprehensive normalizeGitRemote test suite (HTTPS, SSH, SCP, credentials, ports, nested paths, null cases); MCP tests verify project scoping rules (default, global scope, explicit override); schema description reflowed for clarity.
Project identity backfill utility
scripts/backfill-project-identity.mjs
New CLI script for one-time consolidation of fragmented project identifiers in standalone stores. Accepts --canonical, repeatable --match/--map, optional --store, and --apply flag. Rewrites project fields in value scopes and consolidates profile keys using timestamp-based collision resolution; dry-run by default.

Sequence Diagram(s)

flowchart TD
    Start([resolveProject called]) --> CheckEnv{AGENTMEMORY_PROJECT_NAME set?}
    CheckEnv -->|yes| ReturnEnv["return env override"]
    CheckEnv -->|no| CheckRemoteFlag{AGENTMEMORY_PROJECT_FROM_REMOTE enabled?}
    CheckRemoteFlag -->|yes| ReadRemote["git config --get remote.origin.url"]
    CheckRemoteFlag -->|no| CheckGitToplevel
    ReadRemote --> NormalizeURL["normalizeGitRemote: host/org/repo"]
    NormalizeURL --> HasRemote{normalized?}
    HasRemote -->|yes| ReturnRemote["return remote identity"]
    HasRemote -->|no| CheckGitToplevel["git rev-parse --show-toplevel"]
    CheckGitToplevel --> HasToplevel{success?}
    HasToplevel -->|yes| ReturnToplevel["return basename"]
    HasToplevel -->|no| ReturnCwd["return basename(cwd)"]
    ReturnEnv --> End([return identifier])
    ReturnRemote --> End
    ReturnToplevel --> End
    ReturnCwd --> End
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related issues

Possibly related PRs

  • rohitg00/agentmemory#687: Both refactor resolveProject-based project scoping in hooks/scripts; main PR extends it with optional origin remote identity derivation.
  • rohitg00/agentmemory#662: Both touch src/mcp/server.ts/memory_save project-scoping plumbing; this PR drives it via deterministic resolveProject() identity.

Suggested reviewers

  • rohitg00

Poem

A rabbit plots a git remote course,
Normalizing URLs as the force,
No more collisions in project names,
Host and org align the same, 🐰
Identity stable, basename's gone—
The remote-based resolver shines on!

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 20.34% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The PR title clearly and concisely summarizes the two primary changes: introducing stable project identity from git remote and making memory_save default to project scoping.
Linked Issues check ✅ Passed The PR fully implements the proposed fix from issue #733: derives stable host/org/repo identity from git remote with normalizeGitRemote, implements opt-in AGENTMEMORY_PROJECT_FROM_REMOTE flag, provides backfill script, and extends memory_save to default to project scoping per the objectives.
Out of Scope Changes check ✅ Passed All changes are directly within scope: project identity resolution enhancements across hooks/SDK, memory_save project scoping integration, remote URL normalization, backfill utility, and comprehensive test coverage. No unrelated refactoring or out-of-scope additions detected.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Warning

There were issues while running some tools. Please review the errors and either fix the tool's configuration or disable the tool if it's a critical failure.

🔧 ESLint

If the error stems from missing dependencies, add them to the package.json file. For unrecoverable errors (e.g., due to private dependencies), disable the tool in the CodeRabbit configuration.

ESLint skipped: no ESLint configuration detected in root package.json. To enable, add eslint to devDependencies.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
test/hook-project.test.ts (1)

57-60: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Use basename(dir) in these assertions.

dir.split("/").pop() is POSIX-only, so these tests will fail on Windows and no longer mirror the implementation they're checking.

Suggested change
-import { join } from "node:path";
+import { basename, join } from "node:path";
@@
-      expect(resolveProject(dir)).toBe(dir.split("/").pop());
+      expect(resolveProject(dir)).toBe(basename(dir));
@@
-      expect(resolveProject(dir)).toBe(dir.split("/").pop());
+      expect(resolveProject(dir)).toBe(basename(dir));

Also applies to: 99-104

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@test/hook-project.test.ts` around lines 57 - 60, Replace POSIX-only
dir.split("/").pop() with path.basename(dir) in the tests that assert
resolveProject(dir) falls back to the cwd basename; import or use the existing
basename from the path module and update both the assertion at the
resolveProject(dir) case (around the block using mkdtempSync in
hook-project.test.ts) and the similar assertions in the second block (lines
~99-104) so tests are platform-independent and mirror the implementation.
🧹 Nitpick comments (2)
src/mcp/standalone.ts (1)

126-128: ⚡ Quick win

Drop the WHAT-comment in memory_save validation.

The code is already readable enough here, and the added prose violates the repo's no-WHAT-comments rule for src files.

As per coding guidelines, "src/**/*.{ts,js}: No code comments explaining WHAT — use clear naming instead".

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/mcp/standalone.ts` around lines 126 - 128, Remove the WHAT-style
explanatory comment in the memory_save validation block in
src/mcp/standalone.ts; locate the comment near the memory_save validation logic
(the block that starts with "Explicit project wins; scope:\"global\" stores
unscoped; otherwise default to the current project...") and delete that prose
comment so the code adheres to the repo rule forbidding WHAT-comments in src
files while keeping the existing variable and function names (memory_save
validation code) intact.
src/hooks/_project.ts (1)

19-21: ⚡ Quick win

Remove the WHAT-comments from this helper.

These blocks restate behavior the function names and tests already cover, and they violate the repo rule for src files.

As per coding guidelines, "src/**/*.{ts,js}: No code comments explaining WHAT — use clear naming instead".

Also applies to: 73-79

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/hooks/_project.ts` around lines 19 - 21, Remove the explanatory "WHAT"
comment blocks that restate behavior for the helper that normalizes any git
remote URL (the top comment describing scp-style SSH, ssh://, https://, git://
and credential-carrying URLs) and the similar comment block later in the file
(the second block covering scp/ssh/https/gitea-style examples). Replace them
with either no comment or a single-line descriptive summary (e.g., "Normalize
git remote URLs to host/org/repo") if you want a short identifier, and do not
add any additional behavioral explanation — leave the function name and tests to
convey the behavior.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@plugin/scripts/post-tool-use.mjs`:
- Around line 22-41: normalizeGitRemote currently treats local filesystem paths
like "C:/work/repo.git" as valid remotes; update normalizeGitRemote to detect
and reject local-path remotes by returning null so resolveProject() can fall
back to repo top-level. Before parsing/scp handling, add a guard that returns
null when raw matches local path patterns (e.g., starts with "/", "./", "../",
"~/" or Windows drive-letter patterns like /^[A-Za-z]:[\\/]/, or contains
backslashes without a protocol/user@host), then continue the existing
scp/noCreds logic; reference the normalizeGitRemote function and its local
variables raw, scp, noCreds, host, and path when making the change.

In `@src/mcp/server.ts`:
- Around line 182-188: The code currently falls back to resolveProject() when
args.project is omitted, which wrongly binds direct MCP saves to the server's
startup repo; change the project resolution so project is set only from
explicitProject or left undefined (respecting isGlobal) and remove the
resolveProject() fallback call (i.e., update the logic using explicitProject,
isGlobal, and project to not call or use resolveProject()).

---

Outside diff comments:
In `@test/hook-project.test.ts`:
- Around line 57-60: Replace POSIX-only dir.split("/").pop() with
path.basename(dir) in the tests that assert resolveProject(dir) falls back to
the cwd basename; import or use the existing basename from the path module and
update both the assertion at the resolveProject(dir) case (around the block
using mkdtempSync in hook-project.test.ts) and the similar assertions in the
second block (lines ~99-104) so tests are platform-independent and mirror the
implementation.

---

Nitpick comments:
In `@src/hooks/_project.ts`:
- Around line 19-21: Remove the explanatory "WHAT" comment blocks that restate
behavior for the helper that normalizes any git remote URL (the top comment
describing scp-style SSH, ssh://, https://, git:// and credential-carrying URLs)
and the similar comment block later in the file (the second block covering
scp/ssh/https/gitea-style examples). Replace them with either no comment or a
single-line descriptive summary (e.g., "Normalize git remote URLs to
host/org/repo") if you want a short identifier, and do not add any additional
behavioral explanation — leave the function name and tests to convey the
behavior.

In `@src/mcp/standalone.ts`:
- Around line 126-128: Remove the WHAT-style explanatory comment in the
memory_save validation block in src/mcp/standalone.ts; locate the comment near
the memory_save validation logic (the block that starts with "Explicit project
wins; scope:\"global\" stores unscoped; otherwise default to the current
project...") and delete that prose comment so the code adheres to the repo rule
forbidding WHAT-comments in src files while keeping the existing variable and
function names (memory_save validation code) intact.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 6344e0a4-7b83-4b92-b3a6-407cca2e47af

📥 Commits

Reviewing files that changed from the base of the PR and between fd9e3bd and 7a08385.

📒 Files selected for processing (16)
  • plugin/scripts/notification.mjs
  • plugin/scripts/post-tool-failure.mjs
  • plugin/scripts/post-tool-use.mjs
  • plugin/scripts/pre-compact.mjs
  • plugin/scripts/prompt-submit.mjs
  • plugin/scripts/session-start.mjs
  • plugin/scripts/subagent-start.mjs
  • plugin/scripts/subagent-stop.mjs
  • plugin/scripts/task-completed.mjs
  • scripts/backfill-project-identity.mjs
  • src/hooks/_project.ts
  • src/mcp/server.ts
  • src/mcp/standalone.ts
  • src/mcp/tools-registry.ts
  • test/hook-project.test.ts
  • test/mcp-standalone.test.ts

Comment on lines +22 to +41
function normalizeGitRemote(url) {
const raw = (url ?? "").trim();
if (!raw) return null;
let host = "";
let path = "";
const scp = raw.match(/^[^@/]+@([^:/]+):(.+)$/);
if (scp) {
host = scp[1];
path = scp[2];
} else {
const noCreds = raw.replace(/^[a-zA-Z][a-zA-Z0-9+.-]*:\/\//, "").replace(/^[^@/]*@/, "");
const slash = noCreds.indexOf("/");
if (slash === -1) return null;
host = noCreds.slice(0, slash);
path = noCreds.slice(slash + 1);
}
host = host.toLowerCase().replace(/:\d+$/, "");
path = path.replace(/^\/+/, "").replace(/\/+$/, "").replace(/\.git$/i, "");
if (!host || !path) return null;
return `${host}/${path}`;
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Return null for local-path remotes instead of treating them as canonical IDs.

With AGENTMEMORY_PROJECT_FROM_REMOTE=1, a local origin like C:/work/repo.git currently normalizes to c:/work/repo, which is machine-specific and reintroduces the fragmentation this feature is meant to eliminate. These cases should fail normalization so resolveProject() falls back to the git toplevel/cwd basename.

Suggested fix
 function normalizeGitRemote(url) {
 	const raw = (url ?? "").trim();
 	if (!raw) return null;
+	if (/^(file:|\/|\.{1,2}[\\/]|[A-Za-z]:[\\/]|\\\\)/.test(raw)) return null;
 	let host = "";
 	let path = "";
 	const scp = raw.match(/^[^`@/`]+@([^:/]+):(.+)$/);
 	if (scp) {
 		host = scp[1];
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
function normalizeGitRemote(url) {
const raw = (url ?? "").trim();
if (!raw) return null;
let host = "";
let path = "";
const scp = raw.match(/^[^@/]+@([^:/]+):(.+)$/);
if (scp) {
host = scp[1];
path = scp[2];
} else {
const noCreds = raw.replace(/^[a-zA-Z][a-zA-Z0-9+.-]*:\/\//, "").replace(/^[^@/]*@/, "");
const slash = noCreds.indexOf("/");
if (slash === -1) return null;
host = noCreds.slice(0, slash);
path = noCreds.slice(slash + 1);
}
host = host.toLowerCase().replace(/:\d+$/, "");
path = path.replace(/^\/+/, "").replace(/\/+$/, "").replace(/\.git$/i, "");
if (!host || !path) return null;
return `${host}/${path}`;
function normalizeGitRemote(url) {
const raw = (url ?? "").trim();
if (!raw) return null;
if (/^(file:|\/|\.{1,2}[\\/]|[A-Za-z]:[\\/]|\\\\)/.test(raw)) return null;
let host = "";
let path = "";
const scp = raw.match(/^[^`@/`]+@([^:/]+):(.+)$/);
if (scp) {
host = scp[1];
path = scp[2];
} else {
const noCreds = raw.replace(/^[a-zA-Z][a-zA-Z0-9+.-]*:\/\//, "").replace(/^[^`@/`]*`@/`, "");
const slash = noCreds.indexOf("/");
if (slash === -1) return null;
host = noCreds.slice(0, slash);
path = noCreds.slice(slash + 1);
}
host = host.toLowerCase().replace(/:\d+$/, "");
path = path.replace(/^\/+/, "").replace(/\/+$/, "").replace(/\.git$/i, "");
if (!host || !path) return null;
return `${host}/${path}`;
}
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@plugin/scripts/post-tool-use.mjs` around lines 22 - 41, normalizeGitRemote
currently treats local filesystem paths like "C:/work/repo.git" as valid
remotes; update normalizeGitRemote to detect and reject local-path remotes by
returning null so resolveProject() can fall back to repo top-level. Before
parsing/scp handling, add a guard that returns null when raw matches local path
patterns (e.g., starts with "/", "./", "../", "~/" or Windows drive-letter
patterns like /^[A-Za-z]:[\\/]/, or contains backslashes without a
protocol/user@host), then continue the existing scp/noCreds logic; reference the
normalizeGitRemote function and its local variables raw, scp, noCreds, host, and
path when making the change.

Comment thread src/mcp/server.ts
Comment on lines +182 to +188
const explicitProject =
typeof args.project === "string" && args.project.trim().length > 0
? args.project.trim()
: undefined;
const isGlobal =
typeof args.scope === "string" && args.scope.trim().toLowerCase() === "global";
const project = explicitProject ?? (isGlobal ? undefined : resolveProject());
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major | 🏗️ Heavy lift

Don't default direct MCP saves to the server process project.

This handler has no caller cwd/project context, so resolveProject() here binds omitted memory_save.project values to whatever repo the MCP server was started in. Direct MCP clients will silently write memories into the wrong project bucket unless they always pass project explicitly.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/mcp/server.ts` around lines 182 - 188, The code currently falls back to
resolveProject() when args.project is omitted, which wrongly binds direct MCP
saves to the server's startup repo; change the project resolution so project is
set only from explicitProject or left undefined (respecting isGlobal) and remove
the resolveProject() fallback call (i.e., update the logic using
explicitProject, isGlobal, and project to not call or use resolveProject()).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Project identity uses git-toplevel basename — collides across same-named repos, no remote-based identity

1 participant