Help us improve
Share bugs, ideas, or general feedback.
From product-lens
Use for periodic scans over a project root such as ~/Code. Builds a root-level picture of active projects, current risks, and PKOS exchange artifacts for downstream ingestion.
npx claudepluginhub n0rvyn/indie-toolkit --plugin product-lensHow this skill is triggered — by the user, by Claude, or both
Slash command
/product-lens:portfolio-scanThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
`portfolio-scan` is the root AI-facing periodic skill for `product-lens`.
Aggregates cross-repo health signals from vault-registered GitLab/GitHub projects into a single _PORTFOLIO.md dashboard. Runs on demand or at session-start when enabled.
Scans repo directory to detect projects, summarize architecture and components per project, map dependencies, and generate repo.md for codebase overviews and analysis prep.
Share bugs, ideas, or general feedback.
portfolio-scan is the root AI-facing periodic skill for product-lens.
It answers:
It does not produce fake completion percentages. It records observable facts first, then emits a compact portfolio summary and exchange artifacts for PKOS.
Expected structured input:
{
"intent": "portfolio_scan",
"project_root": "~/Code",
"targets": [],
"window_days": 14,
"mode": "summary",
"save_report": true,
"sync_notion": false
}
Use targets if provided.
Otherwise discover repositories under project_root using lightweight indicators:
.git/.xcodeproj or .xcworkspacePackage.swiftpackage.jsonpubspec.yamlREADME.mdIgnore obvious non-project directories such as:
node_modules.buildDerivedDatadistbuildDispatch repo-activity-scanner for each candidate repository.
The agent should return facts only:
For each repository, summarize:
Allowed portfolio-scan decision values:
focusmaintainfreezestopwatchWhen evidence is weak, prefer:
watchDo not force a hard verdict when the repo lacks enough signal.
Dispatch ingress-publisher with:
intent = portfolio_scanCommand shape:
python3 ${CLAUDE_PLUGIN_ROOT}/scripts/publish_exchange.py \
--intent portfolio_scan \
--project-root ~/Code \
--decision watch \
--confidence medium \
--risk "Evidence is still sparse across most repos." \
--reason "Only a subset of repos show coherent recent product movement." \
--action "Run project_progress_pulse on the top active repos." \
--evidence ~/Code \
--exchange-root ~/Obsidian/PKOS/.exchange/product-lens
Artifact target:
~/Obsidian/PKOS/.exchange/product-lens/portfolio-scan/
Do not select final PKOS vault destinations here.
Return the machine-readable summary first:
{
"decision": "watch",
"confidence": "medium",
"why": ["reason 1", "reason 2"],
"biggest_risk": "one-line risk",
"next_actions": ["action 1", "action 2"],
"source_note_paths": ["exchange artifact paths"]
}
Then return a Markdown digest:
# Portfolio Scan
## Focus Candidates
- ...
## At Risk
- ...
## Follow-up
- ...