{"name":"dev.ikenga/mcp-iyke","slug":"ikenga-mcp-iyke","title":"Ikenga iyke (control bridge)","description":"Drive a running Ikenga desktop app from MCP clients — DOM, click, type, navigate, screenshot.","url":"https://mcp.market/server/ikenga-mcp-iyke","rating":null,"grade":"A","score":86,"certified":false,"status":"active","category":"productivity","tags":["productivity"],"presence":{"score":29,"stars":0,"forks":0,"downloads_week":140,"last_push_at":"2026-11-02T06:05:09.000Z","license":"Apache-2.0"},"uptime":null,"claimed":false,"transport":"npm","callable_via_gateway":false,"default_price_micros":0,"repository":"https://github.com/ikenga-hq/ikenga-pkgs","website":"https://github.com/ikenga-hq/ikenga-pkgs/tree/main/packages/mcp/iyke#readme","version":"0.2.3","remotes":[],"packages":[{"registryType":"npm","registryBaseUrl":"https://registry.npmjs.org","identifier":"@ikenga/mcp-iyke","version":"0.2.3","runtimeHint":"npx","transport":{"type":"stdio"}}],"tools":[{"name":"iyke_agent_register","description":"Register this agent so locks and timers can attribute work to it. Returns an opaque id. Pass the id as holder to iyke_lock_acquire. Repeated calls with the same {id} bump last_seen_at; omit id to mint a new one.","write_action":false,"price_micros":0,"input_schema":null},{"name":"iyke_chi_cancel","description":"Cancel a running chi agent run by run_id.","write_action":true,"price_micros":0,"input_schema":null},{"name":"iyke_chi_list","description":"List chi agent runs. Optionally filter by engine_id. Returns rows newest-first with runId, engineId, status, and brief.","write_action":false,"price_micros":0,"input_schema":null},{"name":"iyke_chi_resume","description":"Continue an existing chi agent run with a new prompt. Requires run_id from a previous iyke_chi_run or iyke_chi_list.","write_action":false,"price_micros":0,"input_schema":null},{"name":"iyke_chi_run","description":"Start a new chi agent run against an engine. Returns { runId, status, output?, error? }. Use iyke_chi_status to poll for output. engine_id examples: claude-code, gemini, codex. mode controls permissions: plan, default, auto, bypassPermissions.","write_action":true,"price_micros":0,"input_schema":null},{"name":"iyke_chi_status","description":"Get the current status and output of a chi run. Returns { runId, engineId, status, output?, error?, brief? }. Poll periodically after iyke_chi_run.","write_action":false,"price_micros":0,"input_schema":null},{"name":"iyke_claude_asset_list_pins","description":"List Claude-config asset pins for a scope. Scope is \"workspace\" (cross-project) or \"project:<id>\" (this project only). Returns one entry per pin with preferred_tier + preferred_source.","write_action":false,"price_micros":0,"input_schema":null},{"name":"iyke_claude_asset_pin","description":"Pin a preferred provider for a Claude-config asset name in a scope. When discovery finds the same asset name in multiple tiers (e.g. a `code-reviewer` agent in both ~/.claude/ and a project pkg), the lowest tier wins by default; a pin overrides that. Scope is \"workspace\" (cross-project) or \"project:<id>\" (this project only). preferred_tier is one of personal | workspace_pkg | project | project_pkg","write_action":false,"price_micros":0,"input_schema":null},{"name":"iyke_claude_asset_unpin","description":"Remove a pinned resolution. Falls back to the default lowest-tier-wins rule.","write_action":true,"price_micros":0,"input_schema":null},{"name":"iyke_claude_assets_list","description":"List Claude-config assets (skills, agents, commands, hooks, mcps) discovered for a project, grouped by provider tier. Returns a tree where each asset name maps to one or more AssetSource entries; multiple entries on the same name indicate a conflict between tiers. Defaults to the active project; pass project_id to query a specific one. Use this to see what an agent will actually load in a project ","write_action":false,"price_micros":0,"input_schema":null},{"name":"iyke_click","description":"Click an element. Specify exactly one of `ref` (from iyke_dom), `selector` (CSS), or `text` (innerText match). Refs are most reliable.","write_action":false,"price_micros":0,"input_schema":null},{"name":"iyke_close","description":"Close a pane (or the focused pane if pane_id omitted). Closes the entire pane and all its tabs — to close a single tab from the in-app keyboard, use ⌘⇧W (⌘W closes the whole pane). Refuses to close the last remaining pane.","write_action":false,"price_micros":0,"input_schema":null},{"name":"iyke_devtools","description":"Open Chrome DevTools for the main webview (debug builds only). Returns 503 in production builds.","write_action":false,"price_micros":0,"input_schema":null},{"name":"iyke_dom","description":"Take an accessibility-tree snapshot of the focused pane. Returns Playwright-style text plus structured JSON. Each interactive element gets a stable ref like e1, e2; pass that ref to iyke_click / iyke_type / iyke_key. Refs invalidate on the next snapshot or page navigation. Use `query` for substring filter, `all=true` to include hidden elements.","write_action":false,"price_micros":0,"input_schema":null},{"name":"iyke_focus","description":"Focus a specific pane. Provide either pane_id (leaf id from iyke_state response — shell.panes.leaves[].id) or index (1-based DFS leaf index, matching the in-app ⌃1..⌃6 keyboard shortcuts).","write_action":false,"price_micros":0,"input_schema":null},{"name":"iyke_go","description":"Navigate the focused pane to a route path inside the Ikenga desktop app (e.g. \"/notes/today\"). Path must start with \"/\". This replaces the focused pane's active tab content; use iyke_open with kind=route to add a new tab instead.","write_action":false,"price_micros":0,"input_schema":null},{"name":"iyke_iframe_send","description":"Send a fire-and-forget postMessage to an iframe pane. The iframe bridge listens for known kinds (e.g. \"story-select\") and acts on the payload. Use to drive mini-app actions from outside the running app.","write_action":true,"price_micros":0,"input_schema":null},{"name":"iyke_iframe_state","description":"Read the latest published state object for an iframe pane (storyboard cursor, comp current frame, etc.). Iframes call publishState(key, value) from their iyke-bridge to expose runtime state for inspection.","write_action":false,"price_micros":0,"input_schema":null},{"name":"iyke_key","description":"Dispatch a keyboard combo. Use names like \"Enter\", \"Escape\", \"Tab\", \"ArrowDown\", and modifiers Ctrl/Alt/Shift/Meta separated by + or , (e.g. \"Ctrl+S\", \"Meta+K\"). Optional `ref`/`selector` targets a specific element; otherwise the active element receives.","write_action":false,"price_micros":0,"input_schema":null},{"name":"iyke_kv_delete","description":"Delete a KV entry. Idempotent.","write_action":true,"price_micros":0,"input_schema":null},{"name":"iyke_kv_get","description":"Read a JSON value at scope+key. Returns { key, value: null } if absent (200, not 404).","write_action":false,"price_micros":0,"input_schema":null},{"name":"iyke_kv_list","description":"List KV entries in a scope. `prefix` filter narrows by key prefix.","write_action":false,"price_micros":0,"input_schema":null},{"name":"iyke_kv_set","description":"Store a small JSON value at scope+key. Cap 64 KB per value; cap 1 MB total per scope. For larger durable text, use scratchpads. Scope defaults to active project.","write_action":false,"price_micros":0,"input_schema":null},{"name":"iyke_layout_get","description":"Get the saved layout (pane tree, files-explorer state, panel sizes) for a project. Returns the raw layout_state row contents — each field is the JSON the shell wrote, or null when nothing has been saved for that key. Defaults to the active project; pass project_id to query a specific one. Useful for the conductor pattern (an agent inspecting \"what does this project look like to the user\").","write_action":false,"price_micros":0,"input_schema":null},{"name":"iyke_layout_reset","description":"Reset a project's saved layout — deletes the pane tree, files-explorer state, and panel sizes rows. Next time the user (or anyone) switches to this project, the layout-swap orchestrator finds no saved state and leaves the current view in place. Use this to recover from a wedged layout or as part of a clean-slate workflow.","write_action":false,"price_micros":0,"input_schema":null},{"name":"iyke_lock_acquire","description":"Acquire a project-scoped lease lock on a named resource. Use for short-lived coordination around shared files, plans, migrations. holder is the agent id from iyke_agent_register. ttl_ms defaults to 60000 (clamped to [1000, 600000]). If wait_ms is set, blocks up to that long for an existing lock to expire.","write_action":false,"price_micros":0,"input_schema":null},{"name":"iyke_lock_release","description":"Release a lock you hold. No-op if held by someone else or already expired.","write_action":false,"price_micros":0,"input_schema":null},{"name":"iyke_lock_renew","description":"Extend a lock you hold by ttl_ms. Useful for long-running work that needs more time than the original lease.","write_action":false,"price_micros":0,"input_schema":null},{"name":"iyke_lock_status","description":"Check whether a resource is currently locked (active leases only). Returns held=false if the lease has expired.","write_action":false,"price_micros":0,"input_schema":null},{"name":"iyke_logs","description":"Read recent console + error logs (last 500) from the running webview. Includes window error and unhandledrejection captures.","write_action":false,"price_micros":0,"input_schema":null},{"name":"iyke_mcp_list","description":"List MCP servers visible from a project. Returns each (server name × source) pair so conflicts across tiers are surfaced separately. Each entry reports: source tier (personal | workspace_pkg | project | project_pkg), provider (pkg id or \"personal\"), lifecycle (long-lived | per-call | on-demand), live state (running / parked / crashed / blocked / not-started / on-demand), and the source file path. ","write_action":false,"price_micros":0,"input_schema":null},{"name":"iyke_mcp_restart","description":"Restart a supervised MCP server by pkg id. Restarts every long-lived MCP entry the pkg declares (the supervisor keys per pkg, not per server name). Useful when a child has wedged. Fails with 404 if the pkg is not supervised — per-call MCPs spawn fresh on every tool invocation and have nothing persistent to restart.","write_action":false,"price_micros":0,"input_schema":null},{"name":"iyke_mode","description":"Switch the activity-bar sidebar mode. Valid modes: app, files, agents, sessions, settings, storyboard, video-engine, canvas-design, image-generator. The first five are core; the rest are mini-apps.","write_action":false,"price_micros":0,"input_schema":null},{"name":"iyke_network","description":"Read recent fetch + XHR network activity (last 100). Each entry has method, url, status, duration_ms, and error if it failed.","write_action":false,"price_micros":0,"input_schema":null},{"name":"iyke_open","description":"Open a new tab in the focused pane. `kind` selects the view type. For \"route\" pass `path`; \"terminal\" optionally `cmd` (a shell command string); \"chat\" requires `session_id`; \"artifact\" requires `path` (a single .html file); \"artifact-studio\" requires `path` plus optional `density` (grid for a folder, loupe for a single artifact, compare for two — with a `vs` sibling path); \"artifact-grid\" is a ba","write_action":false,"price_micros":0,"input_schema":null},{"name":"iyke_pa_actions_pause","description":"Pause a batch of drafted actions into the Ikenga approve gate for operator sign-off (ux_mode: approve). Call this INSTEAD of performing the side effect (sending an email, posting, etc.) once you have drafted the outgoing items: it writes them to the gate at /outbox/approvals where the operator edits + approves, then STOP — the operator's approval drives the real send, not you. Each draft's `payloa","write_action":false,"price_micros":0,"input_schema":null},{"name":"iyke_pin_acknowledge","description":"Transition a pin from `open` to `in_progress`. Call this once you've read the pin and started working — the grid cell's pin dot flips to kola-amber so the user sees you're on it. Idempotent: later calls leave the existing `acknowledged_at` timestamp intact.","write_action":false,"price_micros":0,"input_schema":null},{"name":"iyke_pin_read","description":"Fetch the full payload for an artifact-grid pin by id. The routing dispatcher pastes a short prompt referencing the pin id; call this tool to retrieve the structured context — artifact_path (the .html file on disk), selector (CSS selector inside the artifact iframe), text (the user's comment body), screenshot_path (local PNG of the targeted element, may be null), plus lifecycle stamps. Use the pat","write_action":false,"price_micros":0,"input_schema":null},{"name":"iyke_pin_resolve","description":"Transition a pin to `resolved`. Call this after committing the change you set out to make — the grid cell's pin dot flips to verdigris (resolved). Users can also resolve manually from the grid right-click menu; this is the agent-initiated path for closing the loop without bouncing back to the human. Stamps `resolved_at` on first transition; idempotent on re-calls.","write_action":false,"price_micros":0,"input_schema":null},{"name":"iyke_pkg_install_scope_set","description":"Change the scope of an installed pkg. scope=\"workspace\" (always loaded) or \"project:<id>\" (loaded only when that project is active). Triggers a kernel reconcile so sidecars start/stop accordingly.","write_action":false,"price_micros":0,"input_schema":null},{"name":"iyke_pkg_list","description":"List installed pkgs visible from the active project. Workspace-scoped pkgs are always included; project-scoped pkgs are included only when their project is active unless include_other_projects=true. Each entry: id, version, install_path, enabled, source, scope (\"workspace\" | \"project:<id>\"), active_now.","write_action":false,"price_micros":0,"input_schema":null},{"name":"iyke_pkg_trust_list","description":"List trust state for every installed pkg. Returns one entry per pkg with state (auto_trusted / auto_granted / granted / needs_approval), declared sensitive permissions summary, and last grant timestamp when applicable. Use when surveying which third-party pkgs need user approval before their MCP tools can be invoked.","write_action":false,"price_micros":0,"input_schema":null},{"name":"iyke_pkg_trust_status","description":"Get the trust state for a single installed pkg. Returns one of: auto_trusted (built-in com.ikenga.* shipped with the shell), auto_granted (no sensitive permissions declared), granted (user approved a specific manifest version), or needs_approval (sensitive perms declared but no current grant; either never approved, perms changed since last grant, or explicitly revoked). When state is needs_approva","write_action":false,"price_micros":0,"input_schema":null},{"name":"iyke_pkg_uninstall","description":"Uninstall a pkg. Stops its sidecars, removes its registry entries, deletes its files. Project-scoped state in iyke_kv / iyke_scratchpads / iyke_todos survives. Builtins (com.ikenga.*) cannot be uninstalled.","write_action":false,"price_micros":0,"input_schema":null},{"name":"iyke_pkg_violations_list","description":"List kernel-level permission-violation audit rows newest-first. Today only `shell.execute` denials write here (a pkg attempted to spawn a binary outside its manifest's declared allowlist). Returns one entry per attempt with attempted (the resolved command), declared (the manifest allowlist at attempt time, comma-joined), scope_kind ('shell.execute'), pkg_id, and occurred_at (unix millis). Pass pkg","write_action":false,"price_micros":0,"input_schema":null},{"name":"iyke_project_archive","description":"Archive a project (soft-delete — sets archived_at, no data removed). The project disappears from the default switcher list but its sessions/pkgs/todos remain on disk and can be restored by a later iyke_project_update if needed. Refuses to archive the built-in \"Default\" project. If the archived project was active, the shell falls back to Default automatically.","write_action":false,"price_micros":0,"input_schema":null},{"name":"iyke_project_create","description":"Create a new project in the Ikenga shell. Projects scope chats, installed pkgs, pane layouts, todos, scratchpads and cron jobs — switching project rebinds those surfaces. Slug `id` must match ^[a-z0-9][a-z0-9_-]{0,63}$ and be unique; `default` is reserved. `display_name` is freely Unicode, capped at 120 chars. `root_path` is optional but recommended — it becomes the cwd for new chats spawned insid","write_action":true,"price_micros":0,"input_schema":null},{"name":"iyke_project_get_active","description":"Return the currently active project (id, display_name, root_path, icon, color, description, position, is_default, created_at). Call this before iyke_project_set_active or any project-scoped mutation so an agent knows which project the user is in.","write_action":false,"price_micros":0,"input_schema":null},{"name":"iyke_project_list","description":"List projects in switcher order (position ASC, then created_at). Each entry has id, display_name, root_path, icon, color, description, position, is_default, created_at, archived_at. Archived projects are hidden by default — pass include_archived=true to surface them (e.g. when an agent is restoring an old project).","write_action":false,"price_micros":0,"input_schema":null},{"name":"iyke_project_set_active","description":"Switch the shell's active project. Subsequent new chats, scratchpads, todos and pkg installs default to this project; existing project-scoped TanStack queries (sessions, pkgs, todos, scratchpads, cron) refetch automatically. Does NOT navigate panes — pane contents stay put until a phase-2/6-aware surface reads the new active id. Fails if the id is unknown or archived.","write_action":false,"price_micros":0,"input_schema":null},{"name":"iyke_project_update","description":"Patch fields on an existing project. Only the fields you pass in `patch` are touched — omit a field to leave it as is. Pass `null` to clear a nullable field (root_path, icon, color, description). `position` controls the project ordering in the activity-bar switcher (lower = earlier). Cannot change `id`; create a new project and migrate instead.","write_action":true,"price_micros":0,"input_schema":null},{"name":"iyke_query_cache","description":"Dump the TanStack Query cache: queryKey, status, fetchStatus, isStale, dataUpdatedAt, errorUpdatedAt, error, and a 200-char data preview for each entry. Useful for diagnosing stale data or failed fetches.","write_action":false,"price_micros":0,"input_schema":null},{"name":"iyke_scratchpad_append","description":"Append to a scratchpad without overwriting. Creates it if missing. `with_separator=true` (default) inserts a horizontal rule + timestamp between the prior body and the new content.","write_action":false,"price_micros":0,"input_schema":null},{"name":"iyke_scratchpad_delete","description":"Delete a scratchpad by scope+name. Idempotent.","write_action":true,"price_micros":0,"input_schema":null},{"name":"iyke_scratchpad_list","description":"List scratchpads in a scope (defaults to active project). Each entry has id, name, updated_at, and a 200-char preview.","write_action":false,"price_micros":0,"input_schema":null},{"name":"iyke_scratchpad_read","description":"Read a scratchpad by scope+name. 404 if missing. Returns id, body, updated_at.","write_action":false,"price_micros":0,"input_schema":null},{"name":"iyke_scratchpad_write","description":"Create or replace a project-scoped Markdown scratchpad. Use for plans, handoffs, working context that should outlive a chat. `scope` defaults to the active project (project:<active_id>); pass \"workspace\" or \"pkg:<id>\" to opt out. `name` is a slug unique within scope. Body cap 1 MB.","write_action":true,"price_micros":0,"input_schema":null},{"name":"iyke_screenshot","description":"Capture a PNG screenshot of either the full window or a specific pane. Returns the saved path, dimensions, and byte count. Default writes to ~/.local/share/ikenga/screenshots/.","write_action":false,"price_micros":0,"input_schema":null},{"name":"iyke_secret_delete","description":"Delete a secret from the given scope. Same scope semantics as iyke_secret_get. Returns ok even if the key did not exist. Does not touch the legacy unscoped key — to clean up legacy entries, delete the value at the unscoped key directly.","write_action":true,"price_micros":0,"input_schema":null},{"name":"iyke_secret_get","description":"Read a secret from the vault. The scope arg partitions the read: omit it (or pass an empty string) to read from the active project; pass \"workspace\" to read a cross-project shared secret; pass \"project:<id>\" or \"pkg:<id>\" to target a specific partition. Returns the value as a string, or null when the key does not exist in the chosen scope. Falls back transparently to the legacy unscoped key when a","write_action":false,"price_micros":0,"input_schema":null},{"name":"iyke_secret_list","description":"List secret KEY NAMES (not values) in a scope. Same scope semantics as iyke_secret_get. Returns sorted bare key names — the scope prefix is stripped. Use to inventory what secrets are stored in a project without revealing values.","write_action":false,"price_micros":0,"input_schema":null},{"name":"iyke_secret_set","description":"Write a secret to the vault under the given scope (same scope semantics as iyke_secret_get). Triggers a re-dump of the runtime env-vault file so sidecars and per-call MCP children pick up the new value on next spawn. Use this sparingly — secrets are sensitive and the values land in the user's encrypted Stronghold snapshot.","write_action":true,"price_micros":0,"input_schema":null},{"name":"iyke_session_list","description":"List Claude chat sessions. Filter by project (defaults to active); pass include_all=true to list across all projects. Returns at most 50 threads by default (max 200). Each entry has id, title, cwd, project_id, claude_session_id, created_at, updated_at.","write_action":false,"price_micros":0,"input_schema":null},{"name":"iyke_session_move","description":"Move a chat thread between projects. Metadata-only — does not restart the claude subprocess. The cwd captured at spawn time stays whatever it was. Fails if the target project is unknown or archived.","write_action":false,"price_micros":0,"input_schema":null},{"name":"iyke_session_start_in_project","description":"Mint a new Claude chat thread attached to a project. The shell resolves the project root as the session cwd, builds the layered Claude-config overlay dir (skills + agents + commands + merged .mcp.json) for the spawn, and routes the request through the ACP `session/new` handler. Returns the new thread_id; the actual subprocess spawns lazily on the first prompt — fire `acp_prompt` or open `/sessions","write_action":false,"price_micros":0,"input_schema":null},{"name":"iyke_split","description":"Split the focused pane (or a specific pane via pane_id) into two. \"horizontal\" splits side-by-side; \"vertical\" splits top-bottom. Subject to the in-app MAX_LEAVES cap (currently 6).","write_action":false,"price_micros":0,"input_schema":null},{"name":"iyke_state","description":"Get the current state of the Ikenga desktop app — sidebar mode, focused pane route, and the full pane tree under shell.panes. shell.panes has shape { leaves: [{ id, focused, activeTabIdx, tabs: [{kind,title}] }], tree: <recursive PaneNode> }; use leaves[].id with iyke_focus or iyke_close (pane_id) to operate on a specific pane. Call this before iyke_go / iyke_mode / iyke_focus / iyke_close to chec","write_action":false,"price_micros":0,"input_schema":null},{"name":"iyke_timer_cancel","description":"Cancel a pending timer by id. No-op if already fired or cancelled. Returns { cancelled: bool }.","write_action":true,"price_micros":0,"input_schema":null},{"name":"iyke_timer_list","description":"List timers in a scope (defaults to active project). Optional status filter: pending | fired | cancelled. Returns timers sorted by fire_at ascending.","write_action":false,"price_micros":0,"input_schema":null},{"name":"iyke_timer_schedule","description":"Schedule a one-shot timer in the active project (or specified scope). Pass either fire_at (absolute epoch-ms) or delay_ms (relative from now), not both. When the timer fires the shell emits an OS notification; if agent_id is set, an entry also lands in that agent's inbox (delivered on its next tool call, 24h TTL).","write_action":false,"price_micros":0,"input_schema":null},{"name":"iyke_todo_complete","description":"Mark a todo as done and stamp completed_at. Equivalent to iyke_todo_update with status=done.","write_action":false,"price_micros":0,"input_schema":null},{"name":"iyke_todo_create","description":"Create a project-scoped todo. Tags are free-form strings; assignee is a free-form name (agent or user). Set blocker_id to mark this todo as blocked by another.","write_action":true,"price_micros":0,"input_schema":null},{"name":"iyke_todo_list","description":"List todos in a scope (defaults to active project). Filter by status, tag, assignee.","write_action":false,"price_micros":0,"input_schema":null},{"name":"iyke_todo_update","description":"Partial update of a todo. Only supplied fields are changed. Pass status=\"done\" or use iyke_todo_complete for the common case.","write_action":true,"price_micros":0,"input_schema":null},{"name":"iyke_type","description":"Type text into an input/textarea/contenteditable element. Specify exactly one of `ref` or `selector`. By default appends; pass `replace=true` to overwrite the existing value.","write_action":false,"price_micros":0,"input_schema":null},{"name":"iyke_wait","description":"Wait until a predicate is satisfied or timeout. Use this after iyke_click / iyke_go to wait for the new state to render, instead of fixed sleeps. Returns { satisfied, elapsed_ms, message? }.","write_action":false,"price_micros":0,"input_schema":null}],"scan":{"score":86,"grade":"A","scanned_at":"2026-11-02T06:13:46.833Z","report":{"scannerVersion":"0.1.10","scannedAt":"2026-11-02T06:13:46.758Z","components":{"code":{"score":25,"max":25,"notes":["11 source files scanned"]},"reliability":{"score":-1,"max":20,"notes":["no gateway calls yet and no remote to probe"]},"poisoning":{"score":-1,"max":15,"notes":["tools not inspected (local package is not executed); not counted"]},"auth":{"score":12,"max":15,"notes":["local package, no credentials required"]},"maintenance":{"score":15,"max":15,"notes":["last push 0 days ago"]},"identity":{"score":4,"max":10,"notes":["namespace and repository owner differ"]}},"findings":[],"inputs":{"packages":[{"registryType":"npm","identifier":"@ikenga/mcp-iyke","version":"0.2.3","found":true,"license":"Apache-2.0","hasInstallScripts":false,"dependencyCount":2,"publishedAt":"2026-08-21T07:43:12.757Z","repositoryUrl":"git+https://github.com/ikenga-hq/ikenga-pkgs.git","weeklyDownloads":140}],"repo":{"found":true,"owner":"ikenga-hq","repo":"ikenga-pkgs","archived":false,"pushedAt":"2026-11-02T06:05:09Z","stars":0,"forks":0,"openIssues":2,"ownerType":"Organization","ownerAvatarUrl":"https://avatars.githubusercontent.com/u/319333615?v=4","ownerCreatedAt":"2026-08-21T05:30:00Z","license":"Apache-2.0"},"icon":{"url":"https://ikenga.dev/favicon.svg","source":"registry"},"presence":{"stars":0,"forks":0,"downloadsWeek":140,"license":"Apache-2.0","lastPushAt":"2026-11-02T06:05:09.000Z","score":29}}}},"grade_history":[],"reviews":[]}