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.
@@ -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
- const adapterUpdates = (0, agent_adapters_1.ensureAgentAdapterFiles)(projectRoot, detectedConfigTypes.length > 0 ? detectedConfigTypes : null);
202
- if (adapterUpdates.length > 0) {
203
- console.log(chalk_1.default.green(`Updated FRAIM agent adapter files: ${adapterUpdates.join(', ')}`));
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
- .action(() => (0, exports.runInitProject)());
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
- const allowedTypes = resolveAllowedConfigTypes();
292
- await cleanupStaleAdapterFiles(projectRoot, allowedTypes);
293
- const adapterUpdates = (0, agent_adapters_1.ensureAgentAdapterFiles)(projectRoot, allowedTypes);
294
- if (adapterUpdates.length > 0) {
295
- console.log(chalk_1.default.green(`Updated FRAIM agent adapter files: ${adapterUpdates.join(', ')}`));
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
- const allowedTypes = resolveAllowedConfigTypes();
339
- await cleanupStaleAdapterFiles(projectRoot, allowedTypes);
340
- const adapterUpdates = (0, agent_adapters_1.ensureAgentAdapterFiles)(projectRoot, allowedTypes);
341
- if (adapterUpdates.length > 0) {
342
- console.log(chalk_1.default.green(`Updated FRAIM agent adapter files: ${adapterUpdates.join(', ')}`));
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 codexDir = path_1.default.join(projectRoot, '.codex');
17
- const codexConfigPath = path_1.default.join(codexDir, 'config.toml');
18
- if (!fs_1.default.existsSync(codexDir)) {
19
- fs_1.default.mkdirSync(codexDir, { recursive: true });
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', 'project-scaffolding',
12
- 'blue-sky-brainstorming', 'codebase-analysis-and-ideation',
13
- 'domain-registration-research', 'google-workspace-setup', 'github-org-setup',
14
- 'contribute-to-fraim', 'file-fraim-issue', 'praise-fraim',
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', 'business-plan-creation']),
43
- protectedJobs: ['competitive-analysis', 'review-business-strategy', 'business-plan-creation', 'problem-statement-crystallization', 'business-idea-validation-and-scoping', 'founder-market-fit-analysis', 'community-funding-preparation', 'fundraising-prospect-discovery', 'investor-pitch-preparation', 'review-funding-preparation', 'advisory-board-development', 'advisor-interview', 'advisory-board-selection', 'blue-sky-brainstorming', 'domain-registration-research'],
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', 'issue-preparation']),
52
- protectedJobs: ['feature-specification', 'technical-design', 'issue-preparation', 'implementation-design-review', 'issue-retrospective', 'work-completion', 'scrum-sprint-planning', 'mvp-validation-plan', 'sprint-planning', 'customer-prospect-discovery', 'interview-preparation', 'participant-recruitment', 'process-interview-notes', 'review-customer-development', 'triage-customer-needs'],
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', 'code-refactoring', 'pr-iteration']),
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', 'implementation-feature-review', 'accessibility-audit', 'api-testing', 'performance-benchmarking'],
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', 'ppc-campaign-management']),
88
- protectedJobs: ['pricing-strategy-definition', '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', 'social-engagement-campaign', 'thought-leadership-engagement', 'promo-video-creation', 'linkedin-carousel-from-deck'],
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', 'weekly-operating-review']),
115
- protectedJobs: ['chief-of-staff-briefing', 'calendar-triage', 'meeting-preparation', 'executive-assistant', 'weekly-operating-review', 'send-thank-you-notes', 'send-newsletter', 'analyze-transcript', 'send-stakeholder-update'],
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', 'project-plan-creation', 'stakeholder-status-reporting']),
124
- protectedJobs: ['fully-delegate', 'delivery-governance-review', 'project-plan-creation', 'stakeholder-status-reporting', 'experiment-tracking', 'cross-functional-dependency-management', 'portfolio-impact-report'],
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', ['support-case-resolution', 'support-sop-operationalization', 'support-system-operationalization', 'support-playbook-evaluation']),
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', 'fpa-and-forecasting', 'monthly-close-review']),
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.'
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fraim",
3
- "version": "2.0.217",
3
+ "version": "2.0.218",
4
4
  "description": "FRAIM core CLI and MCP package.",
5
5
  "main": "index.js",
6
6
  "bin": {