# Mm Init Project

> Инициализирует или обновляет проект для mm-системы — создаёт passport.md в корне, копию в Obsidian, dashboard.md, handoff.md (скелет), project-instructions.md для claude.ai. Use when user says "оформи проект", "сделай паспорт", "init project", "/mm-init", "/mm-init-project", "обнови паспорт", "регистрирую проект". Работает на пустой папке (новый проект) и на существующем коде с любыми .md файлами…

- **Type:** Skill
- **Install:** `agentstack add skill-mworldorg-markdown-memory-mm-init-project`
- **Verified:** Yes — security-reviewed for prompt injection and unsafe behavior
- **Seller:** [mworldorg](https://agentstack.voostack.com/s/mworldorg)
- **Installs:** 0
- **Category:** [Data & Analytics](https://agentstack.voostack.com/c/data-and-analytics)
- **Latest version:** 0.1.0
- **License:** MIT
- **Upstream author:** [mworldorg](https://github.com/mworldorg)
- **Source:** https://github.com/mworldorg/markdown-memory/tree/main/skills/mm-init-project

## Install

```sh
agentstack add skill-mworldorg-markdown-memory-mm-init-project
```

Requires the [AgentStack CLI](https://agentstack.voostack.com/docs/cli). Works with Claude Code, Cursor, and any MCP-compatible agent.

## About

# mm-init-project — Project Bootstrap & Refresh (safe edition)

Создаёт «паспорт» проекта — единый источник контекста для claude.ai Project Knowledge и для всех mm-* skills. **Всегда показывает план перед записью**, никогда не уничтожает чужие .md файлы.

## Контракт безопасности (это важно — соблюдай дословно)

**Skill ПИШЕТ только в эти файлы:**
- `/passport.md` — создаёт или обновляет
- `/CLAUDE.md` — **только** добавляет секции `## Obsidian Knowledge Vault` и `## mm-system` если их нет; **никогда** не редактирует существующие секции
- `/.gitignore` — добавляет правила для игнорирования локальных настроек Obsidian (`.vault/.obsidian/`)
- Файлы Obsidian Vault (хранилище в `/.vault/` при локальном режиме или `//` при глобальном режиме):
  - `00-home/index.md` — карта всех заметок
  - `00-home/текущие приоритеты.md` — текущие приоритеты
  - `00-home/project-instructions.md` — инструкции для claude.ai
  - `handoff.md` — создаёт **скелет** на старте (в корне хранилища)
  - `atlas/passport.md` — копия паспорта проекта
  - `atlas/архитектура проекта.md` — описание архитектуры
  - `atlas/база данных.md` — схема БД
  - `atlas/деплой.md` — информация о деплое
  - Создает папки `knowledge/integrations/`, `knowledge/decisions/`, `knowledge/debugging/`, `knowledge/patterns/`, `knowledge/business/`, `sessions/`, `inbox/` if they don't exist.

**Skill ТОЛЬКО ЧИТАЕТ (никогда не редактирует):**
- README.md, ARCHITECTURE.md, NOTES.md, OVERVIEW.md, CONTEXT.md, DESIGN.md, ROADMAP.md, TODO.md, BUGS.md, DECISIONS.md, и любые другие *.md в проекте
- package.json, pyproject.toml, requirements.txt, go.mod, Cargo.toml, pom.xml
- .env.example (не .env!)
- Dockerfile, docker-compose.yml, railway.json, vercel.json
- .git/config, git log, git status

**Skill НЕ ТРОГАЕТ ВООБЩЕ:**
- `.env`, `*.key`, `*.pem`, `secrets/` — даже не читает значения
- node_modules/, .venv/, dist/, build/, target/
- Файлы вне `` за исключением Obsidian-папки из конфига

**Перед любой записью** — обязательная фаза Preview (см. ниже). Без подтверждения `y` — ничего не пишется.

## Конфиг

Загрузи `mm-config.json` по алгоритму из `/docs/CONFIG-LOADING.md`. Поддержка `mm-config.local.json` overlay обязательна. `` берётся из `_repo_root` инжектированного loader'ом.

Понадобятся:
- `paths.obsidian_projects`
- `_repo_root` (для `templates/passport.md` и `templates/project-instructions.md`)
- `bot_defaults.*`
- `default_language`

## Фаза 0. Определи целевую папку (worktree-aware)

**Целевая папка** = «корень проекта», не «cwd как есть».

Алгоритм:
1. Возьми `cwd`.
2. Если в пути есть подстрока `\.claude\worktrees\` или `/.claude/worktrees/` — это worktree. Найди корневой репо:
   - Прочитай `/.git` (это файл-указатель, не папка). Извлеки `gitdir: `. Из него выведи main repo path.
   - Если не получилось — спроси: `Это git worktree. Какую папку считать корнем проекта? `.
3. Иначе — поднимись от `cwd` пока не найдёшь `.git/` (папку, не файл) или `package.json` / `pyproject.toml` / любой явный маркер корня. Если ничего нет — `cwd` и есть корень.

**Имя проекта** = basename целевой папки. Покажи: `Имя проекта:  (целевая папка: ). Ок? (y/n или новое имя)`.

## Фаза 1. Discovery (что уже есть в проекте)

Просканируй и **выведи отчёт пользователю** перед любыми действиями.

### 1a. Существующие паспорта (миграция)

Поищи (case-insensitive) в `` и `/docs/`:
- `passport.md`, `PASSPORT.md`, `Passport.md`, `passport.MD` — варианты case
- `PROJECT_PASSPORT.md`, `project_passport.md` — старая louise-система (`Claude Setup/`)
- `*_passport.md`, `passport_*.md`

Любой найденный — **кандидат на миграцию**, не конфликт-блокер.

### 1b. Документы которые могут содержать контекст

Просканируй `*.md` в:
- `/` (корень)
- `/docs/`, `/notes/`, `/_docs/`
- `/.planning/` (GSD-документы)

Распознай семантически по имени (case-insensitive substring):
| В имени есть | Категория |
|---|---|
| `readme` | Описание / overview |
| `architecture`, `design`, `arch` | Архитектура |
| `overview`, `context`, `intro` | Контекст |
| `notes`, `ideas` | Заметки |
| `decisions`, `adr`, `rfc` | Решения |
| `roadmap`, `plan` | Планы |
| `todo`, `tasks`, `backlog` | Задачи |
| `bugs`, `issues`, `known-issues` | Проблемы |
| `changelog`, `history` | История |
| `claude` (CLAUDE.md, claude-rules.md) | Правила для AI |

Прочитай **первые 50 строк** каждого найденного файла — для понимания.

### 1c. Маркеры стека (auto-detection)

**Manifest-файлы** — прочитай если есть:
- `package.json`, `pyproject.toml`, `requirements.txt`, `go.mod`, `Cargo.toml`, `pom.xml`, `composer.json`, `Gemfile`, `mix.exs`, `pubspec.yaml`
- `Dockerfile`, `docker-compose.yml`, `railway.json`, `vercel.json`, `fly.toml`, `Procfile`
- `.env.example`, `.env.template` (не `.env`!)
- `tsconfig.json`, `next.config.*`, `vite.config.*`, `astro.config.*`, `nuxt.config.*`, `svelte.config.*`, `remix.config.*`
- `.python-version`, `.nvmrc`, `.tool-versions`, `runtime.txt`

**Auto-detection: пакет → стек** (по подстроке в зависимостях):

| Если в зависимостях | Тип | Фреймворк | Категория |
|---|---|---|---|
| `aiogram`, `python-telegram-bot`, `telethon`, `pyrogram`, `telegraf`, `grammy` | bot | по имени | tg-bot |
| `discord.py`, `discord.js`, `discordeno` | bot | по имени | discord-bot |
| `fastapi`, `flask`, `django`, `starlette`, `litestar`, `quart`, `sanic`, `bottle`, `pyramid` | web | по имени | python-web |
| `express`, `koa`, `hapi`, `fastify`, `nest`, `polka`, `hono`, `elysia` | web | по имени | node-web |
| `next`, `nuxt`, `astro`, `remix`, `sveltekit`, `gatsby`, `solid-start`, `qwik` | web | по имени | meta-framework |
| `react`, `vue`, `svelte`, `solid-js`, `preact`, `lit`, `htmx` | web | по имени | spa-frontend |
| `gin`, `echo`, `fiber`, `chi`, `gorilla/mux`, `huma` | web | по имени | go-web |
| `actix-web`, `axum`, `rocket`, `warp`, `tide`, `salvo` | web | по имени | rust-web |
| `rails`, `sinatra`, `hanami`, `roda` | web | по имени | ruby-web |
| `phoenix`, `plug` | web | по имени | elixir-web |
| `laravel`, `symfony`, `slim` | web | по имени | php-web |
| `sqlalchemy`, `sqlmodel`, `alembic`, `tortoise-orm`, `peewee`, `pydantic` | — | — | python-db |
| `prisma`, `drizzle`, `kysely`, `typeorm`, `sequelize`, `mongoose`, `mikro-orm` | — | — | node-db |
| `gorm`, `ent`, `sqlx`, `bun`, `pgx` | — | — | go-db |
| `diesel`, `sea-orm`, `sqlx` (rust) | — | — | rust-db |
| `pytest`, `unittest`, `nose2`, `tox` | — | тесты Python | testing |
| `vitest`, `jest`, `mocha`, `playwright`, `cypress`, `ava`, `tap` | — | тесты JS | testing |
| `cargo test` (default), `nextest` | — | тесты Rust | testing |
| `loguru`, `structlog`, `winston`, `pino`, `zap`, `tracing`, `slog` | — | логирование | observability |
| `pydantic`, `zod`, `joi`, `yup`, `ajv`, `valibot`, `arktype` | — | валидация | validation |
| `openai`, `anthropic`, `litellm`, `langchain`, `llama-index`, `instructor` | — | — | ai-llm |
| `huggingface`, `transformers`, `torch`, `tensorflow`, `jax`, `keras` | — | — | ai-ml |
| `pandas`, `polars`, `numpy`, `scipy`, `dask` | — | — | data |
| `dlt`, `airflow`, `prefect`, `dagster`, `kafka-python`, `aiokafka` | — | — | pipelines |
| `redis`, `aioredis`, `kombu`, `celery`, `rq`, `bullmq` | — | — | queue/cache |
| `scrapy`, `playwright`, `puppeteer`, `selenium`, `httpx`, `aiohttp` | — | — | scraping/http |
| `tauri`, `electron`, `wails` | — | — | desktop |

**Файловые маркеры (если manifest неоднозначен):**
- `*.tsx` / `*.jsx` → React
- `*.vue` → Vue
- `*.svelte` → Svelte
- `*.astro` → Astro
- `app/page.tsx` → Next.js App Router
- `pages/*.tsx` → Next.js Pages Router
- `wrangler.toml` → Cloudflare Workers
- `serverless.yml` → Serverless Framework
- `terraform/`, `*.tf` → Terraform
- `helm/`, `Chart.yaml` → Kubernetes Helm

**Combo-recognition (комплекты):**
- React + TypeScript + Tailwind + shadcn → пометить «modern react stack»
- FastAPI + Pydantic + sqlmodel + pytest → пометить «modern python web»
- aiogram + sqlmodel + loguru → пометить «default bot stack» (из bot_defaults конфига)
- Наличие `telethon` в зависимостях → установить внутренний флаг `telethon_project: true`
- Наличие фреймворков категории `tg-bot` (`aiogram`, `python-telegram-bot`, `telegraf`, `grammy` и др.) в зависимостях → установить внутренний флаг `tg_bot_project: true`

**Приоритет определения типа** (когда несколько матчей):
1. tg-bot / discord-bot (если есть бот-фреймворк) — `bot`
2. meta-framework (Next/Nuxt/Astro/Remix) — `web`
3. python-web / node-web / go-web / rust-web — `web`
4. spa-frontend без backend — `web` (frontend-only)
5. ai-ml / ai-llm + entry point — `script` или `service`
6. data / pipelines — `script`
7. desktop — `desktop`
8. lib (если в `pyproject.toml` `[project]` без entry point ИЛИ в `package.json` `main` без `bin`) — `lib`
9. иначе — `script`

**Версии:**
- Питон: из `.python-version` или `pyproject.toml` `requires-python`
- Node: из `.nvmrc`, `engines.node` в package.json
- Go: из `go.mod` строка `go X.Y`
- Rust: из `rust-toolchain.toml` или edition в `Cargo.toml`

### 1d. Git-контекст

```bash
git rev-parse --show-toplevel
git remote -v
git branch --show-current
git log --oneline -10
```

### 1e. Системы которые могут конфликтовать (dual-detection GSD)

**GSD detection** (определи версию):
- `/.planning/` существует:
  - Если `/.planning/config.json` существует → **GSD Core**. В passport frontmatter `gsd_version: core`.
  - Иначе → **GSD v1**. В passport frontmatter `gsd_version: v1`.
- `/.gsd/` существует → **GSD v2**. В passport frontmatter `gsd_version: v2`.
- Оба → **смешанный** (редкость, после миграции). Спроси: какой считать активным?
- Ни одного → `gsd_version: none`.

**Если GSD есть — попробуй импортировать scope/requirements** (чтобы не дублировать):

GSD v1 (`.planning/`):
- `PROJECT.md` → vision, audience, goals → секция 1 (Назначение) + секция 3 (Архитектура краткая)
- `REQUIREMENTS.md` → REQ-001..N → можно вытащить топ-5 в секцию 4 как «функциональные требования» (опционально)
- `ROADMAP.md` → phases, статусы → секция 9 паспорта строка `Текущий milestone / phase: >`
- `STATE.md` → current phase / position → секция 10 «В работе сейчас»
- `codebase/STACK.md`, `codebase/ARCHITECTURE.md`, `codebase/CONVENTIONS.md`, `codebase/CONCERNS.md` → если есть, переносим в секции 2, 3, 7, 10 паспорта (НЕ дублируя — кратко + ссылка `см. .planning/codebase/STACK.md`)

GSD v2 (`.gsd/`):
- `gsd.db` (SQLite) → если можешь прочитать через sqlite3 CLI/Python — извлеки текущий milestone/slice/task; иначе пропусти
- `STATE.md` (rendered dashboard) → парсинг как у v1
- `AGENTS.md` → preferences для агентов → ссылка в секции 7 паспорта

**Важное правило про дубликацию:**
- Если в `.planning/PROJECT.md` уже есть подробное описание проекта — в секции 1 паспорта пиши **краткое summary + ссылку** (`см. .planning/PROJECT.md`), не копируй целиком.
- В секции 9 явно укажи source-of-truth: `Source-of-truth для scope/requirements: .planning/PROJECT.md`. Это нужно чтобы будущий читатель не запутался какой документ актуальный.

**Никогда не пиши в `.planning/*` или `.gsd/*` напрямую** — там file-lock'и, hook'и-охранники GSD. Только читать.

**`CLAUDE.md`** → читай, оценивай размер: маленький (/passport.md` И `/Projects//passport.md`:
- Сравни sha256 содержимого (или хотя бы mtime + size).
- Если **расходятся** — это значит юзер редактировал одну из копий (например в Obsidian app). Покажи в Discovery:
  ```
  ⚠️ Рассинхрон: passport.md в проекте и в Obsidian отличаются.
     Проект:  updated , sha 
     Obsidian: updated , sha 

     Какую версию считать source-of-truth?
     [1] Проект (Obsidian перезапишется) — дефолт
     [2] Obsidian (проект перезапишется)
     [3] Show diff first
     [4] Cancel
  ```
- Запомни выбор для фазы 4 (write).

### 1g. Вывод фазы Discovery (покажи пользователю)

```
🔍 Discovery: 

Целевая папка: 
Git: ,  коммитов, remote: 

Найдено существующих паспортов:
  • PROJECT_PASSPORT.md  ← старая louise-система, можно мигрировать
  • passport.md          ← текущий формат, режим update
  (или: «не найдено»)

Найдено документов с контекстом:
  • README.md (описание)
  • docs/architecture.md (архитектура)
  • NOTES.md (заметки)
  (используются ТОЛЬКО для чтения — не будут изменены)

GSD detection:
  • Версия: 
  • PROJECT.md: 
  • REQUIREMENTS.md: 
  • Текущий milestone: 
  • codebase/: 

Стек определён (auto-detection):
  • Язык: Python 3.12 (из .python-version)
  • Фреймворк: aiogram 3.x (из pyproject.toml)
  • DB: SQLite через sqlmodel
  • Тесты: pytest
  • Логирование: loguru
  • Тип: bot (combo: «default bot stack»)

Существующий CLAUDE.md:  строк, добавлю секцию mm-system / большой — спрошу>
```

## Фаза 2. Решения (если нужны)

Задай только реально неопределённые вопросы (максимум 3-4):

1. **Расположение Obsidian Vault (КРИТИЧНО):**
   Спроси пользователя, где хранить базу знаний (Obsidian Vault):
   ```
   Выберите расположение Obsidian Vault для проекта:
   [1] Локально в папке проекта (рекомендуется: /.vault/, версионируется в git, синхронизируется с claude.ai автоматически) — дефолт
   [2] Глобально в папке Obsidian (из конфига: //)
   ```

2. **Если найден PROJECT_PASSPORT.md** или другой кандидат миграции:
   `Найден старый паспорт . Мигрировать его контент в новый passport.md? (y = мигрировать, переименую старый в .legacy / n = игнорировать)`

3. **Если есть passport.md И он явно устарел** (mtime старше 30 дней или git log показывает много коммитов после updated):
   Просто переходи в режим update без вопроса.

4. **Если CLAUDE.md > 30 строк**:
   `CLAUDE.md существует и непустой ( строк). Добавить правила базы знаний в конец? (y/n)`

5. **Если папка пустая** (новый проект):
   - Тип: bot / web / lib / script?
   - Язык / фреймворк? (для bot — дефолт `aiogram` из bot_defaults)
   - Назначение в одном предложении?

6. **Если в выбранной директории Vault уже есть файлы**:
   `В директории базы знаний уже есть файлы. Update (y) / Создать папку с суффиксом -2 (n) / Отмена (c)?`

7. **Если есть GSD (`.planning/PROJECT.md` или `.gsd/`) и режим init**:
   `Найден . Импортировать описание/scope в секции 1, 3 паспорта (y) / только сослаться, не дублировать (n) / отмена (c)? Дефолт n — паспорт ссылается, не дублирует.`

Если пользователь говорит «решай сам» — выбирай разумный дефолт, отмечай в финальном отчёте ``.

## Фаза 3. План записи (Preview / Dry-run)

**Это обязательная фаза. Без подтверждения — НИЧЕГО не пишется.**

Покажи пользователю полный план в формате:

```
📋 План записи

Расположение Obsidian Vault: )>

СОЗДАМ:
  + /passport.md (новый файл,  секций)
    Источники: README.md, package.json, etc.
  + /00-home/index.md (карта всех заметок)
  + /00-home/текущие приоритеты.md (активные приоритеты)
  + /00-home/project-instructions.md (инструкции для claude.ai)
  + /handoff.md (скелет)
  + /atlas/passport.md (копия паспорта)
  + /atlas/архитектура проекта.md (архитектура)
  + /atlas/база данных.md (схемы БД)
  + /atlas/деплой.md (информация о деплое)
  + /knowledge/integrations/ (папка)
  + /knowledge/decisions/ (папка)
  + /knowledge/debugging/ (папка)
  + /knowledge/patterns/ (папка)
  + /knowledge/business/ (папка)
  + /sessions/ (папка для логов сессий)
  + /inbox/ (папка для входящего)

ИЗМЕНЮ:
  ~ /CLAUDE.md (добавлю правила Obsidian Knowledge Vault, +18 строк)
  
  ~ /.gitignore (добавлю .vault/.obsidian/ в конец, +2 строки)

ПЕРЕИМЕНУЮ:
  → PROJECT_PASSPORT.md → PROJECT_PASSPORT.md.legacy

НЕ ТРОНУ:
  README.md, .planning/*, .env, src/

Continue? (y / n / edit)
```

`edit` → дай возможность изменить план: «Не переименовывай PROJECT_PASSPORT» / «Не трогай CLAUDE.md» / «Не создавай dashboard» — пользователь редактирует список через простой dialog, ты применяешь.

`n` → останови, ничего не пиши.

`y` → переходи к фазе 4.

## Фаза 4. Запись (atomic: всё или ничего)

Делай в этом порядке. Если хоть один шаг падает — **откати уже сделанное** (удали созданные файлы, восстанови переименованный):

### 4.1. Сгенерируй текст passport.md в памяти

Возьми шаблон `/templates/passport.md`. Заполни:

- **Секции 1-7, 9** — из discovery (ст

…

## Source & license

This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.

- **Author:** [mworldorg](https://github.com/mworldorg)
- **Source:** [mworldorg/markdown-memory](https://github.com/mworldorg/markdown-memory)
- **License:** MIT

Install and usage instructions live in the source repository linked above.

## Pricing

- **Free** — Free

## Security capabilities

Automated source analysis of v0.1.0 — what this tool can access:

- **Network access:** yes
- **Filesystem access:** no
- **Shell / process execution:** no
- **Environment & secrets:** yes
- **Dynamic code execution:** no

*"Yes" means the capability is present in the source — more access means more to trust, not that it is unsafe.*


## Versions

- **0.1.0** — security scan: passed — Imported from the upstream source.

## Links

- Listing page: https://agentstack.voostack.com/l/skill-mworldorg-markdown-memory-mm-init-project
- Seller: https://agentstack.voostack.com/s/mworldorg
- Browse the marketplace: https://agentstack.voostack.com/browse

---
Listed on AgentStack — the marketplace for AI agent skills and MCP servers. Every listing is security-reviewed. Creators keep 70%.
