@cloudstreamsoftware/claude-tools 1.0.0 → 1.2.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/README.md +152 -37
- package/agents/INDEX.md +183 -0
- package/agents/architect.md +247 -0
- package/agents/build-error-resolver.md +555 -0
- package/agents/catalyst-deployer.md +132 -0
- package/agents/code-reviewer.md +121 -0
- package/agents/compliance-auditor.md +148 -0
- package/agents/creator-architect.md +395 -0
- package/agents/deluge-reviewer.md +98 -0
- package/agents/doc-updater.md +471 -0
- package/agents/e2e-runner.md +711 -0
- package/agents/planner.md +122 -0
- package/agents/refactor-cleaner.md +309 -0
- package/agents/security-reviewer.md +582 -0
- package/agents/tdd-guide.md +302 -0
- package/bin/cloudstream-setup.js +16 -6
- package/config/versions.json +63 -0
- package/dist/hooks/hooks.json +209 -0
- package/dist/index.js +47 -0
- package/dist/lib/asset-value.js +609 -0
- package/dist/lib/client-manager.js +300 -0
- package/dist/lib/command-matcher.js +242 -0
- package/dist/lib/cross-session-patterns.js +754 -0
- package/dist/lib/intent-classifier.js +1075 -0
- package/dist/lib/package-manager.js +374 -0
- package/dist/lib/recommendation-engine.js +597 -0
- package/dist/lib/session-memory.js +489 -0
- package/dist/lib/skill-effectiveness.js +486 -0
- package/dist/lib/skill-matcher.js +595 -0
- package/dist/lib/tutorial-metrics.js +242 -0
- package/dist/lib/tutorial-progress.js +209 -0
- package/dist/lib/tutorial-renderer.js +431 -0
- package/dist/lib/utils.js +380 -0
- package/dist/lib/verify-formatter.js +143 -0
- package/dist/lib/workflow-state.js +249 -0
- package/hooks/hooks.json +209 -0
- package/package.json +5 -1
- package/scripts/aggregate-sessions.js +290 -0
- package/scripts/branch-name-validator.js +291 -0
- package/scripts/build.js +101 -0
- package/scripts/commands/client-switch.js +231 -0
- package/scripts/deprecate-skill.js +610 -0
- package/scripts/diagnose.js +324 -0
- package/scripts/doc-freshness.js +168 -0
- package/scripts/generate-weekly-digest.js +393 -0
- package/scripts/health-check.js +270 -0
- package/scripts/hooks/credential-check.js +101 -0
- package/scripts/hooks/evaluate-session.js +81 -0
- package/scripts/hooks/pre-compact.js +66 -0
- package/scripts/hooks/prompt-analyzer.js +276 -0
- package/scripts/hooks/prompt-router.js +422 -0
- package/scripts/hooks/quality-gate-enforcer.js +371 -0
- package/scripts/hooks/session-end.js +156 -0
- package/scripts/hooks/session-start.js +195 -0
- package/scripts/hooks/skill-injector.js +333 -0
- package/scripts/hooks/suggest-compact.js +58 -0
- package/scripts/lib/asset-value.js +609 -0
- package/scripts/lib/client-manager.js +300 -0
- package/scripts/lib/command-matcher.js +242 -0
- package/scripts/lib/cross-session-patterns.js +754 -0
- package/scripts/lib/intent-classifier.js +1075 -0
- package/scripts/lib/package-manager.js +374 -0
- package/scripts/lib/recommendation-engine.js +597 -0
- package/scripts/lib/session-memory.js +489 -0
- package/scripts/lib/skill-effectiveness.js +486 -0
- package/scripts/lib/skill-matcher.js +595 -0
- package/scripts/lib/tutorial-metrics.js +242 -0
- package/scripts/lib/tutorial-progress.js +209 -0
- package/scripts/lib/tutorial-renderer.js +431 -0
- package/scripts/lib/utils.js +380 -0
- package/scripts/lib/verify-formatter.js +143 -0
- package/scripts/lib/workflow-state.js +249 -0
- package/scripts/onboard.js +363 -0
- package/scripts/quarterly-report.js +692 -0
- package/scripts/setup-package-manager.js +204 -0
- package/scripts/sync-upstream.js +391 -0
- package/scripts/test.js +108 -0
- package/scripts/tutorial-runner.js +351 -0
- package/scripts/validate-all.js +201 -0
- package/scripts/verifiers/agents.js +245 -0
- package/scripts/verifiers/config.js +186 -0
- package/scripts/verifiers/environment.js +123 -0
- package/scripts/verifiers/hooks.js +188 -0
- package/scripts/verifiers/index.js +38 -0
- package/scripts/verifiers/persistence.js +140 -0
- package/scripts/verifiers/plugin.js +215 -0
- package/scripts/verifiers/skills.js +209 -0
- package/scripts/verify-setup.js +164 -0
- package/skills/INDEX.md +157 -0
- package/skills/backend-patterns/SKILL.md +586 -0
- package/skills/backend-patterns/catalyst-patterns.md +128 -0
- package/skills/bigquery-patterns/SKILL.md +27 -0
- package/skills/bigquery-patterns/performance-optimization.md +518 -0
- package/skills/bigquery-patterns/query-patterns.md +372 -0
- package/skills/bigquery-patterns/schema-design.md +78 -0
- package/skills/cloudstream-project-template/SKILL.md +20 -0
- package/skills/cloudstream-project-template/structure.md +65 -0
- package/skills/coding-standards/SKILL.md +524 -0
- package/skills/coding-standards/deluge-standards.md +83 -0
- package/skills/compliance-patterns/SKILL.md +28 -0
- package/skills/compliance-patterns/hipaa/audit-requirements.md +251 -0
- package/skills/compliance-patterns/hipaa/baa-process.md +298 -0
- package/skills/compliance-patterns/hipaa/data-archival-strategy.md +387 -0
- package/skills/compliance-patterns/hipaa/phi-handling.md +52 -0
- package/skills/compliance-patterns/pci-dss/saq-a-requirements.md +307 -0
- package/skills/compliance-patterns/pci-dss/tokenization-patterns.md +382 -0
- package/skills/compliance-patterns/pci-dss/zoho-checkout-patterns.md +56 -0
- package/skills/compliance-patterns/soc2/access-controls.md +344 -0
- package/skills/compliance-patterns/soc2/audit-logging.md +458 -0
- package/skills/compliance-patterns/soc2/change-management.md +403 -0
- package/skills/compliance-patterns/soc2/deluge-execution-logging.md +407 -0
- package/skills/consultancy-workflows/SKILL.md +19 -0
- package/skills/consultancy-workflows/client-isolation.md +21 -0
- package/skills/consultancy-workflows/documentation-automation.md +454 -0
- package/skills/consultancy-workflows/handoff-procedures.md +257 -0
- package/skills/consultancy-workflows/knowledge-capture.md +513 -0
- package/skills/consultancy-workflows/time-tracking.md +26 -0
- package/skills/continuous-learning/SKILL.md +84 -0
- package/skills/continuous-learning/config.json +18 -0
- package/skills/continuous-learning/evaluate-session.sh +60 -0
- package/skills/continuous-learning-v2/SKILL.md +126 -0
- package/skills/continuous-learning-v2/config.json +61 -0
- package/skills/frontend-patterns/SKILL.md +635 -0
- package/skills/frontend-patterns/zoho-widget-patterns.md +103 -0
- package/skills/gcp-data-engineering/SKILL.md +36 -0
- package/skills/gcp-data-engineering/bigquery/performance-optimization.md +337 -0
- package/skills/gcp-data-engineering/dataflow/error-handling.md +496 -0
- package/skills/gcp-data-engineering/dataflow/pipeline-patterns.md +444 -0
- package/skills/gcp-data-engineering/dbt/model-organization.md +63 -0
- package/skills/gcp-data-engineering/dbt/testing-patterns.md +503 -0
- package/skills/gcp-data-engineering/medallion-architecture/bronze-layer.md +60 -0
- package/skills/gcp-data-engineering/medallion-architecture/gold-layer.md +311 -0
- package/skills/gcp-data-engineering/medallion-architecture/layer-transitions.md +517 -0
- package/skills/gcp-data-engineering/medallion-architecture/silver-layer.md +305 -0
- package/skills/gcp-data-engineering/zoho-to-gcp/data-extraction.md +543 -0
- package/skills/gcp-data-engineering/zoho-to-gcp/real-time-vs-batch.md +337 -0
- package/skills/security-review/SKILL.md +498 -0
- package/skills/security-review/compliance-checklist.md +53 -0
- package/skills/strategic-compact/SKILL.md +67 -0
- package/skills/tdd-workflow/SKILL.md +413 -0
- package/skills/tdd-workflow/zoho-testing.md +124 -0
- package/skills/tutorial/SKILL.md +249 -0
- package/skills/tutorial/docs/ACCESSIBILITY.md +169 -0
- package/skills/tutorial/lessons/00-philosophy-and-workflow.md +198 -0
- package/skills/tutorial/lessons/01-basics.md +81 -0
- package/skills/tutorial/lessons/02-training.md +86 -0
- package/skills/tutorial/lessons/03-commands.md +109 -0
- package/skills/tutorial/lessons/04-workflows.md +115 -0
- package/skills/tutorial/lessons/05-compliance.md +116 -0
- package/skills/tutorial/lessons/06-zoho.md +121 -0
- package/skills/tutorial/lessons/07-hooks-system.md +277 -0
- package/skills/tutorial/lessons/08-mcp-servers.md +316 -0
- package/skills/tutorial/lessons/09-client-management.md +215 -0
- package/skills/tutorial/lessons/10-testing-e2e.md +260 -0
- package/skills/tutorial/lessons/11-skills-deep-dive.md +272 -0
- package/skills/tutorial/lessons/12-rules-system.md +326 -0
- package/skills/tutorial/lessons/13-golden-standard-graduation.md +213 -0
- package/skills/tutorial/lessons/14-fork-setup-and-sync.md +312 -0
- package/skills/tutorial/lessons/15-living-examples-system.md +221 -0
- package/skills/tutorial/tracks/accelerated/README.md +134 -0
- package/skills/tutorial/tracks/accelerated/assessment/checkpoint-1.md +161 -0
- package/skills/tutorial/tracks/accelerated/assessment/checkpoint-2.md +175 -0
- package/skills/tutorial/tracks/accelerated/day-1-core-concepts.md +234 -0
- package/skills/tutorial/tracks/accelerated/day-2-essential-commands.md +270 -0
- package/skills/tutorial/tracks/accelerated/day-3-workflow-mastery.md +305 -0
- package/skills/tutorial/tracks/accelerated/day-4-compliance-zoho.md +304 -0
- package/skills/tutorial/tracks/accelerated/day-5-hooks-skills.md +344 -0
- package/skills/tutorial/tracks/accelerated/day-6-client-testing.md +386 -0
- package/skills/tutorial/tracks/accelerated/day-7-graduation.md +369 -0
- package/skills/zoho-patterns/CHANGELOG.md +108 -0
- package/skills/zoho-patterns/SKILL.md +446 -0
- package/skills/zoho-patterns/analytics/dashboard-patterns.md +352 -0
- package/skills/zoho-patterns/analytics/zoho-to-bigquery-pipeline.md +427 -0
- package/skills/zoho-patterns/catalyst/appsail-deployment.md +349 -0
- package/skills/zoho-patterns/catalyst/context-close-patterns.md +354 -0
- package/skills/zoho-patterns/catalyst/cron-batch-processing.md +374 -0
- package/skills/zoho-patterns/catalyst/function-patterns.md +439 -0
- package/skills/zoho-patterns/creator/form-design.md +304 -0
- package/skills/zoho-patterns/creator/publish-api-patterns.md +313 -0
- package/skills/zoho-patterns/creator/widget-integration.md +306 -0
- package/skills/zoho-patterns/creator/workflow-automation.md +253 -0
- package/skills/zoho-patterns/deluge/api-patterns.md +468 -0
- package/skills/zoho-patterns/deluge/batch-processing.md +403 -0
- package/skills/zoho-patterns/deluge/cross-app-integration.md +356 -0
- package/skills/zoho-patterns/deluge/error-handling.md +423 -0
- package/skills/zoho-patterns/deluge/syntax-reference.md +65 -0
- package/skills/zoho-patterns/integration/cors-proxy-architecture.md +426 -0
- package/skills/zoho-patterns/integration/crm-books-native-sync.md +277 -0
- package/skills/zoho-patterns/integration/oauth-token-management.md +461 -0
- package/skills/zoho-patterns/integration/zoho-flow-patterns.md +334 -0
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Workflow State - Tracks Workflow Phases and Suggests Next Steps
|
|
3
|
+
*
|
|
4
|
+
* Manages the state of multi-phase workflows (feature, bugfix, refactor, zoho)
|
|
5
|
+
* and provides guidance on skipped phases and next steps.
|
|
6
|
+
*
|
|
7
|
+
* @module workflow-state
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Workflow phase definitions
|
|
12
|
+
*
|
|
13
|
+
* Each workflow type has an ordered list of phases that should be followed.
|
|
14
|
+
* Critical phases are marked and require confirmation to skip.
|
|
15
|
+
*/
|
|
16
|
+
const WORKFLOW_PHASES = {
|
|
17
|
+
feature: ['plan', 'tdd', 'implement', 'review', 'verify', 'pr'],
|
|
18
|
+
bugfix: ['investigate', 'tdd', 'fix', 'review', 'verify'],
|
|
19
|
+
refactor: ['plan', 'review-existing', 'refactor', 'verify'],
|
|
20
|
+
zoho: ['architect', 'deluge-review', 'deploy', 'verify'],
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Critical phases that require confirmation to skip
|
|
25
|
+
*/
|
|
26
|
+
const CRITICAL_PHASES = {
|
|
27
|
+
feature: ['plan', 'tdd', 'review'],
|
|
28
|
+
bugfix: ['investigate', 'review'],
|
|
29
|
+
refactor: ['plan', 'review-existing'],
|
|
30
|
+
zoho: ['architect', 'deluge-review'],
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* In-memory workflow state
|
|
35
|
+
* In production, this would be persisted to session-memory.js
|
|
36
|
+
*/
|
|
37
|
+
let currentWorkflow = null;
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Get the current workflow state
|
|
41
|
+
*
|
|
42
|
+
* @returns {object|null} Current workflow state or null if no workflow active
|
|
43
|
+
*/
|
|
44
|
+
function getWorkflowState() {
|
|
45
|
+
return currentWorkflow;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Start a new workflow
|
|
50
|
+
*
|
|
51
|
+
* @param {string} type - Workflow type (feature, bugfix, refactor, zoho)
|
|
52
|
+
* @param {string} description - Description of what this workflow is for
|
|
53
|
+
* @returns {boolean} True if workflow started successfully
|
|
54
|
+
*/
|
|
55
|
+
function startWorkflow(type, description = '') {
|
|
56
|
+
// Validate workflow type
|
|
57
|
+
if (!WORKFLOW_PHASES[type]) {
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
currentWorkflow = {
|
|
62
|
+
type,
|
|
63
|
+
description,
|
|
64
|
+
currentPhase: null,
|
|
65
|
+
completedPhases: [],
|
|
66
|
+
startedAt: new Date().toISOString(),
|
|
67
|
+
lastUpdated: new Date().toISOString(),
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
return true;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Advance to a specific phase
|
|
75
|
+
*
|
|
76
|
+
* @param {string} phase - The phase to advance to
|
|
77
|
+
* @returns {boolean} True if phase was advanced successfully
|
|
78
|
+
*/
|
|
79
|
+
function advancePhase(phase) {
|
|
80
|
+
if (!currentWorkflow) {
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// Add to completed phases if not already there
|
|
85
|
+
if (!currentWorkflow.completedPhases.includes(phase)) {
|
|
86
|
+
currentWorkflow.completedPhases.push(phase);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
currentWorkflow.currentPhase = phase;
|
|
90
|
+
currentWorkflow.lastUpdated = new Date().toISOString();
|
|
91
|
+
|
|
92
|
+
return true;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Check which phases were skipped to reach a target phase
|
|
97
|
+
*
|
|
98
|
+
* @param {string} targetPhase - The phase we're trying to reach
|
|
99
|
+
* @returns {string[]} Array of skipped phase names
|
|
100
|
+
*/
|
|
101
|
+
function checkSkippedPhases(targetPhase) {
|
|
102
|
+
if (!currentWorkflow) {
|
|
103
|
+
return [];
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
const phases = WORKFLOW_PHASES[currentWorkflow.type];
|
|
107
|
+
if (!phases) {
|
|
108
|
+
return [];
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
const targetIndex = phases.indexOf(targetPhase);
|
|
112
|
+
if (targetIndex === -1) {
|
|
113
|
+
return [];
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
const skipped = [];
|
|
117
|
+
|
|
118
|
+
// Check all phases before the target
|
|
119
|
+
for (let i = 0; i < targetIndex; i++) {
|
|
120
|
+
const phase = phases[i];
|
|
121
|
+
if (!currentWorkflow.completedPhases.includes(phase)) {
|
|
122
|
+
skipped.push(phase);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
return skipped;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* Get the next recommended phase
|
|
131
|
+
*
|
|
132
|
+
* @returns {string|null} Next phase name or null if workflow complete
|
|
133
|
+
*/
|
|
134
|
+
function getNextPhase() {
|
|
135
|
+
if (!currentWorkflow) {
|
|
136
|
+
return null;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
const phases = WORKFLOW_PHASES[currentWorkflow.type];
|
|
140
|
+
if (!phases) {
|
|
141
|
+
return null;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
// Find the current phase index
|
|
145
|
+
const currentIndex = currentWorkflow.currentPhase
|
|
146
|
+
? phases.indexOf(currentWorkflow.currentPhase)
|
|
147
|
+
: -1;
|
|
148
|
+
|
|
149
|
+
// Return the next phase
|
|
150
|
+
const nextIndex = currentIndex + 1;
|
|
151
|
+
if (nextIndex >= phases.length) {
|
|
152
|
+
return null; // Workflow complete
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
return phases[nextIndex];
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
/**
|
|
159
|
+
* Check if a phase is critical for a workflow type
|
|
160
|
+
*
|
|
161
|
+
* @param {string} phase - Phase name
|
|
162
|
+
* @param {string} workflowType - Workflow type
|
|
163
|
+
* @returns {boolean} True if phase is critical
|
|
164
|
+
*/
|
|
165
|
+
function isCriticalPhase(phase, workflowType) {
|
|
166
|
+
const criticalPhases = CRITICAL_PHASES[workflowType];
|
|
167
|
+
if (!criticalPhases) {
|
|
168
|
+
return false;
|
|
169
|
+
}
|
|
170
|
+
return criticalPhases.includes(phase);
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
/**
|
|
174
|
+
* Reset the workflow state
|
|
175
|
+
*/
|
|
176
|
+
function resetWorkflow() {
|
|
177
|
+
currentWorkflow = null;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
/**
|
|
181
|
+
* Check if a workflow is currently active
|
|
182
|
+
*
|
|
183
|
+
* @returns {boolean} True if workflow is active
|
|
184
|
+
*/
|
|
185
|
+
function hasActiveWorkflow() {
|
|
186
|
+
return currentWorkflow !== null;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
/**
|
|
190
|
+
* Get workflow progress as a percentage
|
|
191
|
+
*
|
|
192
|
+
* @returns {number} Progress percentage (0-100)
|
|
193
|
+
*/
|
|
194
|
+
function getProgress() {
|
|
195
|
+
if (!currentWorkflow) {
|
|
196
|
+
return 0;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
const phases = WORKFLOW_PHASES[currentWorkflow.type];
|
|
200
|
+
if (!phases || phases.length === 0) {
|
|
201
|
+
return 0;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
return Math.round((currentWorkflow.completedPhases.length / phases.length) * 100);
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
/**
|
|
208
|
+
* Detect workflow type from an intent
|
|
209
|
+
*
|
|
210
|
+
* @param {string} intent - The detected intent
|
|
211
|
+
* @returns {string|null} Suggested workflow type or null
|
|
212
|
+
*/
|
|
213
|
+
function detectWorkflowType(intent) {
|
|
214
|
+
const intentToWorkflow = {
|
|
215
|
+
PLANNING: 'feature',
|
|
216
|
+
TESTING: 'feature', // Testing typically part of feature workflow
|
|
217
|
+
REVIEW: null, // Review could be any workflow
|
|
218
|
+
SECURITY: null,
|
|
219
|
+
COMPLIANCE: null,
|
|
220
|
+
ZOHO: 'zoho',
|
|
221
|
+
DEPLOY: null, // Deploy is usually end of workflow
|
|
222
|
+
REFACTOR: 'refactor',
|
|
223
|
+
DEBUG: 'bugfix',
|
|
224
|
+
};
|
|
225
|
+
|
|
226
|
+
return intentToWorkflow[intent] || null;
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
module.exports = {
|
|
230
|
+
// State management
|
|
231
|
+
getWorkflowState,
|
|
232
|
+
startWorkflow,
|
|
233
|
+
advancePhase,
|
|
234
|
+
resetWorkflow,
|
|
235
|
+
hasActiveWorkflow,
|
|
236
|
+
|
|
237
|
+
// Phase checking
|
|
238
|
+
checkSkippedPhases,
|
|
239
|
+
getNextPhase,
|
|
240
|
+
isCriticalPhase,
|
|
241
|
+
getProgress,
|
|
242
|
+
|
|
243
|
+
// Workflow detection
|
|
244
|
+
detectWorkflowType,
|
|
245
|
+
|
|
246
|
+
// Constants
|
|
247
|
+
WORKFLOW_PHASES,
|
|
248
|
+
CRITICAL_PHASES,
|
|
249
|
+
};
|
|
@@ -0,0 +1,363 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Onboard Script for Everything Claude Code
|
|
5
|
+
* Interactive setup wizard for new users
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
const fs = require('fs');
|
|
9
|
+
const path = require('path');
|
|
10
|
+
const {
|
|
11
|
+
getClaudeDir,
|
|
12
|
+
commandExists,
|
|
13
|
+
runCommand,
|
|
14
|
+
readFile,
|
|
15
|
+
ensureDir,
|
|
16
|
+
log,
|
|
17
|
+
} = require('./lib/utils');
|
|
18
|
+
|
|
19
|
+
// Status indicators
|
|
20
|
+
const CHECK = '\u2713'; // ✓
|
|
21
|
+
const CROSS = '\u2717'; // ✗
|
|
22
|
+
const ARROW = '\u2192'; // →
|
|
23
|
+
|
|
24
|
+
let stepNumber = 0;
|
|
25
|
+
const totalSteps = 6;
|
|
26
|
+
const issues = [];
|
|
27
|
+
|
|
28
|
+
function step(title) {
|
|
29
|
+
stepNumber++;
|
|
30
|
+
log('');
|
|
31
|
+
log(`[${stepNumber}/${totalSteps}] ${title}`);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
function success(msg) {
|
|
35
|
+
log(` ${CHECK} ${msg}`);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function fail(msg) {
|
|
39
|
+
log(` ${CROSS} ${msg}`);
|
|
40
|
+
issues.push(msg);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
function info(msg) {
|
|
44
|
+
log(` ${ARROW} ${msg}`);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function divider() {
|
|
48
|
+
log('');
|
|
49
|
+
log('-'.repeat(50));
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// Step 1: Prerequisites
|
|
53
|
+
function checkPrerequisites() {
|
|
54
|
+
step('Checking prerequisites...');
|
|
55
|
+
|
|
56
|
+
// Node.js
|
|
57
|
+
const nodeVersion = process.version;
|
|
58
|
+
const nodeMajor = parseInt(nodeVersion.slice(1).split('.')[0], 10);
|
|
59
|
+
if (nodeMajor >= 18) {
|
|
60
|
+
success(`Node.js ${nodeVersion}`);
|
|
61
|
+
} else {
|
|
62
|
+
fail(`Node.js ${nodeVersion} (requires 18+)`);
|
|
63
|
+
info('Install Node.js 18+ from https://nodejs.org/');
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// Git
|
|
67
|
+
const gitResult = runCommand('git --version');
|
|
68
|
+
if (gitResult.success) {
|
|
69
|
+
success('Git installed');
|
|
70
|
+
|
|
71
|
+
// Check git config
|
|
72
|
+
const emailResult = runCommand('git config --get user.email');
|
|
73
|
+
if (emailResult.success && emailResult.output) {
|
|
74
|
+
success(`Git configured (${emailResult.output})`);
|
|
75
|
+
} else {
|
|
76
|
+
fail('Git email not configured');
|
|
77
|
+
info('Run: git config --global user.email "your@email.com"');
|
|
78
|
+
}
|
|
79
|
+
} else {
|
|
80
|
+
fail('Git not installed');
|
|
81
|
+
info('Install Git from https://git-scm.com/');
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// Package manager
|
|
85
|
+
if (commandExists('npm')) {
|
|
86
|
+
success('npm available');
|
|
87
|
+
} else if (commandExists('yarn')) {
|
|
88
|
+
success('yarn available');
|
|
89
|
+
} else if (commandExists('pnpm')) {
|
|
90
|
+
success('pnpm available');
|
|
91
|
+
} else {
|
|
92
|
+
fail('No package manager found');
|
|
93
|
+
info('npm comes with Node.js - try reinstalling Node.js');
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// Step 2: Repository
|
|
98
|
+
function checkRepository() {
|
|
99
|
+
step('Checking repository setup...');
|
|
100
|
+
|
|
101
|
+
const gitDirResult = runCommand('git rev-parse --git-dir');
|
|
102
|
+
if (!gitDirResult.success) {
|
|
103
|
+
fail('Not in a git repository');
|
|
104
|
+
info('Clone your fork first: git clone https://github.com/YOUR-USERNAME/css_claude_code.git');
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
success('In a git repository');
|
|
108
|
+
|
|
109
|
+
// Check remotes
|
|
110
|
+
const remotesResult = runCommand('git remote -v');
|
|
111
|
+
if (remotesResult.success) {
|
|
112
|
+
const remotes = remotesResult.output;
|
|
113
|
+
|
|
114
|
+
if (remotes.includes('origin')) {
|
|
115
|
+
success('Origin remote configured');
|
|
116
|
+
} else {
|
|
117
|
+
fail('No origin remote');
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
if (remotes.includes('upstream')) {
|
|
121
|
+
success('Upstream remote configured');
|
|
122
|
+
} else {
|
|
123
|
+
fail('No upstream remote');
|
|
124
|
+
info(
|
|
125
|
+
'Add upstream: git remote add upstream https://github.com/CloudStreamSoftware/css_claude_code.git'
|
|
126
|
+
);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
// Check if we're in the right repo
|
|
131
|
+
const packagePath = path.join(process.cwd(), 'package.json');
|
|
132
|
+
if (fs.existsSync(packagePath)) {
|
|
133
|
+
const pkg = JSON.parse(readFile(packagePath));
|
|
134
|
+
if (pkg.name && pkg.name.includes('claude')) {
|
|
135
|
+
success('Appears to be correct repository');
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
// Step 3: Dependencies
|
|
141
|
+
function checkDependencies() {
|
|
142
|
+
step('Checking dependencies...');
|
|
143
|
+
|
|
144
|
+
const nodeModules = path.join(process.cwd(), 'node_modules');
|
|
145
|
+
if (fs.existsSync(nodeModules)) {
|
|
146
|
+
success('node_modules exists');
|
|
147
|
+
|
|
148
|
+
// Quick check for a key dependency
|
|
149
|
+
const utilsPath = path.join(nodeModules, '.package-lock.json');
|
|
150
|
+
if (fs.existsSync(utilsPath) || fs.readdirSync(nodeModules).length > 10) {
|
|
151
|
+
success('Dependencies appear installed');
|
|
152
|
+
}
|
|
153
|
+
} else {
|
|
154
|
+
fail('node_modules not found');
|
|
155
|
+
info('Run: npm install');
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
// Check for package-lock.json
|
|
159
|
+
const lockFile = path.join(process.cwd(), 'package-lock.json');
|
|
160
|
+
if (fs.existsSync(lockFile)) {
|
|
161
|
+
success('package-lock.json exists');
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
// Step 4: Credentials
|
|
166
|
+
function checkCredentials() {
|
|
167
|
+
step('Checking credentials...');
|
|
168
|
+
|
|
169
|
+
const claudeDir = getClaudeDir();
|
|
170
|
+
ensureDir(claudeDir);
|
|
171
|
+
|
|
172
|
+
const envFile = path.join(claudeDir, '.env');
|
|
173
|
+
if (fs.existsSync(envFile)) {
|
|
174
|
+
const content = readFile(envFile);
|
|
175
|
+
if (content && content.trim().length > 0) {
|
|
176
|
+
success('~/.claude/.env exists with content');
|
|
177
|
+
|
|
178
|
+
// Check for GITHUB_TOKEN
|
|
179
|
+
if (content.includes('GITHUB_TOKEN')) {
|
|
180
|
+
success('GITHUB_TOKEN configured');
|
|
181
|
+
} else {
|
|
182
|
+
fail('GITHUB_TOKEN not found in .env');
|
|
183
|
+
info('Add GITHUB_TOKEN=your_token to ~/.claude/.env');
|
|
184
|
+
}
|
|
185
|
+
} else {
|
|
186
|
+
fail('~/.claude/.env is empty');
|
|
187
|
+
info('Add your credentials to ~/.claude/.env');
|
|
188
|
+
}
|
|
189
|
+
} else {
|
|
190
|
+
fail('~/.claude/.env not found');
|
|
191
|
+
log('');
|
|
192
|
+
log(' Create ~/.claude/.env with:');
|
|
193
|
+
log(' GITHUB_TOKEN=your_github_token');
|
|
194
|
+
log('');
|
|
195
|
+
log(' Ask your team lead for additional credentials.');
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
// Step 5: Health Check
|
|
200
|
+
function runHealthCheck() {
|
|
201
|
+
step('Running health check...');
|
|
202
|
+
|
|
203
|
+
// Run a simplified health check
|
|
204
|
+
const claudeDir = getClaudeDir();
|
|
205
|
+
|
|
206
|
+
// Check claude dir
|
|
207
|
+
if (fs.existsSync(claudeDir)) {
|
|
208
|
+
try {
|
|
209
|
+
const testFile = path.join(claudeDir, '.onboard-test');
|
|
210
|
+
fs.writeFileSync(testFile, 'test');
|
|
211
|
+
fs.unlinkSync(testFile);
|
|
212
|
+
success('~/.claude/ is writable');
|
|
213
|
+
} catch {
|
|
214
|
+
fail('~/.claude/ is not writable');
|
|
215
|
+
}
|
|
216
|
+
} else {
|
|
217
|
+
ensureDir(claudeDir);
|
|
218
|
+
success('Created ~/.claude/ directory');
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
// Check hooks
|
|
222
|
+
const hooksFile = path.join(process.cwd(), 'hooks', 'hooks.json');
|
|
223
|
+
if (fs.existsSync(hooksFile)) {
|
|
224
|
+
try {
|
|
225
|
+
JSON.parse(readFile(hooksFile));
|
|
226
|
+
success('hooks.json is valid');
|
|
227
|
+
} catch {
|
|
228
|
+
fail('hooks.json has invalid JSON');
|
|
229
|
+
}
|
|
230
|
+
} else {
|
|
231
|
+
fail('hooks.json not found');
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
// Check commands directory
|
|
235
|
+
const commandsDir = path.join(process.cwd(), 'commands');
|
|
236
|
+
if (fs.existsSync(commandsDir)) {
|
|
237
|
+
const commands = fs.readdirSync(commandsDir).filter((f) => f.endsWith('.md'));
|
|
238
|
+
success(`${commands.length} commands available`);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
// Step 6: Next Steps
|
|
243
|
+
function showNextSteps() {
|
|
244
|
+
step('Setup complete!');
|
|
245
|
+
|
|
246
|
+
divider();
|
|
247
|
+
|
|
248
|
+
if (issues.length === 0) {
|
|
249
|
+
log('');
|
|
250
|
+
log('Your system is ready!');
|
|
251
|
+
log('');
|
|
252
|
+
log('Next steps:');
|
|
253
|
+
log('');
|
|
254
|
+
log(' 1. Start the tutorial:');
|
|
255
|
+
log(' /tutorial');
|
|
256
|
+
log('');
|
|
257
|
+
log(' 2. Review documentation:');
|
|
258
|
+
log(' - README.md (overview)');
|
|
259
|
+
log(' - GETTING-STARTED.md (detailed setup)');
|
|
260
|
+
log(' - docs/DAY-ONE-CHECKLIST.md (first day guide)');
|
|
261
|
+
log('');
|
|
262
|
+
log(' 3. When ready for client work:');
|
|
263
|
+
log(' /client-switch [client-name]');
|
|
264
|
+
log('');
|
|
265
|
+
log('Questions? Ask your team buddy or check docs/FAQ.md');
|
|
266
|
+
} else {
|
|
267
|
+
log('');
|
|
268
|
+
log(`Setup incomplete - ${issues.length} issue(s) to resolve:`);
|
|
269
|
+
log('');
|
|
270
|
+
issues.forEach((issue, i) => {
|
|
271
|
+
log(` ${i + 1}. ${issue}`);
|
|
272
|
+
});
|
|
273
|
+
log('');
|
|
274
|
+
log('Fix these issues, then run /onboard again.');
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
log('');
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
// Status only mode
|
|
281
|
+
function showStatus() {
|
|
282
|
+
log('');
|
|
283
|
+
log('Everything Claude Code - Setup Status');
|
|
284
|
+
log('');
|
|
285
|
+
|
|
286
|
+
const checks = [];
|
|
287
|
+
|
|
288
|
+
// Node
|
|
289
|
+
const nodeMajor = parseInt(process.version.slice(1).split('.')[0], 10);
|
|
290
|
+
checks.push({ name: 'Node.js 18+', ok: nodeMajor >= 18 });
|
|
291
|
+
|
|
292
|
+
// Git
|
|
293
|
+
checks.push({ name: 'Git', ok: runCommand('git --version').success });
|
|
294
|
+
|
|
295
|
+
// In repo
|
|
296
|
+
checks.push({ name: 'Git repository', ok: runCommand('git rev-parse --git-dir').success });
|
|
297
|
+
|
|
298
|
+
// Dependencies
|
|
299
|
+
checks.push({
|
|
300
|
+
name: 'Dependencies',
|
|
301
|
+
ok: fs.existsSync(path.join(process.cwd(), 'node_modules')),
|
|
302
|
+
});
|
|
303
|
+
|
|
304
|
+
// Credentials
|
|
305
|
+
checks.push({ name: 'Credentials', ok: fs.existsSync(path.join(getClaudeDir(), '.env')) });
|
|
306
|
+
|
|
307
|
+
// Hooks
|
|
308
|
+
checks.push({
|
|
309
|
+
name: 'Hooks config',
|
|
310
|
+
ok: fs.existsSync(path.join(process.cwd(), 'hooks', 'hooks.json')),
|
|
311
|
+
});
|
|
312
|
+
|
|
313
|
+
checks.forEach((check) => {
|
|
314
|
+
const status = check.ok ? CHECK : CROSS;
|
|
315
|
+
log(` ${status} ${check.name}`);
|
|
316
|
+
});
|
|
317
|
+
|
|
318
|
+
const passed = checks.filter((c) => c.ok).length;
|
|
319
|
+
log('');
|
|
320
|
+
log(`${passed}/${checks.length} checks passed`);
|
|
321
|
+
|
|
322
|
+
if (passed < checks.length) {
|
|
323
|
+
log('');
|
|
324
|
+
log('Run /onboard for guided setup.');
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
log('');
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
function runOnboard(options = {}) {
|
|
331
|
+
const { skipChecks = false, status = false } = options;
|
|
332
|
+
|
|
333
|
+
if (status) {
|
|
334
|
+
showStatus();
|
|
335
|
+
return;
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
log('');
|
|
339
|
+
log('Welcome to CloudStream Claude Code!');
|
|
340
|
+
log('');
|
|
341
|
+
log("Let's get you set up. This takes about 15 minutes.");
|
|
342
|
+
|
|
343
|
+
if (!skipChecks) {
|
|
344
|
+
checkPrerequisites();
|
|
345
|
+
}
|
|
346
|
+
checkRepository();
|
|
347
|
+
checkDependencies();
|
|
348
|
+
checkCredentials();
|
|
349
|
+
runHealthCheck();
|
|
350
|
+
showNextSteps();
|
|
351
|
+
|
|
352
|
+
// Exit with appropriate code for CI/CD
|
|
353
|
+
process.exit(issues.length > 0 ? 1 : 0);
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
// Parse arguments
|
|
357
|
+
const args = process.argv.slice(2);
|
|
358
|
+
const options = {
|
|
359
|
+
skipChecks: args.includes('--skip-checks'),
|
|
360
|
+
status: args.includes('--status'),
|
|
361
|
+
};
|
|
362
|
+
|
|
363
|
+
runOnboard(options);
|