Skip to content

Commit 7d8daa7

Browse files
add more log for easy trouble-shooting (#121)
* add more log for easy trouble-shooting * fix test failure
1 parent 9da1ef5 commit 7d8daa7

File tree

10 files changed

+66
-14
lines changed

10 files changed

+66
-14
lines changed

packages/mcp-workflow/src/routers/checkPropertiesFulfilledRouter.ts

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -103,15 +103,18 @@ export class CheckPropertiesFulfilledRouter<TState extends StateType<StateDefini
103103
}
104104

105105
if (unfulfilledProperties.length > 0) {
106-
this.logger.debug('Properties not fulfilled, routing to unfulfilled node', {
107-
unfulfilledProperties,
108-
targetNode: this.propertiesUnfulfilledNodeName,
109-
totalRequired: Object.keys(this.requiredProperties).length,
110-
});
106+
this.logger.debug(
107+
`Properties not fulfilled, routing to ${this.propertiesUnfulfilledNodeName}`,
108+
{
109+
unfulfilledProperties,
110+
targetNode: this.propertiesUnfulfilledNodeName,
111+
totalRequired: Object.keys(this.requiredProperties).length,
112+
}
113+
);
111114
return this.propertiesUnfulfilledNodeName;
112115
}
113116

114-
this.logger.debug('All properties fulfilled, routing to fulfilled node', {
117+
this.logger.debug(`All properties fulfilled, routing to ${this.propertiesFulfilledNodeName}`, {
115118
targetNode: this.propertiesFulfilledNodeName,
116119
totalProperties: Object.keys(this.requiredProperties).length,
117120
});

packages/mobile-native-mcp-server/src/tools/workflow/sfmobile-native-project-manager/tool.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import {
1212
WorkflowStateManager,
1313
type Logger,
1414
type WorkflowEnvironment,
15+
createWorkflowLogger,
1516
} from '@salesforce/magen-mcp-workflow';
1617
import { mobileNativeWorkflow } from '../../../workflow/graph.js';
1718
import { ORCHESTRATOR_TOOL } from './metadata.js';
@@ -24,6 +25,10 @@ import { ORCHESTRATOR_TOOL } from './metadata.js';
2425
*/
2526
export class MobileNativeOrchestrator extends OrchestratorTool {
2627
constructor(server: McpServer, logger?: Logger, environment: WorkflowEnvironment = 'production') {
28+
const mobileNativeOrchestratorToolLogger =
29+
logger ?? createWorkflowLogger('MobileNativeOrchestratorTool');
30+
const mobileNativeWorkflowStateManagerLogger =
31+
logger ?? createWorkflowLogger('MobileNativeWorkflowStateManager');
2732
const config: OrchestratorConfig = {
2833
toolId: ORCHESTRATOR_TOOL.toolId,
2934
title: 'Salesforce Mobile Native Project Manager',
@@ -32,9 +37,9 @@ export class MobileNativeOrchestrator extends OrchestratorTool {
3237
workflow: mobileNativeWorkflow,
3338
stateManager: new WorkflowStateManager({
3439
environment,
35-
logger,
40+
logger: mobileNativeWorkflowStateManagerLogger,
3641
}),
37-
logger,
42+
logger: mobileNativeOrchestratorToolLogger,
3843
};
3944

4045
super(server, config);

packages/mobile-native-mcp-server/src/workflow/nodes/checkAndroidSetupExtractedRouter.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,9 @@ export class CheckAndroidSetupExtractedRouter {
3131
execute = (state: State): string => {
3232
// Check if both androidHome and javaHome were extracted
3333
if (state.androidHome && state.javaHome) {
34-
this.logger.info('Android setup successfully extracted, routing to platform check');
34+
this.logger.info(
35+
`Android setup successfully extracted, routing to ${this.setupExtractedNodeName}`
36+
);
3537
return this.setupExtractedNodeName;
3638
}
3739

@@ -41,7 +43,7 @@ export class CheckAndroidSetupExtractedRouter {
4143
if (!state.javaHome) missingPaths.push('javaHome');
4244

4345
this.logger.warn(
44-
`Android setup extraction failed. Missing: ${missingPaths.join(', ')}. Routing to failure.`
46+
`Android setup extraction failed. Missing: ${missingPaths.join(', ')}. Routing to ${this.failureNodeName}.`
4547
);
4648
return this.failureNodeName;
4749
};

packages/mobile-native-mcp-server/src/workflow/nodes/checkBuildSuccessfulRouter.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
*/
77

88
import { State } from '../metadata.js';
9+
import { createComponentLogger } from '@salesforce/magen-mcp-workflow';
910

1011
/**
1112
* Router node that determines the next step based on build success status.
@@ -19,6 +20,7 @@ export class CheckBuildSuccessfulRouter {
1920
private readonly deploymentNodeName: string;
2021
private readonly buildRecoveryNodeName: string;
2122
private readonly failureNodeName: string;
23+
private readonly logger = createComponentLogger('CheckBuildSuccessfulRouter');
2224

2325
constructor(deploymentNodeName: string, buildRecoveryNodeName: string, failureNodeName: string) {
2426
this.deploymentNodeName = deploymentNodeName;
@@ -29,6 +31,7 @@ export class CheckBuildSuccessfulRouter {
2931
execute = (state: State): string => {
3032
// If build was successful, proceed to deployment
3133
if (state.buildSuccessful) {
34+
this.logger.info(`Build successful, routing to ${this.deploymentNodeName}`);
3235
return this.deploymentNodeName;
3336
}
3437

@@ -38,15 +41,18 @@ export class CheckBuildSuccessfulRouter {
3841

3942
// If we've reached max retries, go to failure
4043
if (attemptCount >= maxRetries) {
44+
this.logger.info(`Max retries ${maxRetries} reached, routing to ${this.failureNodeName}`);
4145
return this.failureNodeName;
4246
}
4347

4448
// If we just came from recovery and it said it's not ready to retry, go to failure
4549
if (state.recoveryReadyForRetry === false) {
50+
this.logger.info(`Recovery not ready to retry, routing to ${this.failureNodeName}`);
4651
return this.failureNodeName;
4752
}
4853

4954
// Otherwise, attempt recovery
55+
this.logger.info(`Attempting recovery, routing to ${this.buildRecoveryNodeName}`);
5056
return this.buildRecoveryNodeName;
5157
};
5258
}

packages/mobile-native-mcp-server/src/workflow/nodes/checkPlatformSetup.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ export class PlatformCheckNode extends BaseNode<State> {
8787
: undefined,
8888
};
8989
} catch (error) {
90+
this.logger.error(`Error executing platform check command: ${command}`, error as Error);
9091
const errorMessage = error instanceof Error ? error.message : `${error}`;
9192
return {
9293
validPlatformSetup: false,

packages/mobile-native-mcp-server/src/workflow/nodes/checkPluginValidatedRouter.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
* For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
66
*/
77

8+
import { createComponentLogger } from '@salesforce/magen-mcp-workflow';
89
import { State } from '../metadata.js';
910

1011
/**
@@ -13,6 +14,7 @@ import { State } from '../metadata.js';
1314
export class CheckPluginValidatedRouter {
1415
private readonly pluginValidatedNodeName: string;
1516
private readonly invalidPluginNodeName: string;
17+
private readonly logger = createComponentLogger('CheckPluginValidatedRouter');
1618

1719
/**
1820
* Creates a new CheckPluginValidatedRouter.
@@ -26,6 +28,12 @@ export class CheckPluginValidatedRouter {
2628
}
2729

2830
execute = (state: State): string => {
29-
return state.validPluginSetup ? this.pluginValidatedNodeName : this.invalidPluginNodeName;
31+
if (state.validPluginSetup === true) {
32+
this.logger.info(`Plugin setup valid, routing to ${this.pluginValidatedNodeName}`);
33+
return this.pluginValidatedNodeName;
34+
}
35+
36+
this.logger.info(`Plugin setup invalid, routing to ${this.invalidPluginNodeName}`);
37+
return this.invalidPluginNodeName;
3038
};
3139
}

packages/mobile-native-mcp-server/src/workflow/nodes/checkProjectGenerationRouter.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ export class CheckProjectGenerationRouter {
3838

3939
if (hasProjectPath && !hasFatalErrors) {
4040
this.logger.info(
41-
`Project generation successful at ${state.projectPath}, routing to build validation`
41+
`Project generation successful at ${state.projectPath}, routing to ${this.successNodeName}`
4242
);
4343
return this.successNodeName;
4444
}
@@ -48,7 +48,9 @@ export class CheckProjectGenerationRouter {
4848
? `Fatal errors occurred: ${state.workflowFatalErrorMessages?.join(', ')}`
4949
: 'Project path not set after generation';
5050

51-
this.logger.warn(`Project generation failed. Reason: ${reason}. Routing to failure.`);
51+
this.logger.warn(
52+
`Project generation failed. Reason: ${reason}. Routing to ${this.failureNodeName}.`
53+
);
5254
return this.failureNodeName;
5355
};
5456
}

packages/mobile-native-mcp-server/src/workflow/nodes/checkSetupValidatedRouter.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
* For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
66
*/
77

8+
import { createComponentLogger } from '@salesforce/magen-mcp-workflow';
89
import { State } from '../metadata.js';
910

1011
/**
@@ -15,6 +16,7 @@ export class CheckSetupValidatedRouter {
1516
private readonly setupValidatedNodeName: string;
1617
private readonly androidSetupNodeName: string;
1718
private readonly invalidSetupNodeName: string;
19+
private readonly logger = createComponentLogger('CheckSetupValidatedRouter');
1820

1921
/**
2022
* Creates a new CheckSetupValidatedRouter.
@@ -36,15 +38,23 @@ export class CheckSetupValidatedRouter {
3638
execute = (state: State): string => {
3739
// If platform setup is valid, proceed
3840
if (state.validPlatformSetup) {
41+
this.logger.info(`Platform setup valid, routing to ${this.setupValidatedNodeName}`);
3942
return this.setupValidatedNodeName;
4043
}
4144

4245
// If platform is Android and Android/Java paths are missing, route to Android setup
4346
if (state.platform === 'Android' && (!state.androidHome || !state.javaHome)) {
47+
const missingSetup: string[] = [];
48+
if (!state.androidHome) missingSetup.push('androidHome');
49+
if (!state.javaHome) missingSetup.push('javaHome');
50+
this.logger.info(
51+
`Android setup missing ${missingSetup.join(', ')}, routing to ${this.androidSetupNodeName}`
52+
);
4453
return this.androidSetupNodeName;
4554
}
4655

4756
// Otherwise, route to failure
57+
this.logger.info(`Platform setup invalid, routing to ${this.invalidSetupNodeName}`);
4858
return this.invalidSetupNodeName;
4959
};
5060
}

packages/mobile-native-mcp-server/src/workflow/nodes/checkTemplatePropertiesFulfilledRouter.ts

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
* For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
66
*/
77

8+
import { createComponentLogger } from '@salesforce/magen-mcp-workflow';
89
import { State } from '../metadata.js';
910

1011
/**
@@ -17,7 +18,7 @@ import { State } from '../metadata.js';
1718
export class CheckTemplatePropertiesFulfilledRouter {
1819
private readonly propertiesFulfilledNodeName: string;
1920
private readonly propertiesUnfulfilledNodeName: string;
20-
21+
private readonly logger = createComponentLogger('CheckTemplatePropertiesFulfilledRouter');
2122
/**
2223
* Creates a new CheckTemplatePropertiesFulfilledRouter.
2324
*
@@ -37,6 +38,7 @@ export class CheckTemplatePropertiesFulfilledRouter {
3738
// If no template has been selected yet, we shouldn't be checking template properties
3839
// This is a safety check to prevent routing to project generation before template selection
3940
if (!state.selectedTemplate) {
41+
this.logger.info(`No template selected, routing to ${this.propertiesUnfulfilledNodeName}`);
4042
return this.propertiesUnfulfilledNodeName;
4143
}
4244

@@ -45,22 +47,34 @@ export class CheckTemplatePropertiesFulfilledRouter {
4547
!state.templatePropertiesMetadata ||
4648
Object.keys(state.templatePropertiesMetadata).length === 0
4749
) {
50+
this.logger.info(
51+
`No template properties defined, routing to ${this.propertiesFulfilledNodeName}`
52+
);
4853
return this.propertiesFulfilledNodeName;
4954
}
5055

5156
// If templateProperties haven't been initialized, properties are unfulfilled
5257
if (!state.templateProperties) {
58+
this.logger.info(
59+
`Template properties not initialized, routing to ${this.propertiesUnfulfilledNodeName}`
60+
);
5361
return this.propertiesUnfulfilledNodeName;
5462
}
5563

5664
// Check each required property
5765
for (const [propertyName, metadata] of Object.entries(state.templatePropertiesMetadata)) {
5866
// If property is required and not present in templateProperties, it's unfulfilled
5967
if (metadata.required && !state.templateProperties[propertyName]) {
68+
this.logger.info(
69+
`Property ${propertyName} is required but not present in state.templateProperties["${propertyName}"], routing to ${this.propertiesUnfulfilledNodeName}`
70+
);
6071
return this.propertiesUnfulfilledNodeName;
6172
}
6273
}
6374

75+
this.logger.info(
76+
`All template properties fulfilled, routing to ${this.propertiesFulfilledNodeName}`
77+
);
6478
return this.propertiesFulfilledNodeName;
6579
}
6680
}

packages/mobile-native-mcp-server/src/workflow/nodes/templateSelection.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ export class TemplateSelectionNode extends AbstractToolNode<State> {
3232
}
3333

3434
if (!state.templateOptions) {
35+
this.logger.error('Fatal error: No template is available to select.');
3536
return {
3637
workflowFatalErrorMessages: ['No template options available for selection'],
3738
};

0 commit comments

Comments
 (0)