diff --git a/ATTRIBUTION.md b/ATTRIBUTION.md index 72a5c37..7a8d6e9 100644 --- a/ATTRIBUTION.md +++ b/ATTRIBUTION.md @@ -18,7 +18,7 @@ The following public projects informed parts of the workflow or terminology. The - AntV chart visualization skills: https://github.com/antvis/chart-visualization-skills - AntV visualisation ecosystem concepts: https://antv.vision/ - Octagon Financial Skills: https://github.com/OctagonAI/skills -- Teacher PPTX Designer: original predecessor workflow by Tariq Said +- Teacher PPTX Designer: original predecessor workflow by Tariq Said, used as the education-focused foundation for this broader presentation skill. ## Attribution Policy diff --git a/CHANGELOG.md b/CHANGELOG.md index 80c6abc..34f9d68 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,20 +3,14 @@ ## [1.0.0] - 2026-05-16 ### Added -- Added Claude-focused distribution package under `dist/claude/`. -- Added `presentation-pro-designer.skill` for Claude environments that support custom Skill uploads. -- Added Claude package documentation: - - `00_START_HERE.txt` - - `INSTALLATION.txt` - - `CLAUDE_GUIDE.md` - - `SKILL_SUMMARY.md` - - `README.md` -- Added `THIRD_PARTY_NOTICES.md` for public attribution and license notes. -- Added platform guidance distinguishing ChatGPT ZIP, Claude Skill package, Gemini instructions, IDE agent usage, and CLI usage. - -### Fixed -- Clarified package usage by platform. -- Avoided implying that financial data or external APIs are used by default. +- First public release. +- Multi-platform presentation design Skill. +- ChatGPT Skill ZIP package. +- Claude-focused `.skill` package. +- CLI routing, planning, validation, package export, `which-file`, and `validate-dist`. +- Prompt library examples. +- Platform support documentation. +- Attribution and notice files. --- diff --git a/NOTICE.md b/NOTICE.md index a0505e5..73eddd6 100644 --- a/NOTICE.md +++ b/NOTICE.md @@ -58,6 +58,7 @@ The following third-party or external projects informed parts of the workflow, s **Project / source:** Octagon financial skill examples and financial analyst workflow concepts **Repository:** https://github.com/OctagonAI/skills + **Use in this project:** Conceptual inspiration for investor-deck sections, financial-analysis routing, income statement, balance sheet, financial growth, analyst estimates, financial health scores, peer analysis, valuation, and risk sections. **Bundled code:** No. **Bundled financial data:** No. diff --git a/README.md b/README.md index dd19a99..e0d82de 100644 --- a/README.md +++ b/README.md @@ -168,19 +168,19 @@ presentation-pro-designer/ │ └── source-governance.md ├── examples/ │ ├── README.md # This file -│ ├── prompt-library/ # Comprehensive prompt templates -│ ├── business-proposal-full.md -│ ├── corporate-company-profile-full.md -│ ├── data-report-deck-full.md -│ ├── education-lesson-full.md -│ ├── education-workshop-full.md -│ ├── generic-presentation-full.md -│ ├── improve-existing-pptx-full.md -│ ├── investor-public-company-deck-full.md -│ ├── investor-startup-deck-full.md -│ ├── product-service-full.md -│ ├── prompt-index.md -│ └── verification-profile-claim-full.md +│ └── prompt-library/ # Comprehensive prompt templates +│ ├── prompt-index.md +│ ├── education-lesson-full.md +│ ├── education-workshop-full.md +│ ├── corporate-company-profile-full.md +│ ├── business-proposal-full.md +│ ├── product-service-full.md +│ ├── verification-profile-claim-full.md +│ ├── investor-startup-deck-full.md +│ ├── investor-public-company-deck-full.md +│ ├── data-report-deck-full.md +│ ├── improve-existing-pptx-full.md +│ └── generic-presentation-full.md ├── cli/ │ ├── presentation_pro_cli.py │ ├── router.py @@ -242,40 +242,22 @@ Suggested files: examples/ ├── README.md # This file └── prompt-library/ # Comprehensive prompt templates - ├── business-proposal-full.md - ├── corporate-company-profile-full.md - ├── data-report-deck-full.md + ├── prompt-index.md ├── education-lesson-full.md ├── education-workshop-full.md - ├── generic-presentation-full.md - ├── improve-existing-pptx-full.md - ├── investor-public-company-deck-full.md - ├── investor-startup-deck-full.md + ├── corporate-company-profile-full.md + ├── business-proposal-full.md ├── product-service-full.md - ├── prompt-index.md - └── verification-profile-claim-full.md + ├── verification-profile-claim-full.md + ├── investor-startup-deck-full.md + ├── investor-public-company-deck-full.md + ├── data-report-deck-full.md + ├── improve-existing-pptx-full.md + └── generic-presentation-full.md ``` See [examples/README.md](examples/README.md) for detailed guidance on using each prompt. -## Which File Should I Use? - -Choose the right file or folder based on your platform: - -| Target | File / Folder | -|---|---| -| **ChatGPT Skills** | `dist/presentation-pro-designer-skill.zip` (export with CLI) or create from `skills/presentation-pro-designer/` | -| **Claude local Skills** | `skills/presentation-pro-designer/` copied into your Claude skills directory | -| **Claude Code / IDE Agents** | Full repository as local context or as a project directory | -| **Gemini Gems** | `skills/presentation-pro-designer/agents/gemini.md` as Gem instructions | -| **VS Code Agents** | `skills/presentation-pro-designer/agents/vscode.md` or full repository | -| **Cursor / Windsurf** | Full repository or `skills/presentation-pro-designer/agents/generic-agent.md` | -| **Antigravity** | `skills/presentation-pro-designer/agents/antigravity.md` | -| **Generic AI Agents** | `skills/presentation-pro-designer/SKILL.md` as instructions + reference files | -| **CLI** | Repository root (run commands from here) | - ---- - ## Quick Start ### Option 1: Use a Prompt Template @@ -347,7 +329,15 @@ Run from the repository root: python -m cli.presentation_pro_cli route examples/corporate-profile.md python -m cli.presentation_pro_cli plan examples/investor-deck.md --type investor_deck python -m cli.presentation_pro_cli validate-repo . -python -m cli.presentation_pro_cli export-skill --output dist/presentation-pro-designer-skill.zip +python -m cli.presentation_pro_cli export-skill --target chatgpt +``` + +Default output: `dist/skill.zip` + +Advanced (custom output path): + +```bash +python -m cli.presentation_pro_cli export-skill --output dist/skill.zip ``` ### CLI Commands @@ -412,9 +402,11 @@ presentation-pro-designer/SKILL.md If using the provided CLI: ```bash -python -m cli.presentation_pro_cli export-skill --output dist/skill.zip +python -m cli.presentation_pro_cli export-skill --target chatgpt ``` +Do not upload the Claude `.skill` package to ChatGPT unless ChatGPT explicitly supports that format. For ChatGPT, use `dist/skill.zip`. + ## Which File Should I Use? | Target | Use | @@ -440,8 +432,6 @@ dist/claude/CLAUDE_GUIDE.md See [`docs/platform-support.md`](docs/platform-support.md) for detailed platform instructions. -For detailed platform setup, see `docs/platform-support.md`. - For Claude-specific packaged distribution files, see `dist/claude/`. Supported usage patterns include: @@ -497,7 +487,7 @@ python -m cli.presentation_pro_cli validate-repo . Export the standalone skill: ```bash -python -m cli.presentation_pro_cli export-skill --output dist/presentation-pro-designer-skill.zip +python -m cli.presentation_pro_cli export-skill --target chatgpt ``` ## Roadmap @@ -516,7 +506,7 @@ Planned improvements: ## License -MIT License. See [`LICENSE`](LICENSE) and [`NOTICE.md`](NOTICE.md). +MIT License. See [`LICENSE.md`](LICENSE.md) and [`NOTICE.md`](NOTICE.md). Copyright (c) 2026 Tariq Said. diff --git a/cli/__pycache__/presentation_pro_cli.cpython-312.pyc b/cli/__pycache__/presentation_pro_cli.cpython-312.pyc index c785599..88b9ee1 100644 Binary files a/cli/__pycache__/presentation_pro_cli.cpython-312.pyc and b/cli/__pycache__/presentation_pro_cli.cpython-312.pyc differ diff --git a/cli/presentation_pro_cli.py b/cli/presentation_pro_cli.py index 7777d45..9f2bd81 100644 --- a/cli/presentation_pro_cli.py +++ b/cli/presentation_pro_cli.py @@ -37,11 +37,16 @@ def cmd_plan(args): def cmd_validate_repo(args): errors = [] - required = ["README.md", "LICENSE", "NOTICE.md", "skill.json", "marketplace.json", "skills/presentation-pro-designer/SKILL.md"] root = Path(args.path) + + required = ["README.md", "NOTICE.md", "skill.json", "marketplace.json", "skills/presentation-pro-designer/SKILL.md"] for rel in required: if not (root/rel).exists(): errors.append(f"Missing {rel}") + + if not ((root / "LICENSE.md").exists() or (root / "LICENSE").exists()): + errors.append("Missing LICENSE.md (or legacy LICENSE)") + if errors: print("Repository validation failed:") for e in errors: print(f"- {e}") diff --git a/examples/README.md b/examples/README.md index 640f4aa..004184c 100644 --- a/examples/README.md +++ b/examples/README.md @@ -325,7 +325,7 @@ You can copy any full prompt and: ## 📝 License -These examples and prompts are part of the Presentation Pro Designer skill and are available under the MIT License. See [LICENSE](../LICENSE) for details. +These examples and prompts are part of the Presentation Pro Designer skill and are available under the MIT License. See [LICENSE.md](../LICENSE.md) for details. --- diff --git a/skills/presentation-pro-designer/scripts/README.md b/skills/presentation-pro-designer/scripts/README.md index 5614576..2016a82 100644 --- a/skills/presentation-pro-designer/scripts/README.md +++ b/skills/presentation-pro-designer/scripts/README.md @@ -6,6 +6,7 @@ Helper scripts for deterministic tasks: - `clean.py`: clean unused parts from unpacked PPTX folders after low-level edits. - `add_slide.py`: duplicate or add slides in an unpacked PPTX workflow. - `route_request.py`: classify prompt text into a presentation route. +- `TEST_CASES.json`: baseline routing fixtures for manual regression checks. - `deck_manifest.py`: generate a reusable deck manifest from route output. - `validate_skill.py`: lightweight local skill-folder validation. diff --git a/skills/presentation-pro-designer/scripts/TEST_CASES.json b/skills/presentation-pro-designer/scripts/TEST_CASES.json new file mode 100644 index 0000000..f600a0b --- /dev/null +++ b/skills/presentation-pro-designer/scripts/TEST_CASES.json @@ -0,0 +1,12 @@ +[ + { + "name": "Corporate company profile routes to corporate", + "input": "Create a corporate company profile presentation for stakeholders, covering company overview, services, capabilities, and digital presence.", + "expected_type": "corporate" + }, + { + "name": "Explicit investor language routes to investor_deck", + "input": "Create an investor pitch deck for a Series A fundraising round including traction, valuation, and equity story.", + "expected_type": "investor_deck" + } +] diff --git a/skills/presentation-pro-designer/scripts/route_request.py b/skills/presentation-pro-designer/scripts/route_request.py index fe088c5..a9ddf42 100644 --- a/skills/presentation-pro-designer/scripts/route_request.py +++ b/skills/presentation-pro-designer/scripts/route_request.py @@ -6,15 +6,85 @@ ROUTES = { "education": ["lesson", "students", "learning objective", "syllabus", "classroom", "retrieval", "exit ticket", "teacher", "cpd", "workshop", "curriculum"], - "corporate": ["company profile", "corporate", "stakeholder", "leadership", "internal update", "capabilities", "business overview"], + "corporate": [ + "corporate", + "company profile", + "company overview", + "business overview", + "stakeholder", + "stakeholders", + "capabilities", + "services", + "service portfolio", + "about us", + "who we are", + "what we do", + "internal update", + "leadership update", + "company introduction", + ], "business_proposal": ["proposal", "scope", "deliverables", "client", "partnership", "implementation plan", "commercial"], "product_service": ["product", "service", "saas", "platform", "feature", "demo", "use case"], "verification_profile_claim": ["verification", "claim", "domain ownership", "profile", "official email", "tracxn", "ownership proof"], - "investor_deck": ["investor", "investors", "investment", "pitch deck", "fundraising", "valuation", "market size", "ticker", "eps", "revenue growth", "target price", "financials", "ask"], + "investor_deck": [ + "investor", + "investment", + "pitch deck", + "fundraising", + "raise", + "series a", + "seed round", + "pre-seed", + "valuation", + "traction", + "vc", + "venture capital", + "equity", + "investment committee", + "public company", + "ticker", + "eps", + "ebitda", + "target price", + "analyst estimate", + ], "data_report": ["kpi", "metrics", "dashboard", "performance", "trend", "analysis", "chart", "data report"], "pptx_editing": ["edit", "redesign", "improve attached", "existing pptx", "template"], } +EXPLICIT_INVESTOR_TERMS = { + "investor", + "investment", + "pitch deck", + "fundraising", + "raise", + "series a", + "seed round", + "pre-seed", + "valuation", + "traction", + "vc", + "venture capital", + "equity", + "investment committee", + "public company", + "ticker", + "eps", + "ebitda", + "target price", + "analyst estimate", +} + +CORPORATE_PROFILE_TERMS = { + "company profile", + "corporate", + "company overview", + "business overview", + "services", + "capabilities", + "stakeholders", +} + REFERENCE_MAP = { "education": ["education_decks.md", "brand_theme_protocol.md", "qa_checklists.md"], "corporate": ["corporate_decks.md", "brand_theme_protocol.md", "qa_checklists.md"], @@ -35,10 +105,24 @@ def classify(text: str) -> dict: hits = [] for kw in keywords: if kw in hay: - score += 3 if route == "investor_deck" and kw in ["investor", "investors", "investment", "fundraising", "valuation", "financials", "ask"] else (2 if " " in kw else 1) + if route == "investor_deck" and kw in EXPLICIT_INVESTOR_TERMS: + score += 2 + elif route == "corporate" and kw in CORPORATE_PROFILE_TERMS: + score += 2 + else: + score += 2 if " " in kw else 1 hits.append(kw) scores[route] = (score, hits) - route, (score, hits) = max(scores.items(), key=lambda kv: kv[1][0]) + + has_explicit_investor_signal = any(term in hay for term in EXPLICIT_INVESTOR_TERMS) + has_corporate_profile_signal = any(term in hay for term in CORPORATE_PROFILE_TERMS) + + if has_corporate_profile_signal and not has_explicit_investor_signal: + route = "corporate" + score, hits = scores[route] + else: + route, (score, hits) = max(scores.items(), key=lambda kv: kv[1][0]) + if score == 0: route = "generic_presentation" hits = []