@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.
- package/bin/admin/release.js +15 -1
- package/bin/modules/maintainer-release-support/release-workflow/handler.js +9 -2
- package/bin/modules/skill-selection-management/stop-managing-file/handler.js +2 -8
- package/bin/modules/sync-review/sync-preview.js +4 -4
- package/bin/modules/template-catalog-rendering/templates.js +18 -3
- package/bin/modules/workflow-target-planning/catalog.js +57 -0
- package/bin/modules/workflow-target-planning/index.js +2 -2
- package/bin/modules/workflow-target-planning/workflow-targets.js +40 -8
- package/package.json +1 -1
- package/templates/.claude/agents/github-exporter.md +18 -0
- package/templates/.claude/agents/notion-exporter.md +18 -0
- package/templates/.claude/settings.json +16 -0
- package/templates/.codex/agents/github-exporter.toml +20 -0
- package/templates/.codex/agents/notion-exporter.toml +20 -0
- package/templates/.codex/hooks.json +17 -0
- package/templates/.gemini/agents/github-exporter.md +18 -0
- package/templates/.gemini/agents/notion-exporter.md +18 -0
- package/templates/.gemini/settings.json +17 -0
- package/templates/AGENTS.md +1 -3
- package/templates/manifest.json +81 -18
- package/templates/skills/deep-module-map-writer/SKILL.md +3 -1
- package/templates/skills/export-to-github/SKILL.md +36 -1
- package/templates/skills/export-to-notion/SKILL.md +36 -1
- package/templates/skills/feature-brief-writer/SKILL.md +3 -1
- package/templates/skills/product-vision-writer/SKILL.md +4 -2
- package/templates/skills/technical-design-writer/SKILL.md +3 -1
- package/templates/skills/ux-expert/SKILL.md +3 -1
package/bin/admin/release.js
CHANGED
|
@@ -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
|
-
|
|
211
|
-
|
|
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(
|
|
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
|
-
|
|
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
|
|
40
|
-
|
|
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
|
@@ -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
|
+
}
|
package/templates/AGENTS.md
CHANGED
|
@@ -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
|
-
|
|
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.
|
package/templates/manifest.json
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
{
|
|
2
|
-
"templateVersion": "
|
|
2
|
+
"templateVersion": "110",
|
|
3
3
|
"templates": {
|
|
4
4
|
"AGENTS.md": {
|
|
5
|
-
"version": "
|
|
5
|
+
"version": "31",
|
|
6
6
|
"description": "Project-level agent instructions and Sibu maintenance guidance.",
|
|
7
7
|
"changes": [
|
|
8
|
-
"
|
|
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": "
|
|
54
|
+
"version": "9",
|
|
55
55
|
"description": "Mandatory product vision writer skill installed once at the shared .agents/skills workspace path.",
|
|
56
56
|
"changes": [
|
|
57
|
-
"
|
|
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": "
|
|
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
|
-
"
|
|
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": "
|
|
68
|
+
"version": "14",
|
|
69
69
|
"description": "Mandatory feature brief writer skill installed once at the shared .agents/skills workspace path.",
|
|
70
70
|
"changes": [
|
|
71
|
-
"
|
|
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": "
|
|
75
|
+
"version": "20",
|
|
76
76
|
"description": "Mandatory technical design writer skill installed once at the shared .agents/skills workspace path.",
|
|
77
77
|
"changes": [
|
|
78
|
-
"
|
|
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
|
|
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": "
|
|
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
|
-
"
|
|
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": "
|
|
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
|
-
"
|
|
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": "
|
|
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
|
-
"
|
|
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
|
|
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.
|
|
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.
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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.
|