skills/project-knowledge-base/SKILL.md
Collects, structures and maintains a Project Knowledge Base (PKB.md) in Obsidian for a marketing agency. Aggregates data from Google Drive, Gmail, Telegram (group chat and DMs via MTProto), moo.team tasks/comments, and local Obsidian meeting transcripts. Uses async parallel collection and a two-stage LLM pipeline for init. Use when the user wants to initialize, update or enrich a project's knowledge base, mentions PKB, project knowledge base, синхронизация проекта, база знаний проекта, init_project_knowledge, update_project_knowledge, or ad_hoc_add_context.
npx skillsauth add ai-mindset-org/pos-sprint project-knowledge-baseInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Manages structured Markdown knowledge-base cards for marketing agency projects stored in Obsidian.
Sources (collected in parallel): Google Drive · Gmail · Telegram group · Telegram DMs · moo.team · Obsidian transcripts
This skill processes potentially sensitive client and agency data.
OpenAI or Anthropic).3.11 (repo pin: root .python-version).env.example → .env and fill in all values (local file only, do not commit)LLM_PROVIDER to openai or anthropicpip install -r requirements.txtpip install -r requirements-dev.txt_projects_index.yaml exists at $OBSIDIAN_VAULT_PATH/$PROJECTS_INDEX_PATHpython skill.py init <project_id> --history-days 1python skill.py init <project_id> [--history-days 180]
Uses two-stage LLM pipeline: collect all sources in parallel → summarize each source in parallel → single LLM call to build PKB.
python skill.py update <project_id> [--force-sources tg_group tg_dm ...]
Reads last_sync_at from frontmatter; collects only newer data → single LLM call.
Available --force-sources values: google_drive, gmail, tg_group, tg_dm, mootem, obsidian
python skill.py add-context <project_id> \
--type text|file_path|gmail_message_id|telegram_messages|mootem_task_id \
--data "<content or identifier>"
Does not update last_sync_at.
project-knowledge-base/
├── SKILL.md
├── skill.py # entry point / CLI
├── pytest.ini # asyncio_mode = auto
├── pipelines/
│ ├── init_pipeline.py # Approach B: collect → summarize per source → build PKB
│ └── update_pipeline.py # Approach A: collect → single LLM update
├── sources/
│ ├── google_drive.py # Google Drive API v3
│ ├── gmail.py # Gmail API
│ ├── telegram_group.py # Group chat (async Telethon)
│ ├── telegram_dm.py # DMs with relevance filter (async Telethon)
│ ├── telegram_utils.py # Shared: TelegramCredentials, resolve_offset, serialize_message
│ ├── mootem.py # moo.team REST API
│ └── obsidian_notes.py # Local .md transcripts
├── utils/
│ ├── models.py # SourceResult dataclass
│ ├── logger.py # PKBLogger → logs/{project_id}/{timestamp}.log
│ ├── project_index.py # _projects_index.yaml parser
│ ├── pkb_writer.py # Atomic write via os.replace()
│ └── llm_processor.py # Claude API: summarize_source / build_pkb_from_summaries / update_pkb
├── tests/
│ ├── sources/ # test_telegram.py, test_sources_async.py
│ ├── pipelines/ # test_init_pipeline.py, test_update_pipeline.py
│ └── utils/ # test_models.py, test_logger.py, test_pkb_writer.py, test_llm_processor.py
├── logs/ # {project_id}/{timestamp}.log (auto-created)
├── template/
│ └── pkb_template.md
├── .env.example
└── requirements.txt
| | init (180 days) | update (since last_sync_at) |
|---|---|---|
| Data volume | Large — full history | Small — only new data |
| Stage 1 | Parallel async collection | Parallel async collection |
| Stage 2 | Parallel LLM summarize per source | — |
| Stage 3 | build_pkb_from_summaries() | update_pkb() — single call |
| moo.team | Formatted as Markdown table (no LLM) | Same |
When init, update, or add-context calls the LLM layer, the skill sends project content to the configured provider API.
init: raw source payloads are summarized per source, then merged into a full PKB documentupdate: new raw source payloads are sent together with the current PKB to generate an updated documentadd-context: the provided context is sent together with the current PKBDo not use production client data with this skill unless that transfer is explicitly allowed.
Each source is wrapped in try/except. Failures are logged but do not abort the pipeline. The run always ends with a summary printed to stdout:
─── Сводка синхронизации ───
✅ google_drive — 23 items
✅ gmail — 8 items
❌ tg_group — session expired
✅ mootem — 41 items
⚠️ PKB обновлён без: tg_group
Повтор: python skill.py update <id> --force-sources tg_group
| Source | PKB sections populated | |--------|----------------------| | Google Drive | Описание проекта, Цели и KPI, Текущая реклама, Ссылки и артефакты | | Gmail | История решений, Хронология, Контакты | | Telegram group | История решений, Хронология, Задачи | | Telegram DMs | История решений, Тонкости работы с клиентом | | moo.team | Задачи (таблица), История решений | | Obsidian transcripts | История решений, Хронология, Тонкости |
A DM message is included if it matches any of:
project_name (stem-prefix matching for Russian morphology)domainskeywordsnew-app\.moo\.team/{workspace_path_part}/projects/{project_id}/Where:
workspace_path_part — path segment from moo.team URL after domain (e.g. WSbawtbSmV in new-app.moo.team/WSbawtbSmV/projects/16390)channels.moo_team_workspace_path_partchannels.moo_team_workspace_slug is still supportedpip install -r requirements-dev.txt
pytest tests/ -v
ruff check .
ruff format --check .
mypy .
pytest -v
requirements.in — runtime direct dependenciesrequirements-dev.in — dev tooling + -r requirements.inrequirements.txtrequirements-dev.txtPIP_TOOLS_CACHE_DIR=.pip-tools-cache pip-compile --resolver=backtracking requirements.in
PIP_TOOLS_CACHE_DIR=.pip-tools-cache pip-compile --resolver=backtracking requirements-dev.in
.env.example in VCS; real .env stays local.google_token.json and *.session local only; never commit runtime auth artifacts..venv, logs/, .mypy_cache/, .pytest_cache/, .ruff_cache/, and .pip-tools-cache/ out of VCS..gitignore from this folder in place; it is part of the security boundary for publication..env and revoke stale OAuth/session tokens.docs/plans/2026-03-07-p0-secret-rotation-checklist.mdBefore opening a PR to a public repository:
.env, google_token.json, *.session, logs, caches, and local virtualenv files are absent.testing
# YT Transcribe — YouTube → Whisper → Obsidian Транскрибирует YouTube-видео через mlx-whisper (Apple Silicon, Metal-native) с параллельными чанками. Fallback на openai-whisper если mlx недоступен. ## Какую боль закрывает - **Потерянный контент видео**: Посмотрел лекцию/подкаст — через неделю забыл 90%. Нет текстовой базы для поиска. - **Нет транскриптов для русского**: YouTube auto-captions для русского языка — мусор. Whisper даёт quality транскрипцию. - **Ручная обработка**: Переслушивать 2-
development
Интерактивный процесс написания текстов для вайб-маркетинга на основе Julian Shapiro framework. **Новые возможности (v2.0):** - Research & Gap Analysis (Perplexity → WebSearch fallback) - Scoring 0-5 вместо binary (Novelty + Resonance + Hook + Clarity) - AI-Slop Detection на всех этапах (10 типов patterns) - 3 варианта intro с self-scoring - Markdown export всех промежуточных результатов **Русские triggers:** "напиши пост по шапиро", "написать статью по фреймворку шапиро", "создай текст в стиле julian shapiro", "помоги написать контент по методу shapiro", "контент по julian shapiro фреймворку", "пост по julian shapiro", "напиши в стиле шапиро" **English triggers:** "write content using julian shapiro framework", "create post with shapiro method", "write article shapiro style", "help with julian shapiro writing" **Generic triggers:** "напиши статью", "помоги написать контент", "создай текст", "начать писать", "хочу написать пост", "нужна помощь с текстом", "write content", "write article", "создай контент", "придумай идею для статьи", or requests help with content creation process.
tools
# /tg-saved v2 — Telegram Saved Messages → Deep Analysis → Obsidian ## Назначение Скилл извлекает сообщения из Telegram "Избранное" (Saved Messages) за последние N дней, автоматически парсит контент всех ссылок в сообщениях (requests + BeautifulSoup, до 5000 символов на URL), затем для каждого сообщения запускает глубокий анализ через Claude CLI subprocess (модель Sonnet). Результат — подробная структурированная заметка в Obsidian `00-inbox/` с YAML frontmatter, секциями анализа, ссылками и ор
documentation
Делает LLM-выжимку из комментариев менеджеров об одном или нескольких подрядчиках. Используй этот скилл когда нужно понять что говорят менеджеры о конкретном подрядчике, или получить JSON с выжимкой для дальнейшей обработки.