Install
$ agentstack add skill-gusbavia-pbi-project-hub-pbi-project-hub ✓ scanned · ✓ verified — works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v0.1.0 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
What it can access
- ✓ Network access No
- ✓ Filesystem access No
- ✓ Shell / process execution No
- ✓ Environment & secrets No
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
About
Power BI Project Hub
Build a complete Obsidian-ready project delivery vault for Power BI consulting. Answer 8 questions about your practice and first client project. Get a production-grade vault with per-client isolation, design system scaffolding, credential management, sprint boards, discovery frameworks, and live dashboards — all in plain markdown.
Input: $ARGUMENTS
1 · Choose delivery mode — MANDATORY FIRST QUESTION
Before anything else, ask:
> Hi! I'll build you a complete Power BI project delivery vault. First, how would you like me to deliver it? > > A · All-at-once — I ask 8 questions, then generate everything in one response. Total time: ~10 minutes. Best if you want to copy-paste everything and start immediately. > > B · Step-by-step — I ask 8 questions, then deliver in 5 phases with a "ready?" between each. Total time: ~20 minutes. Best if you want to follow along, save files as we go, and ask questions. > > Reply A or B.
Wait for response. Set internal mode based on answer. If unclear, default to B (step-by-step is safer for consultants new to Obsidian).
2 · Discovery — 8 questions, ONE AT A TIME
Ask each question, wait for answer, then ask the next. Be warm but efficient. Don't lecture between questions.
🔑 Global rule · "Decide later" is ALWAYS valid
You act as a senior Power BI consultant + PM, not a questionnaire robot. A PM setting up the hub often doesn't have every answer on day 1 — that's normal. For every question below, accept any of:
- "not sure yet" · "decide later" · "TBC" · "skip" · "I don't know" · "pending"
When the user skips:
- Acknowledge briefly: "No problem — we'll leave a placeholder and come back to it."
- Mark the field internally as
pending - At generation time, create the relevant file/folder with
status: pendingand a## TODOcallout explaining what's missing - Add to a consolidated "Pending decisions" section in
00_FOCUS.mdso nothing slips - Never block the flow — always advance
This is what a professional consultant does: capture what's known, document what's open, keep the engagement moving.
Q1 · Practice type "What kind of Power BI practice do you run? Pick the closest: (a) Solo consultant — you do everything yourself, client to delivery (b) Small agency (2-10 people) — shared methodology, multiple consultants (c) In-house BI team — internal stakeholders, multiple business units (d) Freelancer starting out — building your first repeatable process (e) Senior consultant — experienced but no formal system yet (f) Other — describe in your own words (skip) — we'll default to 'solo consultant' and you can change it later"
Q2 · Your context "Tell me about you in 2-3 sentences. Your role, typical day, years of experience, and what tools you use alongside Power BI (SQL, Python, Azure, SharePoint, etc.). If you'd rather skip, just say 'skip' — we'll leave a TODO on your profile."
Q3 · First project — the client "Tell me about the first project you want to set up:
- Client name (or codename — 'Project Phoenix' is fine)
- Industry (or 'not sure yet')
- Company size (rough — small / mid / enterprise / skip)
- Main stakeholder role (CFO · Ops Manager · CTO / skip)
If you don't have a project yet and just want the practice scaffold set up, say 'no project yet' and I'll create a reusable Clients/_TEMPLATE/ folder you can copy each time you win a new one."
Q4 · Data stack "What does the data landscape look like?
- Source: SQL Server · Azure SQL · Synapse · Databricks · SharePoint lists · Excel · API · other · unknown
- Connection mode: Direct Query · Import · Composite · Dataflow · TBC
- Existing model: yes · no · partial · not checked yet
Any 'unknown / TBC / not checked yet' is fine — I'll add it to the discovery backlog."
Q5 · Design system · 3 paths
"Where are you with the client's design system? Pick the path that matches:
Path A · I have it — you already have brand colors, fonts, logo. Share what you have:
- 3 hex colors (primary · secondary · tertiary) — or 7 if you have a full palette
- Primary font + body font
- Logo file available? (yes / send later / no)
- Existing Power BI theme JSON? (yes / no)
Path B · Partial — you have some info but not all. Tell me what you have, I'll flag the rest as pending.
Path C · Not yet — haven't collected it. I'll create 02_Design_System/ with a _PENDING.md TODO note and the discovery questions to ask the client. You come back when the info arrives.
🎨 Companion skill offer — if Path A or Path B: > 'By the way — I can generate a production-grade Power BI theme (full JSON + SVG canvas + design system PDF + CSS tokens + DAX HTML examples) using the companion skill pbi-theme. If you want that, say 'yes, generate theme' after we finish the 8 questions and I'll invoke it with your colors. Or say 'scaffold only' if you just want the brand-guide.md + theme.json stub.'
Accept any answer. If user says 'yes, generate theme', make a note to invoke pbi-theme after the vault is built, saving outputs to Clients/{name}/02_Design_System/."
Q6 · Deployment + file format "How will you deploy and manage the report? Any 'not sure yet' is fine — we'll leave a placeholder.
- File format: PBIX (single file) · PBIP (git-friendly folder) · PBIT (template) · TBC
- Workspace: Service workspace name · 'not set up yet' · skip
- Deployment: manual publish · deployment pipelines (Dev/Test/Prod) · CI/CD · TBC
- Row-level security: yes · no · not sure"
Q7 · Project scope "What are you actually building? Pick all that apply, or 'scope not locked yet': (a) Executive dashboard — KPIs, trends, high-level metrics (b) Operational report — daily/weekly detail for teams (c) Self-service dataset — semantic model for others to build on (d) Embedded analytics — Power BI embedded in an app or portal (e) Migration — rebuilding an existing report (Excel · Tableau · SSRS · etc.) (f) Other — describe (skip) — scope will be defined during discovery phase"
Q8 · Governance + handover "Who else will touch this after you deliver? Skip any you don't know.
- Client maintains?: yes · no · partially · TBC
- Power BI admin / champion internally?: yes (name) · no · unknown
- Compliance requirements: data residency · sensitivity labels · audit trail · none · not sure
- Handover format: documentation · training session · video walkthrough · all · decide later"
3 · Confirm + plan
After all 8 answers, summarise back in 6-8 bullets:
- Practice type + your context (1 line)
- Client + industry + stakeholder (1 line)
- Data stack + connection mode (1 line)
- Design system status (colors / fonts / theme JSON)
- Deployment model (file format + workspace + pipeline)
- Project scope (what you're building)
- Governance + handover plan
- Any special considerations
Then ask: "Does this match? Anything to adjust before I build your vault?"
If any fields were skipped, surface them explicitly in the summary with a ⏳ marker: > ⏳ Pending items (will be placeholders in the vault, visible in 00_FOCUS.md's 'Pending decisions' section): > - Data stack connection mode > - Client compliance requirements > - etc.
Wait for confirmation.
3.5 · Companion skill handoff — pbi-theme
If the user answered Path A (I have colors) or Path B (partial) in Q5 AND said "yes, generate theme":
After the vault is built, announce: > "Vault is ready. Now handing off to the pbi-theme companion skill to generate the production theme. Outputs will land in Clients/{name}/02_Design_System/: > - {client}-pbi-theme.json — importable theme (~5,800 lines) > - {client}-canvas-background.svg — branded SVG layout > - {client}-design-system.pdf — A4 design system reference > - {client}-tokens.css — CSS custom properties for HTML visuals > - {client}-html-visual-example.dax — 3 DAX HTML visual examples"
Then invoke pbi-theme with the collected inputs:
- 3 brand colors from Q5
- Light/dark mode (ask if not yet clear)
- Resolution (default 1280x720 if not specified)
- Layout (default B · Header + Filters)
- Brand name (= client name from Q3)
- Logo if provided in Q5
If the user answered Path C (not yet) in Q5:
- Skip the handoff entirely
- Create
02_Design_System/_PENDING.mdwith the 4 discovery questions to ask the client (colors · fonts · logo · existing theme) - When the user comes back with the info, they can invoke
pbi-thememanually or re-run this skill
4 · Generate the vault
Baseline structure (always generate)
00_START_HERE.md Vault index · MOC pointing to everything
00_DASHBOARD.md Live Dataview queries · practice-wide status
00_FOCUS.md Daily driver · current sprint · blockers · quick capture
00_HOW_THIS_WORKS.md System documentation for this vault
_templates/
├── note.md Generic note with frontmatter
├── meeting.md Client meeting / stakeholder call
├── decision.md Decision log entry with rationale
├── discovery.md Discovery session capture
├── standup.md Daily / weekly standup
├── uat-feedback.md UAT testing feedback capture
└── handover.md Client handover checklist
_Attachments/ Screenshots · mockups · exports
_Practice/ Practice-level config (reusable across clients)
├── _MOC.md Practice methodology index
├── methodology.md Your delivery methodology
├── pricing-model.md Rate card / pricing structure
└── tools-stack.md Tools you use and why
Clients/
└── {client-name}/ Per-client isolation
├── _MOC.md Client project index
├── 01_Discovery/
│ ├── _MOC.md
│ ├── discovery-notes.md First meeting capture
│ ├── stakeholder-map.md Who's who + influence
│ ├── requirements.md What they asked for
│ └── data-audit.md What data exists + quality
├── 02_Design_System/
│ ├── _MOC.md
│ ├── brand-guide.md Colors · fonts · logo · rules
│ ├── theme.json Power BI theme file (scaffold)
│ └── wireframes.md Page layout sketches / mockups
├── 03_Build/
│ ├── _MOC.md
│ ├── data-model.md Tables · relationships · measures index
│ ├── dax-log.md Complex DAX with rationale
│ ├── pages.md Page inventory + status
│ └── sprint-board.canvas Kanban board (Backlog → In Progress → Blocked → Done)
├── 04_UAT/
│ ├── _MOC.md
│ ├── test-plan.md What to test · who tests · when
│ ├── feedback-log.md Aggregated UAT feedback
│ └── sign-off.md Formal sign-off record
├── 05_Production/
│ ├── _MOC.md
│ ├── deployment.md Workspace · pipeline · schedule
│ ├── credentials.md Masked credentials + connection strings
│ ├── monitoring.md Refresh schedule · alerts · capacity
│ └── handover.md Client handover document
└── 06_Meetings/
└── (meeting notes go here)
90_Journal/ Daily notes · personal reflections
91_Decisions/ Append-only decision log
92_Resources/ Articles · reference links · bookmarks
Per-client customisation rules
- Replace
{client-name}with actual client name or codename from Q3 - Pre-fill
brand-guide.mdwith colors/fonts from Q5 (or leave placeholder prompts) - Pre-fill
credentials.mdwith connection type from Q4 (masked template) - Pre-fill
deployment.mdwith workspace/pipeline from Q6 - Pre-fill
requirements.mdwith scope from Q7 - Pre-fill
handover.mdwith governance answers from Q8 - Generate
theme.jsonscaffold using colors from Q5 (if provided)
File content rules
Every file MUST include:
- YAML frontmatter with:
title,type,client(where applicable), optionalstatus,tags,updated(use today's date asYYYY-MM-DD) - Status vocabulary:
not_started · in_progress · blocked · review · done - Wiki-links
[[note-name]]to connect to other notes in the vault - Tags like
#client/{name},#phase/discovery,#priority/high,#status/blocked
Templates use Templater syntax for dynamic content:
- Date: ``
- Title: ``
The 4 hub files (00_*) MUST include working Dataview queries. Project-specific examples:
TABLE status, client, phase FROM "Clients"
WHERE status = "in_progress"
SORT client ASC
TABLE WITHOUT ID file.link as "Meeting", date, client
FROM "Clients" WHERE type = "meeting"
SORT date DESC LIMIT 10
TABLE status, owner, end as "Deadline"
FROM "" WHERE status = "blocked"
Sprint board (Canvas)
Generate a .canvas JSON file with 4 columns:
- Backlog — tasks identified but not started
- In Progress — actively being worked
- Blocked — waiting on client / data / access
- Done — completed and verified
Pre-populate with 5-8 tasks based on Q7 scope (e.g., "Set up data connections", "Build star schema", "Create executive summary page", "Implement RLS", "UAT with stakeholder").
Seed notes specificity rule
Seed notes MUST be specific to what the user told you in Q2-Q8. Examples:
- User said "SQL Server, Direct Query, executive dashboard" → seed notes like
sql-server-connection.md,executive-kpis.md,directquery-performance.md - User said "migrating from Excel" → seed notes like
excel-source-audit.md,migration-mapping.md,data-cleanup-log.md - User said "embedded analytics" → seed notes like
embed-config.md,api-integration.md,capacity-planning.md
NEVER deliver generic placeholders like note-1.md, example.md, untitled.md.
theme.json scaffold vs production theme
Three outcomes based on Q5 answer:
Path A + "yes, generate theme" → do NOT write a scaffold. Invoke pbi-theme after vault is built. The pbi-theme skill owns 02_Design_System/theme.json and produces the full 5,800-line production JSON + SVG + PDF + CSS + DAX examples.
Path A/B + "scaffold only" → generate a minimal scaffold with the colors captured:
{
"name": "{client-name} Theme",
"dataColors": ["#hex1", "#hex2", "#hex3", "#hex4", "#hex5", "#hex6", "#hex7"],
"background": "#ffffff",
"foreground": "#333333",
"tableAccent": "#hex1",
"visualStyles": {
"*": {
"*": {
"general": [{ "responsive": true }]
}
}
}
}
Add a comment at the top: "This is a starter scaffold. For a production theme with full color engine, canvas backgrounds, and design system PDF, run the pbi-theme skill pointed at this folder."
Path C (no info yet) → do NOT create theme.json at all. Create _PENDING.md instead (see placeholder pattern below).
Placeholder pattern · for every skipped answer
When a field was skipped or marked pending, never silently drop it. Instead:
- Create the file anyway, but with
status: pendingin frontmatter - Start the file body with a visible TODO callout:
> ⏳ **TODO** · This section is pending information from [stakeholder/discovery/you].
>
> **What's missing**: [specific thing — e.g. "brand colors and fonts"]
>
> **To resolve**: [concrete next step — e.g. "ask marketing team for brand guidelines PDF"]
>
> Remove this callout once the info lands.
- Add a bullet to
00_FOCUS.mdunder "⏳ Pending decisions" section, linking to the file
Example _PENDING.md for a missing design system (Path C):
---
title: Design System · Pending
type: pending
client: {client-name}
status: pending
tags: [pending, design
…
## Source & license
This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.
- **Author:** [gusbavia](https://github.com/gusbavia)
- **Source:** [gusbavia/pbi-project-hub](https://github.com/gusbavia/pbi-project-hub)
- **License:** MIT
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet — be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.