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.
- package/.workflow/agents/reviewer.md +81 -0
- package/.workflow/agents/security.md +94 -0
- package/.workflow/agents/story-writer.md +58 -0
- package/.workflow/bridges/base-bridge.js +395 -0
- package/.workflow/bridges/claude-bridge.js +434 -0
- package/.workflow/bridges/index.js +130 -0
- package/.workflow/lib/assumption-detector.js +481 -0
- package/.workflow/lib/config-substitution.js +371 -0
- package/.workflow/lib/failure-categories.js +478 -0
- package/.workflow/state/app-map.md.template +15 -0
- package/.workflow/state/architecture.md.template +24 -0
- package/.workflow/state/component-index.json.template +5 -0
- package/.workflow/state/decisions.md.template +15 -0
- package/.workflow/state/feedback-patterns.md.template +9 -0
- package/.workflow/state/knowledge-sync.json.template +6 -0
- package/.workflow/state/progress.md.template +14 -0
- package/.workflow/state/ready.json.template +7 -0
- package/.workflow/state/request-log.md.template +14 -0
- package/.workflow/state/session-state.json.template +11 -0
- package/.workflow/state/stack.md.template +33 -0
- package/.workflow/state/testing.md.template +36 -0
- package/.workflow/templates/claude-md.hbs +257 -0
- package/.workflow/templates/correction-report.md +67 -0
- package/.workflow/templates/gemini-md.hbs +52 -0
- package/README.md +1802 -0
- package/bin/flow +205 -0
- package/lib/index.js +33 -0
- package/lib/installer.js +467 -0
- package/lib/release-channel.js +269 -0
- package/lib/skill-registry.js +526 -0
- package/lib/upgrader.js +401 -0
- package/lib/utils.js +305 -0
- package/package.json +64 -0
- package/scripts/flow +985 -0
- package/scripts/flow-adaptive-learning.js +1259 -0
- package/scripts/flow-aggregate.js +488 -0
- package/scripts/flow-archive +133 -0
- package/scripts/flow-auto-context.js +1015 -0
- package/scripts/flow-auto-learn.js +615 -0
- package/scripts/flow-bridge.js +223 -0
- package/scripts/flow-browser-suggest.js +316 -0
- package/scripts/flow-bug.js +247 -0
- package/scripts/flow-cascade.js +711 -0
- package/scripts/flow-changelog +85 -0
- package/scripts/flow-checkpoint.js +483 -0
- package/scripts/flow-cli.js +403 -0
- package/scripts/flow-code-intelligence.js +760 -0
- package/scripts/flow-complexity.js +502 -0
- package/scripts/flow-config-set.js +152 -0
- package/scripts/flow-constants.js +157 -0
- package/scripts/flow-context +152 -0
- package/scripts/flow-context-init.js +482 -0
- package/scripts/flow-context-monitor.js +384 -0
- package/scripts/flow-context-scoring.js +886 -0
- package/scripts/flow-correct.js +458 -0
- package/scripts/flow-damage-control.js +985 -0
- package/scripts/flow-deps +101 -0
- package/scripts/flow-diff.js +700 -0
- package/scripts/flow-done +151 -0
- package/scripts/flow-done.js +489 -0
- package/scripts/flow-durable-session.js +1541 -0
- package/scripts/flow-entropy-monitor.js +345 -0
- package/scripts/flow-export-profile +349 -0
- package/scripts/flow-export-scanner.js +1046 -0
- package/scripts/flow-figma-confirm.js +400 -0
- package/scripts/flow-figma-extract.js +496 -0
- package/scripts/flow-figma-generate.js +683 -0
- package/scripts/flow-figma-index.js +909 -0
- package/scripts/flow-figma-match.js +617 -0
- package/scripts/flow-figma-mcp-server.js +518 -0
- package/scripts/flow-figma-pipeline.js +414 -0
- package/scripts/flow-file-ops.js +301 -0
- package/scripts/flow-gate-confidence.js +825 -0
- package/scripts/flow-guided-edit.js +659 -0
- package/scripts/flow-health +185 -0
- package/scripts/flow-health.js +413 -0
- package/scripts/flow-hooks.js +556 -0
- package/scripts/flow-http-client.js +249 -0
- package/scripts/flow-hybrid-detect.js +167 -0
- package/scripts/flow-hybrid-interactive.js +591 -0
- package/scripts/flow-hybrid-test.js +152 -0
- package/scripts/flow-import-profile +439 -0
- package/scripts/flow-init +253 -0
- package/scripts/flow-instruction-richness.js +827 -0
- package/scripts/flow-jira-integration.js +579 -0
- package/scripts/flow-knowledge-router.js +522 -0
- package/scripts/flow-knowledge-sync.js +589 -0
- package/scripts/flow-linear-integration.js +631 -0
- package/scripts/flow-links.js +774 -0
- package/scripts/flow-log-manager.js +559 -0
- package/scripts/flow-loop-enforcer.js +1246 -0
- package/scripts/flow-loop-retry-learning.js +630 -0
- package/scripts/flow-lsp.js +923 -0
- package/scripts/flow-map-index +348 -0
- package/scripts/flow-map-sync +201 -0
- package/scripts/flow-memory-blocks.js +668 -0
- package/scripts/flow-memory-compactor.js +350 -0
- package/scripts/flow-memory-db.js +1110 -0
- package/scripts/flow-memory-sync.js +484 -0
- package/scripts/flow-metrics.js +353 -0
- package/scripts/flow-migrate-ids.js +370 -0
- package/scripts/flow-model-adapter.js +802 -0
- package/scripts/flow-model-router.js +884 -0
- package/scripts/flow-models.js +1231 -0
- package/scripts/flow-morning.js +517 -0
- package/scripts/flow-multi-approach.js +660 -0
- package/scripts/flow-new-feature +86 -0
- package/scripts/flow-onboard +1042 -0
- package/scripts/flow-orchestrate-llm.js +459 -0
- package/scripts/flow-orchestrate.js +3592 -0
- package/scripts/flow-output.js +123 -0
- package/scripts/flow-parallel-detector.js +399 -0
- package/scripts/flow-parallel-dispatch.js +987 -0
- package/scripts/flow-parallel.js +428 -0
- package/scripts/flow-pattern-enforcer.js +600 -0
- package/scripts/flow-prd-manager.js +282 -0
- package/scripts/flow-progress.js +323 -0
- package/scripts/flow-project-analyzer.js +975 -0
- package/scripts/flow-prompt-composer.js +487 -0
- package/scripts/flow-providers.js +1381 -0
- package/scripts/flow-queue.js +308 -0
- package/scripts/flow-ready +82 -0
- package/scripts/flow-ready.js +189 -0
- package/scripts/flow-regression.js +396 -0
- package/scripts/flow-response-parser.js +450 -0
- package/scripts/flow-resume.js +284 -0
- package/scripts/flow-rules-sync.js +439 -0
- package/scripts/flow-run-trace.js +718 -0
- package/scripts/flow-safety.js +587 -0
- package/scripts/flow-search +104 -0
- package/scripts/flow-security.js +481 -0
- package/scripts/flow-session-end +106 -0
- package/scripts/flow-session-end.js +437 -0
- package/scripts/flow-session-state.js +671 -0
- package/scripts/flow-setup-hooks +216 -0
- package/scripts/flow-setup-hooks.js +377 -0
- package/scripts/flow-skill-create.js +329 -0
- package/scripts/flow-skill-creator.js +572 -0
- package/scripts/flow-skill-generator.js +1046 -0
- package/scripts/flow-skill-learn.js +880 -0
- package/scripts/flow-skill-matcher.js +578 -0
- package/scripts/flow-spec-generator.js +820 -0
- package/scripts/flow-stack-wizard.js +895 -0
- package/scripts/flow-standup +162 -0
- package/scripts/flow-start +74 -0
- package/scripts/flow-start.js +235 -0
- package/scripts/flow-status +110 -0
- package/scripts/flow-status.js +301 -0
- package/scripts/flow-step-browser.js +83 -0
- package/scripts/flow-step-changelog.js +217 -0
- package/scripts/flow-step-comments.js +306 -0
- package/scripts/flow-step-complexity.js +234 -0
- package/scripts/flow-step-coverage.js +218 -0
- package/scripts/flow-step-knowledge.js +193 -0
- package/scripts/flow-step-pr-tests.js +364 -0
- package/scripts/flow-step-regression.js +89 -0
- package/scripts/flow-step-review.js +516 -0
- package/scripts/flow-step-security.js +162 -0
- package/scripts/flow-step-silent-failures.js +290 -0
- package/scripts/flow-step-simplifier.js +346 -0
- package/scripts/flow-story +105 -0
- package/scripts/flow-story.js +500 -0
- package/scripts/flow-suspend.js +252 -0
- package/scripts/flow-sync-daemon.js +654 -0
- package/scripts/flow-task-analyzer.js +606 -0
- package/scripts/flow-team-dashboard.js +748 -0
- package/scripts/flow-team-sync.js +752 -0
- package/scripts/flow-team.js +977 -0
- package/scripts/flow-tech-options.js +528 -0
- package/scripts/flow-templates.js +812 -0
- package/scripts/flow-tiered-learning.js +728 -0
- package/scripts/flow-trace +204 -0
- package/scripts/flow-transcript-chunking.js +1106 -0
- package/scripts/flow-transcript-digest.js +7918 -0
- package/scripts/flow-transcript-language.js +465 -0
- package/scripts/flow-transcript-parsing.js +1085 -0
- package/scripts/flow-transcript-stories.js +2194 -0
- package/scripts/flow-update-map +224 -0
- package/scripts/flow-utils.js +2242 -0
- package/scripts/flow-verification.js +644 -0
- package/scripts/flow-verify.js +1177 -0
- package/scripts/flow-voice-input.js +638 -0
- package/scripts/flow-watch +168 -0
- package/scripts/flow-workflow-steps.js +521 -0
- package/scripts/flow-workflow.js +1029 -0
- package/scripts/flow-worktree.js +489 -0
- package/scripts/hooks/adapters/base-adapter.js +102 -0
- package/scripts/hooks/adapters/claude-code.js +359 -0
- package/scripts/hooks/adapters/index.js +79 -0
- package/scripts/hooks/core/component-check.js +341 -0
- package/scripts/hooks/core/index.js +35 -0
- package/scripts/hooks/core/loop-check.js +241 -0
- package/scripts/hooks/core/session-context.js +294 -0
- package/scripts/hooks/core/task-gate.js +177 -0
- package/scripts/hooks/core/validation.js +230 -0
- package/scripts/hooks/entry/claude-code/post-tool-use.js +65 -0
- package/scripts/hooks/entry/claude-code/pre-tool-use.js +89 -0
- package/scripts/hooks/entry/claude-code/session-end.js +87 -0
- package/scripts/hooks/entry/claude-code/session-start.js +46 -0
- package/scripts/hooks/entry/claude-code/stop.js +43 -0
- package/scripts/postinstall.js +139 -0
- package/templates/browser-test-flow.json +56 -0
- package/templates/bug-report.md +43 -0
- package/templates/component-detail.md +42 -0
- package/templates/component.stories.tsx +49 -0
- package/templates/context/constraints.md +83 -0
- package/templates/context/conventions.md +177 -0
- package/templates/context/stack.md +60 -0
- package/templates/correction-report.md +90 -0
- package/templates/feature-proposal.md +35 -0
- package/templates/hybrid/_base.md +254 -0
- package/templates/hybrid/_patterns.md +45 -0
- package/templates/hybrid/create-component.md +127 -0
- package/templates/hybrid/create-file.md +56 -0
- package/templates/hybrid/create-hook.md +145 -0
- package/templates/hybrid/create-service.md +70 -0
- package/templates/hybrid/fix-bug.md +33 -0
- package/templates/hybrid/modify-file.md +55 -0
- package/templates/story.md +68 -0
- package/templates/task.json +56 -0
- 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
|