@juancr11/sibu 0.14.0 → 0.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (27) hide show
  1. package/bin/admin/release.js +15 -1
  2. package/bin/modules/maintainer-release-support/release-workflow/handler.js +9 -2
  3. package/bin/modules/skill-selection-management/stop-managing-file/handler.js +2 -8
  4. package/bin/modules/sync-review/sync-preview.js +4 -4
  5. package/bin/modules/template-catalog-rendering/templates.js +18 -3
  6. package/bin/modules/workflow-target-planning/catalog.js +57 -0
  7. package/bin/modules/workflow-target-planning/index.js +2 -2
  8. package/bin/modules/workflow-target-planning/workflow-targets.js +40 -8
  9. package/package.json +1 -1
  10. package/templates/.claude/agents/github-exporter.md +18 -0
  11. package/templates/.claude/agents/notion-exporter.md +18 -0
  12. package/templates/.claude/settings.json +16 -0
  13. package/templates/.codex/agents/github-exporter.toml +20 -0
  14. package/templates/.codex/agents/notion-exporter.toml +20 -0
  15. package/templates/.codex/hooks.json +17 -0
  16. package/templates/.gemini/agents/github-exporter.md +18 -0
  17. package/templates/.gemini/agents/notion-exporter.md +18 -0
  18. package/templates/.gemini/settings.json +17 -0
  19. package/templates/AGENTS.md +1 -3
  20. package/templates/manifest.json +81 -18
  21. package/templates/skills/deep-module-map-writer/SKILL.md +3 -1
  22. package/templates/skills/export-to-github/SKILL.md +36 -1
  23. package/templates/skills/export-to-notion/SKILL.md +36 -1
  24. package/templates/skills/feature-brief-writer/SKILL.md +3 -1
  25. package/templates/skills/product-vision-writer/SKILL.md +4 -2
  26. package/templates/skills/technical-design-writer/SKILL.md +3 -1
  27. package/templates/skills/ux-expert/SKILL.md +3 -1
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  import { createInterface } from 'node:readline/promises';
3
- import { execFileSync } from 'node:child_process';
3
+ import { execFileSync, spawnSync } from 'node:child_process';
4
4
  import fs from 'node:fs';
5
5
  import { fileURLToPath } from 'node:url';
6
6
  import { previewAndConfirmMaintainerRelease } from '../modules/maintainer-release-support/release-workflow/handler.js';
@@ -166,6 +166,20 @@ function createTerminalPorts() {
166
166
  return commandFailure(error);
167
167
  }
168
168
  },
169
+ runInteractive(command, args) {
170
+ const result = spawnSync(command, args, {
171
+ stdio: 'inherit',
172
+ });
173
+ if (result.error) {
174
+ return {
175
+ exitCode: 1,
176
+ stderr: result.error.message,
177
+ };
178
+ }
179
+ return {
180
+ exitCode: result.status ?? 1,
181
+ };
182
+ },
169
183
  };
170
184
  }
171
185
  function printExecutionResult(result, ports) {
@@ -207,8 +207,9 @@ export async function executeConfirmedRelease(plan, ports) {
207
207
  }
208
208
  const npmPublishArgs = buildNpmPublishArgs(plan);
209
209
  const npmPublishLog = plan.hasOtp ? 'npm publish --access public --otp ******' : 'npm publish --access public';
210
- printExecutionProgress(ports, `Publishing package to npm: ${npmPublishLog}...`);
211
- const npmPublish = await ports.run('npm', npmPublishArgs);
210
+ const npmPublishMode = plan.hasOtp ? 'captured OTP publish' : 'interactive browser/2FA-capable publish';
211
+ printExecutionProgress(ports, `Publishing package to npm: ${npmPublishLog} (${npmPublishMode})...`);
212
+ const npmPublish = await runNpmPublish(ports, npmPublishArgs, plan);
212
213
  if (npmPublish.exitCode !== 0) {
213
214
  const failure = failExecution(completedSteps, 'publish-npm', 'Publishing to npm failed.', npmPublish);
214
215
  printExecutionFailure(ports, failure);
@@ -272,6 +273,12 @@ function buildNpmPublishArgs(plan) {
272
273
  }
273
274
  return args;
274
275
  }
276
+ function runNpmPublish(ports, args, plan) {
277
+ if (plan.hasOtp || !ports.runInteractive) {
278
+ return ports.run('npm', args);
279
+ }
280
+ return ports.runInteractive('npm', args);
281
+ }
275
282
  async function runStep(ports, completedSteps, stepName, startMessage, command, args, completedMessage) {
276
283
  printExecutionProgress(ports, startMessage);
277
284
  const result = await ports.run(command, args);
@@ -10,7 +10,7 @@ import { renderIntro } from '../../interactive-guidance/index.js';
10
10
  import { cloneState, readStateForDoctor, writeStateFile } from '../../workflow-state-registry/index.js';
11
11
  import { getTemplateVersion, readTemplateManifest, renderTemplateForSync } from '../../template-catalog-rendering/index.js';
12
12
  import { removeUndefinedFields } from '../../../shared/object.js';
13
- import { getSelectedAgentsFromState, getSelectedArchitectureSkillFromState, getSelectedDatabaseSkillsFromState, getSelectedFrameworkSkillsFromState, getSelectedLanguageSkillsFromState, getSelectedWorkflowSkillsFromState, } from '../../workflow-target-planning/index.js';
13
+ import { getSelectedAgentsFromState, getSelectedArchitectureSkillFromState, getSelectedDatabaseSkillsFromState, getSelectedFrameworkSkillsFromState, getSelectedLanguageSkillsFromState, getSelectedWorkflowSkillsFromState, getSkillTargetsForAgents, } from '../../workflow-target-planning/index.js';
14
14
  export async function handleStopManagingFile({ skillName }) {
15
15
  await renderIntro();
16
16
  intro(chalk.cyan('Updating skill management'));
@@ -136,13 +136,7 @@ function removeSelectedSkill(state, resolved) {
136
136
  }
137
137
  }
138
138
  function getSkillManagedPaths(rootPath, state, resolved) {
139
- const relativePaths = new Set();
140
- for (const agent of getSelectedAgentsFromState(state)) {
141
- const relativePath = resolved.skill.targetRelativePathsByAgent[agent.id];
142
- if (relativePath) {
143
- relativePaths.add(relativePath);
144
- }
145
- }
139
+ const relativePaths = new Set(getSkillTargetsForAgents(resolved.skill, getSelectedAgentsFromState(state)).map((target) => target.targetRelativePath));
146
140
  return [...relativePaths].map((relativePath) => ({
147
141
  relativePath,
148
142
  absolutePath: path.join(rootPath, relativePath),
@@ -3,7 +3,7 @@ import path from 'node:path';
3
3
  import { sha256 } from '../../shared/hash.js';
4
4
  import { hasReviewedTemplateVersion } from '../workflow-state-registry/index.js';
5
5
  import { renderTemplateForSync } from '../template-catalog-rendering/index.js';
6
- import { getSelectedAgentsFromState, getSelectedArchitectureSkillFromState, getSelectedDatabaseSkillsFromState, getSelectedFrameworkSkillsFromState, getSelectedLanguageSkillsFromState, getSelectedMcpServersFromState, getSelectedWorkflowSkillsFromState, getWorkflowSkillsImpliedByMcpServers, getWorkflowTargets, } from '../workflow-target-planning/index.js';
6
+ import { getSelectedAgentsFromState, getSelectedArchitectureSkillFromState, getSelectedDatabaseSkillsFromState, getSelectedFrameworkSkillsFromState, getSelectedLanguageSkillsFromState, getSelectedMcpServersFromState, getSelectedWorkflowSkillsFromState, getSkillTargetsForAgents, getWorkflowSkillsImpliedByMcpServers, getWorkflowTargets, } from '../workflow-target-planning/index.js';
7
7
  const ACTIONABLE_SYNC_PREVIEW_STATUSES = new Set([
8
8
  'new-template',
9
9
  'missing',
@@ -39,7 +39,7 @@ export function getSyncPreviews({ rootPath, state, manifest }) {
39
39
  const expectedTargets = getWorkflowTargets(rootPath, getSelectedAgentsFromState(state), selectedLanguageSkills, selectedFrameworkSkills, selectedArchitectureSkill, plannedWorkflowSkills, selectedDatabaseSkills, selectedMcpServers);
40
40
  const alreadyPreviewedPaths = new Set();
41
41
  for (const skill of missingImpliedWorkflowSkills) {
42
- for (const preview of getNewExpectedTargetPreviews({ rootPath, manifest, state, expectedTargets, workflowSkill: skill })) {
42
+ for (const preview of getNewExpectedTargetPreviews({ rootPath, manifest, state, expectedTargets, selectedAgents: getSelectedAgentsFromState(state), workflowSkill: skill })) {
43
43
  previews.push(preview);
44
44
  alreadyPreviewedPaths.add(preview.relativePath);
45
45
  }
@@ -65,8 +65,8 @@ export function getSyncPreviews({ rootPath, state, manifest }) {
65
65
  }
66
66
  return previews;
67
67
  }
68
- function getNewExpectedTargetPreviews({ rootPath, manifest, state, expectedTargets, workflowSkill, }) {
69
- const workflowSkillTargetPaths = new Set(Object.values(workflowSkill.targetRelativePathsByAgent));
68
+ function getNewExpectedTargetPreviews({ rootPath, manifest, state, expectedTargets, selectedAgents, workflowSkill, }) {
69
+ const workflowSkillTargetPaths = new Set(getSkillTargetsForAgents(workflowSkill, selectedAgents).map((target) => target.targetRelativePath));
70
70
  return expectedTargets
71
71
  .filter((target) => workflowSkillTargetPaths.has(path.relative(rootPath, target.targetPath)))
72
72
  .filter((target) => !state.managedFiles[path.relative(rootPath, target.targetPath)])
@@ -45,7 +45,7 @@ export function renderMcpConfig({ agentId, baseContents, selectedMcpServers, })
45
45
  if (agentId === 'codex') {
46
46
  return renderCodexMcpConfig(baseContents ?? '', selectedMcpServers);
47
47
  }
48
- return renderJsonMcpConfig(buildJsonMcpServerConfigs(agentId, selectedMcpServers));
48
+ return renderJsonMcpConfig(buildJsonMcpServerConfigs(agentId, selectedMcpServers), baseContents);
49
49
  }
50
50
  export function extractProjectOverview(filePath) {
51
51
  if (!fs.existsSync(filePath)) {
@@ -93,6 +93,9 @@ function getMcpConfigAgentId(templateRelativePath) {
93
93
  if (templateRelativePath === 'mcp/gemini/settings.json') {
94
94
  return 'gemini';
95
95
  }
96
+ if (templateRelativePath === '.gemini/settings.json') {
97
+ return 'gemini';
98
+ }
96
99
  return undefined;
97
100
  }
98
101
  function buildJsonMcpServerConfigs(agentId, selectedMcpServers) {
@@ -128,8 +131,20 @@ function buildNotionMcpServerConfig() {
128
131
  url: 'https://mcp.notion.com/mcp',
129
132
  };
130
133
  }
131
- function renderJsonMcpConfig(mcpServers) {
132
- return `${JSON.stringify({ mcpServers }, null, 2)}\n`;
134
+ function renderJsonMcpConfig(mcpServers, baseContents) {
135
+ const baseConfig = parseJsonObject(baseContents);
136
+ baseConfig.mcpServers = mcpServers;
137
+ return `${JSON.stringify(baseConfig, null, 2)}\n`;
138
+ }
139
+ function parseJsonObject(contents) {
140
+ if (!contents?.trim()) {
141
+ return {};
142
+ }
143
+ const parsed = JSON.parse(contents);
144
+ if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {
145
+ throw new Error('Expected JSON template to contain an object.');
146
+ }
147
+ return parsed;
133
148
  }
134
149
  function isTemplateManifest(value) {
135
150
  if (!value || typeof value !== 'object') {
@@ -81,6 +81,23 @@ export const MANDATORY_SKILLS = [
81
81
  },
82
82
  },
83
83
  ];
84
+ export const SESSION_START_HOOKS = [
85
+ {
86
+ agentId: 'codex',
87
+ templateRelativePath: '.codex/hooks.json',
88
+ targetRelativePath: '.codex/hooks.json',
89
+ },
90
+ {
91
+ agentId: 'gemini',
92
+ templateRelativePath: '.gemini/settings.json',
93
+ targetRelativePath: '.gemini/settings.json',
94
+ },
95
+ {
96
+ agentId: 'claude',
97
+ templateRelativePath: '.claude/settings.json',
98
+ targetRelativePath: '.claude/settings.json',
99
+ },
100
+ ];
84
101
  export const SELECTABLE_LANGUAGE_SKILLS = [
85
102
  {
86
103
  id: 'typescript',
@@ -232,6 +249,26 @@ export const SELECTABLE_WORKFLOW_SKILLS = [
232
249
  claude: '.agents/skills/export-to-github/SKILL.md',
233
250
  windsurf: '.agents/skills/export-to-github/SKILL.md',
234
251
  },
252
+ supplementalTargetsByAgent: {
253
+ codex: [
254
+ {
255
+ templateRelativePath: '.codex/agents/github-exporter.toml',
256
+ targetRelativePath: '.codex/agents/github-exporter.toml',
257
+ },
258
+ ],
259
+ gemini: [
260
+ {
261
+ templateRelativePath: '.gemini/agents/github-exporter.md',
262
+ targetRelativePath: '.gemini/agents/github-exporter.md',
263
+ },
264
+ ],
265
+ claude: [
266
+ {
267
+ templateRelativePath: '.claude/agents/github-exporter.md',
268
+ targetRelativePath: '.claude/agents/github-exporter.md',
269
+ },
270
+ ],
271
+ },
235
272
  },
236
273
  {
237
274
  id: 'export-to-notion',
@@ -245,6 +282,26 @@ export const SELECTABLE_WORKFLOW_SKILLS = [
245
282
  claude: '.agents/skills/export-to-notion/SKILL.md',
246
283
  windsurf: '.agents/skills/export-to-notion/SKILL.md',
247
284
  },
285
+ supplementalTargetsByAgent: {
286
+ codex: [
287
+ {
288
+ templateRelativePath: '.codex/agents/notion-exporter.toml',
289
+ targetRelativePath: '.codex/agents/notion-exporter.toml',
290
+ },
291
+ ],
292
+ gemini: [
293
+ {
294
+ templateRelativePath: '.gemini/agents/notion-exporter.md',
295
+ targetRelativePath: '.gemini/agents/notion-exporter.md',
296
+ },
297
+ ],
298
+ claude: [
299
+ {
300
+ templateRelativePath: '.claude/agents/notion-exporter.md',
301
+ targetRelativePath: '.claude/agents/notion-exporter.md',
302
+ },
303
+ ],
304
+ },
248
305
  },
249
306
  ];
250
307
  const EXPORT_WORKFLOW_SKILL_MCP_REQUIREMENTS = {
@@ -1,2 +1,2 @@
1
- export { MANDATORY_SKILLS, SELECTABLE_ARCHITECTURE_SKILLS, SELECTABLE_DATABASE_SKILLS, SELECTABLE_FRAMEWORK_SKILLS, SELECTABLE_LANGUAGE_SKILLS, SELECTABLE_MCP_SERVERS, SELECTABLE_WORKFLOW_SKILLS, SUPPORTED_AGENTS, getMcpServersRequiredByWorkflowSkills, getWorkflowSkillsImpliedByMcpServers, resolveSelectableMcpServerById, resolveSelectableSkillById, } from './catalog.js';
2
- export { getSelectedAgentsFromState, getSelectedArchitectureSkillFromState, getSelectedDatabaseSkillsFromState, getSelectedFrameworkSkillsFromState, getSelectedLanguageSkillsFromState, getSelectedMcpServersFromState, getSelectedMcpTargetsForAgents, getSelectedSkillTargetsForAgents, getSelectedWorkflowSkillsFromState, getWorkflowTargets, renderMissingWorkflowFiles, writeSibuState, } from './workflow-targets.js';
1
+ export { MANDATORY_SKILLS, SELECTABLE_ARCHITECTURE_SKILLS, SELECTABLE_DATABASE_SKILLS, SELECTABLE_FRAMEWORK_SKILLS, SELECTABLE_LANGUAGE_SKILLS, SELECTABLE_MCP_SERVERS, SELECTABLE_WORKFLOW_SKILLS, SESSION_START_HOOKS, SUPPORTED_AGENTS, getMcpServersRequiredByWorkflowSkills, getWorkflowSkillsImpliedByMcpServers, resolveSelectableMcpServerById, resolveSelectableSkillById, } from './catalog.js';
2
+ export { getSelectedAgentsFromState, getSelectedArchitectureSkillFromState, getSelectedDatabaseSkillsFromState, getSelectedFrameworkSkillsFromState, getSelectedLanguageSkillsFromState, getSelectedMcpServersFromState, getSelectedMcpTargetsForAgents, getSelectedSkillTargetsForAgents, getSelectedWorkflowSkillsFromState, getSkillTargetsForAgents, getWorkflowTargets, renderMissingWorkflowFiles, writeSibuState, } from './workflow-targets.js';
@@ -1,7 +1,7 @@
1
1
  import fs from 'node:fs';
2
2
  import path from 'node:path';
3
3
  import { SIBU_VERSION } from '../version-advisory/index.js';
4
- import { MANDATORY_SKILLS, SELECTABLE_ARCHITECTURE_SKILLS, SELECTABLE_DATABASE_SKILLS, SELECTABLE_FRAMEWORK_SKILLS, SELECTABLE_LANGUAGE_SKILLS, SELECTABLE_MCP_SERVERS, SELECTABLE_WORKFLOW_SKILLS, SUPPORTED_AGENTS, } from './index.js';
4
+ import { MANDATORY_SKILLS, SELECTABLE_ARCHITECTURE_SKILLS, SELECTABLE_DATABASE_SKILLS, SELECTABLE_FRAMEWORK_SKILLS, SELECTABLE_LANGUAGE_SKILLS, SELECTABLE_MCP_SERVERS, SELECTABLE_WORKFLOW_SKILLS, SESSION_START_HOOKS, SUPPORTED_AGENTS, } from './index.js';
5
5
  import { sha256 } from '../../shared/hash.js';
6
6
  import { removeUndefinedFields } from '../../shared/object.js';
7
7
  import { readExistingState } from '../workflow-state-registry/index.js';
@@ -36,18 +36,36 @@ export function getSelectedSkillTargetsForAgents(selectedAgents, selectedLanguag
36
36
  ];
37
37
  for (const agent of selectedAgents) {
38
38
  for (const skill of selectedSkills) {
39
- const targetRelativePath = skill.targetRelativePathsByAgent[agent.id];
40
- if (!targetRelativePath) {
41
- continue;
39
+ for (const skillTarget of getSkillTargetsForAgent(skill, agent.id)) {
40
+ skillTargets.set(skillTarget.targetRelativePath, skillTarget);
42
41
  }
43
- skillTargets.set(targetRelativePath, {
44
- targetRelativePath,
45
- templateRelativePath: skill.templateRelativePath,
46
- });
47
42
  }
48
43
  }
49
44
  return [...skillTargets.values()];
50
45
  }
46
+ export function getSkillTargetsForAgents(skill, selectedAgents) {
47
+ const skillTargets = new Map();
48
+ for (const agent of selectedAgents) {
49
+ for (const skillTarget of getSkillTargetsForAgent(skill, agent.id)) {
50
+ skillTargets.set(skillTarget.targetRelativePath, skillTarget);
51
+ }
52
+ }
53
+ return [...skillTargets.values()];
54
+ }
55
+ function getSkillTargetsForAgent(skill, agentId) {
56
+ const targets = [];
57
+ const targetRelativePath = skill.targetRelativePathsByAgent[agentId];
58
+ if (targetRelativePath) {
59
+ targets.push({
60
+ targetRelativePath,
61
+ templateRelativePath: skill.templateRelativePath,
62
+ });
63
+ }
64
+ for (const supplementalTarget of skill.supplementalTargetsByAgent?.[agentId] ?? []) {
65
+ targets.push(supplementalTarget);
66
+ }
67
+ return targets;
68
+ }
51
69
  export function getSelectedMcpTargetsForAgents(selectedAgents, selectedMcpServers) {
52
70
  if (selectedMcpServers.length === 0) {
53
71
  return [];
@@ -83,6 +101,13 @@ export function getSelectedMcpTargetsForAgents(selectedAgents, selectedMcpServer
83
101
  return [];
84
102
  });
85
103
  }
104
+ function getSessionStartHookTargetsForAgents(selectedAgents) {
105
+ const selectedAgentIds = new Set(selectedAgents.map((agent) => agent.id));
106
+ return SESSION_START_HOOKS.filter((hookTemplate) => selectedAgentIds.has(hookTemplate.agentId)).map((hookTemplate) => ({
107
+ targetRelativePath: hookTemplate.targetRelativePath,
108
+ templateRelativePath: hookTemplate.templateRelativePath,
109
+ }));
110
+ }
86
111
  export function getWorkflowTargets(rootPath, selectedAgents, selectedLanguageSkills = [], selectedFrameworkSkills = [], selectedArchitectureSkill, selectedWorkflowSkills = [], selectedDatabaseSkills = [], selectedMcpServers = []) {
87
112
  const targets = [
88
113
  {
@@ -113,6 +138,13 @@ export function getWorkflowTargets(rootPath, selectedAgents, selectedLanguageSki
113
138
  requiresProjectOverview: false,
114
139
  targetKind: 'skill',
115
140
  })),
141
+ ...getSessionStartHookTargetsForAgents(selectedAgents).map((hookTarget) => ({
142
+ label: hookTarget.targetRelativePath,
143
+ targetPath: path.join(rootPath, hookTarget.targetRelativePath),
144
+ templateRelativePath: hookTarget.templateRelativePath,
145
+ requiresProjectOverview: false,
146
+ targetKind: 'agent-support',
147
+ })),
116
148
  ];
117
149
  for (const mcpTarget of getSelectedMcpTargetsForAgents(selectedAgents, selectedMcpServers)) {
118
150
  const targetPath = path.join(rootPath, mcpTarget.targetRelativePath);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@juancr11/sibu",
3
- "version": "0.14.0",
3
+ "version": "0.16.0",
4
4
  "description": "CLI for setting up a local AI-augmented development workflow.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -0,0 +1,18 @@
1
+ ---
2
+ name: github-exporter
3
+ description: Exports Sibu feature epics and user stories to GitHub issues with narrow task context and no local repository writes.
4
+ ---
5
+
6
+ You are the GitHub exporter sub-agent for Sibu-managed workflows.
7
+
8
+ Use only the specific export packet from the main agent: feature slug or explicit planning artifact paths, target repository resolved from the current repo, the no-local-write rule, and the expected final output format. Do not rely on or request the main agent's full conversation context.
9
+
10
+ Scope:
11
+ - Export only local Epic briefs and User Story Markdown files for the requested feature.
12
+ - Read local Markdown files as source of truth.
13
+ - Write only to GitHub issues and native sub-issue relationships.
14
+ - Ask for explicit opt-in before creating or modifying GitHub issues or sub-issues.
15
+ - Do not modify local repository files or write GitHub URLs back into Markdown by default.
16
+ - Return concise created issue URLs or numbers, sub-issue relationship results, and any errors.
17
+
18
+ If issue creation, issue ID access, native sub-issue mutation, or target repository resolution is unavailable, fail clearly and do not fall back to labels, loose links, projects, or checklists.
@@ -0,0 +1,18 @@
1
+ ---
2
+ name: notion-exporter
3
+ description: Exports Sibu feature documentation to Notion with narrow task context and no local repository writes.
4
+ ---
5
+
6
+ You are the Notion exporter sub-agent for Sibu-managed workflows.
7
+
8
+ Use only the specific export packet from the main agent: feature slug or explicit source paths, Notion destination details, the no-local-write rule, and the expected final output format. Do not rely on or request the main agent's full conversation context.
9
+
10
+ Scope:
11
+ - Export only allowed feature documentation artifacts: feature brief, UX design, and technical design.
12
+ - Read local Markdown files as source of truth.
13
+ - Write only to Notion.
14
+ - Ask for explicit opt-in before creating or modifying Notion pages.
15
+ - Do not modify local repository files or write Notion URLs back into Markdown by default.
16
+ - Return concise created or updated Notion URLs and any errors.
17
+
18
+ If required Notion MCP capabilities, destination details, or source files are missing, fail clearly instead of inventing content or destinations.
@@ -0,0 +1,16 @@
1
+ {
2
+ "hooks": {
3
+ "SessionStart": [
4
+ {
5
+ "matcher": "startup",
6
+ "hooks": [
7
+ {
8
+ "type": "command",
9
+ "command": "sh -lc 'if latest=$(npm view @juancr11/sibu version 2>/dev/null); then echo \"Sibu latest version: $latest\"; else echo \"Sibu version check unavailable; continuing to sibu doctor.\"; fi; sibu doctor || true'",
10
+ "timeout": 60
11
+ }
12
+ ]
13
+ }
14
+ ]
15
+ }
16
+ }
@@ -0,0 +1,20 @@
1
+ name = "github-exporter"
2
+ description = "Exports Sibu feature epics and user stories to GitHub issues with narrow task context and no local repository writes."
3
+
4
+ developer_instructions = """
5
+ You are the GitHub exporter sub-agent for Sibu-managed workflows.
6
+
7
+ Use only the specific export packet from the main agent: feature slug or explicit planning artifact paths, target repository resolved from the current repo, the no-local-write rule, and the expected final output format. Do not rely on or request the main agent's full conversation context.
8
+
9
+ If the export packet is missing required source paths, destination details, mutation approval state, or expected output format, stop and ask the main agent for the missing packet. Do not infer missing export inputs from broader conversation history.
10
+
11
+ Scope:
12
+ - Export only local Epic briefs and User Story Markdown files for the requested feature.
13
+ - Read local Markdown files as source of truth.
14
+ - Write only to GitHub issues and native sub-issue relationships.
15
+ - Ask for explicit opt-in before creating or modifying GitHub issues or sub-issues.
16
+ - Do not modify local repository files or write GitHub URLs back into Markdown by default.
17
+ - Return concise created issue URLs or numbers, sub-issue relationship results, and any errors.
18
+
19
+ If issue creation, issue ID access, native sub-issue mutation, or target repository resolution is unavailable, fail clearly and do not fall back to labels, loose links, projects, or checklists.
20
+ """
@@ -0,0 +1,20 @@
1
+ name = "notion-exporter"
2
+ description = "Exports Sibu feature documentation to Notion with narrow task context and no local repository writes."
3
+
4
+ developer_instructions = """
5
+ You are the Notion exporter sub-agent for Sibu-managed workflows.
6
+
7
+ Use only the specific export packet from the main agent: feature slug or explicit source paths, Notion destination details, the no-local-write rule, and the expected final output format. Do not rely on or request the main agent's full conversation context.
8
+
9
+ If the export packet is missing required source paths, destination details, mutation approval state, or expected output format, stop and ask the main agent for the missing packet. Do not infer missing export inputs from broader conversation history.
10
+
11
+ Scope:
12
+ - Export only allowed feature documentation artifacts: feature brief, UX design, and technical design.
13
+ - Read local Markdown files as source of truth.
14
+ - Write only to Notion.
15
+ - Ask for explicit opt-in before creating or modifying Notion pages.
16
+ - Do not modify local repository files or write Notion URLs back into Markdown by default.
17
+ - Return concise created or updated Notion URLs and any errors.
18
+
19
+ If required Notion MCP capabilities, destination details, or source files are missing, fail clearly instead of inventing content or destinations.
20
+ """
@@ -0,0 +1,17 @@
1
+ {
2
+ "hooks": {
3
+ "SessionStart": [
4
+ {
5
+ "matcher": "startup",
6
+ "hooks": [
7
+ {
8
+ "type": "command",
9
+ "command": "sh -lc 'if latest=$(npm view @juancr11/sibu version 2>/dev/null); then echo \"Sibu latest version: $latest\"; else echo \"Sibu version check unavailable; continuing to sibu doctor.\"; fi; sibu doctor || true'",
10
+ "statusMessage": "Running Sibu session health check",
11
+ "timeout": 60
12
+ }
13
+ ]
14
+ }
15
+ ]
16
+ }
17
+ }
@@ -0,0 +1,18 @@
1
+ ---
2
+ name: github-exporter
3
+ description: Exports Sibu feature epics and user stories to GitHub issues with narrow task context and no local repository writes.
4
+ ---
5
+
6
+ You are the GitHub exporter sub-agent for Sibu-managed workflows.
7
+
8
+ Use only the specific export packet from the main agent: feature slug or explicit planning artifact paths, target repository resolved from the current repo, the no-local-write rule, and the expected final output format. Do not rely on or request the main agent's full conversation context.
9
+
10
+ Scope:
11
+ - Export only local Epic briefs and User Story Markdown files for the requested feature.
12
+ - Read local Markdown files as source of truth.
13
+ - Write only to GitHub issues and native sub-issue relationships.
14
+ - Ask for explicit opt-in before creating or modifying GitHub issues or sub-issues.
15
+ - Do not modify local repository files or write GitHub URLs back into Markdown by default.
16
+ - Return concise created issue URLs or numbers, sub-issue relationship results, and any errors.
17
+
18
+ If issue creation, issue ID access, native sub-issue mutation, or target repository resolution is unavailable, fail clearly and do not fall back to labels, loose links, projects, or checklists.
@@ -0,0 +1,18 @@
1
+ ---
2
+ name: notion-exporter
3
+ description: Exports Sibu feature documentation to Notion with narrow task context and no local repository writes.
4
+ ---
5
+
6
+ You are the Notion exporter sub-agent for Sibu-managed workflows.
7
+
8
+ Use only the specific export packet from the main agent: feature slug or explicit source paths, Notion destination details, the no-local-write rule, and the expected final output format. Do not rely on or request the main agent's full conversation context.
9
+
10
+ Scope:
11
+ - Export only allowed feature documentation artifacts: feature brief, UX design, and technical design.
12
+ - Read local Markdown files as source of truth.
13
+ - Write only to Notion.
14
+ - Ask for explicit opt-in before creating or modifying Notion pages.
15
+ - Do not modify local repository files or write Notion URLs back into Markdown by default.
16
+ - Return concise created or updated Notion URLs and any errors.
17
+
18
+ If required Notion MCP capabilities, destination details, or source files are missing, fail clearly instead of inventing content or destinations.
@@ -0,0 +1,17 @@
1
+ {
2
+ "hooks": {
3
+ "SessionStart": [
4
+ {
5
+ "matcher": "startup",
6
+ "hooks": [
7
+ {
8
+ "type": "command",
9
+ "command": "sh -lc 'if latest=$(npm view @juancr11/sibu version 2>/dev/null); then echo \"Sibu latest version: $latest\" >&2; else echo \"Sibu version check unavailable; continuing to sibu doctor.\" >&2; fi; sibu doctor >&2 || true; printf \"%s\\n\" \"{\\\"systemMessage\\\":\\\"Sibu session health check finished. Review hook output for details.\\\"}\"'",
10
+ "name": "Sibu session health check",
11
+ "timeout": 60000
12
+ }
13
+ ]
14
+ }
15
+ ]
16
+ }
17
+ }
@@ -58,9 +58,7 @@ This repository uses Sibu to manage AI workflow setup.
58
58
  - `sibu doctor` is the read-only health check for this workflow. It inspects whether Sibu-managed files are missing, modified, unrecorded, or generated from older templates.
59
59
  - `sibu sync` is the post-init workflow maintenance command. It reviews template updates interactively, repairs missing managed files, adopts newly added managed templates, protects local edits from automatic overwrites, and lets the user apply safe updates, mark customized files as reviewed, write side templates, stop managing a file, or skip for later.
60
60
 
61
- At the start of each session in this repository, run `sibu doctor` once before making changes or giving workflow guidance. Treat it as a read-only preflight check. Do not rerun it before every follow-up in the same session unless workflow-managed files changed, the user asks, or you need to verify Sibu state after applying updates.
62
-
63
- After `sibu doctor` finishes, guide the user based on the outcome:
61
+ Use `sibu doctor` as a read-only workflow health check when you need to verify Sibu-managed file state. After `sibu doctor` finishes, guide the user based on the outcome:
64
62
 
65
63
  - Healthy workflow: mention that the Sibu check passed and proceed.
66
64
  - Missing `.sibu/state.json`: tell the user to run `sibu init` once before continuing.
@@ -1,11 +1,11 @@
1
1
  {
2
- "templateVersion": "103",
2
+ "templateVersion": "110",
3
3
  "templates": {
4
4
  "AGENTS.md": {
5
- "version": "30",
5
+ "version": "31",
6
6
  "description": "Project-level agent instructions and Sibu maintenance guidance.",
7
7
  "changes": [
8
- "Routes rough future idea capture requests to the mandatory feature-idea-capture skill."
8
+ "Removes the manual session-start preflight instruction now that native hook files own automatic Sibu health checks."
9
9
  ]
10
10
  },
11
11
  ".codex/config.toml": {
@@ -51,31 +51,31 @@
51
51
  ]
52
52
  },
53
53
  "skills/product-vision-writer/SKILL.md": {
54
- "version": "8",
54
+ "version": "9",
55
55
  "description": "Mandatory product vision writer skill installed once at the shared .agents/skills workspace path.",
56
56
  "changes": [
57
- "Strengthens product vision interviews to resolve material strategy questions before drafting instead of leaving uncertainty in the artifact."
57
+ "Makes product vision discovery mandatory before drafting, even when existing context looks complete."
58
58
  ]
59
59
  },
60
60
  "skills/deep-module-map-writer/SKILL.md": {
61
- "version": "4",
61
+ "version": "5",
62
62
  "description": "Mandatory Deep Module Map writer skill installed once at the shared .agents/skills workspace path.",
63
63
  "changes": [
64
- "Adds explicit Deep Module Map discovery guidance so agents keep interviewing one question at a time until module interfaces, hidden complexity, ownership, exclusions, scenarios, relationships, and cross-module rules are clear enough to defend."
64
+ "Makes Deep Module Map interviews mandatory before drafting, even when repo code or existing docs look complete."
65
65
  ]
66
66
  },
67
67
  "skills/feature-brief-writer/SKILL.md": {
68
- "version": "13",
68
+ "version": "14",
69
69
  "description": "Mandatory feature brief writer skill installed once at the shared .agents/skills workspace path.",
70
70
  "changes": [
71
- "Keeps feature brief writing focused on local Markdown artifacts and moves Notion export workflow guidance to dedicated exporter skills."
71
+ "Makes feature brief interviews mandatory before drafting while keeping export workflows delegated to dedicated exporter skills."
72
72
  ]
73
73
  },
74
74
  "skills/technical-design-writer/SKILL.md": {
75
- "version": "19",
75
+ "version": "20",
76
76
  "description": "Mandatory technical design writer skill installed once at the shared .agents/skills workspace path.",
77
77
  "changes": [
78
- "Keeps technical design writing focused on local Markdown artifacts and moves Notion export workflow guidance to dedicated exporter skills."
78
+ "Makes technical design clarification mandatory before drafting while keeping export workflows delegated to dedicated exporter skills."
79
79
  ]
80
80
  },
81
81
  "skills/typescript/SKILL.md": {
@@ -89,7 +89,7 @@
89
89
  "version": "1",
90
90
  "description": "Selectable Go skill installed when Go language support is selected.",
91
91
  "changes": [
92
- "Adds an optional Go skill with concise, Effective Go–style guidance for .go files, package APIs, interfaces, errors, receivers, concurrency, and tests."
92
+ "Adds an optional Go skill with concise, Effective Go\u2013style guidance for .go files, package APIs, interfaces, errors, receivers, concurrency, and tests."
93
93
  ]
94
94
  },
95
95
  "skills/postgresql-expert/SKILL.md": {
@@ -163,10 +163,10 @@
163
163
  ]
164
164
  },
165
165
  "skills/ux-expert/SKILL.md": {
166
- "version": "9",
166
+ "version": "10",
167
167
  "description": "Selectable UX expert skill for UI-changing features, responsive design, flows, states, accessibility, and binding mockups.",
168
168
  "changes": [
169
- "Keeps UX design writing focused on local Markdown artifacts and moves Notion export workflow guidance to dedicated exporter skills."
169
+ "Makes UX clarification mandatory before drafting while keeping export workflows delegated to dedicated exporter skills."
170
170
  ]
171
171
  },
172
172
  "skills/architecture/layered-architecture/SKILL.md": {
@@ -177,17 +177,80 @@
177
177
  ]
178
178
  },
179
179
  "skills/export-to-github/SKILL.md": {
180
- "version": "1",
180
+ "version": "4",
181
181
  "description": "Selectable GitHub export skill for publishing a named feature's Epics and User Stories to GitHub issues and native sub-issues.",
182
182
  "changes": [
183
- "Adds a dedicated GitHub exporter skill paired with GitHub MCP selection."
183
+ "Requires GitHub exports to run as non-blocking background sub-agent jobs and prevents the main agent from waiting or polling for completion."
184
184
  ]
185
185
  },
186
186
  "skills/export-to-notion/SKILL.md": {
187
- "version": "1",
187
+ "version": "4",
188
188
  "description": "Selectable Notion export skill for publishing a named feature's core documentation files to Notion.",
189
189
  "changes": [
190
- "Adds a dedicated Notion exporter skill paired with Notion MCP selection."
190
+ "Requires Notion exports to run as non-blocking background sub-agent jobs and prevents the main agent from waiting or polling for completion."
191
+ ]
192
+ },
193
+ ".codex/agents/github-exporter.toml": {
194
+ "version": "3",
195
+ "description": "Codex GitHub exporter sub-agent for Sibu feature Epic and User Story exports.",
196
+ "changes": [
197
+ "Requires the Codex github-exporter sub-agent to stop and request missing export packet details instead of inferring from broad conversation context."
198
+ ]
199
+ },
200
+ ".codex/agents/notion-exporter.toml": {
201
+ "version": "3",
202
+ "description": "Codex Notion exporter sub-agent for Sibu feature documentation exports.",
203
+ "changes": [
204
+ "Requires the Codex notion-exporter sub-agent to stop and request missing export packet details instead of inferring from broad conversation context."
205
+ ]
206
+ },
207
+ ".claude/agents/github-exporter.md": {
208
+ "version": "1",
209
+ "description": "Claude GitHub exporter sub-agent for Sibu feature Epic and User Story exports.",
210
+ "changes": [
211
+ "Adds a Claude github-exporter sub-agent with clean-context and no-local-write export guidance."
212
+ ]
213
+ },
214
+ ".claude/agents/notion-exporter.md": {
215
+ "version": "1",
216
+ "description": "Claude Notion exporter sub-agent for Sibu feature documentation exports.",
217
+ "changes": [
218
+ "Adds a Claude notion-exporter sub-agent with clean-context and no-local-write export guidance."
219
+ ]
220
+ },
221
+ ".gemini/agents/github-exporter.md": {
222
+ "version": "1",
223
+ "description": "Gemini GitHub exporter sub-agent for Sibu feature Epic and User Story exports.",
224
+ "changes": [
225
+ "Adds a Gemini github-exporter sub-agent with clean-context and no-local-write export guidance."
226
+ ]
227
+ },
228
+ ".gemini/agents/notion-exporter.md": {
229
+ "version": "1",
230
+ "description": "Gemini Notion exporter sub-agent for Sibu feature documentation exports.",
231
+ "changes": [
232
+ "Adds a Gemini notion-exporter sub-agent with clean-context and no-local-write export guidance."
233
+ ]
234
+ },
235
+ ".codex/hooks.json": {
236
+ "version": "1",
237
+ "description": "Codex SessionStart hook configuration for running Sibu session health checks.",
238
+ "changes": [
239
+ "Adds a managed Codex SessionStart hook that checks the latest Sibu version and runs sibu doctor automatically."
240
+ ]
241
+ },
242
+ ".claude/settings.json": {
243
+ "version": "1",
244
+ "description": "Claude Code SessionStart hook configuration for running Sibu session health checks.",
245
+ "changes": [
246
+ "Adds a managed Claude SessionStart hook that checks the latest Sibu version and runs sibu doctor automatically."
247
+ ]
248
+ },
249
+ ".gemini/settings.json": {
250
+ "version": "1",
251
+ "description": "Gemini CLI SessionStart hook configuration for running Sibu session health checks.",
252
+ "changes": [
253
+ "Adds a managed Gemini SessionStart hook that checks the latest Sibu version and runs sibu doctor automatically."
191
254
  ]
192
255
  }
193
256
  }
@@ -35,7 +35,7 @@ This skill owns the Deep Module Map only. It does not own feature briefs, techni
35
35
 
36
36
  - Do not create feature briefs, technical designs, UX specs, Epics, User Stories, implementation plans, or production code.
37
37
  - Do not choose a specific internal architecture, service split, database model, framework, or team ownership structure.
38
- - Do not ask for or require a final confirmation summary before writing once enough Deep Module Map information is available.
38
+ - Do not skip the interview or the final “I am clear; are you good?” check-in before writing. Once the user confirms there is nothing else to cover, write without requiring a recap, artifact approval, or separate summary confirmation.
39
39
  - Do not invent Deep Modules without grounding them in the product vision, current system behavior, and user interview.
40
40
  - Do not treat a command, screen, helper, folder, data object, or technical layer as a Deep Module merely because it exists.
41
41
  - Do not leave material module-boundary questions unresolved in the final map; keep interviewing until the user answers, confirms an assumption, or explicitly excludes the boundary.
@@ -125,6 +125,8 @@ This file is user-owned product and implementation-boundary content created or u
125
125
 
126
126
  Be deliberately interrogative before writing.
127
127
 
128
+ This interview is mandatory and non-skippable. Even when the repository has substantial code, existing docs, an existing map, or extensive initial context, ask at least one explicit user-facing discovery question before drafting or writing the Deep Module Map. Treat code, repository artifacts, prior conversation, and initial context as useful but provisional: they can shape better questions, but they must not replace the interview or become the full source of truth for module boundaries, interfaces, hidden complexity, or ownership. Keep asking focused follow-up questions until the module decisions are clear enough to defend. Before drafting, always perform one final check-in in the spirit of: “I am clear on my end. Are you good, or is there anything else you want to cover before I proceed?” If the user adds context, incorporate or clarify it before writing.
129
+
128
130
  - Ask one focused question at a time.
129
131
  - Ask as many one-at-a-time questions as needed to understand the app well enough to defend the map; do not optimize for a short interview.
130
132
  - Walk down each module-boundary decision branch one by one, resolving dependencies between candidate modules before drafting.
@@ -7,6 +7,32 @@ description: Export a named feature's Epics and User Stories from local Markdown
7
7
 
8
8
  Use this skill when the user asks to export a feature's Epics and User Stories to GitHub.
9
9
 
10
+ ## Non-blocking delegation requirement
11
+
12
+ Before reading planning artifacts or calling GitHub mutation tools, check whether the configured `github-exporter` sub-agent is available for the current AI target.
13
+
14
+ If available, you must delegate the export to `github-exporter`. Do not perform the export inline and do not call GitHub issue or sub-issue mutation tools from the main agent.
15
+
16
+ The delegation is fire-and-notify:
17
+
18
+ - Start the `github-exporter` sub-agent in the background.
19
+ - Do not call `wait_agent`, poll for completion, spawn a status-checking agent, or otherwise block the main thread.
20
+ - Immediately return control to the user after spawning the exporter.
21
+ - Tell the user the export is running in the background and that completion will arrive via sub-agent notification.
22
+ - Only inspect the final result if the user explicitly asks for status/results later, or after a sub-agent completion notification is received.
23
+
24
+ Pass only a clean, narrow export packet:
25
+
26
+ - feature slug or explicit planning artifact paths
27
+ - target repository resolved from the current local repo's GitHub `origin` remote
28
+ - the no-local-write rule
29
+ - whether user opt-in for GitHub mutation has already been granted
30
+ - expected final output format: created issue URLs or numbers, sub-issue relationship results, and errors
31
+
32
+ Do not fork or pass the main agent's full conversation context. The exporter does not need implementation, planning, or unrelated discussion context.
33
+
34
+ Inline export is allowed only when sub-agent execution is unavailable, the configured `github-exporter` is not installed, or the user explicitly asks for inline fallback after the background exporter is unavailable or failed. Before any inline mutation, clearly tell the user why delegation cannot be used.
35
+
10
36
  ## Required input
11
37
 
12
38
  - A feature name or feature slug.
@@ -26,7 +52,16 @@ If the feature name is ambiguous, inspect `docs/features/` and ask one focused c
26
52
  - one issue per Epic, with no labels
27
53
  - one issue per User Story, with no labels
28
54
  - each User Story issue attached as a native sub-issue of its parent Epic issue
29
- 7. Report created issue numbers or URLs.
55
+ 7. After spawning the background exporter, immediately report that the export is running in the background. Do not wait for created issue numbers or URLs in the same turn.
56
+
57
+ ## Delegation self-check
58
+
59
+ Before finalizing, verify:
60
+
61
+ - Did I use `github-exporter` when it was available?
62
+ - Did I avoid `wait_agent`, status polling, and duplicate status-checking agents?
63
+ - If not, did I explicitly report why before any inline GitHub mutation?
64
+ - Did I avoid local file writes and preserve native sub-issue requirements?
30
65
 
31
66
  ## Export rules
32
67
 
@@ -7,6 +7,32 @@ description: Export a named feature's local feature brief, UX design, and techni
7
7
 
8
8
  Use this skill when the user asks to export a feature's core documentation to Notion.
9
9
 
10
+ ## Non-blocking delegation requirement
11
+
12
+ Before reading source docs or calling Notion mutation tools, check whether the configured `notion-exporter` sub-agent is available for the current AI target.
13
+
14
+ If available, you must delegate the export to `notion-exporter`. Do not perform the export inline and do not call Notion mutation tools from the main agent.
15
+
16
+ The delegation is fire-and-notify:
17
+
18
+ - Start the `notion-exporter` sub-agent in the background.
19
+ - Do not call `wait_agent`, poll for completion, spawn a status-checking agent, or otherwise block the main thread.
20
+ - Immediately return control to the user after spawning the exporter.
21
+ - Tell the user the export is running in the background and that completion will arrive via sub-agent notification.
22
+ - Only inspect the final result if the user explicitly asks for status/results later, or after a sub-agent completion notification is received.
23
+
24
+ Pass only a clean, narrow export packet:
25
+
26
+ - feature slug or explicit source paths
27
+ - Notion destination details
28
+ - the no-local-write rule
29
+ - whether user opt-in for Notion mutation has already been granted
30
+ - expected final output format: created or updated Notion URLs and errors
31
+
32
+ Do not fork or pass the main agent's full conversation context. The exporter does not need implementation, planning, or unrelated discussion context.
33
+
34
+ Inline export is allowed only when sub-agent execution is unavailable, the configured `notion-exporter` is not installed, or the user explicitly asks for inline fallback after the background exporter is unavailable or failed. Before any inline mutation, clearly tell the user why delegation cannot be used.
35
+
10
36
  ## Required input
11
37
 
12
38
  - A feature name or feature slug.
@@ -49,7 +75,16 @@ Use this organization under the configured Notion docs parent page:
49
75
  4. Ask one explicit opt-in question before creating or modifying Notion pages.
50
76
  5. Create or reuse the repo, Features, and feature organization pages under the configured parent.
51
77
  6. Export each existing allowed artifact to its matching Notion page.
52
- 7. Report export success or failure per artifact.
78
+ 7. After spawning the background exporter, immediately report that the export is running in the background. Do not wait for final URLs in the same turn.
79
+
80
+ ## Delegation self-check
81
+
82
+ Before finalizing, verify:
83
+
84
+ - Did I use `notion-exporter` when it was available?
85
+ - Did I avoid `wait_agent`, status polling, and duplicate status-checking agents?
86
+ - If not, did I explicitly report why before any inline Notion mutation?
87
+ - Did I avoid local file writes and keep local Markdown canonical?
53
88
 
54
89
  ## Export rules
55
90
 
@@ -36,7 +36,7 @@ This skill owns the product/business shape of a feature. It does not own UI inte
36
36
 
37
37
  - Do not create or update Deep Module Maps, technical designs, UX specs, Epics, User Stories, implementation plans, or production code.
38
38
  - Do not invent Deep Modules or use modules that are absent from `docs/deep-module-map.md`.
39
- - Do not require a final confirmation summary before writing once enough feature brief context is available.
39
+ - Do not skip the interview or the final “I am clear; are you good?” check-in before writing. Once the user confirms there is nothing else to cover, write without requiring a recap, artifact approval, or separate summary confirmation.
40
40
  - Do not duplicate or rewrite the product vision; apply only the relevant implications to the feature.
41
41
  - Do not leave material product, scope, success, constraint, or Deep Module fit questions unresolved in the final brief; keep interviewing until the user answers, confirms an assumption, or explicitly excludes the topic.
42
42
 
@@ -110,6 +110,8 @@ If the user asks for a feature brief from an idea in `docs/feature-ideas.md`, re
110
110
 
111
111
  Be deliberately interrogative before drafting. The feature brief should reflect the user's intent, not the assistant's assumptions.
112
112
 
113
+ This interview is mandatory and non-skippable. Even when the user provides extensive initial context, existing docs, repo code, or a raw idea file, ask at least one explicit user-facing discovery question before drafting or writing the feature brief. Treat repository artifacts, prior conversation, existing product docs, and initial context as useful but provisional: they can shape better questions, but they must not replace the interview or become the full source of truth for feature intent, scope, success, constraints, or user value. Keep asking focused follow-up questions until the feature decisions are clear enough to defend. Before drafting, always perform one final check-in in the spirit of: “I am clear on my end. Are you good, or is there anything else you want to cover before I proceed?” If the user adds context, incorporate or clarify it before writing.
114
+
113
115
  - Ask one focused question at a time.
114
116
  - Keep asking until you have complete practical understanding and explicit user alignment; do not optimize for a short interview.
115
117
  - Walk down each feature decision branch one by one, resolving dependencies between product, scope, success, constraint, and module-fit decisions before drafting.
@@ -33,14 +33,16 @@ Default output path: `docs/product-vision.md`.
33
33
  ### What this skill must not do
34
34
 
35
35
  - Do not create Deep Module Maps, feature briefs, technical designs, UX specs, Epics, User Stories, implementation plans, or production code.
36
- - Do not require a final confirmation summary before writing once enough product vision context is available.
36
+ - Do not skip the interview or the final “I am clear; are you good?” check-in before writing. Once the user confirms there is nothing else to cover, write without requiring a recap, artifact approval, or separate summary confirmation.
37
37
  - Do not leave material strategy questions unresolved in the final document; keep interviewing until the user answers, confirms an assumption, or explicitly excludes the topic.
38
38
 
39
39
  ## Workflow
40
40
 
41
41
  ### 1. Start with discovery, not drafting
42
42
 
43
- Interview before writing unless the user already provided complete source material. Be deliberately interrogative: ask as many focused questions as needed to extract all material product vision decisions before drafting.
43
+ Interview before writing. Be deliberately interrogative: ask as many focused questions as needed to extract all material product vision decisions before drafting.
44
+
45
+ This interview is mandatory and non-skippable. Even when the user provides extensive initial context, existing documents, or a mature codebase, ask at least one explicit user-facing discovery question before drafting or writing the product vision. Treat repository artifacts, prior conversation, and initial context as useful but provisional: they can shape better questions, but they must not replace the interview or become the full source of truth for the user's product intent. Keep asking focused follow-up questions until the material product vision decisions are clear enough to defend. Before drafting, always perform one final check-in in the spirit of: “I am clear on my end. Are you good, or is there anything else you want to cover before I proceed?” If the user adds context, incorporate or clarify it before writing.
44
46
 
45
47
  Ask one question at a time. Walk down the product decision tree branch by branch, resolving dependencies between decisions before moving on. When useful, include a recommended answer or concise assumption so the user can confirm, correct, or reject it quickly. If a question can be answered from existing repository artifacts, inspect those artifacts instead of asking.
46
48
 
@@ -36,7 +36,7 @@ Write the smallest useful technical design doc for an approved feature: enough f
36
36
  - Do not invent new Deep Modules or move work into unselected modules.
37
37
  - Do not redesign binding UX mockups.
38
38
  - Do not duplicate architecture, language, framework, or clean-code skill guidance.
39
- - Do not require a final confirmation summary before writing once enough technical design context is available.
39
+ - Do not skip the interview or the final “I am clear; are you good?” check-in before writing. Once the user confirms there is nothing else to cover, write without requiring a recap, artifact approval, or separate summary confirmation.
40
40
 
41
41
  ## Grounding
42
42
 
@@ -66,6 +66,8 @@ If the feature has UI impact, require `docs/features/<feature-slug>/ux.md`. If i
66
66
 
67
67
  Be deliberately interrogative before drafting. The technical design should reflect resolved implementation direction, not risky assistant assumptions.
68
68
 
69
+ This interview is mandatory and non-skippable. Even when the approved artifacts, repo files, codebase, or prior conversation seem complete, ask at least one explicit user-facing technical clarification question before drafting or writing the technical design. Treat repository artifacts, source docs, prior conversation, and initial context as useful but provisional for current implementation intent: they can shape better questions, but they must not replace the interview or become the full source of truth for implementation direction, boundaries, risks, or validation choices. Keep asking focused follow-up questions until the technical decisions are clear enough to defend. Before drafting, always perform one final check-in in the spirit of: “I am clear on my end. Are you good, or is there anything else you want to cover before I proceed?” If the user adds context, incorporate or clarify it before writing.
70
+
69
71
  - Ask one focused question at a time when repository artifacts and source docs do not resolve a material technical ambiguity.
70
72
  - Ask as many questions as required to reach complete practical understanding; do not optimize for a short interview.
71
73
  - If a question can be answered by reading repository artifacts, inspect those artifacts instead of asking.
@@ -33,7 +33,7 @@ Act as a senior UX/UI designer. Turn an approved product artifact into usable, e
33
33
  - Do not create or update product visions, Deep Module Maps, feature briefs, technical designs, Epics, User Stories, implementation plans, or production code.
34
34
  - Do not make architecture, framework, API, data model, or file-path decisions.
35
35
  - Do not treat UX work as optional for UI-changing features; concrete mockups are required.
36
- - Do not require a final confirmation summary before writing once enough UX context is available.
36
+ - Do not skip the interview or the final “I am clear; are you good?” check-in before writing. Once the user confirms there is nothing else to cover, write without requiring a recap, artifact approval, or separate summary confirmation.
37
37
 
38
38
  ## Required grounding
39
39
 
@@ -45,6 +45,8 @@ Require a product artifact such as `docs/features/<feature-slug>/feature_brief.m
45
45
 
46
46
  Be deliberately interrogative before drafting. The UX spec should reflect resolved experience direction, not assistant-invented assumptions.
47
47
 
48
+ This interview is mandatory and non-skippable. Even when product artifacts, existing UI, repo files, or prior conversation seem complete, ask at least one explicit user-facing UX clarification question before drafting or writing the UX spec. Treat artifacts, mockups, repo context, prior conversation, and initial context as useful but provisional for current experience intent: they can shape better questions, but they must not replace the interview or become the full source of truth for user flow, hierarchy, visual direction, states, or accessibility decisions. Keep asking focused follow-up questions until the UX decisions are clear enough to defend. Before drafting, always perform one final check-in in the spirit of: “I am clear on my end. Are you good, or is there anything else you want to cover before I proceed?” If the user adds context, incorporate or clarify it before writing.
49
+
48
50
  - Ask one focused question at a time when product artifacts do not resolve a material UX ambiguity.
49
51
  - Ask as many questions as required to reach complete practical understanding; do not optimize for a short interview.
50
52
  - If a question can be answered by reading repository artifacts, inspect those artifacts instead of asking.