From dev-workflow
Generate Obsidian Bases (.base) views for structured querying of crystals, lessons, and vault notes. Use when the user says 'generate views', 'create base files', 'make queryable', or after crystallize/collect-lesson.
npx claudepluginhub n0rvyn/indie-toolkit --plugin dev-workflowThis skill uses the workspace's default tool permissions.
Generates Obsidian Bases `.base` files that provide structured table/board/list views over dev-workflow documents (crystals, lessons) and PKOS vault notes. These files live in the PKOS vault and enable structured filtering, sorting, and grouping without writing code.
Searches, retrieves, and installs Agent Skills from prompts.chat registry using MCP tools like search_skills and get_skill. Activates for finding skills, browsing catalogs, or extending Claude.
Searches prompts.chat for AI prompt templates by keyword or category, retrieves by ID with variable handling, and improves prompts via AI. Use for discovering or enhancing prompts.
Designs, implements, and audits WCAG 2.2 AA accessible UIs for Web (ARIA/HTML5), iOS (SwiftUI traits), and Android (Compose semantics). Audits code for compliance gaps.
Generates Obsidian Bases .base files that provide structured table/board/list views over dev-workflow documents (crystals, lessons) and PKOS vault notes. These files live in the PKOS vault and enable structured filtering, sorting, and grouping without writing code.
--target TARGET: Which views to generate (crystals | lessons | vault-knowledge | vault-all | cross-project | product-lens | all). Default: all--output DIR: Output directory. Default: ~/Obsidian/PKOS/99-System/bases/Based on --target, scan the relevant directories:
crystals:
Glob(pattern="*-crystal.md", path="docs/11-crystals/")
For each crystal, extract frontmatter: type, status, tags, refs, date from filename.
lessons:
Glob(pattern="*.md", path="~/.claude/knowledge/")
For each lesson, extract frontmatter: category, keywords, date.
vault-knowledge:
Glob(pattern="**/*.md", path="~/Obsidian/PKOS/10-Knowledge")
Glob(pattern="**/*.md", path="~/Obsidian/PKOS/50-References")
For each note, extract frontmatter: type, tags, quality, status, created.
cross-project:
Glob(pattern="**/*.md", path="~/Obsidian/PKOS/30-Projects")
For each note, extract frontmatter: type, tags, harvest_project, harvest_type, created.
product-lens:
Glob(pattern="**/*.md", path="~/Obsidian/PKOS/30-Projects")
For each note, extract frontmatter when present:
typesourceproducer_intentdecisionconfidenceprojectfeaturestatusprojection_statuscrystals.base — decision history across all projects:
filters:
and:
- 'file.inFolder("docs/11-crystals") || file.inFolder("10-Knowledge")'
- 'type == "crystal"'
properties:
file.name:
displayName: "Crystal"
status:
displayName: "Status"
file.cday:
displayName: "Date"
views:
- type: table
name: "All Decisions"
order:
- file.name
- status
- tags
- file.cday
filters:
and:
- 'type == "crystal"'
- type: table
name: "Active Decisions"
order:
- file.name
- tags
- file.cday
filters:
and:
- 'status == "active"'
knowledge-quality.base — vault knowledge by quality score:
filters:
or:
- file.inFolder("10-Knowledge")
- file.inFolder("50-References")
formulas:
age_days: '(now() - prop("created")).days'
views:
- type: table
name: "Quality Dashboard"
order:
- file.name
- type
- quality
- citations
- status
- formula.age_days
- file.cday
filters:
and: []
- type: table
name: "Seeds (need nurturing)"
order:
- file.name
- tags
- formula.age_days
filters:
and:
- 'status == "seed"'
- 'formula.age_days > 7'
- type: table
name: "High Quality"
order:
- file.name
- quality
- citations
- tags
filters:
and:
- 'quality >= 3'
tags-overview.base — notes grouped by topic:
filters:
or:
- file.inFolder("10-Knowledge")
- file.inFolder("20-Ideas")
- file.inFolder("50-References")
views:
- type: table
name: "All Notes by Topic"
order:
- file.name
- type
- tags
- quality
- status
groupBy:
property: type
direction: ASC
- type: cards
name: "Topic Cards"
order:
- file.name
- tags
- status
groupBy:
property: status
cross-project-decisions.base — all crystals across all projects:
filters:
and:
- file.inFolder("30-Projects")
- 'harvest_type == "crystal"'
properties:
file.name:
displayName: "Decision"
harvest_project:
displayName: "Project"
tags:
displayName: "Tags"
file.cday:
displayName: "Date"
views:
- type: table
name: "All Decisions"
order:
- file.name
- harvest_project
- tags
- file.cday
groupBy:
property: harvest_project
direction: ASC
- type: table
name: "Recent Decisions"
order:
- file.name
- harvest_project
- tags
filters:
and:
- 'file.cday >= date(today) - dur(30 days)'
cross-project-lessons.base — all lessons across all projects:
filters:
and:
- file.inFolder("30-Projects")
- 'harvest_type == "lesson"'
properties:
file.name:
displayName: "Lesson"
harvest_project:
displayName: "Project"
tags:
displayName: "Tags"
views:
- type: table
name: "All Lessons"
order:
- file.name
- harvest_project
- tags
- file.cday
groupBy:
property: harvest_project
direction: ASC
- type: cards
name: "By Tag"
order:
- file.name
- harvest_project
groupBy:
property: tags
project-activity.base — which projects have recent knowledge activity:
filters:
and:
- file.inFolder("30-Projects")
formulas:
age_days: '(now() - prop("created")).days'
views:
- type: table
name: "Project Activity"
order:
- harvest_project
- harvest_type
- file.name
- file.cday
groupBy:
property: harvest_project
direction: ASC
- type: table
name: "Last 30 Days"
order:
- file.name
- harvest_project
- harvest_type
filters:
and:
- 'formula.age_days <= 30'
kb-lessons.base — cross-project knowledge base view:
# This base file should be placed where it can see ~/.claude/knowledge/ files
# Since Obsidian can only query within its vault, this base queries
# PKOS notes that were bridged FROM the KB (have pkos_source field)
filters:
or:
- file.inFolder("10-Knowledge")
- file.inFolder("50-References")
views:
- type: table
name: "KB-Bridged Notes"
order:
- file.name
- source
- tags
- file.cday
filters:
and:
- 'source == "domain-intel"'
- type: table
name: "Recent Imports"
order:
- file.name
- source
- quality
filters:
and:
- 'file.cday >= date(today) - dur(7 days)'
product-lens-portfolio.base — portfolio signals, verdicts, feature reviews, and stale follow-up:
filters:
and:
- file.inFolder("30-Projects")
- 'source == "product-lens"'
views:
- type: table
name: "Recent Signals"
order:
- project
- signal_kind
- evidence_weight
- file.cday
filters:
and:
- 'type == "signal"'
- 'file.cday >= date(today) - dur(14 days)'
- type: table
name: "Portfolio Verdicts"
order:
- project
- decision
- confidence
- file.cday
filters:
and:
- 'type == "verdict"'
- type: table
name: "Feature Reviews"
order:
- project
- feature
- decision
- confidence
- file.cday
filters:
and:
- 'type == "feature-review"'
- type: table
name: "Stale Verdicts"
order:
- project
- projection_status
- file.cday
filters:
and:
- 'type == "verdict"'
- 'projection_status == "stale" || projection_status == "failed"'
Note type semantics (from product-lens/references/pkos/note-schemas.md):
signal — single observation (commit cluster, README shift, scan finding); evidence-only, no decision.verdict — project-level decision at a point in time (focus/maintain/freeze/stop).feature-review — decision about a specific built feature or recent slice.mkdir -p ~/Obsidian/PKOS/99-System/bases/
Write each .base file to the output directory.
Generated Obsidian Bases views:
crystals.base — {N} crystals indexed
knowledge-quality.base — {N} notes indexed
tags-overview.base — {N} notes indexed
kb-lessons.base — {N} bridged notes indexed
cross-project-decisions.base — {N} decisions across {P} projects
cross-project-lessons.base — {N} lessons across {P} projects
project-activity.base — {N} documents across {P} projects
Open in Obsidian: navigate to 99-System/bases/ and click any .base file.
formulas section uses Obsidian's built-in formula language (similar to Dataview).docs/11-crystals/ into the PKOS vault, or we copy crystal files to the vault. See DP-001.