fraim 2.0.217 → 2.0.218
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/dist/src/cli/commands/add-ide.js +0 -7
- package/dist/src/cli/commands/init-project.js +8 -12
- package/dist/src/cli/commands/sync.js +15 -10
- package/dist/src/cli/setup/auto-mcp-setup.js +0 -6
- package/dist/src/cli/setup/codex-local-config.js +5 -27
- package/dist/src/config/persona-capability-bundles.js +27 -21
- package/package.json +1 -1
|
@@ -44,7 +44,6 @@ const fs_1 = __importDefault(require("fs"));
|
|
|
44
44
|
const path_1 = __importDefault(require("path"));
|
|
45
45
|
const ide_detector_1 = require("../setup/ide-detector");
|
|
46
46
|
const mcp_config_generator_1 = require("../setup/mcp-config-generator");
|
|
47
|
-
const codex_local_config_1 = require("../setup/codex-local-config");
|
|
48
47
|
const claude_code_telemetry_1 = require("../setup/claude-code-telemetry");
|
|
49
48
|
const script_sync_utils_1 = require("../utils/script-sync-utils");
|
|
50
49
|
const mcp_server_registry_1 = require("../mcp/mcp-server-registry");
|
|
@@ -254,12 +253,6 @@ const configureIDEMCP = async (ide, fraimKey, tokens, providerConfigs) => {
|
|
|
254
253
|
});
|
|
255
254
|
}
|
|
256
255
|
console.log(chalk_1.default.green(`✅ Updated ${configPath}`));
|
|
257
|
-
// Handle IDE-specific local config (e.g., Codex needs project-level config)
|
|
258
|
-
if (ide.configType === 'codex') {
|
|
259
|
-
const localResult = (0, codex_local_config_1.ensureCodexLocalConfig)(process.cwd());
|
|
260
|
-
const status = localResult.created ? 'Created' : localResult.updated ? 'Updated' : 'Verified';
|
|
261
|
-
console.log(chalk_1.default.green(` ✅ ${status} local ${ide.name} config: ${localResult.path}`));
|
|
262
|
-
}
|
|
263
256
|
// Enable token telemetry for Claude Code via project-level settings
|
|
264
257
|
if (ide.configType === 'claude-code') {
|
|
265
258
|
(0, claude_code_telemetry_1.ensureClaudeCodeTelemetryEnv)();
|
|
@@ -12,7 +12,6 @@ const chalk_1 = __importDefault(require("chalk"));
|
|
|
12
12
|
const sync_1 = require("./sync");
|
|
13
13
|
const platform_detection_1 = require("../utils/platform-detection");
|
|
14
14
|
const ide_detector_1 = require("../setup/ide-detector");
|
|
15
|
-
const codex_local_config_1 = require("../setup/codex-local-config");
|
|
16
15
|
const claude_code_telemetry_1 = require("../setup/claude-code-telemetry");
|
|
17
16
|
const fraim_gitignore_1 = require("../utils/fraim-gitignore");
|
|
18
17
|
const agent_adapters_1 = require("../utils/agent-adapters");
|
|
@@ -173,7 +172,7 @@ const runInitProject = async (options = {}) => {
|
|
|
173
172
|
console.log(chalk_1.default.green('Removed legacy FRAIM sync block from .gitignore'));
|
|
174
173
|
}
|
|
175
174
|
if (!process.env.FRAIM_SKIP_SYNC) {
|
|
176
|
-
await (0, sync_1.runSync)({ projectRoot, failHard });
|
|
175
|
+
await (0, sync_1.runSync)({ projectRoot, failHard, projectAdapters: options.projectAdapters });
|
|
177
176
|
result.syncPerformed = true;
|
|
178
177
|
}
|
|
179
178
|
else {
|
|
@@ -187,24 +186,21 @@ const runInitProject = async (options = {}) => {
|
|
|
187
186
|
if (detectedConfigTypes.length > 0) {
|
|
188
187
|
(0, user_config_1.writeUserFraimConfig)({ installedIdes: detectedConfigTypes });
|
|
189
188
|
}
|
|
190
|
-
const codexAvailable = detectedIdes.some((ide) => ide.configType === 'codex');
|
|
191
|
-
if (codexAvailable) {
|
|
192
|
-
const codexLocalResult = (0, codex_local_config_1.ensureCodexLocalConfig)(projectRoot);
|
|
193
|
-
const status = codexLocalResult.created ? 'Created' : codexLocalResult.updated ? 'Updated' : 'Verified';
|
|
194
|
-
console.log(chalk_1.default.green(`${status} project Codex config at ${codexLocalResult.path}`));
|
|
195
|
-
}
|
|
196
189
|
// Enable token telemetry for Claude Code (user-level, applies to all projects)
|
|
197
190
|
const claudeCodeAvailable = detectedIdes.some((ide) => ide.configType === 'claude-code');
|
|
198
191
|
if (claudeCodeAvailable) {
|
|
199
192
|
(0, claude_code_telemetry_1.ensureClaudeCodeTelemetryEnv)();
|
|
200
193
|
}
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
194
|
+
if (options.projectAdapters) {
|
|
195
|
+
const adapterUpdates = (0, agent_adapters_1.ensureAgentAdapterFiles)(projectRoot, detectedConfigTypes.length > 0 ? detectedConfigTypes : null);
|
|
196
|
+
if (adapterUpdates.length > 0) {
|
|
197
|
+
console.log(chalk_1.default.green(`Updated FRAIM agent adapter files: ${adapterUpdates.join(', ')}`));
|
|
198
|
+
}
|
|
204
199
|
}
|
|
205
200
|
(0, project_bootstrap_1.printInitProjectSummary)(result);
|
|
206
201
|
};
|
|
207
202
|
exports.runInitProject = runInitProject;
|
|
208
203
|
exports.initProjectCommand = new commander_1.Command('init-project')
|
|
209
204
|
.description('Initialize FRAIM in the current project (requires global setup)')
|
|
210
|
-
.
|
|
205
|
+
.option('--project-adapters', 'Write legacy project-local FRAIM agent adapter files')
|
|
206
|
+
.action((options) => (0, exports.runInitProject)({ projectAdapters: Boolean(options.projectAdapters) }));
|
|
@@ -288,11 +288,13 @@ const runSync = async (options) => {
|
|
|
288
288
|
removeLegacyVersionFromConfig(fraimDir);
|
|
289
289
|
writeSyncMetadata('local', localUrl);
|
|
290
290
|
refreshLocalIgnoreConfig();
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
291
|
+
if (options.projectAdapters) {
|
|
292
|
+
const allowedTypes = resolveAllowedConfigTypes();
|
|
293
|
+
await cleanupStaleAdapterFiles(projectRoot, allowedTypes);
|
|
294
|
+
const adapterUpdates = (0, agent_adapters_1.ensureAgentAdapterFiles)(projectRoot, allowedTypes);
|
|
295
|
+
if (adapterUpdates.length > 0) {
|
|
296
|
+
console.log(chalk_1.default.green(`Updated FRAIM agent adapter files: ${adapterUpdates.join(', ')}`));
|
|
297
|
+
}
|
|
296
298
|
}
|
|
297
299
|
await refreshOrgCache(localUrl, 'local-dev');
|
|
298
300
|
await refreshManagerCache(localUrl, 'local-dev');
|
|
@@ -335,11 +337,13 @@ const runSync = async (options) => {
|
|
|
335
337
|
removeLegacyVersionFromConfig(fraimDir);
|
|
336
338
|
writeSyncMetadata('remote', config.remoteUrl || process.env.FRAIM_REMOTE_URL || 'https://fraim.wellnessatwork.me');
|
|
337
339
|
refreshLocalIgnoreConfig();
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
340
|
+
if (options.projectAdapters) {
|
|
341
|
+
const allowedTypes = resolveAllowedConfigTypes();
|
|
342
|
+
await cleanupStaleAdapterFiles(projectRoot, allowedTypes);
|
|
343
|
+
const adapterUpdates = (0, agent_adapters_1.ensureAgentAdapterFiles)(projectRoot, allowedTypes);
|
|
344
|
+
if (adapterUpdates.length > 0) {
|
|
345
|
+
console.log(chalk_1.default.green(`Updated FRAIM agent adapter files: ${adapterUpdates.join(', ')}`));
|
|
346
|
+
}
|
|
343
347
|
}
|
|
344
348
|
await refreshOrgCache(config.remoteUrl || process.env.FRAIM_REMOTE_URL || 'https://fraim.wellnessatwork.me', apiKey);
|
|
345
349
|
await refreshManagerCache(config.remoteUrl || process.env.FRAIM_REMOTE_URL || 'https://fraim.wellnessatwork.me', apiKey);
|
|
@@ -351,4 +355,5 @@ exports.syncCommand = new commander_1.Command('sync')
|
|
|
351
355
|
.option('--skip-updates', 'Skip checking for CLI updates (legacy)')
|
|
352
356
|
.option('--local', 'Sync from local development server (port derived from git branch)')
|
|
353
357
|
.option('--global', 'Sync user-level FRAIM content (~/.fraim/) instead of project')
|
|
358
|
+
.option('--project-adapters', 'Write legacy project-local FRAIM agent adapter files')
|
|
354
359
|
.action(exports.runSync);
|
|
@@ -43,7 +43,6 @@ const chalk_1 = __importDefault(require("chalk"));
|
|
|
43
43
|
const prompts_1 = __importDefault(require("prompts"));
|
|
44
44
|
const ide_detector_1 = require("./ide-detector");
|
|
45
45
|
const mcp_config_generator_1 = require("./mcp-config-generator");
|
|
46
|
-
const codex_local_config_1 = require("./codex-local-config");
|
|
47
46
|
const promptForIDESelection = async (detectedIDEs) => {
|
|
48
47
|
if (process.env.FRAIM_NON_INTERACTIVE) {
|
|
49
48
|
console.log(chalk_1.default.yellow(`\nℹ️ Non-interactive mode: configuring all detected IDEs (${detectedIDEs.length})`));
|
|
@@ -223,11 +222,6 @@ const configureIDEMCP = async (ide, fraimKey) => {
|
|
|
223
222
|
});
|
|
224
223
|
}
|
|
225
224
|
console.log(chalk_1.default.green(`✅ Updated ${configPath}`));
|
|
226
|
-
if (ide.configType === 'codex') {
|
|
227
|
-
const localResult = (0, codex_local_config_1.ensureCodexLocalConfig)(process.cwd());
|
|
228
|
-
const status = localResult.created ? 'Created' : localResult.updated ? 'Updated' : 'Verified';
|
|
229
|
-
console.log(chalk_1.default.green(` ✅ ${status} local Codex config: ${localResult.path}`));
|
|
230
|
-
}
|
|
231
225
|
};
|
|
232
226
|
const autoConfigureMCP = async (fraimKey, selectedIDEs) => {
|
|
233
227
|
const detectedIDEs = (0, ide_detector_1.detectInstalledIDEs)();
|
|
@@ -4,34 +4,12 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.ensureCodexLocalConfig = void 0;
|
|
7
|
-
const fs_1 = __importDefault(require("fs"));
|
|
8
7
|
const path_1 = __importDefault(require("path"));
|
|
9
|
-
const mcp_config_generator_1 = require("./mcp-config-generator");
|
|
10
|
-
const escapeTomlString = (value) => value.replace(/\\/g, '\\\\').replace(/"/g, '\\"');
|
|
11
|
-
const buildFraimCwdBlock = (projectRoot) => `
|
|
12
|
-
[mcp_servers.fraim]
|
|
13
|
-
cwd = "${escapeTomlString(projectRoot)}"
|
|
14
|
-
`;
|
|
15
8
|
const ensureCodexLocalConfig = (projectRoot) => {
|
|
16
|
-
const
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
}
|
|
21
|
-
const hadExistingFile = fs_1.default.existsSync(codexConfigPath);
|
|
22
|
-
const existingContent = hadExistingFile ? fs_1.default.readFileSync(codexConfigPath, 'utf8') : '';
|
|
23
|
-
const generatedContent = buildFraimCwdBlock(projectRoot);
|
|
24
|
-
const mergeResult = (0, mcp_config_generator_1.mergeTomlMCPServers)(existingContent, generatedContent, ['fraim']);
|
|
25
|
-
const normalizedExisting = existingContent.replace(/\r\n/g, '\n');
|
|
26
|
-
const normalizedMerged = mergeResult.content.replace(/\r\n/g, '\n');
|
|
27
|
-
const shouldWrite = !hadExistingFile || normalizedExisting !== normalizedMerged;
|
|
28
|
-
if (shouldWrite) {
|
|
29
|
-
fs_1.default.writeFileSync(codexConfigPath, mergeResult.content);
|
|
30
|
-
}
|
|
31
|
-
return {
|
|
32
|
-
path: codexConfigPath,
|
|
33
|
-
created: !hadExistingFile,
|
|
34
|
-
updated: shouldWrite && hadExistingFile
|
|
35
|
-
};
|
|
9
|
+
const codexConfigPath = path_1.default.join(projectRoot, '.codex', 'config.toml');
|
|
10
|
+
// Codex resolves the active workspace from its process cwd. FRAIM's Codex
|
|
11
|
+
// MCP server belongs in machine-level config; project-local partial TOML can
|
|
12
|
+
// shadow a valid profile and break configured Hub launches.
|
|
13
|
+
return { path: codexConfigPath, created: false, updated: false };
|
|
36
14
|
};
|
|
37
15
|
exports.ensureCodexLocalConfig = ensureCodexLocalConfig;
|
|
@@ -8,10 +8,16 @@ exports.listPersonaCapabilityBundles = listPersonaCapabilityBundles;
|
|
|
8
8
|
const persona_hiring_1 = require("./persona-hiring");
|
|
9
9
|
const persona_catalog_routes_1 = require("../routes/persona-catalog-routes");
|
|
10
10
|
exports.FREE_JOBS = new Set([
|
|
11
|
-
'create-architecture',
|
|
12
|
-
'
|
|
13
|
-
'
|
|
14
|
-
'
|
|
11
|
+
'create-architecture',
|
|
12
|
+
'project-scaffolding',
|
|
13
|
+
'blue-sky-brainstorming',
|
|
14
|
+
'codebase-analysis-and-ideation',
|
|
15
|
+
'domain-registration-research',
|
|
16
|
+
'google-workspace-setup',
|
|
17
|
+
'github-org-setup',
|
|
18
|
+
'contribute-to-fraim',
|
|
19
|
+
'file-fraim-issue',
|
|
20
|
+
'praise-fraim',
|
|
15
21
|
]);
|
|
16
22
|
function isFreeJob(jobName) {
|
|
17
23
|
return exports.FREE_JOBS.has(jobName);
|
|
@@ -39,8 +45,8 @@ exports.PERSONA_CAPABILITY_BUNDLES = {
|
|
|
39
45
|
beza: {
|
|
40
46
|
personaKey: 'beza',
|
|
41
47
|
bundleId: 'persona-beza-core',
|
|
42
|
-
catalogMetadata: buildCatalogMetadata('beza', ['competitive-analysis', 'review-business-strategy', '
|
|
43
|
-
protectedJobs: ['competitive-analysis', 'review-business-strategy', 'business-plan-creation', 'problem-statement-crystallization', 'business-idea-validation-and-scoping', 'founder-market-fit-analysis', '
|
|
48
|
+
catalogMetadata: buildCatalogMetadata('beza', ['competitive-analysis', 'review-business-strategy', 'pricing-strategy-definition']),
|
|
49
|
+
protectedJobs: ['competitive-analysis', 'review-business-strategy', 'business-plan-creation', 'problem-statement-crystallization', 'business-idea-validation-and-scoping', 'founder-market-fit-analysis', 'advisory-board-development', 'advisor-interview', 'advisory-board-selection', 'pricing-strategy-definition'],
|
|
44
50
|
protectedAliases: ['business-strategy', 'company-strategy'],
|
|
45
51
|
defaultHireMode: 'job',
|
|
46
52
|
lockCopy: 'Hire BeZa to unlock business strategy work for this request.'
|
|
@@ -48,8 +54,8 @@ exports.PERSONA_CAPABILITY_BUNDLES = {
|
|
|
48
54
|
pam: {
|
|
49
55
|
personaKey: 'pam',
|
|
50
56
|
bundleId: 'persona-pam-core',
|
|
51
|
-
catalogMetadata: buildCatalogMetadata('pam', ['feature-specification', 'technical-design', '
|
|
52
|
-
protectedJobs: ['feature-specification', 'technical-design', '
|
|
57
|
+
catalogMetadata: buildCatalogMetadata('pam', ['feature-specification', 'technical-design', 'project-plan-creation']),
|
|
58
|
+
protectedJobs: ['feature-specification', 'technical-design', 'experiment-tracking', 'project-plan-creation', 'implementation-feature-review', 'scrum-sprint-planning', 'mvp-validation-plan', 'sprint-planning', 'customer-prospect-discovery', 'interview-preparation', 'participant-recruitment', 'process-interview-notes', 'review-customer-development', 'triage-customer-needs'],
|
|
53
59
|
protectedAliases: ['product-management', 'product-spec'],
|
|
54
60
|
defaultHireMode: 'job',
|
|
55
61
|
lockCopy: 'Hire PaM to unlock product-management work for this request.'
|
|
@@ -57,8 +63,8 @@ exports.PERSONA_CAPABILITY_BUNDLES = {
|
|
|
57
63
|
swen: {
|
|
58
64
|
personaKey: 'swen',
|
|
59
65
|
bundleId: 'persona-swen-core',
|
|
60
|
-
catalogMetadata: buildCatalogMetadata('swen', ['feature-implementation', '
|
|
61
|
-
protectedJobs: ['feature-implementation', 'code-refactoring', 'pr-iteration', 'mobile-app-development', 'mcp-server-creation', 'cloud-application-deployment', 'cloud-cost-optimization', 'cloud-performance-diagnosis', 'route-llm-spend-to-cloud-credits', 'set-up-cloud-cost-alerts', 'gitlabs-to-github', 'system-migration', 'cross-cloud-migration', 'data-pipeline-design', 'data-quality-monitoring', 'data-platform-architecture', 'write-dev-docs', 'database-schema-design', 'create-architecture', 'project-scaffolding', 'codebase-analysis-and-ideation', 'github-org-setup', 'google-workspace-setup', 'mobile-app-rejection-response', 'mobile-app-submission', 'publish-mcp-app', 'application-replication-workflow'],
|
|
66
|
+
catalogMetadata: buildCatalogMetadata('swen', ['feature-implementation', 'technical-design', 'code-refactoring']),
|
|
67
|
+
protectedJobs: ['feature-implementation', 'implementation-design-review', 'code-refactoring', 'pr-iteration', 'mobile-app-development', 'mcp-server-creation', 'cloud-application-deployment', 'cloud-cost-optimization', 'cloud-performance-diagnosis', 'route-llm-spend-to-cloud-credits', 'set-up-cloud-cost-alerts', 'gitlabs-to-github', 'system-migration', 'cross-cloud-migration', 'data-pipeline-design', 'data-quality-monitoring', 'data-platform-architecture', 'write-dev-docs', 'database-schema-design', 'create-architecture', 'project-scaffolding', 'codebase-analysis-and-ideation', 'github-org-setup', 'google-workspace-setup', 'mobile-app-rejection-response', 'mobile-app-submission', 'publish-mcp-app', 'application-replication-workflow'],
|
|
62
68
|
protectedAliases: ['software-engineering', 'implementation'],
|
|
63
69
|
defaultHireMode: 'job',
|
|
64
70
|
lockCopy: 'Hire SWEn to unlock software-engineering delivery for this request.'
|
|
@@ -67,7 +73,7 @@ exports.PERSONA_CAPABILITY_BUNDLES = {
|
|
|
67
73
|
personaKey: 'qasm',
|
|
68
74
|
bundleId: 'persona-qasm-core',
|
|
69
75
|
catalogMetadata: buildCatalogMetadata('qasm', ['test-execution', 'browser-application-validation', 'ui-polish-validation']),
|
|
70
|
-
protectedJobs: ['test-execution', 'browser-application-validation', 'ui-polish-validation', 'code-quality-assessment', 'test-quality-assessment', 'user-testing-and-bug-bash', 'broken-windows-detection-and-remediation', 'iterative-quality-improvement', '
|
|
76
|
+
protectedJobs: ['test-execution', 'browser-application-validation', 'ui-polish-validation', 'code-quality-assessment', 'test-quality-assessment', 'user-testing-and-bug-bash', 'broken-windows-detection-and-remediation', 'iterative-quality-improvement', 'accessibility-audit', 'api-testing', 'performance-benchmarking'],
|
|
71
77
|
protectedAliases: ['qa', 'quality-assurance'],
|
|
72
78
|
defaultHireMode: 'job',
|
|
73
79
|
lockCopy: 'Hire QAsm to unlock QA validation for this request.'
|
|
@@ -84,8 +90,8 @@ exports.PERSONA_CAPABILITY_BUNDLES = {
|
|
|
84
90
|
gautam: {
|
|
85
91
|
personaKey: 'gautam',
|
|
86
92
|
bundleId: 'persona-gautam-core',
|
|
87
|
-
catalogMetadata: buildCatalogMetadata('gautam', ['analyze-revenue-system', 'build-gtm-motion', '
|
|
88
|
-
protectedJobs: ['
|
|
93
|
+
catalogMetadata: buildCatalogMetadata('gautam', ['analyze-revenue-system', 'build-gtm-motion', 'domain-registration-research']),
|
|
94
|
+
protectedJobs: ['marketing-strategy-definition', 'product-launch-management', 'evangelist-content-development', 'funnel-analysis', 'growth-loop-design', 'analyze-revenue-system', 'design-gtm-system', 'build-gtm-motion', 'build-gtm-stack', 'plan-gtm-team', 'marketing-content-creation', 'ppc-campaign-management', 'paid-social-strategy', 'ad-performance-analysis', 'tracking-and-attribution-setup', 'developer-advocacy', 'seo-strategy', 'marketing-analytics-review', 'linkedin-company-page-setup', 'x-account-setup', 'domain-registration-research', 'social-engagement-campaign', 'thought-leadership-engagement', 'promo-video-creation', 'linkedin-carousel-from-deck', 'notebooklm-infographic', 'notebooklm-podcast', 'notebooklm-presentation', 'notebooklm-report', 'notebooklm-video-overview'],
|
|
89
95
|
protectedAliases: ['gtm', 'marketing'],
|
|
90
96
|
defaultHireMode: 'job',
|
|
91
97
|
lockCopy: 'Hire GauTaM to unlock go-to-market and paid media work for this request.'
|
|
@@ -111,8 +117,8 @@ exports.PERSONA_CAPABILITY_BUNDLES = {
|
|
|
111
117
|
ashley: {
|
|
112
118
|
personaKey: 'ashley',
|
|
113
119
|
bundleId: 'persona-ashley-core',
|
|
114
|
-
catalogMetadata: buildCatalogMetadata('ashley', ['chief-of-staff-briefing', 'executive-assistant', '
|
|
115
|
-
protectedJobs: ['chief-of-staff-briefing', 'calendar-triage', 'meeting-preparation', 'executive-assistant', '
|
|
120
|
+
catalogMetadata: buildCatalogMetadata('ashley', ['chief-of-staff-briefing', 'executive-assistant', 'analyze-transcript']),
|
|
121
|
+
protectedJobs: ['chief-of-staff-briefing', 'calendar-triage', 'meeting-preparation', 'executive-assistant', 'send-newsletter', 'send-thank-you-notes', 'analyze-transcript'],
|
|
116
122
|
protectedAliases: ['executive-assistant', 'operations-assistant'],
|
|
117
123
|
defaultHireMode: 'job',
|
|
118
124
|
lockCopy: 'Hire AshLey to unlock executive-assistant work for this request.'
|
|
@@ -120,8 +126,8 @@ exports.PERSONA_CAPABILITY_BUNDLES = {
|
|
|
120
126
|
mandy: {
|
|
121
127
|
personaKey: 'mandy',
|
|
122
128
|
bundleId: 'persona-mandy-core',
|
|
123
|
-
catalogMetadata: buildCatalogMetadata('mandy', ['fully-delegate', '
|
|
124
|
-
protectedJobs: ['fully-delegate', 'delivery-governance-review', '
|
|
129
|
+
catalogMetadata: buildCatalogMetadata('mandy', ['fully-delegate', 'stakeholder-status-reporting', 'weekly-operating-review']),
|
|
130
|
+
protectedJobs: ['fully-delegate', 'delivery-governance-review', 'issue-preparation', 'issue-retrospective', 'work-completion', 'stakeholder-status-reporting', 'send-stakeholder-update', 'weekly-operating-review', 'cross-functional-dependency-management', 'portfolio-impact-report'],
|
|
125
131
|
protectedAliases: ['manager', 'team-lead', 'orchestrator'],
|
|
126
132
|
defaultHireMode: 'job',
|
|
127
133
|
lockCopy: 'Hire MANdy to unlock autonomous multi-role orchestration — MANdy plans the job sequence, runs sub-agents in parallel, coaches them through verification loops, and hands back a synthesized DRAFT for your approval.'
|
|
@@ -174,8 +180,8 @@ exports.PERSONA_CAPABILITY_BUNDLES = {
|
|
|
174
180
|
casey: {
|
|
175
181
|
personaKey: 'casey',
|
|
176
182
|
bundleId: 'persona-casey-core',
|
|
177
|
-
catalogMetadata: buildCatalogMetadata('casey', ['
|
|
178
|
-
protectedJobs: ['crm-account-health-review', 'crm-case-resolution', 'customer-health-review', 'loyalty-program-management', 'survey-campaign-management', 'support-queue-management', 'support-case-resolution', 'support-sop-operationalization', 'support-system-operationalization', 'support-playbook-evaluation', 'user-survey-management'],
|
|
183
|
+
catalogMetadata: buildCatalogMetadata('casey', ['update-crm', 'support-case-resolution', 'support-system-operationalization']),
|
|
184
|
+
protectedJobs: ['crm-account-health-review', 'crm-case-resolution', 'customer-health-review', 'loyalty-program-management', 'survey-campaign-management', 'update-crm', 'support-queue-management', 'support-case-resolution', 'support-sop-operationalization', 'support-system-operationalization', 'support-playbook-evaluation', 'user-survey-management'],
|
|
179
185
|
protectedAliases: ['customer-success', 'customer-support', 'csm', 'support'],
|
|
180
186
|
defaultHireMode: 'job',
|
|
181
187
|
lockCopy: 'Hire CaSey to unlock customer success and support work for this request.'
|
|
@@ -204,8 +210,8 @@ exports.PERSONA_CAPABILITY_BUNDLES = {
|
|
|
204
210
|
mona: {
|
|
205
211
|
personaKey: 'mona',
|
|
206
212
|
bundleId: 'persona-mona-core',
|
|
207
|
-
catalogMetadata: buildCatalogMetadata('mona', ['financial-analysis', '
|
|
208
|
-
protectedJobs: ['financial-analysis', 'fpa-and-forecasting', 'monthly-close-review', 'tax-strategy-planning', 'aws-activate-credits-application', 'google-cloud-credits-application', 'microsoft-azure-credits-application', 'invoice-generation', 'business-banking-setup'],
|
|
213
|
+
catalogMetadata: buildCatalogMetadata('mona', ['financial-analysis', 'fundraising-prospect-discovery', 'investor-pitch-preparation']),
|
|
214
|
+
protectedJobs: ['financial-analysis', 'fpa-and-forecasting', 'monthly-close-review', 'tax-strategy-planning', 'aws-activate-credits-application', 'community-funding-preparation', 'fundraising-prospect-discovery', 'google-cloud-credits-application', 'investor-pitch-preparation', 'microsoft-azure-credits-application', 'review-funding-preparation', 'invoice-generation', 'business-banking-setup'],
|
|
209
215
|
protectedAliases: ['finance', 'financial-modeling', 'fpa', 'bookkeeping'],
|
|
210
216
|
defaultHireMode: 'job',
|
|
211
217
|
lockCopy: 'Hire MONa to unlock financial modeling, FP&A, and tax strategy work for this request.'
|