sinapse-ai 7.7.3 → 7.7.5
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/.codex/catalog.json +157 -0
- package/.codex/command-registry.json +441 -0
- package/.codex/delegation-matrix.json +512 -0
- package/.codex/handoff-packet.schema.json +148 -0
- package/.codex/scripts/generate-codex-greeting.js +101 -0
- package/.codex/scripts/resolve-codex-command.js +147 -0
- package/.codex/scripts/resolve-codex-delegation.js +205 -0
- package/.codex/skills/sinapse-analyst/SKILL.md +5 -4
- package/.codex/skills/sinapse-architect/SKILL.md +5 -4
- package/.codex/skills/sinapse-data-engineer/SKILL.md +5 -4
- package/.codex/skills/sinapse-dev/SKILL.md +5 -4
- package/.codex/skills/sinapse-devops/SKILL.md +5 -4
- package/.codex/skills/sinapse-orqx/SKILL.md +10 -15
- package/.codex/skills/sinapse-pm/SKILL.md +5 -4
- package/.codex/skills/sinapse-po/SKILL.md +4 -3
- package/.codex/skills/sinapse-qa/SKILL.md +12 -11
- package/.codex/skills/sinapse-sm/SKILL.md +5 -4
- package/.codex/skills/sinapse-squad-creator/SKILL.md +5 -4
- package/.codex/skills/sinapse-ux-design-expert/SKILL.md +5 -4
- package/.codex/tasks/convene-sinapse-council.md +28 -0
- package/.codex/tasks/create-sinapse-strategic-brief.md +29 -0
- package/.codex/tasks/onboard-sinapse-codex.md +34 -0
- package/.codex/tasks/plan-sinapse-initiative.md +33 -0
- package/.codex/tasks/resolve-sinapse-conflict.md +28 -0
- package/.codex/tasks/route-sinapse-request.md +35 -0
- package/.codex/tasks/status-sinapse-capabilities.md +28 -0
- package/.sinapse-ai/core-config.yaml +1 -1
- package/.sinapse-ai/data/entity-registry.yaml +874 -749
- package/.sinapse-ai/data/registry-update-log.jsonl +13 -0
- package/.sinapse-ai/infrastructure/scripts/codex-parity/catalog.js +123 -0
- package/.sinapse-ai/infrastructure/scripts/codex-skills-sync/index.js +60 -11
- package/.sinapse-ai/infrastructure/scripts/codex-skills-sync/validate.js +44 -16
- package/.sinapse-ai/infrastructure/scripts/sync-codex-local-first.js +156 -0
- package/.sinapse-ai/infrastructure/scripts/validate-codex-command-registry.js +264 -0
- package/.sinapse-ai/infrastructure/scripts/validate-codex-delegation.js +292 -0
- package/.sinapse-ai/infrastructure/scripts/validate-codex-integration.js +15 -6
- package/.sinapse-ai/infrastructure/scripts/validate-codex-sync.js +159 -0
- package/.sinapse-ai/infrastructure/scripts/validate-parity.js +3 -1
- package/.sinapse-ai/infrastructure/scripts/validate-paths.js +8 -10
- package/.sinapse-ai/infrastructure/templates/safe-collab/README.md +8 -0
- package/.sinapse-ai/install-manifest.yaml +39 -19
- package/.sinapse-ai/project-config.yaml +1 -1
- package/bin/utils/collab-start.js +267 -0
- package/bin/utils/git-branch-guard.js +76 -0
- package/bin/utils/pre-push-safety.js +110 -0
- package/bin/utils/staged-secret-scan.js +108 -0
- package/docs/codex-parity-program.md +670 -0
- package/docs/codex-total-parity-orchestration-plan.md +301 -0
- package/docs/codex-workflow-task-parity.md +87 -0
- package/docs/collaboration-autonomy-plan.md +243 -0
- package/docs/guides/framework-contributor-mode.md +310 -0
- package/docs/guides/parallel-collaboration-source-of-truth.md +481 -0
- package/package.json +14 -3
- package/packages/installer/tests/unit/artifact-copy-pipeline/artifact-copy-pipeline.test.js +7 -2
- package/packages/installer/tests/unit/entity-registry-bootstrap.test.js +2 -2
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
const fs = require('fs');
|
|
5
|
+
const path = require('path');
|
|
6
|
+
const { spawnSync } = require('child_process');
|
|
7
|
+
|
|
8
|
+
const PROJECT_ROOT = path.resolve(__dirname, '..', '..');
|
|
9
|
+
const SHARED_GREETING_SCRIPT = path.join(
|
|
10
|
+
PROJECT_ROOT,
|
|
11
|
+
'.sinapse-ai',
|
|
12
|
+
'development',
|
|
13
|
+
'scripts',
|
|
14
|
+
'generate-greeting.js',
|
|
15
|
+
);
|
|
16
|
+
|
|
17
|
+
function generateFallbackGreeting(agentId) {
|
|
18
|
+
return '## Activation\n\n' +
|
|
19
|
+
`\`${agentId}\` ready\n\n` +
|
|
20
|
+
'Type `*help` to see available commands.';
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
function isGenericSharedFallback(output, agentId) {
|
|
24
|
+
const normalized = String(output || '').trim();
|
|
25
|
+
if (!normalized) return true;
|
|
26
|
+
|
|
27
|
+
const genericPatterns = [
|
|
28
|
+
`\u2705 ${agentId} Agent ready\n\nType \`*help\` to see available commands.`,
|
|
29
|
+
`\u2705 Agent ${agentId} loaded`,
|
|
30
|
+
`\ud83d\udc51 ${agentId} Agent ready`,
|
|
31
|
+
];
|
|
32
|
+
const looksLikeGenericActivation = genericPatterns.some((pattern) => normalized.includes(pattern));
|
|
33
|
+
const hasHelpPrompt = normalized.includes('Type `*help` to see available commands.');
|
|
34
|
+
const hasRichCodexGreeting = normalized.includes('AI Agent Squads for Claude Code');
|
|
35
|
+
|
|
36
|
+
return (looksLikeGenericActivation && hasHelpPrompt && !hasRichCodexGreeting);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function trySharedGreeting(agentId) {
|
|
40
|
+
if (!fs.existsSync(SHARED_GREETING_SCRIPT)) return '';
|
|
41
|
+
|
|
42
|
+
const result = spawnSync(process.execPath, [SHARED_GREETING_SCRIPT, agentId], {
|
|
43
|
+
cwd: PROJECT_ROOT,
|
|
44
|
+
encoding: 'utf8',
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
const output = String(result.stdout || '').trim();
|
|
48
|
+
if (!output || isGenericSharedFallback(output, agentId)) {
|
|
49
|
+
return '';
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
return output;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function extractStaticGreeting(agentId) {
|
|
56
|
+
const agentPath = path.join(PROJECT_ROOT, '.codex', 'agents', `${agentId}.md`);
|
|
57
|
+
if (!fs.existsSync(agentPath)) return '';
|
|
58
|
+
|
|
59
|
+
const content = fs.readFileSync(agentPath, 'utf8');
|
|
60
|
+
const firstBlock = content.match(
|
|
61
|
+
/When this agent is activated, you MUST display this greeting EXACTLY as your first output[\s\S]*?```([\s\S]*?)```/i,
|
|
62
|
+
);
|
|
63
|
+
const secondBlock = content.match(/Then display:\s*```([\s\S]*?)```/i);
|
|
64
|
+
|
|
65
|
+
const parts = [];
|
|
66
|
+
if (firstBlock && firstBlock[1]) {
|
|
67
|
+
parts.push(firstBlock[1].trim());
|
|
68
|
+
}
|
|
69
|
+
if (secondBlock && secondBlock[1]) {
|
|
70
|
+
parts.push(secondBlock[1].trim());
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
return parts.join('\n\n').trim();
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
function generateCodexGreeting(agentId) {
|
|
77
|
+
return trySharedGreeting(agentId) ||
|
|
78
|
+
extractStaticGreeting(agentId) ||
|
|
79
|
+
generateFallbackGreeting(agentId);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
function main() {
|
|
83
|
+
const agentId = process.argv[2];
|
|
84
|
+
if (!agentId) {
|
|
85
|
+
console.error('Usage: node .codex/scripts/generate-codex-greeting.js <agent-id>');
|
|
86
|
+
process.exit(1);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
console.log(generateCodexGreeting(agentId));
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
if (require.main === module) {
|
|
93
|
+
main();
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
module.exports = {
|
|
97
|
+
generateCodexGreeting,
|
|
98
|
+
extractStaticGreeting,
|
|
99
|
+
trySharedGreeting,
|
|
100
|
+
isGenericSharedFallback,
|
|
101
|
+
};
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
const fs = require('fs');
|
|
5
|
+
const path = require('path');
|
|
6
|
+
|
|
7
|
+
const PROJECT_ROOT = path.resolve(__dirname, '..', '..');
|
|
8
|
+
const REGISTRY_PATH = path.join(PROJECT_ROOT, '.codex', 'command-registry.json');
|
|
9
|
+
|
|
10
|
+
function loadCommandRegistry(projectRoot = PROJECT_ROOT) {
|
|
11
|
+
const registryPath = path.join(projectRoot, '.codex', 'command-registry.json');
|
|
12
|
+
const raw = fs.readFileSync(registryPath, 'utf8');
|
|
13
|
+
return JSON.parse(raw);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
function normalizeAgentInput(value) {
|
|
17
|
+
return String(value || '').trim().replace(/^@/, '').toLowerCase();
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
function normalizeCommandInput(value) {
|
|
21
|
+
return String(value || '').trim().replace(/^\*/, '').toLowerCase();
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
function resolveAgent(registry, agentInput) {
|
|
25
|
+
const normalized = normalizeAgentInput(agentInput);
|
|
26
|
+
const matches = [];
|
|
27
|
+
|
|
28
|
+
for (const [agentId, agentSpec] of Object.entries(registry.agents || {})) {
|
|
29
|
+
const aliases = [agentId, ...(agentSpec.aliases || [])]
|
|
30
|
+
.map((alias) => normalizeAgentInput(alias));
|
|
31
|
+
if (aliases.includes(normalized)) {
|
|
32
|
+
matches.push({ agentId, agentSpec });
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
if (matches.length > 1) {
|
|
37
|
+
throw new Error(`Ambiguous Codex agent "${agentInput}"`);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
return matches[0] || null;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
function resolveCommand(agentSpec, commandInput) {
|
|
44
|
+
const normalized = normalizeCommandInput(commandInput);
|
|
45
|
+
const matches = [];
|
|
46
|
+
|
|
47
|
+
for (const [commandId, commandSpec] of Object.entries(agentSpec.commands || {})) {
|
|
48
|
+
const aliases = [commandId, ...(commandSpec.aliases || [])]
|
|
49
|
+
.map((alias) => normalizeCommandInput(alias));
|
|
50
|
+
if (aliases.includes(normalized)) {
|
|
51
|
+
matches.push({ commandId, commandSpec });
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
if (matches.length > 1) {
|
|
56
|
+
throw new Error(`Ambiguous Codex command "${commandInput}"`);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
return matches[0] || null;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function resolveCodexCommand(agentInput, commandInput, projectRoot = PROJECT_ROOT) {
|
|
63
|
+
const registry = loadCommandRegistry(projectRoot);
|
|
64
|
+
const agent = resolveAgent(registry, agentInput);
|
|
65
|
+
if (!agent) {
|
|
66
|
+
throw new Error(`Unknown Codex agent "${agentInput}"`);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
const command = resolveCommand(agent.agentSpec, commandInput);
|
|
70
|
+
if (!command) {
|
|
71
|
+
throw new Error(`Unknown Codex command "${commandInput}" for agent "${agent.agentId}"`);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
return {
|
|
75
|
+
agentId: agent.agentId,
|
|
76
|
+
skillId: agent.agentSpec.skillId,
|
|
77
|
+
commandId: command.commandId,
|
|
78
|
+
kind: command.commandSpec.kind,
|
|
79
|
+
target: command.commandSpec.target,
|
|
80
|
+
resources: command.commandSpec.resources || [],
|
|
81
|
+
sourceOfTruth: agent.agentSpec.sourceOfTruth,
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
function parseArgs(argv = process.argv.slice(2)) {
|
|
86
|
+
const args = argv.filter((arg) => !arg.startsWith('--'));
|
|
87
|
+
const flags = new Set(argv.filter((arg) => arg.startsWith('--')));
|
|
88
|
+
return {
|
|
89
|
+
agent: args[0],
|
|
90
|
+
command: args[1],
|
|
91
|
+
json: flags.has('--json'),
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
function formatHumanResult(result) {
|
|
96
|
+
const lines = [
|
|
97
|
+
`Agent: ${result.agentId}`,
|
|
98
|
+
`Skill: ${result.skillId}`,
|
|
99
|
+
`Command: ${result.commandId}`,
|
|
100
|
+
`Kind: ${result.kind}`,
|
|
101
|
+
`Target: ${result.target}`,
|
|
102
|
+
`Source: ${result.sourceOfTruth}`,
|
|
103
|
+
];
|
|
104
|
+
|
|
105
|
+
if (result.resources.length > 0) {
|
|
106
|
+
lines.push('Resources:');
|
|
107
|
+
lines.push(...result.resources.map((resource) => `- ${resource}`));
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
return lines.join('\n');
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
function main() {
|
|
114
|
+
const args = parseArgs();
|
|
115
|
+
if (!args.agent || !args.command) {
|
|
116
|
+
console.error('Usage: node .codex/scripts/resolve-codex-command.js <agent> <command> [--json]');
|
|
117
|
+
process.exit(1);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
try {
|
|
121
|
+
const result = resolveCodexCommand(args.agent, args.command);
|
|
122
|
+
if (args.json) {
|
|
123
|
+
console.log(JSON.stringify(result, null, 2));
|
|
124
|
+
} else {
|
|
125
|
+
console.log(formatHumanResult(result));
|
|
126
|
+
}
|
|
127
|
+
} catch (error) {
|
|
128
|
+
console.error(error.message);
|
|
129
|
+
process.exit(1);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
if (require.main === module) {
|
|
134
|
+
main();
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
module.exports = {
|
|
138
|
+
REGISTRY_PATH,
|
|
139
|
+
loadCommandRegistry,
|
|
140
|
+
normalizeAgentInput,
|
|
141
|
+
normalizeCommandInput,
|
|
142
|
+
resolveAgent,
|
|
143
|
+
resolveCommand,
|
|
144
|
+
resolveCodexCommand,
|
|
145
|
+
parseArgs,
|
|
146
|
+
formatHumanResult,
|
|
147
|
+
};
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
const fs = require('fs');
|
|
5
|
+
const path = require('path');
|
|
6
|
+
|
|
7
|
+
const PROJECT_ROOT = path.resolve(__dirname, '..', '..');
|
|
8
|
+
const MATRIX_PATH = path.join('.codex', 'delegation-matrix.json');
|
|
9
|
+
|
|
10
|
+
function loadDelegationMatrix(projectRoot = PROJECT_ROOT) {
|
|
11
|
+
const matrixPath = path.join(projectRoot, MATRIX_PATH);
|
|
12
|
+
const raw = fs.readFileSync(matrixPath, 'utf8');
|
|
13
|
+
return JSON.parse(raw);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
function normalizeRouteInput(value) {
|
|
17
|
+
return String(value || '')
|
|
18
|
+
.trim()
|
|
19
|
+
.replace(/^[@*]/, '')
|
|
20
|
+
.toLowerCase();
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
function normalizeActorInput(value) {
|
|
24
|
+
return String(value || '')
|
|
25
|
+
.trim()
|
|
26
|
+
.replace(/^@/, '')
|
|
27
|
+
.toLowerCase();
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function collectRouteAliases(routeId, routeSpec) {
|
|
31
|
+
return [routeId, ...(routeSpec.aliases || [])]
|
|
32
|
+
.map((alias) => normalizeRouteInput(alias))
|
|
33
|
+
.filter(Boolean);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function resolveDelegationRoute(routeInput, projectRoot = PROJECT_ROOT, matrix = loadDelegationMatrix(projectRoot)) {
|
|
37
|
+
const normalized = normalizeRouteInput(routeInput);
|
|
38
|
+
const matches = Object.entries(matrix.routes || {}).filter(([routeId, routeSpec]) =>
|
|
39
|
+
collectRouteAliases(routeId, routeSpec).includes(normalized),
|
|
40
|
+
);
|
|
41
|
+
|
|
42
|
+
if (matches.length > 1) {
|
|
43
|
+
throw new Error(`Ambiguous Codex delegation route "${routeInput}"`);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
if (matches.length === 0) {
|
|
47
|
+
throw new Error(`Unknown Codex delegation route "${routeInput}"`);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
const [routeId, routeSpec] = matches[0];
|
|
51
|
+
return { routeId, routeSpec };
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
function resolveRouteRecord(routeInput, projectRoot = PROJECT_ROOT, matrix = loadDelegationMatrix(projectRoot)) {
|
|
55
|
+
if (
|
|
56
|
+
routeInput &&
|
|
57
|
+
typeof routeInput === 'object' &&
|
|
58
|
+
typeof routeInput.routeId === 'string' &&
|
|
59
|
+
routeInput.routeSpec &&
|
|
60
|
+
typeof routeInput.routeSpec === 'object'
|
|
61
|
+
) {
|
|
62
|
+
return routeInput;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
return resolveDelegationRoute(routeInput, projectRoot, matrix);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
function routeMentionsSource(routeSpec, sourceInput) {
|
|
69
|
+
const normalizedSource = normalizeActorInput(sourceInput);
|
|
70
|
+
if (!normalizedSource) {
|
|
71
|
+
return true;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
if (normalizeActorInput(routeSpec.owner) === normalizedSource) {
|
|
75
|
+
return true;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
return (routeSpec.delegationChain || []).some(
|
|
79
|
+
(step) =>
|
|
80
|
+
normalizeActorInput(step.from) === normalizedSource ||
|
|
81
|
+
normalizeActorInput(step.to) === normalizedSource,
|
|
82
|
+
);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
function buildHandoffPacket(routeInput, projectRoot = PROJECT_ROOT, matrix = loadDelegationMatrix(projectRoot)) {
|
|
86
|
+
const { routeId, routeSpec } = resolveRouteRecord(routeInput, projectRoot, matrix);
|
|
87
|
+
const nextStep = routeSpec.delegationChain?.[0] || null;
|
|
88
|
+
|
|
89
|
+
return {
|
|
90
|
+
routeId,
|
|
91
|
+
mission: routeSpec.mission,
|
|
92
|
+
phase: matrix.phase || 'W5 / Delegation Matrix Parity',
|
|
93
|
+
owner: routeSpec.owner,
|
|
94
|
+
classification: routeSpec.classification,
|
|
95
|
+
summary: routeSpec.summary || '',
|
|
96
|
+
inputs: routeSpec.inputs || [],
|
|
97
|
+
outputs: routeSpec.outputs || [],
|
|
98
|
+
validators: routeSpec.validators || [],
|
|
99
|
+
sharedSurfaceRisk: routeSpec.sharedSurfaceRisk || 'low',
|
|
100
|
+
nextHandoff: {
|
|
101
|
+
to: nextStep?.to || routeSpec.owner,
|
|
102
|
+
artifact: routeSpec.outputs?.[0] || 'handoff-packet',
|
|
103
|
+
},
|
|
104
|
+
delegationChain: routeSpec.delegationChain || [],
|
|
105
|
+
resources: routeSpec.resources || [],
|
|
106
|
+
notes: routeSpec.notes || [],
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
function resolveCodexDelegation(routeInput, projectRoot = PROJECT_ROOT, options = {}) {
|
|
111
|
+
const matrix = options.matrix || loadDelegationMatrix(projectRoot);
|
|
112
|
+
const { routeId, routeSpec } = resolveDelegationRoute(routeInput, projectRoot, matrix);
|
|
113
|
+
|
|
114
|
+
if (options.source && !routeMentionsSource(routeSpec, options.source)) {
|
|
115
|
+
throw new Error(
|
|
116
|
+
`Codex delegation route "${routeId}" is not available from source "${options.source}"`,
|
|
117
|
+
);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
return {
|
|
121
|
+
routeId,
|
|
122
|
+
owner: routeSpec.owner,
|
|
123
|
+
requestType: routeSpec.requestType,
|
|
124
|
+
classification: routeSpec.classification,
|
|
125
|
+
mission: routeSpec.mission,
|
|
126
|
+
summary: routeSpec.summary || '',
|
|
127
|
+
inputs: routeSpec.inputs || [],
|
|
128
|
+
outputs: routeSpec.outputs || [],
|
|
129
|
+
validators: routeSpec.validators || [],
|
|
130
|
+
sharedSurfaceRisk: routeSpec.sharedSurfaceRisk || 'low',
|
|
131
|
+
resources: routeSpec.resources || [],
|
|
132
|
+
delegationChain: routeSpec.delegationChain || [],
|
|
133
|
+
handoffPacket: buildHandoffPacket({ routeId, routeSpec }, projectRoot, matrix),
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
function parseArgs(argv = process.argv.slice(2)) {
|
|
138
|
+
const flags = new Set(argv.filter((arg) => arg.startsWith('--')));
|
|
139
|
+
const args = argv.filter((arg) => !arg.startsWith('--'));
|
|
140
|
+
|
|
141
|
+
return {
|
|
142
|
+
source: args.length > 1 ? args[0] : null,
|
|
143
|
+
route: args.length > 1 ? args[1] : args[0],
|
|
144
|
+
json: flags.has('--json'),
|
|
145
|
+
packet: flags.has('--packet'),
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
function formatHumanResult(result) {
|
|
150
|
+
const nextHandoff = result.handoffPacket?.nextHandoff?.to || 'n/a';
|
|
151
|
+
const delegationPath = (result.delegationChain || [])
|
|
152
|
+
.map((step) => `${step.from} -> ${step.to}`)
|
|
153
|
+
.join(' | ');
|
|
154
|
+
|
|
155
|
+
return [
|
|
156
|
+
`Route: ${result.routeId}`,
|
|
157
|
+
`Owner: ${result.owner}`,
|
|
158
|
+
`Request Type: ${result.requestType}`,
|
|
159
|
+
`Classification: ${result.classification}`,
|
|
160
|
+
`Next Handoff: ${nextHandoff}`,
|
|
161
|
+
`Delegation Chain: ${delegationPath || 'n/a'}`,
|
|
162
|
+
].join('\n');
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
function main() {
|
|
166
|
+
const args = parseArgs();
|
|
167
|
+
if (!args.route) {
|
|
168
|
+
console.error(
|
|
169
|
+
'Usage: node .codex/scripts/resolve-codex-delegation.js <route> [--json] [--packet]\n' +
|
|
170
|
+
' or: node .codex/scripts/resolve-codex-delegation.js <source-agent> <route> [--json] [--packet]',
|
|
171
|
+
);
|
|
172
|
+
process.exit(1);
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
try {
|
|
176
|
+
const result = resolveCodexDelegation(args.route, PROJECT_ROOT, {
|
|
177
|
+
source: args.source,
|
|
178
|
+
});
|
|
179
|
+
const payload = args.packet ? result.handoffPacket : result;
|
|
180
|
+
|
|
181
|
+
if (args.json || args.packet) {
|
|
182
|
+
console.log(JSON.stringify(payload, null, 2));
|
|
183
|
+
} else {
|
|
184
|
+
console.log(formatHumanResult(result));
|
|
185
|
+
}
|
|
186
|
+
} catch (error) {
|
|
187
|
+
console.error(error.message);
|
|
188
|
+
process.exit(1);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
if (require.main === module) {
|
|
193
|
+
main();
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
module.exports = {
|
|
197
|
+
MATRIX_PATH,
|
|
198
|
+
loadDelegationMatrix,
|
|
199
|
+
normalizeRouteInput,
|
|
200
|
+
resolveDelegationRoute,
|
|
201
|
+
buildHandoffPacket,
|
|
202
|
+
resolveCodexDelegation,
|
|
203
|
+
parseArgs,
|
|
204
|
+
formatHumanResult,
|
|
205
|
+
};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: sinapse-analyst
|
|
3
|
-
description: Business Analyst (
|
|
3
|
+
description: Business Analyst (Scope). Use for market research, competitive analysis, user research, brainstorming session facilitation, structured ideation workshops, feasibility studies, i...
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# SINAPSE Business Analyst Activator
|
|
@@ -10,9 +10,10 @@ Use for market research, competitive analysis, user research, brainstorming sess
|
|
|
10
10
|
|
|
11
11
|
## Activation Protocol
|
|
12
12
|
1. Load `.sinapse-ai/development/agents/analyst.md` as source of truth (fallback: `.codex/agents/analyst.md`).
|
|
13
|
-
2.
|
|
14
|
-
3.
|
|
15
|
-
4.
|
|
13
|
+
2. Generate greeting via `node .sinapse-ai/development/scripts/generate-greeting.js analyst` and show it first.
|
|
14
|
+
3. Adopt this agent persona and command system.
|
|
15
|
+
4. If a starred command is invoked in Codex, resolve it via `node .codex/scripts/resolve-codex-command.js sinapse-analyst <command>` when a registry mapping exists.
|
|
16
|
+
5. Stay in this persona until the user asks to switch or exit.
|
|
16
17
|
|
|
17
18
|
## Starter Commands
|
|
18
19
|
- `*help` - Show all available commands with descriptions
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: sinapse-architect
|
|
3
|
-
description: Architect (
|
|
3
|
+
description: Architect (Stratum). Use for system architecture (fullstack, backend, frontend, infrastructure), technology stack selection (technical evaluation), API design (REST/GraphQL/tRPC...
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# SINAPSE Architect Activator
|
|
@@ -10,9 +10,10 @@ Use for system architecture (fullstack, backend, frontend, infrastructure), tech
|
|
|
10
10
|
|
|
11
11
|
## Activation Protocol
|
|
12
12
|
1. Load `.sinapse-ai/development/agents/architect.md` as source of truth (fallback: `.codex/agents/architect.md`).
|
|
13
|
-
2.
|
|
14
|
-
3.
|
|
15
|
-
4.
|
|
13
|
+
2. Generate greeting via `node .sinapse-ai/development/scripts/generate-greeting.js architect` and show it first.
|
|
14
|
+
3. Adopt this agent persona and command system.
|
|
15
|
+
4. If a starred command is invoked in Codex, resolve it via `node .codex/scripts/resolve-codex-command.js sinapse-architect <command>` when a registry mapping exists.
|
|
16
|
+
5. Stay in this persona until the user asks to switch or exit.
|
|
16
17
|
|
|
17
18
|
## Starter Commands
|
|
18
19
|
- `*help` - Show all available commands with descriptions
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: sinapse-data-engineer
|
|
3
|
-
description: Database Architect & Operations Engineer (
|
|
3
|
+
description: Database Architect & Operations Engineer (Tensor). Use for database design, schema architecture, Supabase configuration, RLS policies, migrations, query optimization, data model...
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# SINAPSE Database Architect & Operations Engineer Activator
|
|
@@ -10,9 +10,10 @@ Use for database design, schema architecture, Supabase configuration, RLS polici
|
|
|
10
10
|
|
|
11
11
|
## Activation Protocol
|
|
12
12
|
1. Load `.sinapse-ai/development/agents/data-engineer.md` as source of truth (fallback: `.codex/agents/data-engineer.md`).
|
|
13
|
-
2.
|
|
14
|
-
3.
|
|
15
|
-
4.
|
|
13
|
+
2. Generate greeting via `node .sinapse-ai/development/scripts/generate-greeting.js data-engineer` and show it first.
|
|
14
|
+
3. Adopt this agent persona and command system.
|
|
15
|
+
4. If a starred command is invoked in Codex, resolve it via `node .codex/scripts/resolve-codex-command.js sinapse-data-engineer <command>` when a registry mapping exists.
|
|
16
|
+
5. Stay in this persona until the user asks to switch or exit.
|
|
16
17
|
|
|
17
18
|
## Starter Commands
|
|
18
19
|
- `*help` - Show all available commands with descriptions
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: sinapse-dev
|
|
3
|
-
description: Full Stack Developer (
|
|
3
|
+
description: Full Stack Developer (Pixel). Use for code implementation, debugging, refactoring, and development best practices
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# SINAPSE Full Stack Developer Activator
|
|
@@ -10,9 +10,10 @@ Use for code implementation, debugging, refactoring, and development best practi
|
|
|
10
10
|
|
|
11
11
|
## Activation Protocol
|
|
12
12
|
1. Load `.sinapse-ai/development/agents/developer.md` as source of truth (fallback: `.codex/agents/developer.md`).
|
|
13
|
-
2.
|
|
14
|
-
3.
|
|
15
|
-
4.
|
|
13
|
+
2. Generate greeting via `node .sinapse-ai/development/scripts/generate-greeting.js dev` and show it first.
|
|
14
|
+
3. Adopt this agent persona and command system.
|
|
15
|
+
4. If a starred command is invoked in Codex, resolve it via `node .codex/scripts/resolve-codex-command.js sinapse-dev <command>` when a registry mapping exists.
|
|
16
|
+
5. Stay in this persona until the user asks to switch or exit.
|
|
16
17
|
|
|
17
18
|
## Starter Commands
|
|
18
19
|
- `*help` - Show all available commands with descriptions
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: sinapse-devops
|
|
3
|
-
description: GitHub Repository Manager & DevOps Specialist (
|
|
3
|
+
description: GitHub Repository Manager & DevOps Specialist (Pipeline). Use for repository operations, version management, CI/CD, quality gates, and GitHub push operations. ONLY agent authori...
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# SINAPSE GitHub Repository Manager & DevOps Specialist Activator
|
|
@@ -10,9 +10,10 @@ Use for repository operations, version management, CI/CD, quality gates, and Git
|
|
|
10
10
|
|
|
11
11
|
## Activation Protocol
|
|
12
12
|
1. Load `.sinapse-ai/development/agents/devops.md` as source of truth (fallback: `.codex/agents/devops.md`).
|
|
13
|
-
2.
|
|
14
|
-
3.
|
|
15
|
-
4.
|
|
13
|
+
2. Generate greeting via `node .sinapse-ai/development/scripts/generate-greeting.js devops` and show it first.
|
|
14
|
+
3. Adopt this agent persona and command system.
|
|
15
|
+
4. If a starred command is invoked in Codex, resolve it via `node .codex/scripts/resolve-codex-command.js sinapse-devops <command>` when a registry mapping exists.
|
|
16
|
+
5. Stay in this persona until the user asks to switch or exit.
|
|
16
17
|
|
|
17
18
|
## Starter Commands
|
|
18
19
|
- `*help` - Show all available commands with descriptions
|
|
@@ -1,28 +1,23 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: sinapse-orqx
|
|
3
|
-
description:
|
|
3
|
+
description: "Sinapse Master — Supreme Ecosystem Orchestrator" ("Imperator"). ALWAYS as the default agent. Imperator is the first point of contact for EVERY request. Routes directly to @spec...
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
# SINAPSE
|
|
6
|
+
# SINAPSE "Sinapse Master — Supreme Ecosystem Orchestrator" Activator
|
|
7
7
|
|
|
8
8
|
## When To Use
|
|
9
|
-
|
|
9
|
+
ALWAYS as the default agent. Imperator is the first point of contact for EVERY request. Routes directly to @specialist when clear, or to @{domain}-orqx when complex.
|
|
10
10
|
|
|
11
11
|
## Activation Protocol
|
|
12
|
-
1. Load `.
|
|
13
|
-
2.
|
|
14
|
-
3. Generate greeting via `node .
|
|
15
|
-
4.
|
|
12
|
+
1. Load `.codex/agents/sinapse-orqx.md` as source of truth.
|
|
13
|
+
2. Keep `.sinapse-ai/development/agents/sinapse-orqx.md` as the shared parity reference.
|
|
14
|
+
3. Generate greeting via `node .codex/scripts/generate-codex-greeting.js sinapse-orqx` and show it first.
|
|
15
|
+
4. Adopt this agent persona and command system.
|
|
16
|
+
5. If a starred command is invoked in Codex, resolve it via `node .codex/scripts/resolve-codex-command.js sinapse-orqx <command>` when a registry mapping exists.
|
|
17
|
+
6. Stay in this persona until the user asks to switch or exit.
|
|
16
18
|
|
|
17
19
|
## Starter Commands
|
|
18
|
-
- `*help` -
|
|
19
|
-
- `*kb` - Toggle KB mode (loads SINAPSE Method knowledge)
|
|
20
|
-
- `*status` - Show current context and progress
|
|
21
|
-
- `*guide` - Show comprehensive usage guide for this agent
|
|
22
|
-
- `*exit` - Exit agent mode
|
|
23
|
-
- `*create` - Create new SINAPSE component (agent, task, workflow, template, checklist)
|
|
24
|
-
- `*modify` - Modify existing SINAPSE component
|
|
25
|
-
- `*update-manifest` - Update team manifest
|
|
20
|
+
- `*help` - List available commands
|
|
26
21
|
|
|
27
22
|
## Non-Negotiables
|
|
28
23
|
- Follow `.sinapse-ai/constitution.md`.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: sinapse-pm
|
|
3
|
-
description: Product Manager (
|
|
3
|
+
description: Product Manager (Beacon). Use for PRD creation (greenfield and brownfield), epic creation and management, product strategy and vision, feature prioritization (MoSCoW, RICE), roa...
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# SINAPSE Product Manager Activator
|
|
@@ -10,9 +10,10 @@ Use for PRD creation (greenfield and brownfield), epic creation and management,
|
|
|
10
10
|
|
|
11
11
|
## Activation Protocol
|
|
12
12
|
1. Load `.sinapse-ai/development/agents/project-lead.md` as source of truth (fallback: `.codex/agents/project-lead.md`).
|
|
13
|
-
2.
|
|
14
|
-
3.
|
|
15
|
-
4.
|
|
13
|
+
2. Generate greeting via `node .sinapse-ai/development/scripts/generate-greeting.js pm` and show it first.
|
|
14
|
+
3. Adopt this agent persona and command system.
|
|
15
|
+
4. If a starred command is invoked in Codex, resolve it via `node .codex/scripts/resolve-codex-command.js sinapse-pm <command>` when a registry mapping exists.
|
|
16
|
+
5. Stay in this persona until the user asks to switch or exit.
|
|
16
17
|
|
|
17
18
|
## Starter Commands
|
|
18
19
|
- `*help` - Show all available commands with descriptions
|
|
@@ -10,9 +10,10 @@ Use for backlog management, story refinement, acceptance criteria, sprint planni
|
|
|
10
10
|
|
|
11
11
|
## Activation Protocol
|
|
12
12
|
1. Load `.sinapse-ai/development/agents/product-lead.md` as source of truth (fallback: `.codex/agents/product-lead.md`).
|
|
13
|
-
2.
|
|
14
|
-
3.
|
|
15
|
-
4.
|
|
13
|
+
2. Generate greeting via `node .sinapse-ai/development/scripts/generate-greeting.js po` and show it first.
|
|
14
|
+
3. Adopt this agent persona and command system.
|
|
15
|
+
4. If a starred command is invoked in Codex, resolve it via `node .codex/scripts/resolve-codex-command.js sinapse-po <command>` when a registry mapping exists.
|
|
16
|
+
5. Stay in this persona until the user asks to switch or exit.
|
|
16
17
|
|
|
17
18
|
## Starter Commands
|
|
18
19
|
- `*help` - Show all available commands with descriptions
|