Space methodology
ID: @artiroute/space-methodology
Статус: planned
Зависимости: нет (standalone)
Расширение методологии ведения проекта: этапы (stages), требуемые артефакты (пометка на реальном артефакте в Space), области исследования (per_area), опциональная генерация через ИИ.
Регистрирует тип пространства space-methodology.guided. Не оркестратор, не DAG, не блокировки переходов между этапами.
Заменяет по смыслу required-deliverables.
Назначение
| Вопрос | Ответ |
|---|---|
| Тип Space | space-methodology.guided — «Методология» (отдельный spaceTypeId) |
standard | Без methodology; кнопка «Сгенерировать с ИИ» остаётся на host /templategen |
| AI-flow? | Не пересекается |
| Закрытие требования | Артефакт с entity field «я — этот пункт методологии» |
| Как готовят артефакт | На усмотрение участников; расширение только задаёт список и опционально кнопку генерации |
| Блокировки этапов? | Нет — stages только визуал и % |
| Области | Только на guided Space с binding |
Четыре механики (один пакет)
| # | Механика | Суть |
|---|---|---|
| 1 | Stages | Упорядоченный список; % прогресса по обязательным артефактам |
| 2 | Артефакты методологии | Что должно быть в Space; привязка полем на core Artifact |
| 3 | Генерация | Чекбокс + сообщение в шаблоне; один skill /methodologygen |
| 4 | Области | per_area умножает один пункт на N областей |
Тип пространства space-methodology.guided
typescript
ctx.registerSpaceType({
id: 'space-methodology.guided',
label: 'Методология',
description: 'Space с этапами и требуемыми артефактами по шаблону методологии',
extensionId: '@artiroute/space-methodology',
});- Create: обязательный выбор шаблона методологии (
app.spaceCreatePanels). - Runtime: секции расширения видны только при
spaceTypeId === 'space-methodology.guided'. - Host не показывает «Сгенерировать с ИИ» из
/templategenна create flow guided Space — генерация только через вкладку методологии и skill расширения.
Принцип: пометка на артефакте
Требование шаблона: «в Space есть core-артефакт, который заявляет artifactKey этапа discovery» (+ areaId при per_area).
Способ появления любой: создать, загрузить, сгенерировать, назначить существующему.
Entity fields (artifact)
| key | filterable | Значение |
|---|---|---|
space-methodology.bindingId | да | ID binding snapshot |
space-methodology.artifactKey | да | Ключ пункта из шаблона (tz, risk-matrix) |
space-methodology.stageKey | да | Денормализация для фильтров |
space-methodology.areaId | да | ext.research_area.id или пусто |
space-methodology.statusKey | да | Текущий ключ статуса из statusWorkflow snapshot |
Уникальность на Space: (bindingId, artifactKey, areaId?).
Workflow-статусы
- Настройки инстанса (
defaultStatuses): список{ key, label, color }+doneStatusKey. - Шаблон (
definition.statusWorkflow): snapshot статусов, копируется в binding при применении. - Прогресс: обязательный слот считается выполненным (
isDone) только если артефакт привязан иstatusKey === doneStatusKey. - При assign / create+assign выставляется первый статус из workflow.
- При unassign поле
statusKeyудаляется. - Смена статуса:
POST /artifact-statusили UISplitButtonв инспекторе артефакта и toolbar редактора.
Модель данных
Шаблон методологии (библиотека)
Таблица ext.methodology_template:
| Колонка | Описание |
|---|---|
id | PK |
name | «Старт проекта» |
description | |
owner_id | |
visibility | private | org |
definition | JSON |
typescript
type MethodologyTemplateDefinition = {
stages: StageDef[];
artifacts: MethodologyArtifactDef[];
/** Нужно, если есть artifact с per_area */
areaGroups?: AreaGroupTemplateDef[];
};
type StageDef = {
key: string;
title: string;
description?: string;
sortOrder: number;
};
type AreaGroupTemplateDef = {
key: string;
name: string;
description?: string;
};
type MethodologyArtifactDef = {
key: string;
label: string; // название в UI
stageKey: string;
optional: boolean;
scope: 'single' | 'per_area';
areaGroupKey?: string; // при per_area; одна группа на пункт
templateId?: string | null; // core Template — опционально
generationEnabled: boolean;
generationMessage?: string; // текст user message при agentSend; пусто = skill без доп. текста
};В редакторе больше полей нет: без отдельного mime, без skill на пункт, без suggestedMime.
Binding на Space
Таблица ext.methodology_space_binding — snapshot definition при create / apply.
Области (runtime)
ext.research_area_group, ext.research_area — см. раздел Per_area.
При create guided Space: seed групп из definition.areaGroups; области добавляют участники.
Stages: только визуал и %
- Запрещено: locked, preconditions, «нельзя начать следующий этап».
- % этапа = закрытые обязательные ячейки / всего обязательных ячеек этапа.
- Этапы могут заполняться параллельно в любом порядке.
Per_area: умножение пункта
Пункт с scope: per_area и группой clients → по одной ячейке на каждую область в группе на Space.
expandArtifacts(binding, spaceId) — внутренний сервис (бывш. expandRoles).
Генерация: один skill /methodologygen
Расширение регистрирует один резолвер в backend.skillResolvers (по аналогии с host /templategen).
Когда skill доступен
listSkills: артефакт в контексте, на Space space-methodology.guided, у артефакта заполнен space-methodology.artifactKey, в snapshot binding для этого ключа generationEnabled: true.
resolveSkill('/methodologygen')
Собирает промпт из источников (все опциональны, кроме привязки к пункту):
- Пункт методологии —
generationMessageизMethodologyArtifactDef(если задан). - Шаблон core Template — если у пункта
templateIdи у Template естьsystemPrompt(как/templategen). - Метаданные: название пункта, stage, область (если
per_area).
typescript
// Псевдокод resolve
async function resolveMethodologyGen(ctx: SkillResolveContext): Promise<string | null> {
const artifact = await loadArtifact(ctx.artifactId);
const binding = await loadBinding(artifact.spaceId);
const itemKey = getField(artifact, 'space-methodology.artifactKey');
const def = findArtifactDef(binding.definition, itemKey);
if (!def?.generationEnabled) return null;
const parts: string[] = [];
if (def.generationMessage?.trim()) {
parts.push('## Задание методологии', def.generationMessage.trim());
}
if (def.templateId) {
const tpl = await loadTemplate(def.templateId);
if (tpl?.systemPrompt?.trim()) {
parts.push('## Инструкция шаблона', tpl.systemPrompt.trim());
}
}
return parts.join('\n\n') || 'Сгенерируй содержимое артефакта по методологии.';
}Skill не подменяет agentSend: в query передаётся generationMessage (или пустая строка / дефолт), skill добавляется при resolve на backend перед LLM — как остальные skills.
Поток кнопки «Сгенерировать»
На вкладке «Методология» (см. UI), для ячейки без привязанного артефакта и с generationEnabled:
text
1. createSpaceArtifact(name, mimeType из template или default, templateId?)
2. setArtifactMethodologyFields(artifactId, artifactKey, stageKey, areaId?)
3. router.push(buildArtifactEditorAgentLink(spaceId, artifactId, '/methodologygen', {
agentSend: def.generationMessage ?? '',
edit: '1',
}))
4. bootstrap agentSend с skipFlush (как для templategen)Если артефакт уже есть, но не привязан — только шаг 2–4. Если привязан — кнопка «Открыть» / повторная генерация по желанию участника.
Backend
Сервисы
| Сервис | Методы |
|---|---|
methodologyTemplates | CRUD |
methodologyBindings | get by spaceId |
methodologyProgress | getProgress → stages + expanded artifacts |
researchAreaGroups / researchAreas | CRUD на Space |
GraphQL (фрагмент)
graphql
query MethodologyProgress($spaceId: ID!) {
methodologyProgress(spaceId: $spaceId) {
stages { key title progressPercent requiredTotal requiredFilled }
items {
artifactKey stageKey label displayLabel optional areaId
filled artifactId
generationEnabled
canGenerate
}
}
}canGenerate = !filled && generationEnabled.
Abilities
| Ability | Зачем |
|---|---|
space-methodology.manageTemplates | CRUD шаблонов |
space-methodology.view | вкладка методологии, области |
space-methodology.assignArtifact | назначить пункт на артефакт |
space-methodology.manageAreas | группы и области |
space-methodology.generate | кнопка генерации (опционально отдельно от artifact.agentEdit) |
UI
Библиотека шаблонов (не Settings)
Маршруты из корня приложения (app.routes):
| Путь | Экран |
|---|---|
/methodology-templates | Список шаблонов |
/methodology-templates/:id | Редактор шаблона |
/methodology-templates/new | Создание |
В Настройках (/settings) шаблоны методологии не живут — там только instance/user settings.
Пункт в sidebar (например «Шаблоны методологии») — рядом с Templates, не внутри Settings.
Редактор шаблона
Без canvas. Два основных списка + опционально группы областей.
Таб «Этапы» — drag-reorder:
≡ Сбор данных
≡ Анализ
[+ Этап]Таб «Артефакты» — что нужно реализовать (не «роли»):
Этап: Анализ
┌─────────────────────────────────────────────────────┐
│ Название: [Техническое задание ] │
│ Шаблон: [Markdown — ТЗ ▼] (необязательно) │
│ ○ Один артефакт ● По областям исследования │
│ Группа областей: [Клиенты ▼] │
│ ☐ Обязательный │
│ ☑ Генерация с ИИ │
│ Сообщение: [Сформируй ТЗ на основе устава…] │
└─────────────────────────────────────────────────────┘
[+ Артефакт]Таб «Группы областей» — только если есть хотя бы один артефакт с «По областям»:
• Клиенты (key: clients)
[+ Группа]Create Space (space-methodology.guided)
app.spaceCreatePanels:
Тип: [Методология ▼]
Шаблон методологии: [Старт проекта ▼] (обязательно)Submit: createSpace + snapshot binding + seed area groups.
Runtime Space
Вкладка «Методология» (app.spaceSections)
Основной рабочий экран — список артефактов по этапам, прогресс %:
┌─ Методология ────────────────────────────────────────┐
│ Сбор данных 67% ████░░ │
│ ☑ Устав → открыть │
│ ☐ ТЗ [Сгенерировать] ← generationEnabled │
│ │
│ Анализ 25% ██░░░░ │
│ ☐ Профиль — Клиент А [Сгенерировать] │
│ ☐ Профиль — Клиент Б [Назначить…] │
└──────────────────────────────────────────────────────┘- Сгенерировать — только если ячейка не
filledиgenerationEnabled; flow выше. - Назначить — picker существующего артефакта +
artifactKey/areaId. - Без отдельной кнопки host
/templategenна этом типе Space.
Вкладка «Области исследования»
CRUD групп и областей (если в шаблоне есть per_area).
Дерево артефактов
Стандартная секция артефактов без изменений; инспектор — назначение пункта методологии.
Инспектор артефакта
app.uiSlots space.artifact.inspector:
- Пункт методологии (select из snapshot);
- Область — если пункт
per_area; - Сброс привязки.
Registries
| Registry | Назначение |
|---|---|
backend.spaceTypes | space-methodology.guided |
backend.entityFields | поля на artifact |
backend.entityHooks | validate artifactKey + areaId |
backend.spaceAbilities | abilities |
backend.skillResolvers | /methodologygen (один) |
app.routes | /methodology-templates |
app.spaceCreatePanels | guided create |
app.spaceSections | Методология + Области |
app.uiSlots | inspector |
Отличие от standard и AI-flow
standard | space-methodology.guided | ai-flow.automatic | |
|---|---|---|---|
| Методология | нет | да | свой DAG |
| Генерация | /templategen (host) | /methodologygen + вкладка | оркестратор |
| Stages | — | визуал + % | DAG |
Реализация (чеклист)
- [ ]
registerSpaceType('space-methodology.guided') - [ ] Таблицы template, binding, area_*
- [ ] Entity fields + hooks
- [ ]
expandArtifacts,getProgress - [ ] Routes
/methodology-templates - [ ] Editor: stages + artifacts + area groups
- [ ] Space tab «Методология» + generate flow
- [ ] Skill
/methodologygen - [ ] Create panel guided Space