Skip to content

feat(cli): add migrate-images for KBs ingested before note-relative links - #182

Open
Aldominguez12 wants to merge 2 commits into
VectifyAI:mainfrom
Aldominguez12:feat/migrate-image-links
Open

feat(cli): add migrate-images for KBs ingested before note-relative links#182
Aldominguez12 wants to merge 2 commits into
VectifyAI:mainfrom
Aldominguez12:feat/migrate-image-links

Conversation

@Aldominguez12

Copy link
Copy Markdown
Contributor

Follow-up to #181, as offered there and welcomed in the review.

Problem

KBs ingested before #181 keep wiki-root-relative sources/images/... links in their wiki/sources/*.md pages. The read_wiki_image fallback keeps agent flows working, but renderers (Obsidian, GitHub, VS Code) still resolve those links against the containing file and show every figure broken.

Fix

New one-time migration command:

openkb migrate-images # rewrite old links in place
openkb migrate-images --dry-run # preview files and link counts
  • Rewrites the ](sources/images/ prefix to ](images/ — the form md_image_ref() emits at ingest since fix(images): write note-relative image links in sources pages #181. Only the prefix is swapped, so path tails never need parsing and image embeds / plain links are handled alike.
  • Scope matches the writers fix(images): write note-relative image links in sources pages #181 changed: only .md files directly under wiki/sources/. Long-doc per-page JSON intentionally keeps wiki-root-relative paths (internal metadata), and pages outside sources/ never carried the old prefix.
  • Idempotent (already-migrated links don't match), takes the ingest lock, reports per file, and appends to wiki/log.md — same conventions as lint --fix.
  • Logic lives in a new openkb/migrate.py so the command doesn't drag in pymupdf via images.py.

Verification

  • New tests/test_migrate.py: 11 tests covering rewrite/alt-preservation, idempotency, dry-run, JSON and non-sources pages left untouched, sorted multi-file output, and the CLI surface (no KB, nothing to migrate, apply + log, dry-run).
  • ruff check/format and mypy clean on the touched files.
  • End-to-end against two real pre-fix(images): write note-relative image links in sources pages #181 KBs (32 sources pages, 2,061 old links): the command's output is byte-identical to a previously hand-verified migration of the same KBs, and a second run is a no-op.

🤖 Generated with Claude Code

@chatgpt-codex-connectorchatgpt-codex-connectorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit:7c11d107dd

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment threadopenkb/cli.py Outdated
verb = "Would rewrite" if dry_run else "Rewrote"
click.echo(f"{verb} {total} image link(s) across {len(changed)} file(s).")
if not dry_run:
append_log(wiki, "migrate-images", f"{total} link(s) across {len(changed)} file(s)")

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Keep migration log writes under the KB lock

When openkb migrate-images runs concurrently with another mutating command, this append_log executes after the exclusive kb_ingest_lock block has already been released. Since append_log writes wiki/log.md, this leaves a wiki write outside the repo's locking invariant from AGENTS.md and can interleave with another process's locked log update; keep the log append inside the same exclusive lock as the file rewrites.

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Good catch — fixed in 29da160. The append_log call now runs inside the same kb_ingest_lock block as the file rewrites, matching the pattern used by the lint command. tests/test_migrate.py still passes (11/11).

Aldominguez12and others added 2 commits July 25, 2026 11:29
…inks
Follow-up to VectifyAI#181: already-ingested KBs keep wiki-root-relative
sources/images/... links in their wiki/sources/*.md pages, which
render broken in Obsidian, GitHub, and VS Code.
`openkb migrate-images` rewrites them to the note-relative images/...
form now emitted at ingest (`--dry-run` to preview). Scope matches
the writers VectifyAI#181 changed: only .md files directly under wiki/sources/
— long-doc JSON metadata intentionally keeps wiki-root-relative paths,
and pages outside sources/ never carried the old prefix. Idempotent,
takes the ingest lock, and logs to wiki/log.md.
Verified against two real pre-VectifyAI#181 KBs (32 files, 2,061 links): output
is byte-identical to a hand-verified migration, and a second run is a
no-op.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Codex review flagged that append_log ran after kb_ingest_lock was
released, leaving a wiki/log.md write outside the locking invariant.
Move it inside the exclusive block, matching the lint command.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@Aldominguez12
Aldominguez12force-pushed the feat/migrate-image-links branch from 29da160 to 3a9df1bCompareJuly 25, 2026 09:29
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.

1 participant

@Aldominguez12
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
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;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
feat(cli): add migrate-images for KBs ingested before note-relative links by Aldominguez12 · Pull Request #182 · VectifyAI/OpenKB · GitHub
Skip to content

feat(cli): add migrate-images for KBs ingested before note-relative links - #182

Open
Aldominguez12 wants to merge 2 commits into
VectifyAI:mainfrom
Aldominguez12:feat/migrate-image-links
Open

feat(cli): add migrate-images for KBs ingested before note-relative links#182
Aldominguez12 wants to merge 2 commits into
VectifyAI:mainfrom
Aldominguez12:feat/migrate-image-links

Conversation

@Aldominguez12

Copy link
Copy Markdown
Contributor

Follow-up to #181, as offered there and welcomed in the review.

Problem

KBs ingested before #181 keep wiki-root-relative sources/images/... links in their wiki/sources/*.md pages. The read_wiki_image fallback keeps agent flows working, but renderers (Obsidian, GitHub, VS Code) still resolve those links against the containing file and show every figure broken.

Fix

New one-time migration command:

openkb migrate-images # rewrite old links in place
openkb migrate-images --dry-run # preview files and link counts
  • Rewrites the ](sources/images/ prefix to ](images/ — the form md_image_ref() emits at ingest since fix(images): write note-relative image links in sources pages #181. Only the prefix is swapped, so path tails never need parsing and image embeds / plain links are handled alike.
  • Scope matches the writers fix(images): write note-relative image links in sources pages #181 changed: only .md files directly under wiki/sources/. Long-doc per-page JSON intentionally keeps wiki-root-relative paths (internal metadata), and pages outside sources/ never carried the old prefix.
  • Idempotent (already-migrated links don't match), takes the ingest lock, reports per file, and appends to wiki/log.md — same conventions as lint --fix.
  • Logic lives in a new openkb/migrate.py so the command doesn't drag in pymupdf via images.py.

Verification

  • New tests/test_migrate.py: 11 tests covering rewrite/alt-preservation, idempotency, dry-run, JSON and non-sources pages left untouched, sorted multi-file output, and the CLI surface (no KB, nothing to migrate, apply + log, dry-run).
  • ruff check/format and mypy clean on the touched files.
  • End-to-end against two real pre-fix(images): write note-relative image links in sources pages #181 KBs (32 sources pages, 2,061 old links): the command's output is byte-identical to a previously hand-verified migration of the same KBs, and a second run is a no-op.

🤖 Generated with Claude Code

@chatgpt-codex-connectorchatgpt-codex-connectorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit:7c11d107dd

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment threadopenkb/cli.py Outdated
verb = "Would rewrite" if dry_run else "Rewrote"
click.echo(f"{verb} {total} image link(s) across {len(changed)} file(s).")
if not dry_run:
append_log(wiki, "migrate-images", f"{total} link(s) across {len(changed)} file(s)")

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Keep migration log writes under the KB lock

When openkb migrate-images runs concurrently with another mutating command, this append_log executes after the exclusive kb_ingest_lock block has already been released. Since append_log writes wiki/log.md, this leaves a wiki write outside the repo's locking invariant from AGENTS.md and can interleave with another process's locked log update; keep the log append inside the same exclusive lock as the file rewrites.

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Good catch — fixed in 29da160. The append_log call now runs inside the same kb_ingest_lock block as the file rewrites, matching the pattern used by the lint command. tests/test_migrate.py still passes (11/11).

Aldominguez12and others added 2 commits July 25, 2026 11:29
…inks
Follow-up to VectifyAI#181: already-ingested KBs keep wiki-root-relative
sources/images/... links in their wiki/sources/*.md pages, which
render broken in Obsidian, GitHub, and VS Code.
`openkb migrate-images` rewrites them to the note-relative images/...
form now emitted at ingest (`--dry-run` to preview). Scope matches
the writers VectifyAI#181 changed: only .md files directly under wiki/sources/
— long-doc JSON metadata intentionally keeps wiki-root-relative paths,
and pages outside sources/ never carried the old prefix. Idempotent,
takes the ingest lock, and logs to wiki/log.md.
Verified against two real pre-VectifyAI#181 KBs (32 files, 2,061 links): output
is byte-identical to a hand-verified migration, and a second run is a
no-op.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Codex review flagged that append_log ran after kb_ingest_lock was
released, leaving a wiki/log.md write outside the locking invariant.
Move it inside the exclusive block, matching the lint command.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@Aldominguez12
Aldominguez12force-pushed the feat/migrate-image-links branch from 29da160 to 3a9df1bCompareJuly 25, 2026 09:29
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.

1 participant

@Aldominguez12
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' feat(cli): add migrate-images for KBs ingested before note-relative links by Aldominguez12 · Pull Request #182 · VectifyAI/OpenKB · GitHub
Skip to content

feat(cli): add migrate-images for KBs ingested before note-relative links - #182

Open
Aldominguez12 wants to merge 2 commits into
VectifyAI:mainfrom
Aldominguez12:feat/migrate-image-links
Open

feat(cli): add migrate-images for KBs ingested before note-relative links#182
Aldominguez12 wants to merge 2 commits into
VectifyAI:mainfrom
Aldominguez12:feat/migrate-image-links

Conversation

@Aldominguez12

Copy link
Copy Markdown
Contributor

Follow-up to #181, as offered there and welcomed in the review.

Problem

KBs ingested before #181 keep wiki-root-relative sources/images/... links in their wiki/sources/*.md pages. The read_wiki_image fallback keeps agent flows working, but renderers (Obsidian, GitHub, VS Code) still resolve those links against the containing file and show every figure broken.

Fix

New one-time migration command:

openkb migrate-images # rewrite old links in place
openkb migrate-images --dry-run # preview files and link counts
  • Rewrites the ](sources/images/ prefix to ](images/ — the form md_image_ref() emits at ingest since fix(images): write note-relative image links in sources pages #181. Only the prefix is swapped, so path tails never need parsing and image embeds / plain links are handled alike.
  • Scope matches the writers fix(images): write note-relative image links in sources pages #181 changed: only .md files directly under wiki/sources/. Long-doc per-page JSON intentionally keeps wiki-root-relative paths (internal metadata), and pages outside sources/ never carried the old prefix.
  • Idempotent (already-migrated links don't match), takes the ingest lock, reports per file, and appends to wiki/log.md — same conventions as lint --fix.
  • Logic lives in a new openkb/migrate.py so the command doesn't drag in pymupdf via images.py.

Verification

  • New tests/test_migrate.py: 11 tests covering rewrite/alt-preservation, idempotency, dry-run, JSON and non-sources pages left untouched, sorted multi-file output, and the CLI surface (no KB, nothing to migrate, apply + log, dry-run).
  • ruff check/format and mypy clean on the touched files.
  • End-to-end against two real pre-fix(images): write note-relative image links in sources pages #181 KBs (32 sources pages, 2,061 old links): the command's output is byte-identical to a previously hand-verified migration of the same KBs, and a second run is a no-op.

🤖 Generated with Claude Code

@chatgpt-codex-connectorchatgpt-codex-connectorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit:7c11d107dd

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment threadopenkb/cli.py Outdated
verb = "Would rewrite" if dry_run else "Rewrote"
click.echo(f"{verb} {total} image link(s) across {len(changed)} file(s).")
if not dry_run:
append_log(wiki, "migrate-images", f"{total} link(s) across {len(changed)} file(s)")

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Keep migration log writes under the KB lock

When openkb migrate-images runs concurrently with another mutating command, this append_log executes after the exclusive kb_ingest_lock block has already been released. Since append_log writes wiki/log.md, this leaves a wiki write outside the repo's locking invariant from AGENTS.md and can interleave with another process's locked log update; keep the log append inside the same exclusive lock as the file rewrites.

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Good catch — fixed in 29da160. The append_log call now runs inside the same kb_ingest_lock block as the file rewrites, matching the pattern used by the lint command. tests/test_migrate.py still passes (11/11).

Aldominguez12and others added 2 commits July 25, 2026 11:29
…inks
Follow-up to VectifyAI#181: already-ingested KBs keep wiki-root-relative
sources/images/... links in their wiki/sources/*.md pages, which
render broken in Obsidian, GitHub, and VS Code.
`openkb migrate-images` rewrites them to the note-relative images/...
form now emitted at ingest (`--dry-run` to preview). Scope matches
the writers VectifyAI#181 changed: only .md files directly under wiki/sources/
— long-doc JSON metadata intentionally keeps wiki-root-relative paths,
and pages outside sources/ never carried the old prefix. Idempotent,
takes the ingest lock, and logs to wiki/log.md.
Verified against two real pre-VectifyAI#181 KBs (32 files, 2,061 links): output
is byte-identical to a hand-verified migration, and a second run is a
no-op.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Codex review flagged that append_log ran after kb_ingest_lock was
released, leaving a wiki/log.md write outside the locking invariant.
Move it inside the exclusive block, matching the lint command.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@Aldominguez12
Aldominguez12force-pushed the feat/migrate-image-links branch from 29da160 to 3a9df1bCompareJuly 25, 2026 09:29
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.

1 participant

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

feat(cli): add migrate-images for KBs ingested before note-relative links - #182

Open
Aldominguez12 wants to merge 2 commits into
VectifyAI:mainfrom
Aldominguez12:feat/migrate-image-links
Open

feat(cli): add migrate-images for KBs ingested before note-relative links#182
Aldominguez12 wants to merge 2 commits into
VectifyAI:mainfrom
Aldominguez12:feat/migrate-image-links

Conversation

@Aldominguez12

Copy link
Copy Markdown
Contributor

Follow-up to #181, as offered there and welcomed in the review.

Problem

KBs ingested before #181 keep wiki-root-relative sources/images/... links in their wiki/sources/*.md pages. The read_wiki_image fallback keeps agent flows working, but renderers (Obsidian, GitHub, VS Code) still resolve those links against the containing file and show every figure broken.

Fix

New one-time migration command:

openkb migrate-images # rewrite old links in place
openkb migrate-images --dry-run # preview files and link counts
  • Rewrites the ](sources/images/ prefix to ](images/ — the form md_image_ref() emits at ingest since fix(images): write note-relative image links in sources pages #181. Only the prefix is swapped, so path tails never need parsing and image embeds / plain links are handled alike.
  • Scope matches the writers fix(images): write note-relative image links in sources pages #181 changed: only .md files directly under wiki/sources/. Long-doc per-page JSON intentionally keeps wiki-root-relative paths (internal metadata), and pages outside sources/ never carried the old prefix.
  • Idempotent (already-migrated links don't match), takes the ingest lock, reports per file, and appends to wiki/log.md — same conventions as lint --fix.
  • Logic lives in a new openkb/migrate.py so the command doesn't drag in pymupdf via images.py.

Verification

  • New tests/test_migrate.py: 11 tests covering rewrite/alt-preservation, idempotency, dry-run, JSON and non-sources pages left untouched, sorted multi-file output, and the CLI surface (no KB, nothing to migrate, apply + log, dry-run).
  • ruff check/format and mypy clean on the touched files.
  • End-to-end against two real pre-fix(images): write note-relative image links in sources pages #181 KBs (32 sources pages, 2,061 old links): the command's output is byte-identical to a previously hand-verified migration of the same KBs, and a second run is a no-op.

🤖 Generated with Claude Code

@chatgpt-codex-connectorchatgpt-codex-connectorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit:7c11d107dd

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment threadopenkb/cli.py Outdated
verb = "Would rewrite" if dry_run else "Rewrote"
click.echo(f"{verb} {total} image link(s) across {len(changed)} file(s).")
if not dry_run:
append_log(wiki, "migrate-images", f"{total} link(s) across {len(changed)} file(s)")

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Keep migration log writes under the KB lock

When openkb migrate-images runs concurrently with another mutating command, this append_log executes after the exclusive kb_ingest_lock block has already been released. Since append_log writes wiki/log.md, this leaves a wiki write outside the repo's locking invariant from AGENTS.md and can interleave with another process's locked log update; keep the log append inside the same exclusive lock as the file rewrites.

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Good catch — fixed in 29da160. The append_log call now runs inside the same kb_ingest_lock block as the file rewrites, matching the pattern used by the lint command. tests/test_migrate.py still passes (11/11).

Aldominguez12and others added 2 commits July 25, 2026 11:29
…inks
Follow-up to VectifyAI#181: already-ingested KBs keep wiki-root-relative
sources/images/... links in their wiki/sources/*.md pages, which
render broken in Obsidian, GitHub, and VS Code.
`openkb migrate-images` rewrites them to the note-relative images/...
form now emitted at ingest (`--dry-run` to preview). Scope matches
the writers VectifyAI#181 changed: only .md files directly under wiki/sources/
— long-doc JSON metadata intentionally keeps wiki-root-relative paths,
and pages outside sources/ never carried the old prefix. Idempotent,
takes the ingest lock, and logs to wiki/log.md.
Verified against two real pre-VectifyAI#181 KBs (32 files, 2,061 links): output
is byte-identical to a hand-verified migration, and a second run is a
no-op.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Codex review flagged that append_log ran after kb_ingest_lock was
released, leaving a wiki/log.md write outside the locking invariant.
Move it inside the exclusive block, matching the lint command.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@Aldominguez12
Aldominguez12force-pushed the feat/migrate-image-links branch from 29da160 to 3a9df1bCompareJuly 25, 2026 09:29
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.

1 participant

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

feat(cli): add migrate-images for KBs ingested before note-relative links - #182

Open
Aldominguez12 wants to merge 2 commits into
VectifyAI:mainfrom
Aldominguez12:feat/migrate-image-links
Open

feat(cli): add migrate-images for KBs ingested before note-relative links#182
Aldominguez12 wants to merge 2 commits into
VectifyAI:mainfrom
Aldominguez12:feat/migrate-image-links

Conversation

@Aldominguez12

Copy link
Copy Markdown
Contributor

Follow-up to #181, as offered there and welcomed in the review.

Problem

KBs ingested before #181 keep wiki-root-relative sources/images/... links in their wiki/sources/*.md pages. The read_wiki_image fallback keeps agent flows working, but renderers (Obsidian, GitHub, VS Code) still resolve those links against the containing file and show every figure broken.

Fix

New one-time migration command:

openkb migrate-images # rewrite old links in place
openkb migrate-images --dry-run # preview files and link counts
  • Rewrites the ](sources/images/ prefix to ](images/ — the form md_image_ref() emits at ingest since fix(images): write note-relative image links in sources pages #181. Only the prefix is swapped, so path tails never need parsing and image embeds / plain links are handled alike.
  • Scope matches the writers fix(images): write note-relative image links in sources pages #181 changed: only .md files directly under wiki/sources/. Long-doc per-page JSON intentionally keeps wiki-root-relative paths (internal metadata), and pages outside sources/ never carried the old prefix.
  • Idempotent (already-migrated links don't match), takes the ingest lock, reports per file, and appends to wiki/log.md — same conventions as lint --fix.
  • Logic lives in a new openkb/migrate.py so the command doesn't drag in pymupdf via images.py.

Verification

  • New tests/test_migrate.py: 11 tests covering rewrite/alt-preservation, idempotency, dry-run, JSON and non-sources pages left untouched, sorted multi-file output, and the CLI surface (no KB, nothing to migrate, apply + log, dry-run).
  • ruff check/format and mypy clean on the touched files.
  • End-to-end against two real pre-fix(images): write note-relative image links in sources pages #181 KBs (32 sources pages, 2,061 old links): the command's output is byte-identical to a previously hand-verified migration of the same KBs, and a second run is a no-op.

🤖 Generated with Claude Code

@chatgpt-codex-connectorchatgpt-codex-connectorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit:7c11d107dd

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment threadopenkb/cli.py Outdated
verb = "Would rewrite" if dry_run else "Rewrote"
click.echo(f"{verb} {total} image link(s) across {len(changed)} file(s).")
if not dry_run:
append_log(wiki, "migrate-images", f"{total} link(s) across {len(changed)} file(s)")

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Keep migration log writes under the KB lock

When openkb migrate-images runs concurrently with another mutating command, this append_log executes after the exclusive kb_ingest_lock block has already been released. Since append_log writes wiki/log.md, this leaves a wiki write outside the repo's locking invariant from AGENTS.md and can interleave with another process's locked log update; keep the log append inside the same exclusive lock as the file rewrites.

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Good catch — fixed in 29da160. The append_log call now runs inside the same kb_ingest_lock block as the file rewrites, matching the pattern used by the lint command. tests/test_migrate.py still passes (11/11).

Aldominguez12and others added 2 commits July 25, 2026 11:29
…inks
Follow-up to VectifyAI#181: already-ingested KBs keep wiki-root-relative
sources/images/... links in their wiki/sources/*.md pages, which
render broken in Obsidian, GitHub, and VS Code.
`openkb migrate-images` rewrites them to the note-relative images/...
form now emitted at ingest (`--dry-run` to preview). Scope matches
the writers VectifyAI#181 changed: only .md files directly under wiki/sources/
— long-doc JSON metadata intentionally keeps wiki-root-relative paths,
and pages outside sources/ never carried the old prefix. Idempotent,
takes the ingest lock, and logs to wiki/log.md.
Verified against two real pre-VectifyAI#181 KBs (32 files, 2,061 links): output
is byte-identical to a hand-verified migration, and a second run is a
no-op.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Codex review flagged that append_log ran after kb_ingest_lock was
released, leaving a wiki/log.md write outside the locking invariant.
Move it inside the exclusive block, matching the lint command.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@Aldominguez12
Aldominguez12force-pushed the feat/migrate-image-links branch from 29da160 to 3a9df1bCompareJuly 25, 2026 09:29
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.

1 participant

@Aldominguez12
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' feat(cli): add migrate-images for KBs ingested before note-relative links by Aldominguez12 · Pull Request #182 · VectifyAI/OpenKB · GitHub
Skip to content

feat(cli): add migrate-images for KBs ingested before note-relative links - #182

Open
Aldominguez12 wants to merge 2 commits into
VectifyAI:mainfrom
Aldominguez12:feat/migrate-image-links
Open

feat(cli): add migrate-images for KBs ingested before note-relative links#182
Aldominguez12 wants to merge 2 commits into
VectifyAI:mainfrom
Aldominguez12:feat/migrate-image-links

Conversation

@Aldominguez12

Copy link
Copy Markdown
Contributor

Follow-up to #181, as offered there and welcomed in the review.

Problem

KBs ingested before #181 keep wiki-root-relative sources/images/... links in their wiki/sources/*.md pages. The read_wiki_image fallback keeps agent flows working, but renderers (Obsidian, GitHub, VS Code) still resolve those links against the containing file and show every figure broken.

Fix

New one-time migration command:

openkb migrate-images # rewrite old links in place
openkb migrate-images --dry-run # preview files and link counts
  • Rewrites the ](sources/images/ prefix to ](images/ — the form md_image_ref() emits at ingest since fix(images): write note-relative image links in sources pages #181. Only the prefix is swapped, so path tails never need parsing and image embeds / plain links are handled alike.
  • Scope matches the writers fix(images): write note-relative image links in sources pages #181 changed: only .md files directly under wiki/sources/. Long-doc per-page JSON intentionally keeps wiki-root-relative paths (internal metadata), and pages outside sources/ never carried the old prefix.
  • Idempotent (already-migrated links don't match), takes the ingest lock, reports per file, and appends to wiki/log.md — same conventions as lint --fix.
  • Logic lives in a new openkb/migrate.py so the command doesn't drag in pymupdf via images.py.

Verification

  • New tests/test_migrate.py: 11 tests covering rewrite/alt-preservation, idempotency, dry-run, JSON and non-sources pages left untouched, sorted multi-file output, and the CLI surface (no KB, nothing to migrate, apply + log, dry-run).
  • ruff check/format and mypy clean on the touched files.
  • End-to-end against two real pre-fix(images): write note-relative image links in sources pages #181 KBs (32 sources pages, 2,061 old links): the command's output is byte-identical to a previously hand-verified migration of the same KBs, and a second run is a no-op.

🤖 Generated with Claude Code

@chatgpt-codex-connectorchatgpt-codex-connectorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit:7c11d107dd

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment threadopenkb/cli.py Outdated
verb = "Would rewrite" if dry_run else "Rewrote"
click.echo(f"{verb} {total} image link(s) across {len(changed)} file(s).")
if not dry_run:
append_log(wiki, "migrate-images", f"{total} link(s) across {len(changed)} file(s)")

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Keep migration log writes under the KB lock

When openkb migrate-images runs concurrently with another mutating command, this append_log executes after the exclusive kb_ingest_lock block has already been released. Since append_log writes wiki/log.md, this leaves a wiki write outside the repo's locking invariant from AGENTS.md and can interleave with another process's locked log update; keep the log append inside the same exclusive lock as the file rewrites.

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Good catch — fixed in 29da160. The append_log call now runs inside the same kb_ingest_lock block as the file rewrites, matching the pattern used by the lint command. tests/test_migrate.py still passes (11/11).

Aldominguez12and others added 2 commits July 25, 2026 11:29
…inks
Follow-up to VectifyAI#181: already-ingested KBs keep wiki-root-relative
sources/images/... links in their wiki/sources/*.md pages, which
render broken in Obsidian, GitHub, and VS Code.
`openkb migrate-images` rewrites them to the note-relative images/...
form now emitted at ingest (`--dry-run` to preview). Scope matches
the writers VectifyAI#181 changed: only .md files directly under wiki/sources/
— long-doc JSON metadata intentionally keeps wiki-root-relative paths,
and pages outside sources/ never carried the old prefix. Idempotent,
takes the ingest lock, and logs to wiki/log.md.
Verified against two real pre-VectifyAI#181 KBs (32 files, 2,061 links): output
is byte-identical to a hand-verified migration, and a second run is a
no-op.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Codex review flagged that append_log ran after kb_ingest_lock was
released, leaving a wiki/log.md write outside the locking invariant.
Move it inside the exclusive block, matching the lint command.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@Aldominguez12
Aldominguez12force-pushed the feat/migrate-image-links branch from 29da160 to 3a9df1bCompareJuly 25, 2026 09:29
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.

1 participant

@Aldominguez12
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' feat(cli): add migrate-images for KBs ingested before note-relative links by Aldominguez12 · Pull Request #182 · VectifyAI/OpenKB · GitHub
Skip to content

feat(cli): add migrate-images for KBs ingested before note-relative links - #182

Open
Aldominguez12 wants to merge 2 commits into
VectifyAI:mainfrom
Aldominguez12:feat/migrate-image-links
Open

feat(cli): add migrate-images for KBs ingested before note-relative links#182
Aldominguez12 wants to merge 2 commits into
VectifyAI:mainfrom
Aldominguez12:feat/migrate-image-links

Conversation

@Aldominguez12

Copy link
Copy Markdown
Contributor

Follow-up to #181, as offered there and welcomed in the review.

Problem

KBs ingested before #181 keep wiki-root-relative sources/images/... links in their wiki/sources/*.md pages. The read_wiki_image fallback keeps agent flows working, but renderers (Obsidian, GitHub, VS Code) still resolve those links against the containing file and show every figure broken.

Fix

New one-time migration command:

openkb migrate-images # rewrite old links in place
openkb migrate-images --dry-run # preview files and link counts
  • Rewrites the ](sources/images/ prefix to ](images/ — the form md_image_ref() emits at ingest since fix(images): write note-relative image links in sources pages #181. Only the prefix is swapped, so path tails never need parsing and image embeds / plain links are handled alike.
  • Scope matches the writers fix(images): write note-relative image links in sources pages #181 changed: only .md files directly under wiki/sources/. Long-doc per-page JSON intentionally keeps wiki-root-relative paths (internal metadata), and pages outside sources/ never carried the old prefix.
  • Idempotent (already-migrated links don't match), takes the ingest lock, reports per file, and appends to wiki/log.md — same conventions as lint --fix.
  • Logic lives in a new openkb/migrate.py so the command doesn't drag in pymupdf via images.py.

Verification

  • New tests/test_migrate.py: 11 tests covering rewrite/alt-preservation, idempotency, dry-run, JSON and non-sources pages left untouched, sorted multi-file output, and the CLI surface (no KB, nothing to migrate, apply + log, dry-run).
  • ruff check/format and mypy clean on the touched files.
  • End-to-end against two real pre-fix(images): write note-relative image links in sources pages #181 KBs (32 sources pages, 2,061 old links): the command's output is byte-identical to a previously hand-verified migration of the same KBs, and a second run is a no-op.

🤖 Generated with Claude Code

@chatgpt-codex-connectorchatgpt-codex-connectorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit:7c11d107dd

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment threadopenkb/cli.py Outdated
verb = "Would rewrite" if dry_run else "Rewrote"
click.echo(f"{verb} {total} image link(s) across {len(changed)} file(s).")
if not dry_run:
append_log(wiki, "migrate-images", f"{total} link(s) across {len(changed)} file(s)")

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Keep migration log writes under the KB lock

When openkb migrate-images runs concurrently with another mutating command, this append_log executes after the exclusive kb_ingest_lock block has already been released. Since append_log writes wiki/log.md, this leaves a wiki write outside the repo's locking invariant from AGENTS.md and can interleave with another process's locked log update; keep the log append inside the same exclusive lock as the file rewrites.

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Good catch — fixed in 29da160. The append_log call now runs inside the same kb_ingest_lock block as the file rewrites, matching the pattern used by the lint command. tests/test_migrate.py still passes (11/11).

Aldominguez12and others added 2 commits July 25, 2026 11:29
…inks
Follow-up to VectifyAI#181: already-ingested KBs keep wiki-root-relative
sources/images/... links in their wiki/sources/*.md pages, which
render broken in Obsidian, GitHub, and VS Code.
`openkb migrate-images` rewrites them to the note-relative images/...
form now emitted at ingest (`--dry-run` to preview). Scope matches
the writers VectifyAI#181 changed: only .md files directly under wiki/sources/
— long-doc JSON metadata intentionally keeps wiki-root-relative paths,
and pages outside sources/ never carried the old prefix. Idempotent,
takes the ingest lock, and logs to wiki/log.md.
Verified against two real pre-VectifyAI#181 KBs (32 files, 2,061 links): output
is byte-identical to a hand-verified migration, and a second run is a
no-op.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Codex review flagged that append_log ran after kb_ingest_lock was
released, leaving a wiki/log.md write outside the locking invariant.
Move it inside the exclusive block, matching the lint command.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@Aldominguez12
Aldominguez12force-pushed the feat/migrate-image-links branch from 29da160 to 3a9df1bCompareJuly 25, 2026 09:29
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.

1 participant

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

feat(cli): add migrate-images for KBs ingested before note-relative links - #182

Open
Aldominguez12 wants to merge 2 commits into
VectifyAI:mainfrom
Aldominguez12:feat/migrate-image-links
Open

feat(cli): add migrate-images for KBs ingested before note-relative links#182
Aldominguez12 wants to merge 2 commits into
VectifyAI:mainfrom
Aldominguez12:feat/migrate-image-links

Conversation

@Aldominguez12

Copy link
Copy Markdown
Contributor

Follow-up to #181, as offered there and welcomed in the review.

Problem

KBs ingested before #181 keep wiki-root-relative sources/images/... links in their wiki/sources/*.md pages. The read_wiki_image fallback keeps agent flows working, but renderers (Obsidian, GitHub, VS Code) still resolve those links against the containing file and show every figure broken.

Fix

New one-time migration command:

openkb migrate-images # rewrite old links in place
openkb migrate-images --dry-run # preview files and link counts
  • Rewrites the ](sources/images/ prefix to ](images/ — the form md_image_ref() emits at ingest since fix(images): write note-relative image links in sources pages #181. Only the prefix is swapped, so path tails never need parsing and image embeds / plain links are handled alike.
  • Scope matches the writers fix(images): write note-relative image links in sources pages #181 changed: only .md files directly under wiki/sources/. Long-doc per-page JSON intentionally keeps wiki-root-relative paths (internal metadata), and pages outside sources/ never carried the old prefix.
  • Idempotent (already-migrated links don't match), takes the ingest lock, reports per file, and appends to wiki/log.md — same conventions as lint --fix.
  • Logic lives in a new openkb/migrate.py so the command doesn't drag in pymupdf via images.py.

Verification

  • New tests/test_migrate.py: 11 tests covering rewrite/alt-preservation, idempotency, dry-run, JSON and non-sources pages left untouched, sorted multi-file output, and the CLI surface (no KB, nothing to migrate, apply + log, dry-run).
  • ruff check/format and mypy clean on the touched files.
  • End-to-end against two real pre-fix(images): write note-relative image links in sources pages #181 KBs (32 sources pages, 2,061 old links): the command's output is byte-identical to a previously hand-verified migration of the same KBs, and a second run is a no-op.

🤖 Generated with Claude Code

@chatgpt-codex-connectorchatgpt-codex-connectorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit:7c11d107dd

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment threadopenkb/cli.py Outdated
verb = "Would rewrite" if dry_run else "Rewrote"
click.echo(f"{verb} {total} image link(s) across {len(changed)} file(s).")
if not dry_run:
append_log(wiki, "migrate-images", f"{total} link(s) across {len(changed)} file(s)")

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Keep migration log writes under the KB lock

When openkb migrate-images runs concurrently with another mutating command, this append_log executes after the exclusive kb_ingest_lock block has already been released. Since append_log writes wiki/log.md, this leaves a wiki write outside the repo's locking invariant from AGENTS.md and can interleave with another process's locked log update; keep the log append inside the same exclusive lock as the file rewrites.

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Good catch — fixed in 29da160. The append_log call now runs inside the same kb_ingest_lock block as the file rewrites, matching the pattern used by the lint command. tests/test_migrate.py still passes (11/11).

Aldominguez12and others added 2 commits July 25, 2026 11:29
…inks
Follow-up to VectifyAI#181: already-ingested KBs keep wiki-root-relative
sources/images/... links in their wiki/sources/*.md pages, which
render broken in Obsidian, GitHub, and VS Code.
`openkb migrate-images` rewrites them to the note-relative images/...
form now emitted at ingest (`--dry-run` to preview). Scope matches
the writers VectifyAI#181 changed: only .md files directly under wiki/sources/
— long-doc JSON metadata intentionally keeps wiki-root-relative paths,
and pages outside sources/ never carried the old prefix. Idempotent,
takes the ingest lock, and logs to wiki/log.md.
Verified against two real pre-VectifyAI#181 KBs (32 files, 2,061 links): output
is byte-identical to a hand-verified migration, and a second run is a
no-op.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Codex review flagged that append_log ran after kb_ingest_lock was
released, leaving a wiki/log.md write outside the locking invariant.
Move it inside the exclusive block, matching the lint command.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@Aldominguez12
Aldominguez12force-pushed the feat/migrate-image-links branch from 29da160 to 3a9df1bCompareJuly 25, 2026 09:29
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.

1 participant

@Aldominguez12