wogiflow 1.0.0

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.
Files changed (221) hide show
  1. package/.workflow/agents/reviewer.md +81 -0
  2. package/.workflow/agents/security.md +94 -0
  3. package/.workflow/agents/story-writer.md +58 -0
  4. package/.workflow/bridges/base-bridge.js +395 -0
  5. package/.workflow/bridges/claude-bridge.js +434 -0
  6. package/.workflow/bridges/index.js +130 -0
  7. package/.workflow/lib/assumption-detector.js +481 -0
  8. package/.workflow/lib/config-substitution.js +371 -0
  9. package/.workflow/lib/failure-categories.js +478 -0
  10. package/.workflow/state/app-map.md.template +15 -0
  11. package/.workflow/state/architecture.md.template +24 -0
  12. package/.workflow/state/component-index.json.template +5 -0
  13. package/.workflow/state/decisions.md.template +15 -0
  14. package/.workflow/state/feedback-patterns.md.template +9 -0
  15. package/.workflow/state/knowledge-sync.json.template +6 -0
  16. package/.workflow/state/progress.md.template +14 -0
  17. package/.workflow/state/ready.json.template +7 -0
  18. package/.workflow/state/request-log.md.template +14 -0
  19. package/.workflow/state/session-state.json.template +11 -0
  20. package/.workflow/state/stack.md.template +33 -0
  21. package/.workflow/state/testing.md.template +36 -0
  22. package/.workflow/templates/claude-md.hbs +257 -0
  23. package/.workflow/templates/correction-report.md +67 -0
  24. package/.workflow/templates/gemini-md.hbs +52 -0
  25. package/README.md +1802 -0
  26. package/bin/flow +205 -0
  27. package/lib/index.js +33 -0
  28. package/lib/installer.js +467 -0
  29. package/lib/release-channel.js +269 -0
  30. package/lib/skill-registry.js +526 -0
  31. package/lib/upgrader.js +401 -0
  32. package/lib/utils.js +305 -0
  33. package/package.json +64 -0
  34. package/scripts/flow +985 -0
  35. package/scripts/flow-adaptive-learning.js +1259 -0
  36. package/scripts/flow-aggregate.js +488 -0
  37. package/scripts/flow-archive +133 -0
  38. package/scripts/flow-auto-context.js +1015 -0
  39. package/scripts/flow-auto-learn.js +615 -0
  40. package/scripts/flow-bridge.js +223 -0
  41. package/scripts/flow-browser-suggest.js +316 -0
  42. package/scripts/flow-bug.js +247 -0
  43. package/scripts/flow-cascade.js +711 -0
  44. package/scripts/flow-changelog +85 -0
  45. package/scripts/flow-checkpoint.js +483 -0
  46. package/scripts/flow-cli.js +403 -0
  47. package/scripts/flow-code-intelligence.js +760 -0
  48. package/scripts/flow-complexity.js +502 -0
  49. package/scripts/flow-config-set.js +152 -0
  50. package/scripts/flow-constants.js +157 -0
  51. package/scripts/flow-context +152 -0
  52. package/scripts/flow-context-init.js +482 -0
  53. package/scripts/flow-context-monitor.js +384 -0
  54. package/scripts/flow-context-scoring.js +886 -0
  55. package/scripts/flow-correct.js +458 -0
  56. package/scripts/flow-damage-control.js +985 -0
  57. package/scripts/flow-deps +101 -0
  58. package/scripts/flow-diff.js +700 -0
  59. package/scripts/flow-done +151 -0
  60. package/scripts/flow-done.js +489 -0
  61. package/scripts/flow-durable-session.js +1541 -0
  62. package/scripts/flow-entropy-monitor.js +345 -0
  63. package/scripts/flow-export-profile +349 -0
  64. package/scripts/flow-export-scanner.js +1046 -0
  65. package/scripts/flow-figma-confirm.js +400 -0
  66. package/scripts/flow-figma-extract.js +496 -0
  67. package/scripts/flow-figma-generate.js +683 -0
  68. package/scripts/flow-figma-index.js +909 -0
  69. package/scripts/flow-figma-match.js +617 -0
  70. package/scripts/flow-figma-mcp-server.js +518 -0
  71. package/scripts/flow-figma-pipeline.js +414 -0
  72. package/scripts/flow-file-ops.js +301 -0
  73. package/scripts/flow-gate-confidence.js +825 -0
  74. package/scripts/flow-guided-edit.js +659 -0
  75. package/scripts/flow-health +185 -0
  76. package/scripts/flow-health.js +413 -0
  77. package/scripts/flow-hooks.js +556 -0
  78. package/scripts/flow-http-client.js +249 -0
  79. package/scripts/flow-hybrid-detect.js +167 -0
  80. package/scripts/flow-hybrid-interactive.js +591 -0
  81. package/scripts/flow-hybrid-test.js +152 -0
  82. package/scripts/flow-import-profile +439 -0
  83. package/scripts/flow-init +253 -0
  84. package/scripts/flow-instruction-richness.js +827 -0
  85. package/scripts/flow-jira-integration.js +579 -0
  86. package/scripts/flow-knowledge-router.js +522 -0
  87. package/scripts/flow-knowledge-sync.js +589 -0
  88. package/scripts/flow-linear-integration.js +631 -0
  89. package/scripts/flow-links.js +774 -0
  90. package/scripts/flow-log-manager.js +559 -0
  91. package/scripts/flow-loop-enforcer.js +1246 -0
  92. package/scripts/flow-loop-retry-learning.js +630 -0
  93. package/scripts/flow-lsp.js +923 -0
  94. package/scripts/flow-map-index +348 -0
  95. package/scripts/flow-map-sync +201 -0
  96. package/scripts/flow-memory-blocks.js +668 -0
  97. package/scripts/flow-memory-compactor.js +350 -0
  98. package/scripts/flow-memory-db.js +1110 -0
  99. package/scripts/flow-memory-sync.js +484 -0
  100. package/scripts/flow-metrics.js +353 -0
  101. package/scripts/flow-migrate-ids.js +370 -0
  102. package/scripts/flow-model-adapter.js +802 -0
  103. package/scripts/flow-model-router.js +884 -0
  104. package/scripts/flow-models.js +1231 -0
  105. package/scripts/flow-morning.js +517 -0
  106. package/scripts/flow-multi-approach.js +660 -0
  107. package/scripts/flow-new-feature +86 -0
  108. package/scripts/flow-onboard +1042 -0
  109. package/scripts/flow-orchestrate-llm.js +459 -0
  110. package/scripts/flow-orchestrate.js +3592 -0
  111. package/scripts/flow-output.js +123 -0
  112. package/scripts/flow-parallel-detector.js +399 -0
  113. package/scripts/flow-parallel-dispatch.js +987 -0
  114. package/scripts/flow-parallel.js +428 -0
  115. package/scripts/flow-pattern-enforcer.js +600 -0
  116. package/scripts/flow-prd-manager.js +282 -0
  117. package/scripts/flow-progress.js +323 -0
  118. package/scripts/flow-project-analyzer.js +975 -0
  119. package/scripts/flow-prompt-composer.js +487 -0
  120. package/scripts/flow-providers.js +1381 -0
  121. package/scripts/flow-queue.js +308 -0
  122. package/scripts/flow-ready +82 -0
  123. package/scripts/flow-ready.js +189 -0
  124. package/scripts/flow-regression.js +396 -0
  125. package/scripts/flow-response-parser.js +450 -0
  126. package/scripts/flow-resume.js +284 -0
  127. package/scripts/flow-rules-sync.js +439 -0
  128. package/scripts/flow-run-trace.js +718 -0
  129. package/scripts/flow-safety.js +587 -0
  130. package/scripts/flow-search +104 -0
  131. package/scripts/flow-security.js +481 -0
  132. package/scripts/flow-session-end +106 -0
  133. package/scripts/flow-session-end.js +437 -0
  134. package/scripts/flow-session-state.js +671 -0
  135. package/scripts/flow-setup-hooks +216 -0
  136. package/scripts/flow-setup-hooks.js +377 -0
  137. package/scripts/flow-skill-create.js +329 -0
  138. package/scripts/flow-skill-creator.js +572 -0
  139. package/scripts/flow-skill-generator.js +1046 -0
  140. package/scripts/flow-skill-learn.js +880 -0
  141. package/scripts/flow-skill-matcher.js +578 -0
  142. package/scripts/flow-spec-generator.js +820 -0
  143. package/scripts/flow-stack-wizard.js +895 -0
  144. package/scripts/flow-standup +162 -0
  145. package/scripts/flow-start +74 -0
  146. package/scripts/flow-start.js +235 -0
  147. package/scripts/flow-status +110 -0
  148. package/scripts/flow-status.js +301 -0
  149. package/scripts/flow-step-browser.js +83 -0
  150. package/scripts/flow-step-changelog.js +217 -0
  151. package/scripts/flow-step-comments.js +306 -0
  152. package/scripts/flow-step-complexity.js +234 -0
  153. package/scripts/flow-step-coverage.js +218 -0
  154. package/scripts/flow-step-knowledge.js +193 -0
  155. package/scripts/flow-step-pr-tests.js +364 -0
  156. package/scripts/flow-step-regression.js +89 -0
  157. package/scripts/flow-step-review.js +516 -0
  158. package/scripts/flow-step-security.js +162 -0
  159. package/scripts/flow-step-silent-failures.js +290 -0
  160. package/scripts/flow-step-simplifier.js +346 -0
  161. package/scripts/flow-story +105 -0
  162. package/scripts/flow-story.js +500 -0
  163. package/scripts/flow-suspend.js +252 -0
  164. package/scripts/flow-sync-daemon.js +654 -0
  165. package/scripts/flow-task-analyzer.js +606 -0
  166. package/scripts/flow-team-dashboard.js +748 -0
  167. package/scripts/flow-team-sync.js +752 -0
  168. package/scripts/flow-team.js +977 -0
  169. package/scripts/flow-tech-options.js +528 -0
  170. package/scripts/flow-templates.js +812 -0
  171. package/scripts/flow-tiered-learning.js +728 -0
  172. package/scripts/flow-trace +204 -0
  173. package/scripts/flow-transcript-chunking.js +1106 -0
  174. package/scripts/flow-transcript-digest.js +7918 -0
  175. package/scripts/flow-transcript-language.js +465 -0
  176. package/scripts/flow-transcript-parsing.js +1085 -0
  177. package/scripts/flow-transcript-stories.js +2194 -0
  178. package/scripts/flow-update-map +224 -0
  179. package/scripts/flow-utils.js +2242 -0
  180. package/scripts/flow-verification.js +644 -0
  181. package/scripts/flow-verify.js +1177 -0
  182. package/scripts/flow-voice-input.js +638 -0
  183. package/scripts/flow-watch +168 -0
  184. package/scripts/flow-workflow-steps.js +521 -0
  185. package/scripts/flow-workflow.js +1029 -0
  186. package/scripts/flow-worktree.js +489 -0
  187. package/scripts/hooks/adapters/base-adapter.js +102 -0
  188. package/scripts/hooks/adapters/claude-code.js +359 -0
  189. package/scripts/hooks/adapters/index.js +79 -0
  190. package/scripts/hooks/core/component-check.js +341 -0
  191. package/scripts/hooks/core/index.js +35 -0
  192. package/scripts/hooks/core/loop-check.js +241 -0
  193. package/scripts/hooks/core/session-context.js +294 -0
  194. package/scripts/hooks/core/task-gate.js +177 -0
  195. package/scripts/hooks/core/validation.js +230 -0
  196. package/scripts/hooks/entry/claude-code/post-tool-use.js +65 -0
  197. package/scripts/hooks/entry/claude-code/pre-tool-use.js +89 -0
  198. package/scripts/hooks/entry/claude-code/session-end.js +87 -0
  199. package/scripts/hooks/entry/claude-code/session-start.js +46 -0
  200. package/scripts/hooks/entry/claude-code/stop.js +43 -0
  201. package/scripts/postinstall.js +139 -0
  202. package/templates/browser-test-flow.json +56 -0
  203. package/templates/bug-report.md +43 -0
  204. package/templates/component-detail.md +42 -0
  205. package/templates/component.stories.tsx +49 -0
  206. package/templates/context/constraints.md +83 -0
  207. package/templates/context/conventions.md +177 -0
  208. package/templates/context/stack.md +60 -0
  209. package/templates/correction-report.md +90 -0
  210. package/templates/feature-proposal.md +35 -0
  211. package/templates/hybrid/_base.md +254 -0
  212. package/templates/hybrid/_patterns.md +45 -0
  213. package/templates/hybrid/create-component.md +127 -0
  214. package/templates/hybrid/create-file.md +56 -0
  215. package/templates/hybrid/create-hook.md +145 -0
  216. package/templates/hybrid/create-service.md +70 -0
  217. package/templates/hybrid/fix-bug.md +33 -0
  218. package/templates/hybrid/modify-file.md +55 -0
  219. package/templates/story.md +68 -0
  220. package/templates/task.json +56 -0
  221. package/templates/trace.md +69 -0
@@ -0,0 +1,152 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * Wogi Flow - Hybrid Mode Integration Tests
5
+ *
6
+ * Tests the hybrid mode components work together.
7
+ */
8
+
9
+ const fs = require('fs');
10
+ const path = require('path');
11
+ const { spawnSync } = require('child_process');
12
+ const { getProjectRoot } = require('./flow-utils');
13
+
14
+ const PROJECT_ROOT = getProjectRoot();
15
+ const TESTS = [];
16
+ let passed = 0;
17
+ let failed = 0;
18
+
19
+ function test(name, fn) {
20
+ TESTS.push({ name, fn });
21
+ }
22
+
23
+ async function run() {
24
+ console.log('\n🧪 Running Hybrid Mode Integration Tests\n');
25
+ console.log('═'.repeat(60) + '\n');
26
+
27
+ for (const t of TESTS) {
28
+ try {
29
+ await t.fn();
30
+ console.log(`✅ ${t.name}`);
31
+ passed++;
32
+ } catch (err) {
33
+ console.log(`❌ ${t.name}`);
34
+ console.log(` Error: ${err.message}`);
35
+ failed++;
36
+ }
37
+ }
38
+
39
+ console.log('\n' + '═'.repeat(60));
40
+ console.log(`Results: ${passed} passed, ${failed} failed`);
41
+
42
+ process.exit(failed > 0 ? 1 : 0);
43
+ }
44
+
45
+ // Tests
46
+
47
+ test('Config file exists', () => {
48
+ const configPath = path.join(PROJECT_ROOT, '.workflow', 'config.json');
49
+ if (!fs.existsSync(configPath)) {
50
+ throw new Error('config.json not found');
51
+ }
52
+ });
53
+
54
+ test('Config has hybrid section', () => {
55
+ const configPath = path.join(PROJECT_ROOT, '.workflow', 'config.json');
56
+ const config = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
57
+ if (!config.hybrid) {
58
+ throw new Error('hybrid section missing from config');
59
+ }
60
+ });
61
+
62
+ test('Detection script exists and runs', () => {
63
+ const scriptPath = path.join(PROJECT_ROOT, 'scripts', 'flow-hybrid-detect.js');
64
+ if (!fs.existsSync(scriptPath)) {
65
+ throw new Error('flow-hybrid-detect.js not found');
66
+ }
67
+ // Use spawnSync with array arguments to handle paths with spaces
68
+ const result = spawnSync('node', [scriptPath, 'providers'], {
69
+ encoding: 'utf-8',
70
+ stdio: 'pipe'
71
+ });
72
+ if (result.error) {
73
+ throw result.error;
74
+ }
75
+ if (result.status !== 0) {
76
+ throw new Error(result.stderr || 'Detection script failed');
77
+ }
78
+ });
79
+
80
+ test('Orchestrator script exists', () => {
81
+ const scriptPath = path.join(PROJECT_ROOT, 'scripts', 'flow-orchestrate.js');
82
+ if (!fs.existsSync(scriptPath)) {
83
+ throw new Error('flow-orchestrate.js not found');
84
+ }
85
+ });
86
+
87
+ test('Templates directory exists', () => {
88
+ const templatesDir = path.join(PROJECT_ROOT, 'templates', 'hybrid');
89
+ if (!fs.existsSync(templatesDir)) {
90
+ throw new Error('templates/hybrid directory not found');
91
+ }
92
+ });
93
+
94
+ test('Base template exists', () => {
95
+ const basePath = path.join(PROJECT_ROOT, 'templates', 'hybrid', '_base.md');
96
+ if (!fs.existsSync(basePath)) {
97
+ throw new Error('_base.md template not found');
98
+ }
99
+ });
100
+
101
+ test('Component template exists', () => {
102
+ const templatePath = path.join(PROJECT_ROOT, 'templates', 'hybrid', 'create-component.md');
103
+ if (!fs.existsSync(templatePath)) {
104
+ throw new Error('create-component.md template not found');
105
+ }
106
+ });
107
+
108
+ test('State directory exists', () => {
109
+ const stateDir = path.join(PROJECT_ROOT, '.workflow', 'state');
110
+ if (!fs.existsSync(stateDir)) {
111
+ throw new Error('.workflow/state directory not found');
112
+ }
113
+ });
114
+
115
+ test('Progress module exists', () => {
116
+ const scriptPath = path.join(PROJECT_ROOT, 'scripts', 'flow-progress.js');
117
+ if (!fs.existsSync(scriptPath)) {
118
+ throw new Error('flow-progress.js not found');
119
+ }
120
+ });
121
+
122
+ test('Templates module exists', () => {
123
+ const scriptPath = path.join(PROJECT_ROOT, 'scripts', 'flow-templates.js');
124
+ if (!fs.existsSync(scriptPath)) {
125
+ throw new Error('flow-templates.js not found');
126
+ }
127
+ });
128
+
129
+ test('Interactive setup exists', () => {
130
+ const scriptPath = path.join(PROJECT_ROOT, 'scripts', 'flow-hybrid-interactive.js');
131
+ if (!fs.existsSync(scriptPath)) {
132
+ throw new Error('flow-hybrid-interactive.js not found');
133
+ }
134
+ });
135
+
136
+ test('Slash command files exist', () => {
137
+ const commands = [
138
+ 'wogi-hybrid.md',
139
+ 'wogi-hybrid-off.md',
140
+ 'wogi-hybrid-status.md'
141
+ ];
142
+
143
+ for (const cmd of commands) {
144
+ const cmdPath = path.join(PROJECT_ROOT, '.claude', 'commands', cmd);
145
+ if (!fs.existsSync(cmdPath)) {
146
+ throw new Error(`${cmd} not found`);
147
+ }
148
+ }
149
+ });
150
+
151
+ // Run tests
152
+ run();
@@ -0,0 +1,439 @@
1
+ #!/bin/bash
2
+
3
+ # Wogi Flow - Import Profile
4
+ # Import workflow configuration from team
5
+ # v2.1: Enhanced with rules, learnings, and templates support
6
+
7
+ set -e
8
+
9
+ WORKFLOW_DIR=".workflow"
10
+
11
+ # Colors
12
+ RED='\033[0;31m'
13
+ GREEN='\033[0;32m'
14
+ YELLOW='\033[1;33m'
15
+ CYAN='\033[0;36m'
16
+ DIM='\033[2m'
17
+ NC='\033[0m'
18
+
19
+ show_help() {
20
+ echo "Import Workflow Profile"
21
+ echo ""
22
+ echo "Usage: flow import-profile <profile.zip> [options]"
23
+ echo ""
24
+ echo "Options:"
25
+ echo " --backup Create backup of current config before importing"
26
+ echo " --dry-run Show what would be imported without making changes"
27
+ echo " --force Overwrite without confirmation"
28
+ echo " --skip-learnings Don't import learnings (feedback-patterns, skill learnings)"
29
+ echo " --skip-rules Don't import rules (.claude/rules/)"
30
+ echo " --skip-templates Don't import templates"
31
+ echo ""
32
+ echo "Examples:"
33
+ echo " flow import-profile team-frontend.zip"
34
+ echo " flow import-profile team-frontend.zip --backup"
35
+ echo " flow import-profile team-frontend.zip --skip-learnings"
36
+ }
37
+
38
+ if [ -z "$1" ] || [ "$1" = "--help" ] || [ "$1" = "-h" ]; then
39
+ show_help
40
+ exit 0
41
+ fi
42
+
43
+ PROFILE_FILE="$1"
44
+ shift
45
+
46
+ # Parse options
47
+ BACKUP=false
48
+ DRY_RUN=false
49
+ FORCE=false
50
+ SKIP_LEARNINGS=false
51
+ SKIP_RULES=false
52
+ SKIP_TEMPLATES=false
53
+
54
+ while [ $# -gt 0 ]; do
55
+ case "$1" in
56
+ --backup)
57
+ BACKUP=true
58
+ ;;
59
+ --dry-run)
60
+ DRY_RUN=true
61
+ ;;
62
+ --force)
63
+ FORCE=true
64
+ ;;
65
+ --skip-learnings)
66
+ SKIP_LEARNINGS=true
67
+ ;;
68
+ --skip-rules)
69
+ SKIP_RULES=true
70
+ ;;
71
+ --skip-templates)
72
+ SKIP_TEMPLATES=true
73
+ ;;
74
+ *)
75
+ echo -e "${RED}Unknown option: $1${NC}"
76
+ exit 1
77
+ ;;
78
+ esac
79
+ shift
80
+ done
81
+
82
+ # Check file exists
83
+ if [ ! -f "$PROFILE_FILE" ]; then
84
+ echo -e "${RED}Error: Profile file not found: $PROFILE_FILE${NC}"
85
+ exit 1
86
+ fi
87
+
88
+ # Create temp directory
89
+ TEMP_DIR=$(mktemp -d)
90
+
91
+ echo -e "${CYAN}╔══════════════════════════════════════════════════════════╗${NC}"
92
+ echo -e "${CYAN}║ Importing Profile ║${NC}"
93
+ echo -e "${CYAN}╚══════════════════════════════════════════════════════════╝${NC}"
94
+ echo ""
95
+
96
+ # Extract profile
97
+ unzip -q "$PROFILE_FILE" -d "$TEMP_DIR"
98
+
99
+ # Find the profile directory (first directory in zip)
100
+ PROFILE_DIR=$(find "$TEMP_DIR" -mindepth 1 -maxdepth 1 -type d | head -1)
101
+
102
+ if [ -z "$PROFILE_DIR" ]; then
103
+ echo -e "${RED}Error: Invalid profile format${NC}"
104
+ rm -rf "$TEMP_DIR"
105
+ exit 1
106
+ fi
107
+
108
+ # Show profile info
109
+ if [ -f "$PROFILE_DIR/PROFILE.md" ]; then
110
+ echo -e "${CYAN}Profile Info:${NC}"
111
+ head -15 "$PROFILE_DIR/PROFILE.md" | sed 's/^/ /'
112
+ echo " ..."
113
+ echo ""
114
+ fi
115
+
116
+ # ==========================================
117
+ # Analyze what will be imported
118
+ # ==========================================
119
+ echo -e "${YELLOW}Files to import:${NC}"
120
+ echo ""
121
+
122
+ # Track counts
123
+ CORE_COUNT=0
124
+ RULES_COUNT=0
125
+ LEARNINGS_COUNT=0
126
+ TEMPLATES_COUNT=0
127
+
128
+ # CORE FILES
129
+ echo -e "${DIM}Core:${NC}"
130
+
131
+ if [ -f "$PROFILE_DIR/CLAUDE.md" ]; then
132
+ echo -e " ${GREEN}→${NC} CLAUDE.md"
133
+ CORE_COUNT=$((CORE_COUNT + 1))
134
+ fi
135
+
136
+ if [ -d "$PROFILE_DIR/agents" ]; then
137
+ agent_count=$(ls "$PROFILE_DIR/agents"/*.md 2>/dev/null | wc -l | tr -d ' ')
138
+ echo -e " ${GREEN}→${NC} agents/ ($agent_count personas)"
139
+ CORE_COUNT=$((CORE_COUNT + agent_count))
140
+ fi
141
+
142
+ if [ -f "$PROFILE_DIR/.workflow/config.json" ]; then
143
+ echo -e " ${GREEN}→${NC} config.json ${DIM}(will merge)${NC}"
144
+ CORE_COUNT=$((CORE_COUNT + 1))
145
+ fi
146
+
147
+ # RULES & DECISIONS
148
+ if [ "$SKIP_RULES" != true ]; then
149
+ HAS_RULES=false
150
+
151
+ if [ -f "$PROFILE_DIR/.workflow/state/decisions.md" ]; then
152
+ HAS_RULES=true
153
+ fi
154
+
155
+ if [ -d "$PROFILE_DIR/.claude/rules" ]; then
156
+ rule_count=$(ls "$PROFILE_DIR/.claude/rules"/*.md 2>/dev/null | wc -l | tr -d ' ')
157
+ if [ "$rule_count" -gt 0 ]; then
158
+ HAS_RULES=true
159
+ fi
160
+ fi
161
+
162
+ if [ "$HAS_RULES" = true ]; then
163
+ echo ""
164
+ echo -e "${DIM}Rules & Decisions:${NC}"
165
+
166
+ if [ -f "$PROFILE_DIR/.workflow/state/decisions.md" ]; then
167
+ echo -e " ${YELLOW}→${NC} decisions.md ${DIM}(will append)${NC}"
168
+ RULES_COUNT=$((RULES_COUNT + 1))
169
+ fi
170
+
171
+ if [ -d "$PROFILE_DIR/.claude/rules" ]; then
172
+ rule_count=$(ls "$PROFILE_DIR/.claude/rules"/*.md 2>/dev/null | wc -l | tr -d ' ')
173
+ if [ "$rule_count" -gt 0 ]; then
174
+ echo -e " ${GREEN}→${NC} .claude/rules/ ($rule_count rules)"
175
+ RULES_COUNT=$((RULES_COUNT + rule_count))
176
+ fi
177
+ fi
178
+ fi
179
+ fi
180
+
181
+ # LEARNINGS
182
+ if [ "$SKIP_LEARNINGS" != true ]; then
183
+ HAS_LEARNINGS=false
184
+
185
+ if [ -f "$PROFILE_DIR/.workflow/state/feedback-patterns.md" ]; then
186
+ HAS_LEARNINGS=true
187
+ fi
188
+
189
+ if [ -d "$PROFILE_DIR/.claude/skills" ]; then
190
+ skill_count=$(find "$PROFILE_DIR/.claude/skills" -name "patterns.md" -o -name "learnings.md" 2>/dev/null | wc -l | tr -d ' ')
191
+ if [ "$skill_count" -gt 0 ]; then
192
+ HAS_LEARNINGS=true
193
+ fi
194
+ fi
195
+
196
+ if [ "$HAS_LEARNINGS" = true ]; then
197
+ echo ""
198
+ echo -e "${DIM}Learnings:${NC}"
199
+
200
+ if [ -f "$PROFILE_DIR/.workflow/state/feedback-patterns.md" ]; then
201
+ echo -e " ${YELLOW}→${NC} feedback-patterns.md ${DIM}(will append)${NC}"
202
+ LEARNINGS_COUNT=$((LEARNINGS_COUNT + 1))
203
+ fi
204
+
205
+ if [ -d "$PROFILE_DIR/.claude/skills" ]; then
206
+ skill_dirs=$(find "$PROFILE_DIR/.claude/skills" -mindepth 1 -maxdepth 1 -type d 2>/dev/null | wc -l | tr -d ' ')
207
+ if [ "$skill_dirs" -gt 0 ]; then
208
+ echo -e " ${GREEN}→${NC} skill learnings ($skill_dirs skills)"
209
+ LEARNINGS_COUNT=$((LEARNINGS_COUNT + skill_dirs))
210
+ fi
211
+ fi
212
+ fi
213
+ fi
214
+
215
+ # TEMPLATES
216
+ if [ "$SKIP_TEMPLATES" != true ] && [ -d "$PROFILE_DIR/templates" ]; then
217
+ template_count=$(ls "$PROFILE_DIR/templates"/*.md 2>/dev/null | wc -l | tr -d ' ')
218
+ if [ "$template_count" -gt 0 ]; then
219
+ echo ""
220
+ echo -e "${DIM}Templates:${NC}"
221
+ for template in "$PROFILE_DIR/templates"/*.md; do
222
+ if [ -f "$template" ]; then
223
+ echo -e " ${GREEN}→${NC} $(basename "$template")"
224
+ TEMPLATES_COUNT=$((TEMPLATES_COUNT + 1))
225
+ fi
226
+ done
227
+ fi
228
+ fi
229
+
230
+ # APP MAP (optional)
231
+ if [ -f "$PROFILE_DIR/.workflow/state/app-map.md" ]; then
232
+ echo ""
233
+ echo -e "${DIM}Component Registry (optional):${NC}"
234
+ echo -e " ${YELLOW}→${NC} app-map.md ${DIM}(will ask)${NC}"
235
+ fi
236
+
237
+ echo ""
238
+
239
+ # Dry run stops here
240
+ if [ "$DRY_RUN" = true ]; then
241
+ echo -e "${YELLOW}Dry run - no changes made${NC}"
242
+ rm -rf "$TEMP_DIR"
243
+ exit 0
244
+ fi
245
+
246
+ # Confirm unless forced
247
+ if [ "$FORCE" != true ]; then
248
+ echo -e "${CYAN}Summary:${NC} $CORE_COUNT core, $RULES_COUNT rules, $LEARNINGS_COUNT learnings, $TEMPLATES_COUNT templates"
249
+ echo ""
250
+ read -p "Import these files? (y/N) " confirm
251
+ if [ "$confirm" != "y" ] && [ "$confirm" != "Y" ]; then
252
+ echo "Cancelled"
253
+ rm -rf "$TEMP_DIR"
254
+ exit 0
255
+ fi
256
+ fi
257
+
258
+ # Create backup if requested
259
+ if [ "$BACKUP" = true ]; then
260
+ BACKUP_DIR="wogi-backup-$(date +%Y%m%d-%H%M%S)"
261
+ mkdir -p "$BACKUP_DIR"
262
+
263
+ [ -f "CLAUDE.md" ] && cp "CLAUDE.md" "$BACKUP_DIR/"
264
+ [ -d "agents" ] && cp -r "agents" "$BACKUP_DIR/"
265
+ [ -d ".claude/rules" ] && cp -r ".claude/rules" "$BACKUP_DIR/"
266
+ [ -f "$WORKFLOW_DIR/config.json" ] && cp "$WORKFLOW_DIR/config.json" "$BACKUP_DIR/"
267
+ [ -f "$WORKFLOW_DIR/state/decisions.md" ] && cp "$WORKFLOW_DIR/state/decisions.md" "$BACKUP_DIR/"
268
+ [ -f "$WORKFLOW_DIR/state/feedback-patterns.md" ] && cp "$WORKFLOW_DIR/state/feedback-patterns.md" "$BACKUP_DIR/"
269
+
270
+ echo -e "${GREEN}✓${NC} Backup created: $BACKUP_DIR"
271
+ echo ""
272
+ fi
273
+
274
+ # ==========================================
275
+ # Import files
276
+ # ==========================================
277
+ echo -e "${CYAN}Importing...${NC}"
278
+ echo ""
279
+
280
+ # CLAUDE.md
281
+ if [ -f "$PROFILE_DIR/CLAUDE.md" ]; then
282
+ cp "$PROFILE_DIR/CLAUDE.md" ./
283
+ echo -e " ${GREEN}✓${NC} CLAUDE.md"
284
+ fi
285
+
286
+ # agents/
287
+ if [ -d "$PROFILE_DIR/agents" ]; then
288
+ mkdir -p agents
289
+ cp "$PROFILE_DIR/agents"/*.md agents/
290
+ echo -e " ${GREEN}✓${NC} agents/"
291
+ fi
292
+
293
+ # config.json (smart merge)
294
+ if [ -f "$PROFILE_DIR/.workflow/config.json" ]; then
295
+ mkdir -p "$WORKFLOW_DIR"
296
+ if [ -f "$WORKFLOW_DIR/config.json" ]; then
297
+ # Use jq to merge if available, otherwise replace
298
+ if command -v jq &> /dev/null; then
299
+ # Merge: profile values override, but keep local additions
300
+ jq -s '.[0] * .[1]' "$WORKFLOW_DIR/config.json" "$PROFILE_DIR/.workflow/config.json" > "$WORKFLOW_DIR/config.json.tmp"
301
+ mv "$WORKFLOW_DIR/config.json.tmp" "$WORKFLOW_DIR/config.json"
302
+ echo -e " ${GREEN}✓${NC} config.json ${DIM}(merged)${NC}"
303
+ else
304
+ cp "$PROFILE_DIR/.workflow/config.json" "$WORKFLOW_DIR/"
305
+ echo -e " ${GREEN}✓${NC} config.json ${DIM}(replaced)${NC}"
306
+ fi
307
+ else
308
+ cp "$PROFILE_DIR/.workflow/config.json" "$WORKFLOW_DIR/"
309
+ echo -e " ${GREEN}✓${NC} config.json"
310
+ fi
311
+ fi
312
+
313
+ # decisions.md (append if exists)
314
+ if [ "$SKIP_RULES" != true ] && [ -f "$PROFILE_DIR/.workflow/state/decisions.md" ]; then
315
+ mkdir -p "$WORKFLOW_DIR/state"
316
+ if [ -f "$WORKFLOW_DIR/state/decisions.md" ]; then
317
+ echo "" >> "$WORKFLOW_DIR/state/decisions.md"
318
+ echo "---" >> "$WORKFLOW_DIR/state/decisions.md"
319
+ echo "" >> "$WORKFLOW_DIR/state/decisions.md"
320
+ echo "## Imported from profile" >> "$WORKFLOW_DIR/state/decisions.md"
321
+ echo "Source: $(basename "$PROFILE_FILE")" >> "$WORKFLOW_DIR/state/decisions.md"
322
+ echo "Imported: $(date +%Y-%m-%d)" >> "$WORKFLOW_DIR/state/decisions.md"
323
+ echo "" >> "$WORKFLOW_DIR/state/decisions.md"
324
+ # Skip the header from the imported file
325
+ tail -n +3 "$PROFILE_DIR/.workflow/state/decisions.md" >> "$WORKFLOW_DIR/state/decisions.md"
326
+ echo -e " ${GREEN}✓${NC} decisions.md ${DIM}(appended)${NC}"
327
+ else
328
+ cp "$PROFILE_DIR/.workflow/state/decisions.md" "$WORKFLOW_DIR/state/"
329
+ echo -e " ${GREEN}✓${NC} decisions.md"
330
+ fi
331
+ fi
332
+
333
+ # .claude/rules/
334
+ if [ "$SKIP_RULES" != true ] && [ -d "$PROFILE_DIR/.claude/rules" ]; then
335
+ mkdir -p ".claude/rules"
336
+ for rule_file in "$PROFILE_DIR/.claude/rules"/*.md; do
337
+ if [ -f "$rule_file" ]; then
338
+ cp "$rule_file" ".claude/rules/"
339
+ fi
340
+ done
341
+ echo -e " ${GREEN}✓${NC} .claude/rules/"
342
+ fi
343
+
344
+ # feedback-patterns.md (append if exists)
345
+ if [ "$SKIP_LEARNINGS" != true ] && [ -f "$PROFILE_DIR/.workflow/state/feedback-patterns.md" ]; then
346
+ mkdir -p "$WORKFLOW_DIR/state"
347
+ if [ -f "$WORKFLOW_DIR/state/feedback-patterns.md" ]; then
348
+ echo "" >> "$WORKFLOW_DIR/state/feedback-patterns.md"
349
+ echo "---" >> "$WORKFLOW_DIR/state/feedback-patterns.md"
350
+ echo "" >> "$WORKFLOW_DIR/state/feedback-patterns.md"
351
+ echo "## Imported patterns" >> "$WORKFLOW_DIR/state/feedback-patterns.md"
352
+ echo "Source: $(basename "$PROFILE_FILE")" >> "$WORKFLOW_DIR/state/feedback-patterns.md"
353
+ echo "" >> "$WORKFLOW_DIR/state/feedback-patterns.md"
354
+ tail -n +3 "$PROFILE_DIR/.workflow/state/feedback-patterns.md" >> "$WORKFLOW_DIR/state/feedback-patterns.md"
355
+ echo -e " ${GREEN}✓${NC} feedback-patterns.md ${DIM}(appended)${NC}"
356
+ else
357
+ cp "$PROFILE_DIR/.workflow/state/feedback-patterns.md" "$WORKFLOW_DIR/state/"
358
+ echo -e " ${GREEN}✓${NC} feedback-patterns.md"
359
+ fi
360
+ fi
361
+
362
+ # Skill learnings
363
+ if [ "$SKIP_LEARNINGS" != true ] && [ -d "$PROFILE_DIR/.claude/skills" ]; then
364
+ for skill_dir in "$PROFILE_DIR/.claude/skills"/*/; do
365
+ if [ -d "$skill_dir/knowledge" ]; then
366
+ skill_name=$(basename "$skill_dir")
367
+ mkdir -p ".claude/skills/$skill_name/knowledge"
368
+
369
+ # Copy patterns.md and learnings.md
370
+ for file in patterns.md learnings.md; do
371
+ if [ -f "$skill_dir/knowledge/$file" ]; then
372
+ if [ -f ".claude/skills/$skill_name/knowledge/$file" ]; then
373
+ # Append to existing
374
+ echo "" >> ".claude/skills/$skill_name/knowledge/$file"
375
+ echo "---" >> ".claude/skills/$skill_name/knowledge/$file"
376
+ echo "## Imported from profile" >> ".claude/skills/$skill_name/knowledge/$file"
377
+ tail -n +3 "$skill_dir/knowledge/$file" >> ".claude/skills/$skill_name/knowledge/$file"
378
+ else
379
+ cp "$skill_dir/knowledge/$file" ".claude/skills/$skill_name/knowledge/"
380
+ fi
381
+ fi
382
+ done
383
+ fi
384
+ done
385
+ echo -e " ${GREEN}✓${NC} skill learnings"
386
+ fi
387
+
388
+ # Templates (copy to .workflow/templates/)
389
+ if [ "$SKIP_TEMPLATES" != true ] && [ -d "$PROFILE_DIR/templates" ]; then
390
+ mkdir -p "$WORKFLOW_DIR/templates"
391
+ for template in "$PROFILE_DIR/templates"/*.md; do
392
+ if [ -f "$template" ]; then
393
+ template_name=$(basename "$template")
394
+ # Only copy if doesn't exist (templates are starting points)
395
+ if [ ! -f "$WORKFLOW_DIR/templates/$template_name" ]; then
396
+ cp "$template" "$WORKFLOW_DIR/templates/"
397
+ fi
398
+ fi
399
+ done
400
+ echo -e " ${GREEN}✓${NC} templates"
401
+ fi
402
+
403
+ # App-map (ask before importing)
404
+ if [ -f "$PROFILE_DIR/.workflow/state/app-map.md" ]; then
405
+ if [ "$FORCE" = true ]; then
406
+ mkdir -p "$WORKFLOW_DIR/state"
407
+ cp "$PROFILE_DIR/.workflow/state/app-map.md" "$WORKFLOW_DIR/state/"
408
+ echo -e " ${GREEN}✓${NC} app-map.md"
409
+ else
410
+ echo ""
411
+ read -p "Import app-map.md? (This is usually project-specific) (y/N) " import_appmap
412
+ if [ "$import_appmap" = "y" ] || [ "$import_appmap" = "Y" ]; then
413
+ mkdir -p "$WORKFLOW_DIR/state"
414
+ cp "$PROFILE_DIR/.workflow/state/app-map.md" "$WORKFLOW_DIR/state/"
415
+ echo -e " ${GREEN}✓${NC} app-map.md"
416
+ else
417
+ echo -e " ${DIM}⊘${NC} app-map.md ${DIM}(skipped)${NC}"
418
+ fi
419
+ fi
420
+ fi
421
+
422
+ # Cleanup
423
+ rm -rf "$TEMP_DIR"
424
+
425
+ echo ""
426
+ echo -e "${GREEN}╔══════════════════════════════════════════════════════════╗${NC}"
427
+ echo -e "${GREEN}║ ✓ Profile imported successfully! ║${NC}"
428
+ echo -e "${GREEN}╚══════════════════════════════════════════════════════════╝${NC}"
429
+ echo ""
430
+ echo -e "${DIM}Restart Claude CLI to apply changes.${NC}"
431
+
432
+ # Sync rules if decisions were imported
433
+ if [ "$SKIP_RULES" != true ] && [ -f "$WORKFLOW_DIR/state/decisions.md" ]; then
434
+ if [ -f "./scripts/flow-rules-sync.js" ]; then
435
+ echo ""
436
+ echo -e "${DIM}Syncing rules from decisions.md...${NC}"
437
+ node ./scripts/flow-rules-sync.js 2>/dev/null || true
438
+ fi
439
+ fi