mbti-pocketflow / pf_cli.py
Fancellu's picture
Init
5d7e9a5
#!/usr/bin/env python3
"""
PocketFlow-based MBTI questionnaire using the actual flow and shared store
"""
import sys
import os
sys.path.append(os.path.join(os.path.dirname(__file__), '..'))
from flow import create_mbti_flow, create_shared_store
from utils.test_data import generate_test_data
def run_pocketflow_questionnaire(import_file=None):
"""Run questionnaire using PocketFlow"""
print("=== MBTI Questionnaire (PocketFlow) ===\n")
# Create flow and shared store
flow = create_mbti_flow()
config = {
"ui_mode": "cli",
"output_format": "html",
"analysis_method": "traditional", # Skip LLM for now
"import_file": import_file
}
shared = create_shared_store(config)
try:
print("Running PocketFlow pipeline...")
flow.run(shared)
# Display results
print("\n" + "="*50)
print("POCKETFLOW RESULTS")
print("="*50)
print(f"Your MBTI Type: {shared['results']['mbti_type']}")
print(f"Report generated: {shared['exports']['report_path']}")
print(f"Data exported: {shared['exports']['questionnaire_json']}")
# Show confidence scores
confidence = shared['analysis']['confidence_scores']
if confidence:
print(f"\nConfidence Scores:")
for dimension, score in confidence.items():
print(f" {dimension}: {score:.2f}")
# Show traditional scores
traditional = shared['analysis']['traditional_scores']
if traditional:
print(f"\nDimension Scores:")
pairs = [('E', 'I'), ('S', 'N'), ('T', 'F'), ('J', 'P')]
for dim1, dim2 in pairs:
score1 = traditional.get(f'{dim1}_score', 0.5)
score2 = traditional.get(f'{dim2}_score', 0.5)
stronger = dim1 if score1 > score2 else dim2
percentage = max(score1, score2) * 100
print(f" {dim1}/{dim2}: {stronger} ({percentage:.1f}%)")
print(f"\nOpen '{shared['exports']['report_path']}' to view the full report.")
except Exception as e:
print(f"Error running PocketFlow: {e}")
import traceback
traceback.print_exc()
return False
return True
def run_pocketflow_test(mbti_type=None):
"""Run test using PocketFlow with test data"""
print("=== MBTI Test Mode (PocketFlow) ===\n")
# Generate test data
test_data = generate_test_data(mbti_type)
print(f"Generated test data for: {test_data['target_type']}")
# Create flow and shared store
flow = create_mbti_flow()
config = {
"ui_mode": "test",
"output_format": "html",
"analysis_method": "traditional"
}
shared = create_shared_store(config)
# Pre-populate with test data (skip question presentation)
shared["questionnaire"]["responses"] = test_data['responses']
try:
print("Running PocketFlow analysis...")
# Skip to analysis nodes (questions already answered)
from pocketflow import Flow
from nodes import AnalyzeResponsesBatchNode, TraditionalScoringNode, DetermineMBTITypeNode, GenerateReportNode, ExportDataNode
analyze_responses = AnalyzeResponsesBatchNode()
traditional_scoring = TraditionalScoringNode()
determine_type = DetermineMBTITypeNode()
generate_report = GenerateReportNode()
export_data = ExportDataNode()
# Connect partial flow
analyze_responses >> traditional_scoring >> determine_type >> generate_report >> export_data
test_flow = Flow(start=analyze_responses)
# Run the flow
test_flow.run(shared)
# Display results
print("\n" + "="*50)
print("POCKETFLOW TEST RESULTS")
print("="*50)
print(f"Target Type: {test_data['target_type']}")
print(f"Detected Type: {shared['results']['mbti_type']}")
print(f"Match: {'YES' if test_data['target_type'] == shared['results']['mbti_type'] else 'NO'}")
print(f"Report: {shared['exports']['report_path']}")
except Exception as e:
print(f"Error in PocketFlow test: {e}")
import traceback
traceback.print_exc()
return False
return True
if __name__ == "__main__":
import argparse
parser = argparse.ArgumentParser(description='MBTI Questionnaire using PocketFlow')
parser.add_argument('--test', action='store_true', help='Run in test mode')
parser.add_argument('--test-type', type=str, help='MBTI type for test mode')
parser.add_argument('--import-file', type=str, help='Import questionnaire from JSON')
args = parser.parse_args()
if args.test:
success = run_pocketflow_test(args.test_type)
else:
success = run_pocketflow_questionnaire(args.import_file)
exit(0 if success else 1)