Skip to content

Space methodology

ID: @artiroute/space-methodology
Статус: planned
Зависимости: нет (standalone)

Расширение методологии ведения проекта: этапы (stages), требуемые артефакты (пометка на реальном артефакте в Space), области исследования (per_area), опциональная генерация через ИИ.

Регистрирует тип пространства space-methodology.guided. Не оркестратор, не DAG, не блокировки переходов между этапами.

Заменяет по смыслу required-deliverables.

Назначение

ВопросОтвет
Тип Spacespace-methodology.guided — «Методология» (отдельный spaceTypeId)
standardБез methodology; кнопка «Сгенерировать с ИИ» остаётся на host /templategen
AI-flow?Не пересекается
Закрытие требованияАртефакт с entity field «я — этот пункт методологии»
Как готовят артефактНа усмотрение участников; расширение только задаёт список и опционально кнопку генерации
Блокировки этапов?Нет — stages только визуал и %
ОбластиТолько на guided Space с binding

Четыре механики (один пакет)

#МеханикаСуть
1StagesУпорядоченный список; % прогресса по обязательным артефактам
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)

keyfilterableЗначение
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 или UI SplitButton в инспекторе артефакта и toolbar редактора.

Модель данных

Шаблон методологии (библиотека)

Таблица ext.methodology_template:

КолонкаОписание
idPK
name«Старт проекта»
description
owner_id
visibilityprivate | org
definitionJSON
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')

Собирает промпт из источников (все опциональны, кроме привязки к пункту):

  1. Пункт методологииgenerationMessage из MethodologyArtifactDef (если задан).
  2. Шаблон core Template — если у пункта templateId и у Template есть systemPrompt (как /templategen).
  3. Метаданные: название пункта, 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

Сервисы

СервисМетоды
methodologyTemplatesCRUD
methodologyBindingsget by spaceId
methodologyProgressgetProgress → stages + expanded artifacts
researchAreaGroups / researchAreasCRUD на 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.manageTemplatesCRUD шаблонов
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.spaceTypesspace-methodology.guided
backend.entityFieldsполя на artifact
backend.entityHooksvalidate artifactKey + areaId
backend.spaceAbilitiesabilities
backend.skillResolvers/methodologygen (один)
app.routes/methodology-templates
app.spaceCreatePanelsguided create
app.spaceSectionsМетодология + Области
app.uiSlotsinspector

Отличие от standard и AI-flow

standardspace-methodology.guidedai-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

См. также

AI workspace для командных материалов и знаний