fix: consolidate repo management API routes (#49) - #61

Merged
joryirving merged 1 commit into
mainfrom
fix/issue-49-consolidate-repo-management
May 15, 2026
Merged

fix: consolidate repo management API routes (#49)#61
joryirving merged 1 commit into
mainfrom
fix/issue-49-consolidate-repo-management

Conversation

@joryirving

Copy link
Copy Markdown
Contributor

Summary

  • Remove duplicate /api/automation/repositories and /api/automation/repositories/[id] routes — these were legacy duplicates of /api/automation/repos
  • Canonical route is now POST /api/automation/repos for adding tracked repos; it creates both AutomationRepo (source=user) and a mirror Repository row in a single transaction, with full audit logging
  • DeprecatePOST /api/repos with Deprecation and Link: rel="successor-version" headers pointing to /api/automation/repos
  • Shared logic moved to src/lib/tracked-repos.ts (createTrackedRepo, auditTrackedRepoCreateFailure)
  • README updated to document the canonical route and removed legacy route mention

Fixes#49

Remove duplicate /api/automation/repositories routes. Make
/api/automation/repos the canonical endpoint for tracked repo
management. POST now creates both AutomationRepo (source=user)
and a mirror Repository row in a transaction, with audit logging.
Mark /api/repos POST as deprecated with deprecation headers
(Deprecation, Link: rel=successor-version).
Move createTrackedRepo and auditTrackedRepoCreateFailure into
src/lib/tracked-repos.ts for shared use by both routes.
Fixes#49
@its-miso

its-misoBot commented May 15, 2026

Copy link
Copy Markdown
Contributor

Automated recommendation: APPROVE

Analysis engine: anthropic/MiniMax-M2.7@https://litellm.jory.dev/v1 (anthropic)

PR Review: fix: consolidate repo management API routes (#49)

Recommendation

Approve — This PR fully satisfies all acceptance criteria from issue #49 and introduces no breaking changes.

Change-by-Change Findings

FileChangeAssessment
src/lib/tracked-repos.tsNew shared module with createTrackedRepo and auditTrackedRepoCreateFailureCorrect: both functions use prisma.$transaction / direct auditLog.create, matching the repository's auditlogging convention from AGENTS.md rule #11. createTrackedRepo atomically creates AutomationRepo + Repository (upsert with enabled: true) + AuditLog row.
src/app/api/automation/repos/route.tsDelegates POST to shared createTrackedRepo; adds repositoryId to responseCorrect: reduces 29 lines → 18 lines. Response now includes repositoryId from the mirror Repository row. No functionality lost.
src/app/api/repos/route.tsDelegates to shared logic; adds Deprecation + Link: rel="successor-version" headersCorrect: preserves existing behavior while signaling deprecation per IETF standards. Headers Deprecation: true and Link: </api/automation/repos>; rel="successor-version" are properly set on the response object.
src/app/api/automation/repos/route.test.tsUpdated mocks to include $transaction, repository.upsert; updated test assertionCorrect: mocks $transaction as a callback-style function returning the transaction context (automationRepo, repository, auditLog). Test now verifies both createAutomationRepo and upsertRepository are called on success.
README.mdUpdated docs to reflect canonical route, removed legacy route mentionsCorrect: /api/automation/repos documented as canonical; legacy routes clearly marked as removed; deprecation documented for POST /api/repos.
src/app/api/automation/repositories/route.tsDeletedCorrect: route was a duplicate of /api/automation/repos POST with different body-parsing shape (`body?.repo
src/app/api/automation/repositories/[id]/route.tsDeletedCorrect: this delete-by-ID route is superseded by the existing DELETE /api/automation/repos/[repo] route which uses URL-encoded fullName (more consistent with the rest of the API).

Standards Compliance

StandardStatusEvidence
Error handlingerror instanceof Error patternUsed in both route handlers: error instanceof Error ? error.message : "Unknown error"
AuditLog — every state-changing action writes a rowcreateTrackedRepo calls tx.auditLog.create(...) inside the transaction (success path). auditTrackedRepoCreateFailure handles the failure path. Both use the same add_tracked_repo action.
TypeScript — type-safe Prisma usageUses Prisma's PrismaClientKnownRequestError for P2002 detection; jsonSafe wrapper for response serialization.
API conventions — appropriate HTTP status codes201 (created), 400 (bad input), 409 (conflict), 500 (server error)
Deprecation headers — IETF standardPOST /api/repos returns Deprecation: true and Link: </api/automation/repos>; rel="successor-version"

Linked Issue Fit

Acceptance CriterionFitNotes
Pick one canonical route family/api/automation/repos is canonical; documented in README
UI uses the canonical routesrc/app/automation/page.tsx already uses /api/automation/repos per grep hits
Docs describe canonical routeREADME updated with route docs and deprecation notice
Duplicate routes removedBoth /api/automation/repositories routes deleted
Canonical route creates both DB recordscreateTrackedRepo creates AutomationRepo + Repository atomically
Remove/disable behaves consistentlyDELETE /api/automation/repos/[repo] was already correct (hard-delete AutomationRepo, soft-disable Repository)
Audit logging intactBoth success and failure paths write AuditLog with add_tracked_repo action
Existing data not brokenNo schema changes; deprecated endpoint still works
Tests added/updatedTest updated to verify dual-row creation

Evidence Provider Findings

No evidence providers configured.

Tool Harness Findings

No tool requests were executed (planner returned zero requests). This is expected for a local-only plan_execute_once mode.

Unknowns / Needs Verification

ItemNote
UI route consistencyThe issue mentions "UI uses the canonical route consistently." The grep shows the automation UI already uses /api/automation/repos. However, no UI code was modified in this PR. If the board UI (/board) uses /api/repos to add repos, that would be a gap. The grep only shows hits for /api/automation/repos in the automation page; the board page was not included in the diff. Recommend verifying the board UI code path before merging.

Summary

This is a clean, well-scoped consolidation PR. The shared logic in tracked-repos.ts reduces duplication, the canonical route is properly documented, the deprecated route carries correct headers, and tests have been updated. The one caveat above (board UI route verification) is a minor gap that does not block approval but should be confirmed before or shortly after merge.

@joryirving
joryirving merged commit bc45445 into mainMay 15, 2026
3 checks passed
@joryirving
joryirving deleted the fix/issue-49-consolidate-repo-management branch May 15, 2026 03:32
Sign up for freeto 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.

Consolidate automation repository management API routes

1 participant

@joryirving
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

fix: consolidate repo management API routes (#49) - #61

Merged
joryirving merged 1 commit into
mainfrom
fix/issue-49-consolidate-repo-management
May 15, 2026
Merged

fix: consolidate repo management API routes (#49)#61
joryirving merged 1 commit into
mainfrom
fix/issue-49-consolidate-repo-management

Conversation

@joryirving

Copy link
Copy Markdown
Contributor

Summary

  • Remove duplicate /api/automation/repositories and /api/automation/repositories/[id] routes — these were legacy duplicates of /api/automation/repos
  • Canonical route is now POST /api/automation/repos for adding tracked repos; it creates both AutomationRepo (source=user) and a mirror Repository row in a single transaction, with full audit logging
  • DeprecatePOST /api/repos with Deprecation and Link: rel="successor-version" headers pointing to /api/automation/repos
  • Shared logic moved to src/lib/tracked-repos.ts (createTrackedRepo, auditTrackedRepoCreateFailure)
  • README updated to document the canonical route and removed legacy route mention

Fixes#49

Remove duplicate /api/automation/repositories routes. Make
/api/automation/repos the canonical endpoint for tracked repo
management. POST now creates both AutomationRepo (source=user)
and a mirror Repository row in a transaction, with audit logging.
Mark /api/repos POST as deprecated with deprecation headers
(Deprecation, Link: rel=successor-version).
Move createTrackedRepo and auditTrackedRepoCreateFailure into
src/lib/tracked-repos.ts for shared use by both routes.
Fixes#49
@its-miso

its-misoBot commented May 15, 2026

Copy link
Copy Markdown
Contributor

Automated recommendation: APPROVE

Analysis engine: anthropic/MiniMax-M2.7@https://litellm.jory.dev/v1 (anthropic)

PR Review: fix: consolidate repo management API routes (#49)

Recommendation

Approve — This PR fully satisfies all acceptance criteria from issue #49 and introduces no breaking changes.

Change-by-Change Findings

FileChangeAssessment
src/lib/tracked-repos.tsNew shared module with createTrackedRepo and auditTrackedRepoCreateFailureCorrect: both functions use prisma.$transaction / direct auditLog.create, matching the repository's auditlogging convention from AGENTS.md rule #11. createTrackedRepo atomically creates AutomationRepo + Repository (upsert with enabled: true) + AuditLog row.
src/app/api/automation/repos/route.tsDelegates POST to shared createTrackedRepo; adds repositoryId to responseCorrect: reduces 29 lines → 18 lines. Response now includes repositoryId from the mirror Repository row. No functionality lost.
src/app/api/repos/route.tsDelegates to shared logic; adds Deprecation + Link: rel="successor-version" headersCorrect: preserves existing behavior while signaling deprecation per IETF standards. Headers Deprecation: true and Link: </api/automation/repos>; rel="successor-version" are properly set on the response object.
src/app/api/automation/repos/route.test.tsUpdated mocks to include $transaction, repository.upsert; updated test assertionCorrect: mocks $transaction as a callback-style function returning the transaction context (automationRepo, repository, auditLog). Test now verifies both createAutomationRepo and upsertRepository are called on success.
README.mdUpdated docs to reflect canonical route, removed legacy route mentionsCorrect: /api/automation/repos documented as canonical; legacy routes clearly marked as removed; deprecation documented for POST /api/repos.
src/app/api/automation/repositories/route.tsDeletedCorrect: route was a duplicate of /api/automation/repos POST with different body-parsing shape (`body?.repo
src/app/api/automation/repositories/[id]/route.tsDeletedCorrect: this delete-by-ID route is superseded by the existing DELETE /api/automation/repos/[repo] route which uses URL-encoded fullName (more consistent with the rest of the API).

Standards Compliance

StandardStatusEvidence
Error handlingerror instanceof Error patternUsed in both route handlers: error instanceof Error ? error.message : "Unknown error"
AuditLog — every state-changing action writes a rowcreateTrackedRepo calls tx.auditLog.create(...) inside the transaction (success path). auditTrackedRepoCreateFailure handles the failure path. Both use the same add_tracked_repo action.
TypeScript — type-safe Prisma usageUses Prisma's PrismaClientKnownRequestError for P2002 detection; jsonSafe wrapper for response serialization.
API conventions — appropriate HTTP status codes201 (created), 400 (bad input), 409 (conflict), 500 (server error)
Deprecation headers — IETF standardPOST /api/repos returns Deprecation: true and Link: </api/automation/repos>; rel="successor-version"

Linked Issue Fit

Acceptance CriterionFitNotes
Pick one canonical route family/api/automation/repos is canonical; documented in README
UI uses the canonical routesrc/app/automation/page.tsx already uses /api/automation/repos per grep hits
Docs describe canonical routeREADME updated with route docs and deprecation notice
Duplicate routes removedBoth /api/automation/repositories routes deleted
Canonical route creates both DB recordscreateTrackedRepo creates AutomationRepo + Repository atomically
Remove/disable behaves consistentlyDELETE /api/automation/repos/[repo] was already correct (hard-delete AutomationRepo, soft-disable Repository)
Audit logging intactBoth success and failure paths write AuditLog with add_tracked_repo action
Existing data not brokenNo schema changes; deprecated endpoint still works
Tests added/updatedTest updated to verify dual-row creation

Evidence Provider Findings

No evidence providers configured.

Tool Harness Findings

No tool requests were executed (planner returned zero requests). This is expected for a local-only plan_execute_once mode.

Unknowns / Needs Verification

ItemNote
UI route consistencyThe issue mentions "UI uses the canonical route consistently." The grep shows the automation UI already uses /api/automation/repos. However, no UI code was modified in this PR. If the board UI (/board) uses /api/repos to add repos, that would be a gap. The grep only shows hits for /api/automation/repos in the automation page; the board page was not included in the diff. Recommend verifying the board UI code path before merging.

Summary

This is a clean, well-scoped consolidation PR. The shared logic in tracked-repos.ts reduces duplication, the canonical route is properly documented, the deprecated route carries correct headers, and tests have been updated. The one caveat above (board UI route verification) is a minor gap that does not block approval but should be confirmed before or shortly after merge.

@joryirving
joryirving merged commit bc45445 into mainMay 15, 2026
3 checks passed
@joryirving
joryirving deleted the fix/issue-49-consolidate-repo-management branch May 15, 2026 03:32
Sign up for freeto 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.

Consolidate automation repository management API routes

1 participant

@joryirving
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix: consolidate repo management API routes (#49) - #61

Merged
joryirving merged 1 commit into
mainfrom
fix/issue-49-consolidate-repo-management
May 15, 2026
Merged

fix: consolidate repo management API routes (#49)#61
joryirving merged 1 commit into
mainfrom
fix/issue-49-consolidate-repo-management

Conversation

@joryirving

Copy link
Copy Markdown
Contributor

Summary

  • Remove duplicate /api/automation/repositories and /api/automation/repositories/[id] routes — these were legacy duplicates of /api/automation/repos
  • Canonical route is now POST /api/automation/repos for adding tracked repos; it creates both AutomationRepo (source=user) and a mirror Repository row in a single transaction, with full audit logging
  • DeprecatePOST /api/repos with Deprecation and Link: rel="successor-version" headers pointing to /api/automation/repos
  • Shared logic moved to src/lib/tracked-repos.ts (createTrackedRepo, auditTrackedRepoCreateFailure)
  • README updated to document the canonical route and removed legacy route mention

Fixes#49

Remove duplicate /api/automation/repositories routes. Make
/api/automation/repos the canonical endpoint for tracked repo
management. POST now creates both AutomationRepo (source=user)
and a mirror Repository row in a transaction, with audit logging.
Mark /api/repos POST as deprecated with deprecation headers
(Deprecation, Link: rel=successor-version).
Move createTrackedRepo and auditTrackedRepoCreateFailure into
src/lib/tracked-repos.ts for shared use by both routes.
Fixes#49
@its-miso

its-misoBot commented May 15, 2026

Copy link
Copy Markdown
Contributor

Automated recommendation: APPROVE

Analysis engine: anthropic/MiniMax-M2.7@https://litellm.jory.dev/v1 (anthropic)

PR Review: fix: consolidate repo management API routes (#49)

Recommendation

Approve — This PR fully satisfies all acceptance criteria from issue #49 and introduces no breaking changes.

Change-by-Change Findings

FileChangeAssessment
src/lib/tracked-repos.tsNew shared module with createTrackedRepo and auditTrackedRepoCreateFailureCorrect: both functions use prisma.$transaction / direct auditLog.create, matching the repository's auditlogging convention from AGENTS.md rule #11. createTrackedRepo atomically creates AutomationRepo + Repository (upsert with enabled: true) + AuditLog row.
src/app/api/automation/repos/route.tsDelegates POST to shared createTrackedRepo; adds repositoryId to responseCorrect: reduces 29 lines → 18 lines. Response now includes repositoryId from the mirror Repository row. No functionality lost.
src/app/api/repos/route.tsDelegates to shared logic; adds Deprecation + Link: rel="successor-version" headersCorrect: preserves existing behavior while signaling deprecation per IETF standards. Headers Deprecation: true and Link: </api/automation/repos>; rel="successor-version" are properly set on the response object.
src/app/api/automation/repos/route.test.tsUpdated mocks to include $transaction, repository.upsert; updated test assertionCorrect: mocks $transaction as a callback-style function returning the transaction context (automationRepo, repository, auditLog). Test now verifies both createAutomationRepo and upsertRepository are called on success.
README.mdUpdated docs to reflect canonical route, removed legacy route mentionsCorrect: /api/automation/repos documented as canonical; legacy routes clearly marked as removed; deprecation documented for POST /api/repos.
src/app/api/automation/repositories/route.tsDeletedCorrect: route was a duplicate of /api/automation/repos POST with different body-parsing shape (`body?.repo
src/app/api/automation/repositories/[id]/route.tsDeletedCorrect: this delete-by-ID route is superseded by the existing DELETE /api/automation/repos/[repo] route which uses URL-encoded fullName (more consistent with the rest of the API).

Standards Compliance

StandardStatusEvidence
Error handlingerror instanceof Error patternUsed in both route handlers: error instanceof Error ? error.message : "Unknown error"
AuditLog — every state-changing action writes a rowcreateTrackedRepo calls tx.auditLog.create(...) inside the transaction (success path). auditTrackedRepoCreateFailure handles the failure path. Both use the same add_tracked_repo action.
TypeScript — type-safe Prisma usageUses Prisma's PrismaClientKnownRequestError for P2002 detection; jsonSafe wrapper for response serialization.
API conventions — appropriate HTTP status codes201 (created), 400 (bad input), 409 (conflict), 500 (server error)
Deprecation headers — IETF standardPOST /api/repos returns Deprecation: true and Link: </api/automation/repos>; rel="successor-version"

Linked Issue Fit

Acceptance CriterionFitNotes
Pick one canonical route family/api/automation/repos is canonical; documented in README
UI uses the canonical routesrc/app/automation/page.tsx already uses /api/automation/repos per grep hits
Docs describe canonical routeREADME updated with route docs and deprecation notice
Duplicate routes removedBoth /api/automation/repositories routes deleted
Canonical route creates both DB recordscreateTrackedRepo creates AutomationRepo + Repository atomically
Remove/disable behaves consistentlyDELETE /api/automation/repos/[repo] was already correct (hard-delete AutomationRepo, soft-disable Repository)
Audit logging intactBoth success and failure paths write AuditLog with add_tracked_repo action
Existing data not brokenNo schema changes; deprecated endpoint still works
Tests added/updatedTest updated to verify dual-row creation

Evidence Provider Findings

No evidence providers configured.

Tool Harness Findings

No tool requests were executed (planner returned zero requests). This is expected for a local-only plan_execute_once mode.

Unknowns / Needs Verification

ItemNote
UI route consistencyThe issue mentions "UI uses the canonical route consistently." The grep shows the automation UI already uses /api/automation/repos. However, no UI code was modified in this PR. If the board UI (/board) uses /api/repos to add repos, that would be a gap. The grep only shows hits for /api/automation/repos in the automation page; the board page was not included in the diff. Recommend verifying the board UI code path before merging.

Summary

This is a clean, well-scoped consolidation PR. The shared logic in tracked-repos.ts reduces duplication, the canonical route is properly documented, the deprecated route carries correct headers, and tests have been updated. The one caveat above (board UI route verification) is a minor gap that does not block approval but should be confirmed before or shortly after merge.

@joryirving
joryirving merged commit bc45445 into mainMay 15, 2026
3 checks passed
@joryirving
joryirving deleted the fix/issue-49-consolidate-repo-management branch May 15, 2026 03:32
Sign up for freeto 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.

Consolidate automation repository management API routes

1 participant

@joryirving
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix: consolidate repo management API routes (#49) - #61

Merged
joryirving merged 1 commit into
mainfrom
fix/issue-49-consolidate-repo-management
May 15, 2026
Merged

fix: consolidate repo management API routes (#49)#61
joryirving merged 1 commit into
mainfrom
fix/issue-49-consolidate-repo-management

Conversation

@joryirving

Copy link
Copy Markdown
Contributor

Summary

  • Remove duplicate /api/automation/repositories and /api/automation/repositories/[id] routes — these were legacy duplicates of /api/automation/repos
  • Canonical route is now POST /api/automation/repos for adding tracked repos; it creates both AutomationRepo (source=user) and a mirror Repository row in a single transaction, with full audit logging
  • DeprecatePOST /api/repos with Deprecation and Link: rel="successor-version" headers pointing to /api/automation/repos
  • Shared logic moved to src/lib/tracked-repos.ts (createTrackedRepo, auditTrackedRepoCreateFailure)
  • README updated to document the canonical route and removed legacy route mention

Fixes#49

Remove duplicate /api/automation/repositories routes. Make
/api/automation/repos the canonical endpoint for tracked repo
management. POST now creates both AutomationRepo (source=user)
and a mirror Repository row in a transaction, with audit logging.
Mark /api/repos POST as deprecated with deprecation headers
(Deprecation, Link: rel=successor-version).
Move createTrackedRepo and auditTrackedRepoCreateFailure into
src/lib/tracked-repos.ts for shared use by both routes.
Fixes#49
@its-miso

its-misoBot commented May 15, 2026

Copy link
Copy Markdown
Contributor

Automated recommendation: APPROVE

Analysis engine: anthropic/MiniMax-M2.7@https://litellm.jory.dev/v1 (anthropic)

PR Review: fix: consolidate repo management API routes (#49)

Recommendation

Approve — This PR fully satisfies all acceptance criteria from issue #49 and introduces no breaking changes.

Change-by-Change Findings

FileChangeAssessment
src/lib/tracked-repos.tsNew shared module with createTrackedRepo and auditTrackedRepoCreateFailureCorrect: both functions use prisma.$transaction / direct auditLog.create, matching the repository's auditlogging convention from AGENTS.md rule #11. createTrackedRepo atomically creates AutomationRepo + Repository (upsert with enabled: true) + AuditLog row.
src/app/api/automation/repos/route.tsDelegates POST to shared createTrackedRepo; adds repositoryId to responseCorrect: reduces 29 lines → 18 lines. Response now includes repositoryId from the mirror Repository row. No functionality lost.
src/app/api/repos/route.tsDelegates to shared logic; adds Deprecation + Link: rel="successor-version" headersCorrect: preserves existing behavior while signaling deprecation per IETF standards. Headers Deprecation: true and Link: </api/automation/repos>; rel="successor-version" are properly set on the response object.
src/app/api/automation/repos/route.test.tsUpdated mocks to include $transaction, repository.upsert; updated test assertionCorrect: mocks $transaction as a callback-style function returning the transaction context (automationRepo, repository, auditLog). Test now verifies both createAutomationRepo and upsertRepository are called on success.
README.mdUpdated docs to reflect canonical route, removed legacy route mentionsCorrect: /api/automation/repos documented as canonical; legacy routes clearly marked as removed; deprecation documented for POST /api/repos.
src/app/api/automation/repositories/route.tsDeletedCorrect: route was a duplicate of /api/automation/repos POST with different body-parsing shape (`body?.repo
src/app/api/automation/repositories/[id]/route.tsDeletedCorrect: this delete-by-ID route is superseded by the existing DELETE /api/automation/repos/[repo] route which uses URL-encoded fullName (more consistent with the rest of the API).

Standards Compliance

StandardStatusEvidence
Error handlingerror instanceof Error patternUsed in both route handlers: error instanceof Error ? error.message : "Unknown error"
AuditLog — every state-changing action writes a rowcreateTrackedRepo calls tx.auditLog.create(...) inside the transaction (success path). auditTrackedRepoCreateFailure handles the failure path. Both use the same add_tracked_repo action.
TypeScript — type-safe Prisma usageUses Prisma's PrismaClientKnownRequestError for P2002 detection; jsonSafe wrapper for response serialization.
API conventions — appropriate HTTP status codes201 (created), 400 (bad input), 409 (conflict), 500 (server error)
Deprecation headers — IETF standardPOST /api/repos returns Deprecation: true and Link: </api/automation/repos>; rel="successor-version"

Linked Issue Fit

Acceptance CriterionFitNotes
Pick one canonical route family/api/automation/repos is canonical; documented in README
UI uses the canonical routesrc/app/automation/page.tsx already uses /api/automation/repos per grep hits
Docs describe canonical routeREADME updated with route docs and deprecation notice
Duplicate routes removedBoth /api/automation/repositories routes deleted
Canonical route creates both DB recordscreateTrackedRepo creates AutomationRepo + Repository atomically
Remove/disable behaves consistentlyDELETE /api/automation/repos/[repo] was already correct (hard-delete AutomationRepo, soft-disable Repository)
Audit logging intactBoth success and failure paths write AuditLog with add_tracked_repo action
Existing data not brokenNo schema changes; deprecated endpoint still works
Tests added/updatedTest updated to verify dual-row creation

Evidence Provider Findings

No evidence providers configured.

Tool Harness Findings

No tool requests were executed (planner returned zero requests). This is expected for a local-only plan_execute_once mode.

Unknowns / Needs Verification

ItemNote
UI route consistencyThe issue mentions "UI uses the canonical route consistently." The grep shows the automation UI already uses /api/automation/repos. However, no UI code was modified in this PR. If the board UI (/board) uses /api/repos to add repos, that would be a gap. The grep only shows hits for /api/automation/repos in the automation page; the board page was not included in the diff. Recommend verifying the board UI code path before merging.

Summary

This is a clean, well-scoped consolidation PR. The shared logic in tracked-repos.ts reduces duplication, the canonical route is properly documented, the deprecated route carries correct headers, and tests have been updated. The one caveat above (board UI route verification) is a minor gap that does not block approval but should be confirmed before or shortly after merge.

@joryirving
joryirving merged commit bc45445 into mainMay 15, 2026
3 checks passed
@joryirving
joryirving deleted the fix/issue-49-consolidate-repo-management branch May 15, 2026 03:32
Sign up for freeto 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.

Consolidate automation repository management API routes

1 participant

@joryirving
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

fix: consolidate repo management API routes (#49) - #61

Merged
joryirving merged 1 commit into
mainfrom
fix/issue-49-consolidate-repo-management
May 15, 2026
Merged

fix: consolidate repo management API routes (#49)#61
joryirving merged 1 commit into
mainfrom
fix/issue-49-consolidate-repo-management

Conversation

@joryirving

Copy link
Copy Markdown
Contributor

Summary

  • Remove duplicate /api/automation/repositories and /api/automation/repositories/[id] routes — these were legacy duplicates of /api/automation/repos
  • Canonical route is now POST /api/automation/repos for adding tracked repos; it creates both AutomationRepo (source=user) and a mirror Repository row in a single transaction, with full audit logging
  • DeprecatePOST /api/repos with Deprecation and Link: rel="successor-version" headers pointing to /api/automation/repos
  • Shared logic moved to src/lib/tracked-repos.ts (createTrackedRepo, auditTrackedRepoCreateFailure)
  • README updated to document the canonical route and removed legacy route mention

Fixes#49

Remove duplicate /api/automation/repositories routes. Make
/api/automation/repos the canonical endpoint for tracked repo
management. POST now creates both AutomationRepo (source=user)
and a mirror Repository row in a transaction, with audit logging.
Mark /api/repos POST as deprecated with deprecation headers
(Deprecation, Link: rel=successor-version).
Move createTrackedRepo and auditTrackedRepoCreateFailure into
src/lib/tracked-repos.ts for shared use by both routes.
Fixes#49
@its-miso

its-misoBot commented May 15, 2026

Copy link
Copy Markdown
Contributor

Automated recommendation: APPROVE

Analysis engine: anthropic/MiniMax-M2.7@https://litellm.jory.dev/v1 (anthropic)

PR Review: fix: consolidate repo management API routes (#49)

Recommendation

Approve — This PR fully satisfies all acceptance criteria from issue #49 and introduces no breaking changes.

Change-by-Change Findings

FileChangeAssessment
src/lib/tracked-repos.tsNew shared module with createTrackedRepo and auditTrackedRepoCreateFailureCorrect: both functions use prisma.$transaction / direct auditLog.create, matching the repository's auditlogging convention from AGENTS.md rule #11. createTrackedRepo atomically creates AutomationRepo + Repository (upsert with enabled: true) + AuditLog row.
src/app/api/automation/repos/route.tsDelegates POST to shared createTrackedRepo; adds repositoryId to responseCorrect: reduces 29 lines → 18 lines. Response now includes repositoryId from the mirror Repository row. No functionality lost.
src/app/api/repos/route.tsDelegates to shared logic; adds Deprecation + Link: rel="successor-version" headersCorrect: preserves existing behavior while signaling deprecation per IETF standards. Headers Deprecation: true and Link: </api/automation/repos>; rel="successor-version" are properly set on the response object.
src/app/api/automation/repos/route.test.tsUpdated mocks to include $transaction, repository.upsert; updated test assertionCorrect: mocks $transaction as a callback-style function returning the transaction context (automationRepo, repository, auditLog). Test now verifies both createAutomationRepo and upsertRepository are called on success.
README.mdUpdated docs to reflect canonical route, removed legacy route mentionsCorrect: /api/automation/repos documented as canonical; legacy routes clearly marked as removed; deprecation documented for POST /api/repos.
src/app/api/automation/repositories/route.tsDeletedCorrect: route was a duplicate of /api/automation/repos POST with different body-parsing shape (`body?.repo
src/app/api/automation/repositories/[id]/route.tsDeletedCorrect: this delete-by-ID route is superseded by the existing DELETE /api/automation/repos/[repo] route which uses URL-encoded fullName (more consistent with the rest of the API).

Standards Compliance

StandardStatusEvidence
Error handlingerror instanceof Error patternUsed in both route handlers: error instanceof Error ? error.message : "Unknown error"
AuditLog — every state-changing action writes a rowcreateTrackedRepo calls tx.auditLog.create(...) inside the transaction (success path). auditTrackedRepoCreateFailure handles the failure path. Both use the same add_tracked_repo action.
TypeScript — type-safe Prisma usageUses Prisma's PrismaClientKnownRequestError for P2002 detection; jsonSafe wrapper for response serialization.
API conventions — appropriate HTTP status codes201 (created), 400 (bad input), 409 (conflict), 500 (server error)
Deprecation headers — IETF standardPOST /api/repos returns Deprecation: true and Link: </api/automation/repos>; rel="successor-version"

Linked Issue Fit

Acceptance CriterionFitNotes
Pick one canonical route family/api/automation/repos is canonical; documented in README
UI uses the canonical routesrc/app/automation/page.tsx already uses /api/automation/repos per grep hits
Docs describe canonical routeREADME updated with route docs and deprecation notice
Duplicate routes removedBoth /api/automation/repositories routes deleted
Canonical route creates both DB recordscreateTrackedRepo creates AutomationRepo + Repository atomically
Remove/disable behaves consistentlyDELETE /api/automation/repos/[repo] was already correct (hard-delete AutomationRepo, soft-disable Repository)
Audit logging intactBoth success and failure paths write AuditLog with add_tracked_repo action
Existing data not brokenNo schema changes; deprecated endpoint still works
Tests added/updatedTest updated to verify dual-row creation

Evidence Provider Findings

No evidence providers configured.

Tool Harness Findings

No tool requests were executed (planner returned zero requests). This is expected for a local-only plan_execute_once mode.

Unknowns / Needs Verification

ItemNote
UI route consistencyThe issue mentions "UI uses the canonical route consistently." The grep shows the automation UI already uses /api/automation/repos. However, no UI code was modified in this PR. If the board UI (/board) uses /api/repos to add repos, that would be a gap. The grep only shows hits for /api/automation/repos in the automation page; the board page was not included in the diff. Recommend verifying the board UI code path before merging.

Summary

This is a clean, well-scoped consolidation PR. The shared logic in tracked-repos.ts reduces duplication, the canonical route is properly documented, the deprecated route carries correct headers, and tests have been updated. The one caveat above (board UI route verification) is a minor gap that does not block approval but should be confirmed before or shortly after merge.

@joryirving
joryirving merged commit bc45445 into mainMay 15, 2026
3 checks passed
@joryirving
joryirving deleted the fix/issue-49-consolidate-repo-management branch May 15, 2026 03:32
Sign up for freeto 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.

Consolidate automation repository management API routes

1 participant

@joryirving
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix: consolidate repo management API routes (#49) - #61

Merged
joryirving merged 1 commit into
mainfrom
fix/issue-49-consolidate-repo-management
May 15, 2026
Merged

fix: consolidate repo management API routes (#49)#61
joryirving merged 1 commit into
mainfrom
fix/issue-49-consolidate-repo-management

Conversation

@joryirving

Copy link
Copy Markdown
Contributor

Summary

  • Remove duplicate /api/automation/repositories and /api/automation/repositories/[id] routes — these were legacy duplicates of /api/automation/repos
  • Canonical route is now POST /api/automation/repos for adding tracked repos; it creates both AutomationRepo (source=user) and a mirror Repository row in a single transaction, with full audit logging
  • DeprecatePOST /api/repos with Deprecation and Link: rel="successor-version" headers pointing to /api/automation/repos
  • Shared logic moved to src/lib/tracked-repos.ts (createTrackedRepo, auditTrackedRepoCreateFailure)
  • README updated to document the canonical route and removed legacy route mention

Fixes#49

Remove duplicate /api/automation/repositories routes. Make
/api/automation/repos the canonical endpoint for tracked repo
management. POST now creates both AutomationRepo (source=user)
and a mirror Repository row in a transaction, with audit logging.
Mark /api/repos POST as deprecated with deprecation headers
(Deprecation, Link: rel=successor-version).
Move createTrackedRepo and auditTrackedRepoCreateFailure into
src/lib/tracked-repos.ts for shared use by both routes.
Fixes#49
@its-miso

its-misoBot commented May 15, 2026

Copy link
Copy Markdown
Contributor

Automated recommendation: APPROVE

Analysis engine: anthropic/MiniMax-M2.7@https://litellm.jory.dev/v1 (anthropic)

PR Review: fix: consolidate repo management API routes (#49)

Recommendation

Approve — This PR fully satisfies all acceptance criteria from issue #49 and introduces no breaking changes.

Change-by-Change Findings

FileChangeAssessment
src/lib/tracked-repos.tsNew shared module with createTrackedRepo and auditTrackedRepoCreateFailureCorrect: both functions use prisma.$transaction / direct auditLog.create, matching the repository's auditlogging convention from AGENTS.md rule #11. createTrackedRepo atomically creates AutomationRepo + Repository (upsert with enabled: true) + AuditLog row.
src/app/api/automation/repos/route.tsDelegates POST to shared createTrackedRepo; adds repositoryId to responseCorrect: reduces 29 lines → 18 lines. Response now includes repositoryId from the mirror Repository row. No functionality lost.
src/app/api/repos/route.tsDelegates to shared logic; adds Deprecation + Link: rel="successor-version" headersCorrect: preserves existing behavior while signaling deprecation per IETF standards. Headers Deprecation: true and Link: </api/automation/repos>; rel="successor-version" are properly set on the response object.
src/app/api/automation/repos/route.test.tsUpdated mocks to include $transaction, repository.upsert; updated test assertionCorrect: mocks $transaction as a callback-style function returning the transaction context (automationRepo, repository, auditLog). Test now verifies both createAutomationRepo and upsertRepository are called on success.
README.mdUpdated docs to reflect canonical route, removed legacy route mentionsCorrect: /api/automation/repos documented as canonical; legacy routes clearly marked as removed; deprecation documented for POST /api/repos.
src/app/api/automation/repositories/route.tsDeletedCorrect: route was a duplicate of /api/automation/repos POST with different body-parsing shape (`body?.repo
src/app/api/automation/repositories/[id]/route.tsDeletedCorrect: this delete-by-ID route is superseded by the existing DELETE /api/automation/repos/[repo] route which uses URL-encoded fullName (more consistent with the rest of the API).

Standards Compliance

StandardStatusEvidence
Error handlingerror instanceof Error patternUsed in both route handlers: error instanceof Error ? error.message : "Unknown error"
AuditLog — every state-changing action writes a rowcreateTrackedRepo calls tx.auditLog.create(...) inside the transaction (success path). auditTrackedRepoCreateFailure handles the failure path. Both use the same add_tracked_repo action.
TypeScript — type-safe Prisma usageUses Prisma's PrismaClientKnownRequestError for P2002 detection; jsonSafe wrapper for response serialization.
API conventions — appropriate HTTP status codes201 (created), 400 (bad input), 409 (conflict), 500 (server error)
Deprecation headers — IETF standardPOST /api/repos returns Deprecation: true and Link: </api/automation/repos>; rel="successor-version"

Linked Issue Fit

Acceptance CriterionFitNotes
Pick one canonical route family/api/automation/repos is canonical; documented in README
UI uses the canonical routesrc/app/automation/page.tsx already uses /api/automation/repos per grep hits
Docs describe canonical routeREADME updated with route docs and deprecation notice
Duplicate routes removedBoth /api/automation/repositories routes deleted
Canonical route creates both DB recordscreateTrackedRepo creates AutomationRepo + Repository atomically
Remove/disable behaves consistentlyDELETE /api/automation/repos/[repo] was already correct (hard-delete AutomationRepo, soft-disable Repository)
Audit logging intactBoth success and failure paths write AuditLog with add_tracked_repo action
Existing data not brokenNo schema changes; deprecated endpoint still works
Tests added/updatedTest updated to verify dual-row creation

Evidence Provider Findings

No evidence providers configured.

Tool Harness Findings

No tool requests were executed (planner returned zero requests). This is expected for a local-only plan_execute_once mode.

Unknowns / Needs Verification

ItemNote
UI route consistencyThe issue mentions "UI uses the canonical route consistently." The grep shows the automation UI already uses /api/automation/repos. However, no UI code was modified in this PR. If the board UI (/board) uses /api/repos to add repos, that would be a gap. The grep only shows hits for /api/automation/repos in the automation page; the board page was not included in the diff. Recommend verifying the board UI code path before merging.

Summary

This is a clean, well-scoped consolidation PR. The shared logic in tracked-repos.ts reduces duplication, the canonical route is properly documented, the deprecated route carries correct headers, and tests have been updated. The one caveat above (board UI route verification) is a minor gap that does not block approval but should be confirmed before or shortly after merge.

@joryirving
joryirving merged commit bc45445 into mainMay 15, 2026
3 checks passed
@joryirving
joryirving deleted the fix/issue-49-consolidate-repo-management branch May 15, 2026 03:32
Sign up for freeto 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.

Consolidate automation repository management API routes

1 participant

@joryirving
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix: consolidate repo management API routes (#49) - #61

Merged
joryirving merged 1 commit into
mainfrom
fix/issue-49-consolidate-repo-management
May 15, 2026
Merged

fix: consolidate repo management API routes (#49)#61
joryirving merged 1 commit into
mainfrom
fix/issue-49-consolidate-repo-management

Conversation

@joryirving

Copy link
Copy Markdown
Contributor

Summary

  • Remove duplicate /api/automation/repositories and /api/automation/repositories/[id] routes — these were legacy duplicates of /api/automation/repos
  • Canonical route is now POST /api/automation/repos for adding tracked repos; it creates both AutomationRepo (source=user) and a mirror Repository row in a single transaction, with full audit logging
  • DeprecatePOST /api/repos with Deprecation and Link: rel="successor-version" headers pointing to /api/automation/repos
  • Shared logic moved to src/lib/tracked-repos.ts (createTrackedRepo, auditTrackedRepoCreateFailure)
  • README updated to document the canonical route and removed legacy route mention

Fixes#49

Remove duplicate /api/automation/repositories routes. Make
/api/automation/repos the canonical endpoint for tracked repo
management. POST now creates both AutomationRepo (source=user)
and a mirror Repository row in a transaction, with audit logging.
Mark /api/repos POST as deprecated with deprecation headers
(Deprecation, Link: rel=successor-version).
Move createTrackedRepo and auditTrackedRepoCreateFailure into
src/lib/tracked-repos.ts for shared use by both routes.
Fixes#49
@its-miso

its-misoBot commented May 15, 2026

Copy link
Copy Markdown
Contributor

Automated recommendation: APPROVE

Analysis engine: anthropic/MiniMax-M2.7@https://litellm.jory.dev/v1 (anthropic)

PR Review: fix: consolidate repo management API routes (#49)

Recommendation

Approve — This PR fully satisfies all acceptance criteria from issue #49 and introduces no breaking changes.

Change-by-Change Findings

FileChangeAssessment
src/lib/tracked-repos.tsNew shared module with createTrackedRepo and auditTrackedRepoCreateFailureCorrect: both functions use prisma.$transaction / direct auditLog.create, matching the repository's auditlogging convention from AGENTS.md rule #11. createTrackedRepo atomically creates AutomationRepo + Repository (upsert with enabled: true) + AuditLog row.
src/app/api/automation/repos/route.tsDelegates POST to shared createTrackedRepo; adds repositoryId to responseCorrect: reduces 29 lines → 18 lines. Response now includes repositoryId from the mirror Repository row. No functionality lost.
src/app/api/repos/route.tsDelegates to shared logic; adds Deprecation + Link: rel="successor-version" headersCorrect: preserves existing behavior while signaling deprecation per IETF standards. Headers Deprecation: true and Link: </api/automation/repos>; rel="successor-version" are properly set on the response object.
src/app/api/automation/repos/route.test.tsUpdated mocks to include $transaction, repository.upsert; updated test assertionCorrect: mocks $transaction as a callback-style function returning the transaction context (automationRepo, repository, auditLog). Test now verifies both createAutomationRepo and upsertRepository are called on success.
README.mdUpdated docs to reflect canonical route, removed legacy route mentionsCorrect: /api/automation/repos documented as canonical; legacy routes clearly marked as removed; deprecation documented for POST /api/repos.
src/app/api/automation/repositories/route.tsDeletedCorrect: route was a duplicate of /api/automation/repos POST with different body-parsing shape (`body?.repo
src/app/api/automation/repositories/[id]/route.tsDeletedCorrect: this delete-by-ID route is superseded by the existing DELETE /api/automation/repos/[repo] route which uses URL-encoded fullName (more consistent with the rest of the API).

Standards Compliance

StandardStatusEvidence
Error handlingerror instanceof Error patternUsed in both route handlers: error instanceof Error ? error.message : "Unknown error"
AuditLog — every state-changing action writes a rowcreateTrackedRepo calls tx.auditLog.create(...) inside the transaction (success path). auditTrackedRepoCreateFailure handles the failure path. Both use the same add_tracked_repo action.
TypeScript — type-safe Prisma usageUses Prisma's PrismaClientKnownRequestError for P2002 detection; jsonSafe wrapper for response serialization.
API conventions — appropriate HTTP status codes201 (created), 400 (bad input), 409 (conflict), 500 (server error)
Deprecation headers — IETF standardPOST /api/repos returns Deprecation: true and Link: </api/automation/repos>; rel="successor-version"

Linked Issue Fit

Acceptance CriterionFitNotes
Pick one canonical route family/api/automation/repos is canonical; documented in README
UI uses the canonical routesrc/app/automation/page.tsx already uses /api/automation/repos per grep hits
Docs describe canonical routeREADME updated with route docs and deprecation notice
Duplicate routes removedBoth /api/automation/repositories routes deleted
Canonical route creates both DB recordscreateTrackedRepo creates AutomationRepo + Repository atomically
Remove/disable behaves consistentlyDELETE /api/automation/repos/[repo] was already correct (hard-delete AutomationRepo, soft-disable Repository)
Audit logging intactBoth success and failure paths write AuditLog with add_tracked_repo action
Existing data not brokenNo schema changes; deprecated endpoint still works
Tests added/updatedTest updated to verify dual-row creation

Evidence Provider Findings

No evidence providers configured.

Tool Harness Findings

No tool requests were executed (planner returned zero requests). This is expected for a local-only plan_execute_once mode.

Unknowns / Needs Verification

ItemNote
UI route consistencyThe issue mentions "UI uses the canonical route consistently." The grep shows the automation UI already uses /api/automation/repos. However, no UI code was modified in this PR. If the board UI (/board) uses /api/repos to add repos, that would be a gap. The grep only shows hits for /api/automation/repos in the automation page; the board page was not included in the diff. Recommend verifying the board UI code path before merging.

Summary

This is a clean, well-scoped consolidation PR. The shared logic in tracked-repos.ts reduces duplication, the canonical route is properly documented, the deprecated route carries correct headers, and tests have been updated. The one caveat above (board UI route verification) is a minor gap that does not block approval but should be confirmed before or shortly after merge.

@joryirving
joryirving merged commit bc45445 into mainMay 15, 2026
3 checks passed
@joryirving
joryirving deleted the fix/issue-49-consolidate-repo-management branch May 15, 2026 03:32
Sign up for freeto 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.

Consolidate automation repository management API routes

1 participant

@joryirving
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

fix: consolidate repo management API routes (#49) - #61

Merged
joryirving merged 1 commit into
mainfrom
fix/issue-49-consolidate-repo-management
May 15, 2026
Merged

fix: consolidate repo management API routes (#49)#61
joryirving merged 1 commit into
mainfrom
fix/issue-49-consolidate-repo-management

Conversation

@joryirving

Copy link
Copy Markdown
Contributor

Summary

  • Remove duplicate /api/automation/repositories and /api/automation/repositories/[id] routes — these were legacy duplicates of /api/automation/repos
  • Canonical route is now POST /api/automation/repos for adding tracked repos; it creates both AutomationRepo (source=user) and a mirror Repository row in a single transaction, with full audit logging
  • DeprecatePOST /api/repos with Deprecation and Link: rel="successor-version" headers pointing to /api/automation/repos
  • Shared logic moved to src/lib/tracked-repos.ts (createTrackedRepo, auditTrackedRepoCreateFailure)
  • README updated to document the canonical route and removed legacy route mention

Fixes#49

Remove duplicate /api/automation/repositories routes. Make
/api/automation/repos the canonical endpoint for tracked repo
management. POST now creates both AutomationRepo (source=user)
and a mirror Repository row in a transaction, with audit logging.
Mark /api/repos POST as deprecated with deprecation headers
(Deprecation, Link: rel=successor-version).
Move createTrackedRepo and auditTrackedRepoCreateFailure into
src/lib/tracked-repos.ts for shared use by both routes.
Fixes#49
@its-miso

its-misoBot commented May 15, 2026

Copy link
Copy Markdown
Contributor

Automated recommendation: APPROVE

Analysis engine: anthropic/MiniMax-M2.7@https://litellm.jory.dev/v1 (anthropic)

PR Review: fix: consolidate repo management API routes (#49)

Recommendation

Approve — This PR fully satisfies all acceptance criteria from issue #49 and introduces no breaking changes.

Change-by-Change Findings

FileChangeAssessment
src/lib/tracked-repos.tsNew shared module with createTrackedRepo and auditTrackedRepoCreateFailureCorrect: both functions use prisma.$transaction / direct auditLog.create, matching the repository's auditlogging convention from AGENTS.md rule #11. createTrackedRepo atomically creates AutomationRepo + Repository (upsert with enabled: true) + AuditLog row.
src/app/api/automation/repos/route.tsDelegates POST to shared createTrackedRepo; adds repositoryId to responseCorrect: reduces 29 lines → 18 lines. Response now includes repositoryId from the mirror Repository row. No functionality lost.
src/app/api/repos/route.tsDelegates to shared logic; adds Deprecation + Link: rel="successor-version" headersCorrect: preserves existing behavior while signaling deprecation per IETF standards. Headers Deprecation: true and Link: </api/automation/repos>; rel="successor-version" are properly set on the response object.
src/app/api/automation/repos/route.test.tsUpdated mocks to include $transaction, repository.upsert; updated test assertionCorrect: mocks $transaction as a callback-style function returning the transaction context (automationRepo, repository, auditLog). Test now verifies both createAutomationRepo and upsertRepository are called on success.
README.mdUpdated docs to reflect canonical route, removed legacy route mentionsCorrect: /api/automation/repos documented as canonical; legacy routes clearly marked as removed; deprecation documented for POST /api/repos.
src/app/api/automation/repositories/route.tsDeletedCorrect: route was a duplicate of /api/automation/repos POST with different body-parsing shape (`body?.repo
src/app/api/automation/repositories/[id]/route.tsDeletedCorrect: this delete-by-ID route is superseded by the existing DELETE /api/automation/repos/[repo] route which uses URL-encoded fullName (more consistent with the rest of the API).

Standards Compliance

StandardStatusEvidence
Error handlingerror instanceof Error patternUsed in both route handlers: error instanceof Error ? error.message : "Unknown error"
AuditLog — every state-changing action writes a rowcreateTrackedRepo calls tx.auditLog.create(...) inside the transaction (success path). auditTrackedRepoCreateFailure handles the failure path. Both use the same add_tracked_repo action.
TypeScript — type-safe Prisma usageUses Prisma's PrismaClientKnownRequestError for P2002 detection; jsonSafe wrapper for response serialization.
API conventions — appropriate HTTP status codes201 (created), 400 (bad input), 409 (conflict), 500 (server error)
Deprecation headers — IETF standardPOST /api/repos returns Deprecation: true and Link: </api/automation/repos>; rel="successor-version"

Linked Issue Fit

Acceptance CriterionFitNotes
Pick one canonical route family/api/automation/repos is canonical; documented in README
UI uses the canonical routesrc/app/automation/page.tsx already uses /api/automation/repos per grep hits
Docs describe canonical routeREADME updated with route docs and deprecation notice
Duplicate routes removedBoth /api/automation/repositories routes deleted
Canonical route creates both DB recordscreateTrackedRepo creates AutomationRepo + Repository atomically
Remove/disable behaves consistentlyDELETE /api/automation/repos/[repo] was already correct (hard-delete AutomationRepo, soft-disable Repository)
Audit logging intactBoth success and failure paths write AuditLog with add_tracked_repo action
Existing data not brokenNo schema changes; deprecated endpoint still works
Tests added/updatedTest updated to verify dual-row creation

Evidence Provider Findings

No evidence providers configured.

Tool Harness Findings

No tool requests were executed (planner returned zero requests). This is expected for a local-only plan_execute_once mode.

Unknowns / Needs Verification

ItemNote
UI route consistencyThe issue mentions "UI uses the canonical route consistently." The grep shows the automation UI already uses /api/automation/repos. However, no UI code was modified in this PR. If the board UI (/board) uses /api/repos to add repos, that would be a gap. The grep only shows hits for /api/automation/repos in the automation page; the board page was not included in the diff. Recommend verifying the board UI code path before merging.

Summary

This is a clean, well-scoped consolidation PR. The shared logic in tracked-repos.ts reduces duplication, the canonical route is properly documented, the deprecated route carries correct headers, and tests have been updated. The one caveat above (board UI route verification) is a minor gap that does not block approval but should be confirmed before or shortly after merge.

@joryirving
joryirving merged commit bc45445 into mainMay 15, 2026
3 checks passed
@joryirving
joryirving deleted the fix/issue-49-consolidate-repo-management branch May 15, 2026 03:32
Sign up for freeto 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.

Consolidate automation repository management API routes

1 participant

@joryirving