moflo 4.8.21 → 4.8.22
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/.claude/agents/browser/browser-agent.yaml +182 -182
- package/.claude/agents/core/coder.md +265 -265
- package/.claude/agents/core/planner.md +167 -167
- package/.claude/agents/core/researcher.md +189 -189
- package/.claude/agents/core/reviewer.md +325 -325
- package/.claude/agents/core/tester.md +318 -318
- package/.claude/agents/database-specialist.yaml +21 -21
- package/.claude/agents/dual-mode/codex-coordinator.md +224 -224
- package/.claude/agents/dual-mode/codex-worker.md +211 -211
- package/.claude/agents/dual-mode/dual-orchestrator.md +291 -291
- package/.claude/agents/github/code-review-swarm.md +537 -537
- package/.claude/agents/github/github-modes.md +172 -172
- package/.claude/agents/github/issue-tracker.md +318 -318
- package/.claude/agents/github/multi-repo-swarm.md +552 -552
- package/.claude/agents/github/pr-manager.md +190 -190
- package/.claude/agents/github/project-board-sync.md +508 -508
- package/.claude/agents/github/release-manager.md +366 -366
- package/.claude/agents/github/release-swarm.md +582 -582
- package/.claude/agents/github/repo-architect.md +397 -397
- package/.claude/agents/github/swarm-issue.md +572 -572
- package/.claude/agents/github/swarm-pr.md +427 -427
- package/.claude/agents/github/sync-coordinator.md +451 -451
- package/.claude/agents/github/workflow-automation.md +634 -634
- package/.claude/agents/goal/code-goal-planner.md +445 -445
- package/.claude/agents/hive-mind/collective-intelligence-coordinator.md +129 -129
- package/.claude/agents/hive-mind/queen-coordinator.md +202 -202
- package/.claude/agents/hive-mind/scout-explorer.md +241 -241
- package/.claude/agents/hive-mind/swarm-memory-manager.md +192 -192
- package/.claude/agents/hive-mind/worker-specialist.md +216 -216
- package/.claude/agents/index.yaml +17 -17
- package/.claude/agents/neural/safla-neural.md +73 -73
- package/.claude/agents/project-coordinator.yaml +15 -15
- package/.claude/agents/python-specialist.yaml +21 -21
- package/.claude/agents/reasoning/goal-planner.md +72 -72
- package/.claude/agents/security-auditor.yaml +20 -20
- package/.claude/agents/swarm/adaptive-coordinator.md +395 -395
- package/.claude/agents/swarm/hierarchical-coordinator.md +326 -326
- package/.claude/agents/swarm/mesh-coordinator.md +391 -391
- package/.claude/agents/templates/migration-plan.md +745 -745
- package/.claude/agents/typescript-specialist.yaml +21 -21
- package/.claude/checkpoints/1767754460.json +8 -8
- package/.claude/commands/agents/agent-spawning.md +28 -28
- package/.claude/commands/github/github-modes.md +146 -146
- package/.claude/commands/github/github-swarm.md +121 -121
- package/.claude/commands/github/issue-tracker.md +291 -291
- package/.claude/commands/github/pr-manager.md +169 -169
- package/.claude/commands/github/release-manager.md +337 -337
- package/.claude/commands/github/repo-architect.md +366 -366
- package/.claude/commands/github/sync-coordinator.md +300 -300
- package/.claude/commands/memory/neural.md +47 -47
- package/.claude/commands/sparc/analyzer.md +51 -51
- package/.claude/commands/sparc/architect.md +53 -53
- package/.claude/commands/sparc/ask.md +97 -97
- package/.claude/commands/sparc/batch-executor.md +54 -54
- package/.claude/commands/sparc/code.md +89 -89
- package/.claude/commands/sparc/coder.md +54 -54
- package/.claude/commands/sparc/debug.md +83 -83
- package/.claude/commands/sparc/debugger.md +54 -54
- package/.claude/commands/sparc/designer.md +53 -53
- package/.claude/commands/sparc/devops.md +109 -109
- package/.claude/commands/sparc/docs-writer.md +80 -80
- package/.claude/commands/sparc/documenter.md +54 -54
- package/.claude/commands/sparc/innovator.md +54 -54
- package/.claude/commands/sparc/integration.md +83 -83
- package/.claude/commands/sparc/mcp.md +117 -117
- package/.claude/commands/sparc/memory-manager.md +54 -54
- package/.claude/commands/sparc/optimizer.md +54 -54
- package/.claude/commands/sparc/orchestrator.md +131 -131
- package/.claude/commands/sparc/post-deployment-monitoring-mode.md +83 -83
- package/.claude/commands/sparc/refinement-optimization-mode.md +83 -83
- package/.claude/commands/sparc/researcher.md +54 -54
- package/.claude/commands/sparc/reviewer.md +54 -54
- package/.claude/commands/sparc/security-review.md +80 -80
- package/.claude/commands/sparc/sparc-modes.md +174 -174
- package/.claude/commands/sparc/sparc.md +111 -111
- package/.claude/commands/sparc/spec-pseudocode.md +80 -80
- package/.claude/commands/sparc/supabase-admin.md +348 -348
- package/.claude/commands/sparc/swarm-coordinator.md +54 -54
- package/.claude/commands/sparc/tdd.md +54 -54
- package/.claude/commands/sparc/tester.md +54 -54
- package/.claude/commands/sparc/tutorial.md +79 -79
- package/.claude/commands/sparc/workflow-manager.md +54 -54
- package/.claude/commands/sparc.md +166 -166
- package/.claude/commands/swarm/analysis.md +95 -95
- package/.claude/commands/swarm/development.md +96 -96
- package/.claude/commands/swarm/examples.md +168 -168
- package/.claude/commands/swarm/maintenance.md +102 -102
- package/.claude/commands/swarm/optimization.md +117 -117
- package/.claude/commands/swarm/research.md +136 -136
- package/.claude/commands/swarm/testing.md +131 -131
- package/.claude/commands/workflows/development.md +77 -77
- package/.claude/commands/workflows/research.md +62 -62
- package/.claude/guidance/moflo-bootstrap.md +126 -126
- package/.claude/guidance/shipped/agent-bootstrap.md +126 -126
- package/.claude/guidance/shipped/guidance-memory-strategy.md +262 -262
- package/.claude/guidance/shipped/memory-strategy.md +204 -204
- package/.claude/guidance/shipped/moflo.md +668 -653
- package/.claude/guidance/shipped/task-swarm-integration.md +441 -441
- package/.claude/helpers/intelligence.cjs +207 -207
- package/.claude/helpers/statusline.cjs +851 -851
- package/.claude/settings.local.json +18 -0
- package/.claude/skills/fl/SKILL.md +583 -583
- package/.claude/skills/flo/SKILL.md +583 -583
- package/.claude/skills/github-code-review/SKILL.md +1140 -1140
- package/.claude/skills/github-multi-repo/SKILL.md +874 -874
- package/.claude/skills/github-project-management/SKILL.md +1277 -1277
- package/.claude/skills/github-release-management/SKILL.md +1081 -1081
- package/.claude/skills/github-workflow-automation/SKILL.md +1065 -1065
- package/.claude/skills/hive-mind-advanced/SKILL.md +712 -712
- package/.claude/skills/hooks-automation/SKILL.md +1201 -1201
- package/.claude/skills/performance-analysis/SKILL.md +563 -563
- package/.claude/skills/sparc-methodology/SKILL.md +1115 -1115
- package/.claude/skills/swarm-advanced/SKILL.md +973 -973
- package/.claude/workflow-state.json +4 -4
- package/LICENSE +21 -21
- package/README.md +685 -685
- package/bin/cli.js +0 -0
- package/bin/gate-hook.mjs +50 -50
- package/bin/gate.cjs +138 -138
- package/bin/generate-code-map.mjs +775 -775
- package/bin/hook-handler.cjs +83 -83
- package/bin/hooks.mjs +656 -656
- package/bin/index-guidance.mjs +892 -892
- package/bin/index-tests.mjs +709 -709
- package/bin/lib/process-manager.mjs +243 -243
- package/bin/lib/registry-cleanup.cjs +41 -41
- package/bin/prompt-hook.mjs +72 -72
- package/bin/semantic-search.mjs +472 -472
- package/bin/session-start-launcher.mjs +238 -238
- package/bin/setup-project.mjs +250 -250
- package/package.json +123 -123
- package/src/@claude-flow/cli/README.md +452 -452
- package/src/@claude-flow/cli/bin/cli.js +180 -180
- package/src/@claude-flow/cli/bin/preinstall.cjs +2 -2
- package/src/@claude-flow/cli/dist/src/commands/completions.js +409 -409
- package/src/@claude-flow/cli/dist/src/commands/doctor.js +5 -1
- package/src/@claude-flow/cli/dist/src/commands/embeddings.js +25 -25
- package/src/@claude-flow/cli/dist/src/commands/github.js +61 -61
- package/src/@claude-flow/cli/dist/src/commands/hive-mind.js +90 -90
- package/src/@claude-flow/cli/dist/src/commands/hooks.js +9 -9
- package/src/@claude-flow/cli/dist/src/commands/ruvector/import.js +14 -14
- package/src/@claude-flow/cli/dist/src/commands/ruvector/setup.js +624 -624
- package/src/@claude-flow/cli/dist/src/config/moflo-config.d.ts +3 -0
- package/src/@claude-flow/cli/dist/src/config/moflo-config.js +101 -91
- package/src/@claude-flow/cli/dist/src/index.d.ts +5 -0
- package/src/@claude-flow/cli/dist/src/index.js +44 -0
- package/src/@claude-flow/cli/dist/src/init/claudemd-generator.d.ts +29 -29
- package/src/@claude-flow/cli/dist/src/init/claudemd-generator.js +43 -43
- package/src/@claude-flow/cli/dist/src/init/executor.js +453 -453
- package/src/@claude-flow/cli/dist/src/init/helpers-generator.js +482 -482
- package/src/@claude-flow/cli/dist/src/init/moflo-init.d.ts +30 -30
- package/src/@claude-flow/cli/dist/src/init/moflo-init.js +140 -140
- package/src/@claude-flow/cli/dist/src/init/statusline-generator.js +876 -876
- package/src/@claude-flow/cli/dist/src/memory/memory-initializer.js +371 -371
- package/src/@claude-flow/cli/dist/src/runtime/headless.js +28 -28
- package/src/@claude-flow/cli/dist/src/services/container-worker-pool.d.ts +197 -0
- package/src/@claude-flow/cli/dist/src/services/container-worker-pool.js +584 -0
- package/src/@claude-flow/cli/dist/src/services/daemon-lock.d.ts +14 -0
- package/src/@claude-flow/cli/dist/src/services/daemon-lock.js +1 -1
- package/src/@claude-flow/cli/dist/src/services/headless-worker-executor.js +84 -84
- package/src/@claude-flow/cli/package.json +1 -1
- package/src/@claude-flow/guidance/README.md +1195 -1195
- package/src/@claude-flow/guidance/package.json +198 -198
- package/src/@claude-flow/memory/README.md +587 -587
- package/src/@claude-flow/memory/dist/agent-memory-scope.test.js +4 -7
- package/src/@claude-flow/memory/dist/agentdb-backend.d.ts +2 -0
- package/src/@claude-flow/memory/dist/agentdb-backend.js +28 -26
- package/src/@claude-flow/memory/dist/auto-memory-bridge.test.js +36 -39
- package/src/@claude-flow/memory/dist/benchmark.test.js +1 -1
- package/src/@claude-flow/memory/dist/controller-registry.test.js +43 -0
- package/src/@claude-flow/memory/dist/database-provider.d.ts +2 -2
- package/src/@claude-flow/memory/dist/database-provider.js +6 -3
- package/src/@claude-flow/memory/dist/database-provider.test.js +1 -3
- package/src/@claude-flow/memory/dist/hybrid-backend.d.ts +245 -0
- package/src/@claude-flow/memory/dist/hybrid-backend.js +569 -0
- package/src/@claude-flow/memory/dist/hybrid-backend.test.d.ts +8 -0
- package/src/@claude-flow/memory/dist/hybrid-backend.test.js +320 -0
- package/src/@claude-flow/memory/dist/index.d.ts +3 -0
- package/src/@claude-flow/memory/dist/index.js +3 -0
- package/src/@claude-flow/memory/dist/sqlite-backend.d.ts +121 -0
- package/src/@claude-flow/memory/dist/sqlite-backend.js +572 -0
- package/src/@claude-flow/memory/dist/sqljs-backend.d.ts +4 -3
- package/src/@claude-flow/memory/dist/sqljs-backend.js +31 -30
- package/src/@claude-flow/memory/package.json +44 -44
- package/src/@claude-flow/shared/README.md +323 -323
- package/src/@claude-flow/shared/dist/core/config/defaults.js +1 -1
- package/src/@claude-flow/shared/dist/core/config/loader.js +1 -1
- package/src/@claude-flow/shared/dist/core/config/schema.js +1 -1
- package/src/@claude-flow/shared/dist/events/event-store.js +34 -50
- package/src/@claude-flow/shared/dist/events/event-store.test.js +4 -8
- package/src/@claude-flow/shared/dist/hooks/executor.js +4 -7
- package/src/@claude-flow/shared/dist/hooks/safety/file-organization.js +1 -1
- package/src/@claude-flow/shared/dist/hooks/safety/git-commit.js +3 -3
- package/src/@claude-flow/shared/dist/hooks/verify-exports.test.js +6 -6
- package/src/@claude-flow/shared/dist/utils/secure-logger.js +1 -1
- package/src/README.md +493 -493
- package/src/@claude-flow/guidance/dist/adversarial.d.ts +0 -284
- package/src/@claude-flow/guidance/dist/adversarial.js +0 -572
- package/src/@claude-flow/guidance/dist/analyzer.d.ts +0 -530
- package/src/@claude-flow/guidance/dist/analyzer.js +0 -2518
- package/src/@claude-flow/guidance/dist/artifacts.d.ts +0 -283
- package/src/@claude-flow/guidance/dist/artifacts.js +0 -356
- package/src/@claude-flow/guidance/dist/authority.d.ts +0 -290
- package/src/@claude-flow/guidance/dist/authority.js +0 -558
- package/src/@claude-flow/guidance/dist/capabilities.d.ts +0 -209
- package/src/@claude-flow/guidance/dist/capabilities.js +0 -485
- package/src/@claude-flow/guidance/dist/coherence.d.ts +0 -233
- package/src/@claude-flow/guidance/dist/coherence.js +0 -372
- package/src/@claude-flow/guidance/dist/compiler.d.ts +0 -87
- package/src/@claude-flow/guidance/dist/compiler.js +0 -419
- package/src/@claude-flow/guidance/dist/conformance-kit.d.ts +0 -225
- package/src/@claude-flow/guidance/dist/conformance-kit.js +0 -629
- package/src/@claude-flow/guidance/dist/continue-gate.d.ts +0 -214
- package/src/@claude-flow/guidance/dist/continue-gate.js +0 -353
- package/src/@claude-flow/guidance/dist/crypto-utils.d.ts +0 -17
- package/src/@claude-flow/guidance/dist/crypto-utils.js +0 -24
- package/src/@claude-flow/guidance/dist/evolution.d.ts +0 -282
- package/src/@claude-flow/guidance/dist/evolution.js +0 -500
- package/src/@claude-flow/guidance/dist/gates.d.ts +0 -79
- package/src/@claude-flow/guidance/dist/gates.js +0 -302
- package/src/@claude-flow/guidance/dist/gateway.d.ts +0 -206
- package/src/@claude-flow/guidance/dist/gateway.js +0 -452
- package/src/@claude-flow/guidance/dist/generators.d.ts +0 -153
- package/src/@claude-flow/guidance/dist/generators.js +0 -682
- package/src/@claude-flow/guidance/dist/headless.d.ts +0 -177
- package/src/@claude-flow/guidance/dist/headless.js +0 -342
- package/src/@claude-flow/guidance/dist/hooks.d.ts +0 -109
- package/src/@claude-flow/guidance/dist/hooks.js +0 -347
- package/src/@claude-flow/guidance/dist/index.d.ts +0 -205
- package/src/@claude-flow/guidance/dist/index.js +0 -321
- package/src/@claude-flow/guidance/dist/ledger.d.ts +0 -162
- package/src/@claude-flow/guidance/dist/ledger.js +0 -375
- package/src/@claude-flow/guidance/dist/manifest-validator.d.ts +0 -289
- package/src/@claude-flow/guidance/dist/manifest-validator.js +0 -838
- package/src/@claude-flow/guidance/dist/memory-gate.d.ts +0 -222
- package/src/@claude-flow/guidance/dist/memory-gate.js +0 -382
- package/src/@claude-flow/guidance/dist/meta-governance.d.ts +0 -265
- package/src/@claude-flow/guidance/dist/meta-governance.js +0 -348
- package/src/@claude-flow/guidance/dist/optimizer.d.ts +0 -104
- package/src/@claude-flow/guidance/dist/optimizer.js +0 -329
- package/src/@claude-flow/guidance/dist/persistence.d.ts +0 -189
- package/src/@claude-flow/guidance/dist/persistence.js +0 -464
- package/src/@claude-flow/guidance/dist/proof.d.ts +0 -185
- package/src/@claude-flow/guidance/dist/proof.js +0 -238
- package/src/@claude-flow/guidance/dist/retriever.d.ts +0 -116
- package/src/@claude-flow/guidance/dist/retriever.js +0 -394
- package/src/@claude-flow/guidance/dist/ruvbot-integration.d.ts +0 -370
- package/src/@claude-flow/guidance/dist/ruvbot-integration.js +0 -738
- package/src/@claude-flow/guidance/dist/temporal.d.ts +0 -426
- package/src/@claude-flow/guidance/dist/temporal.js +0 -658
- package/src/@claude-flow/guidance/dist/trust.d.ts +0 -283
- package/src/@claude-flow/guidance/dist/trust.js +0 -473
- package/src/@claude-flow/guidance/dist/truth-anchors.d.ts +0 -276
- package/src/@claude-flow/guidance/dist/truth-anchors.js +0 -488
- package/src/@claude-flow/guidance/dist/types.d.ts +0 -378
- package/src/@claude-flow/guidance/dist/types.js +0 -10
- package/src/@claude-flow/guidance/dist/uncertainty.d.ts +0 -372
- package/src/@claude-flow/guidance/dist/uncertainty.js +0 -619
- package/src/@claude-flow/guidance/dist/wasm-kernel.d.ts +0 -48
- package/src/@claude-flow/guidance/dist/wasm-kernel.js +0 -158
|
@@ -1,682 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* CLAUDE.md Generator
|
|
3
|
-
*
|
|
4
|
-
* Generates a structured CLAUDE.md file optimized for the Guidance Control Plane.
|
|
5
|
-
* The output is designed so that when compiled by GuidanceCompiler, it produces
|
|
6
|
-
* a clean constitution (always-loaded invariants) and well-tagged shards
|
|
7
|
-
* (task-scoped rules retrievable by intent).
|
|
8
|
-
*
|
|
9
|
-
* Structure conventions:
|
|
10
|
-
* - Lines 1-60: Constitution (always loaded into every task)
|
|
11
|
-
* - Remaining: Tagged shards (retrieved by intent classification)
|
|
12
|
-
* - Headings map to shard boundaries
|
|
13
|
-
* - Keywords in headings drive intent tagging: "test", "build", "security", etc.
|
|
14
|
-
*
|
|
15
|
-
* @module @claude-flow/guidance/generators
|
|
16
|
-
*/
|
|
17
|
-
// ============================================================================
|
|
18
|
-
// CLAUDE.md Generator
|
|
19
|
-
// ============================================================================
|
|
20
|
-
export function generateClaudeMd(profile) {
|
|
21
|
-
const sections = [];
|
|
22
|
-
// --- Constitution (lines 1-60, always loaded) ---
|
|
23
|
-
sections.push(`# ${profile.name}`);
|
|
24
|
-
sections.push('');
|
|
25
|
-
if (profile.description) {
|
|
26
|
-
sections.push(profile.description);
|
|
27
|
-
sections.push('');
|
|
28
|
-
}
|
|
29
|
-
// Core invariants
|
|
30
|
-
sections.push('## Core Invariants');
|
|
31
|
-
sections.push('');
|
|
32
|
-
sections.push('These rules are always active regardless of task type.');
|
|
33
|
-
sections.push('');
|
|
34
|
-
// Language-specific invariants
|
|
35
|
-
for (const lang of profile.languages) {
|
|
36
|
-
const invariants = getLanguageInvariants(lang);
|
|
37
|
-
if (invariants.length > 0) {
|
|
38
|
-
for (const inv of invariants) {
|
|
39
|
-
sections.push(`- ${inv}`);
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
// Forbidden patterns
|
|
44
|
-
if (profile.forbidden && profile.forbidden.length > 0) {
|
|
45
|
-
sections.push('');
|
|
46
|
-
for (const f of profile.forbidden) {
|
|
47
|
-
sections.push(`- NEVER: ${f}`);
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
// Required patterns
|
|
51
|
-
if (profile.required && profile.required.length > 0) {
|
|
52
|
-
for (const r of profile.required) {
|
|
53
|
-
sections.push(`- ALWAYS: ${r}`);
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
sections.push('');
|
|
57
|
-
// --- Build & Test (tagged shard) ---
|
|
58
|
-
sections.push('## Build & Test');
|
|
59
|
-
sections.push('');
|
|
60
|
-
const pm = profile.packageManager || 'npm';
|
|
61
|
-
if (profile.buildCommand) {
|
|
62
|
-
sections.push(`Build: \`${profile.buildCommand}\``);
|
|
63
|
-
}
|
|
64
|
-
else {
|
|
65
|
-
sections.push(`Build: \`${pm} run build\``);
|
|
66
|
-
}
|
|
67
|
-
if (profile.testCommand) {
|
|
68
|
-
sections.push(`Test: \`${profile.testCommand}\``);
|
|
69
|
-
}
|
|
70
|
-
else {
|
|
71
|
-
sections.push(`Test: \`${pm} test\``);
|
|
72
|
-
}
|
|
73
|
-
if (profile.lintCommand) {
|
|
74
|
-
sections.push(`Lint: \`${profile.lintCommand}\``);
|
|
75
|
-
}
|
|
76
|
-
sections.push('');
|
|
77
|
-
sections.push('Run tests before committing. Run the build to catch type errors.');
|
|
78
|
-
sections.push('');
|
|
79
|
-
// --- Project Structure ---
|
|
80
|
-
sections.push('## Project Structure');
|
|
81
|
-
sections.push('');
|
|
82
|
-
if (profile.monorepo) {
|
|
83
|
-
sections.push('This is a monorepo. Each package has its own CLAUDE.md that layers on top of this root file.');
|
|
84
|
-
}
|
|
85
|
-
if (profile.srcDir) {
|
|
86
|
-
sections.push(`Source code: \`${profile.srcDir}/\``);
|
|
87
|
-
}
|
|
88
|
-
if (profile.testDir) {
|
|
89
|
-
sections.push(`Tests: \`${profile.testDir}/\``);
|
|
90
|
-
}
|
|
91
|
-
if (profile.architecture) {
|
|
92
|
-
sections.push('');
|
|
93
|
-
sections.push(profile.architecture);
|
|
94
|
-
}
|
|
95
|
-
sections.push('');
|
|
96
|
-
// --- Coding Standards ---
|
|
97
|
-
if (profile.conventions && profile.conventions.length > 0) {
|
|
98
|
-
sections.push('## Coding Standards');
|
|
99
|
-
sections.push('');
|
|
100
|
-
for (const c of profile.conventions) {
|
|
101
|
-
sections.push(`- ${c}`);
|
|
102
|
-
}
|
|
103
|
-
sections.push('');
|
|
104
|
-
}
|
|
105
|
-
// --- Domain Rules ---
|
|
106
|
-
if (profile.domainRules && profile.domainRules.length > 0) {
|
|
107
|
-
sections.push('## Domain Rules');
|
|
108
|
-
sections.push('');
|
|
109
|
-
for (const rule of profile.domainRules) {
|
|
110
|
-
sections.push(`- ${rule}`);
|
|
111
|
-
}
|
|
112
|
-
sections.push('');
|
|
113
|
-
}
|
|
114
|
-
// --- Framework-specific shards ---
|
|
115
|
-
if (profile.frameworks && profile.frameworks.length > 0) {
|
|
116
|
-
for (const fw of profile.frameworks) {
|
|
117
|
-
const fwRules = getFrameworkRules(fw);
|
|
118
|
-
if (fwRules.length > 0) {
|
|
119
|
-
sections.push(`## ${fw} Conventions`);
|
|
120
|
-
sections.push('');
|
|
121
|
-
for (const rule of fwRules) {
|
|
122
|
-
sections.push(`- ${rule}`);
|
|
123
|
-
}
|
|
124
|
-
sections.push('');
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
// --- Security ---
|
|
129
|
-
sections.push('## Security');
|
|
130
|
-
sections.push('');
|
|
131
|
-
sections.push('- Never commit secrets, API keys, or credentials to git');
|
|
132
|
-
sections.push('- Never run destructive commands (`rm -rf /`, `DROP TABLE`, `git push --force`) without explicit confirmation');
|
|
133
|
-
sections.push('- Validate all external input at system boundaries');
|
|
134
|
-
sections.push('- Use parameterized queries for database operations');
|
|
135
|
-
sections.push('');
|
|
136
|
-
// --- Guidance Control Plane integration ---
|
|
137
|
-
if (profile.guidanceControlPlane) {
|
|
138
|
-
sections.push('## Guidance Control Plane');
|
|
139
|
-
sections.push('');
|
|
140
|
-
sections.push('This project uses `@claude-flow/guidance` to enforce these rules programmatically.');
|
|
141
|
-
sections.push('The constitution (this section and above) is always loaded. Sections below are');
|
|
142
|
-
sections.push('retrieved by intent classification — only relevant rules are injected per task.');
|
|
143
|
-
sections.push('');
|
|
144
|
-
sections.push('Gates enforce: destructive ops, secrets detection, diff size limits, tool allowlist.');
|
|
145
|
-
sections.push('The optimizer watches violations and promotes winning CLAUDE.local.md experiments here.');
|
|
146
|
-
sections.push('');
|
|
147
|
-
if (profile.wasmKernel) {
|
|
148
|
-
sections.push('WASM kernel: hot-path operations (hashing, secret scanning) use the Rust WASM kernel');
|
|
149
|
-
sections.push('for 1.25-1.96x speedup. Falls back to JS automatically if WASM is unavailable.');
|
|
150
|
-
sections.push('');
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
// --- Swarm configuration ---
|
|
154
|
-
if (profile.swarm) {
|
|
155
|
-
sections.push('## Swarm Configuration');
|
|
156
|
-
sections.push('');
|
|
157
|
-
sections.push(`Topology: ${profile.swarm.topology || 'hierarchical'}`);
|
|
158
|
-
sections.push(`Max agents: ${profile.swarm.maxAgents || 8}`);
|
|
159
|
-
sections.push(`Strategy: ${profile.swarm.strategy || 'specialized'}`);
|
|
160
|
-
sections.push('');
|
|
161
|
-
}
|
|
162
|
-
// --- Imports ---
|
|
163
|
-
if (profile.imports && profile.imports.length > 0) {
|
|
164
|
-
sections.push('## Individual Preferences');
|
|
165
|
-
sections.push('');
|
|
166
|
-
for (const imp of profile.imports) {
|
|
167
|
-
sections.push(`@${imp}`);
|
|
168
|
-
}
|
|
169
|
-
sections.push('');
|
|
170
|
-
}
|
|
171
|
-
return sections.join('\n');
|
|
172
|
-
}
|
|
173
|
-
// ============================================================================
|
|
174
|
-
// CLAUDE.local.md Generator
|
|
175
|
-
// ============================================================================
|
|
176
|
-
export function generateClaudeLocalMd(local) {
|
|
177
|
-
const sections = [];
|
|
178
|
-
sections.push('# Local Development Notes');
|
|
179
|
-
sections.push('');
|
|
180
|
-
sections.push('> This file is auto-gitignored by Claude Code. It stays on this machine only.');
|
|
181
|
-
sections.push('');
|
|
182
|
-
if (local.developer) {
|
|
183
|
-
sections.push(`Developer: ${local.developer}`);
|
|
184
|
-
sections.push('');
|
|
185
|
-
}
|
|
186
|
-
// Local URLs
|
|
187
|
-
if (local.localUrls && Object.keys(local.localUrls).length > 0) {
|
|
188
|
-
sections.push('## Local URLs');
|
|
189
|
-
sections.push('');
|
|
190
|
-
for (const [name, url] of Object.entries(local.localUrls)) {
|
|
191
|
-
sections.push(`- ${name}: ${url}`);
|
|
192
|
-
}
|
|
193
|
-
sections.push('');
|
|
194
|
-
}
|
|
195
|
-
// Databases
|
|
196
|
-
if (local.databases && Object.keys(local.databases).length > 0) {
|
|
197
|
-
sections.push('## Local Databases');
|
|
198
|
-
sections.push('');
|
|
199
|
-
for (const [name, conn] of Object.entries(local.databases)) {
|
|
200
|
-
sections.push(`- ${name}: \`${conn}\``);
|
|
201
|
-
}
|
|
202
|
-
sections.push('');
|
|
203
|
-
}
|
|
204
|
-
// Environment
|
|
205
|
-
if (local.envVars && Object.keys(local.envVars).length > 0) {
|
|
206
|
-
sections.push('## Environment Variables');
|
|
207
|
-
sections.push('');
|
|
208
|
-
sections.push('```bash');
|
|
209
|
-
for (const [key, val] of Object.entries(local.envVars)) {
|
|
210
|
-
sections.push(`export ${key}="${val}"`);
|
|
211
|
-
}
|
|
212
|
-
sections.push('```');
|
|
213
|
-
sections.push('');
|
|
214
|
-
}
|
|
215
|
-
// Preferences
|
|
216
|
-
if (local.preferences && local.preferences.length > 0) {
|
|
217
|
-
sections.push('## Preferences');
|
|
218
|
-
sections.push('');
|
|
219
|
-
for (const p of local.preferences) {
|
|
220
|
-
sections.push(`- ${p}`);
|
|
221
|
-
}
|
|
222
|
-
sections.push('');
|
|
223
|
-
}
|
|
224
|
-
// Machine notes
|
|
225
|
-
if (local.machineNotes && local.machineNotes.length > 0) {
|
|
226
|
-
sections.push('## Machine Notes');
|
|
227
|
-
sections.push('');
|
|
228
|
-
if (local.os) {
|
|
229
|
-
sections.push(`OS: ${local.os}`);
|
|
230
|
-
}
|
|
231
|
-
if (local.editor) {
|
|
232
|
-
sections.push(`Editor: ${local.editor}`);
|
|
233
|
-
}
|
|
234
|
-
for (const note of local.machineNotes) {
|
|
235
|
-
sections.push(`- ${note}`);
|
|
236
|
-
}
|
|
237
|
-
sections.push('');
|
|
238
|
-
}
|
|
239
|
-
// Debug
|
|
240
|
-
if (local.debug && local.debug.length > 0) {
|
|
241
|
-
sections.push('## Debug Settings');
|
|
242
|
-
sections.push('');
|
|
243
|
-
for (const d of local.debug) {
|
|
244
|
-
sections.push(`- ${d}`);
|
|
245
|
-
}
|
|
246
|
-
sections.push('');
|
|
247
|
-
}
|
|
248
|
-
return sections.join('\n');
|
|
249
|
-
}
|
|
250
|
-
// ============================================================================
|
|
251
|
-
// Skills Generator
|
|
252
|
-
// ============================================================================
|
|
253
|
-
export function generateSkillMd(skill) {
|
|
254
|
-
const lines = [];
|
|
255
|
-
// YAML frontmatter
|
|
256
|
-
lines.push('---');
|
|
257
|
-
lines.push(`name: ${skill.name}`);
|
|
258
|
-
lines.push(`version: ${skill.version || '1.0.0'}`);
|
|
259
|
-
lines.push(`description: ${skill.description}`);
|
|
260
|
-
lines.push(`category: ${skill.category}`);
|
|
261
|
-
if (skill.tags && skill.tags.length > 0) {
|
|
262
|
-
lines.push(`tags: [${skill.tags.join(', ')}]`);
|
|
263
|
-
}
|
|
264
|
-
if (skill.requires && skill.requires.length > 0) {
|
|
265
|
-
lines.push('requires:');
|
|
266
|
-
for (const r of skill.requires) {
|
|
267
|
-
lines.push(` - ${r}`);
|
|
268
|
-
}
|
|
269
|
-
}
|
|
270
|
-
if (skill.capabilities && skill.capabilities.length > 0) {
|
|
271
|
-
lines.push('capabilities:');
|
|
272
|
-
for (const c of skill.capabilities) {
|
|
273
|
-
lines.push(` - ${c}`);
|
|
274
|
-
}
|
|
275
|
-
}
|
|
276
|
-
lines.push('---');
|
|
277
|
-
lines.push('');
|
|
278
|
-
// Skill title and instructions
|
|
279
|
-
lines.push(`# ${formatTitle(skill.name)} Skill`);
|
|
280
|
-
lines.push('');
|
|
281
|
-
lines.push(skill.instructions);
|
|
282
|
-
return lines.join('\n');
|
|
283
|
-
}
|
|
284
|
-
// ============================================================================
|
|
285
|
-
// Agent Definition Generator
|
|
286
|
-
// ============================================================================
|
|
287
|
-
export function generateAgentMd(agent) {
|
|
288
|
-
const lines = [];
|
|
289
|
-
// YAML frontmatter
|
|
290
|
-
lines.push('---');
|
|
291
|
-
lines.push(`name: ${agent.name}`);
|
|
292
|
-
lines.push(`type: ${agent.type}`);
|
|
293
|
-
if (agent.color) {
|
|
294
|
-
lines.push(`color: "${agent.color}"`);
|
|
295
|
-
}
|
|
296
|
-
lines.push(`description: ${agent.description}`);
|
|
297
|
-
if (agent.capabilities && agent.capabilities.length > 0) {
|
|
298
|
-
lines.push('capabilities:');
|
|
299
|
-
for (const c of agent.capabilities) {
|
|
300
|
-
lines.push(` - ${c}`);
|
|
301
|
-
}
|
|
302
|
-
}
|
|
303
|
-
if (agent.focus && agent.focus.length > 0) {
|
|
304
|
-
lines.push('focus:');
|
|
305
|
-
for (const f of agent.focus) {
|
|
306
|
-
lines.push(` - ${f}`);
|
|
307
|
-
}
|
|
308
|
-
}
|
|
309
|
-
lines.push(`temperature: ${agent.temperature ?? 0.2}`);
|
|
310
|
-
if (agent.priority) {
|
|
311
|
-
lines.push(`priority: ${agent.priority}`);
|
|
312
|
-
}
|
|
313
|
-
if (agent.preHook || agent.postHook) {
|
|
314
|
-
lines.push('hooks:');
|
|
315
|
-
if (agent.preHook) {
|
|
316
|
-
lines.push(' pre: |');
|
|
317
|
-
lines.push(` ${agent.preHook}`);
|
|
318
|
-
}
|
|
319
|
-
if (agent.postHook) {
|
|
320
|
-
lines.push(' post: |');
|
|
321
|
-
lines.push(` ${agent.postHook}`);
|
|
322
|
-
}
|
|
323
|
-
}
|
|
324
|
-
lines.push('---');
|
|
325
|
-
lines.push('');
|
|
326
|
-
// Agent title
|
|
327
|
-
lines.push(`# ${formatTitle(agent.name)} Agent`);
|
|
328
|
-
lines.push('');
|
|
329
|
-
lines.push(agent.description);
|
|
330
|
-
lines.push('');
|
|
331
|
-
// System prompt
|
|
332
|
-
if (agent.systemPrompt) {
|
|
333
|
-
lines.push('## System Prompt');
|
|
334
|
-
lines.push('');
|
|
335
|
-
lines.push(agent.systemPrompt);
|
|
336
|
-
lines.push('');
|
|
337
|
-
}
|
|
338
|
-
// Instructions
|
|
339
|
-
if (agent.instructions) {
|
|
340
|
-
lines.push('## Instructions');
|
|
341
|
-
lines.push('');
|
|
342
|
-
lines.push(agent.instructions);
|
|
343
|
-
lines.push('');
|
|
344
|
-
}
|
|
345
|
-
return lines.join('\n');
|
|
346
|
-
}
|
|
347
|
-
// ============================================================================
|
|
348
|
-
// Agent Index Generator
|
|
349
|
-
// ============================================================================
|
|
350
|
-
export function generateAgentIndex(agents) {
|
|
351
|
-
const lines = [];
|
|
352
|
-
lines.push('# Generated Agent Index');
|
|
353
|
-
lines.push('');
|
|
354
|
-
lines.push('agents:');
|
|
355
|
-
for (const a of agents) {
|
|
356
|
-
lines.push(` - ${a.name}`);
|
|
357
|
-
}
|
|
358
|
-
lines.push('');
|
|
359
|
-
// Group by type
|
|
360
|
-
const byType = new Map();
|
|
361
|
-
for (const a of agents) {
|
|
362
|
-
const list = byType.get(a.type) || [];
|
|
363
|
-
list.push(a.name);
|
|
364
|
-
byType.set(a.type, list);
|
|
365
|
-
}
|
|
366
|
-
lines.push('types:');
|
|
367
|
-
for (const [type, names] of byType) {
|
|
368
|
-
lines.push(` ${type}:`);
|
|
369
|
-
for (const n of names) {
|
|
370
|
-
lines.push(` - ${n}`);
|
|
371
|
-
}
|
|
372
|
-
}
|
|
373
|
-
return lines.join('\n');
|
|
374
|
-
}
|
|
375
|
-
export function scaffold(options) {
|
|
376
|
-
const files = new Map();
|
|
377
|
-
// CLAUDE.md
|
|
378
|
-
files.set('CLAUDE.md', generateClaudeMd(options.project));
|
|
379
|
-
// CLAUDE.local.md
|
|
380
|
-
if (options.local) {
|
|
381
|
-
files.set('CLAUDE.local.md', generateClaudeLocalMd(options.local));
|
|
382
|
-
}
|
|
383
|
-
// Default agents based on project
|
|
384
|
-
const agents = [...(options.agents || [])];
|
|
385
|
-
if (options.includeDefaultAgents) {
|
|
386
|
-
agents.push(...getDefaultAgents(options.project));
|
|
387
|
-
}
|
|
388
|
-
// Default skills based on project
|
|
389
|
-
const skills = [...(options.skills || [])];
|
|
390
|
-
if (options.includeDefaultSkills) {
|
|
391
|
-
skills.push(...getDefaultSkills(options.project));
|
|
392
|
-
}
|
|
393
|
-
// Generate agent files
|
|
394
|
-
for (const agent of agents) {
|
|
395
|
-
const category = agent.category || 'core';
|
|
396
|
-
const path = `.claude/agents/${category}/${agent.name}.md`;
|
|
397
|
-
files.set(path, generateAgentMd(agent));
|
|
398
|
-
}
|
|
399
|
-
// Generate agent index
|
|
400
|
-
if (agents.length > 0) {
|
|
401
|
-
files.set('.claude/agents/index.yaml', generateAgentIndex(agents));
|
|
402
|
-
}
|
|
403
|
-
// Generate skill files
|
|
404
|
-
for (const skill of skills) {
|
|
405
|
-
const path = `.claude/skills/${skill.name}/SKILL.md`;
|
|
406
|
-
files.set(path, generateSkillMd(skill));
|
|
407
|
-
}
|
|
408
|
-
return { files };
|
|
409
|
-
}
|
|
410
|
-
// ============================================================================
|
|
411
|
-
// Helpers
|
|
412
|
-
// ============================================================================
|
|
413
|
-
function formatTitle(kebab) {
|
|
414
|
-
return kebab
|
|
415
|
-
.split('-')
|
|
416
|
-
.map(w => w.charAt(0).toUpperCase() + w.slice(1))
|
|
417
|
-
.join(' ');
|
|
418
|
-
}
|
|
419
|
-
function getLanguageInvariants(lang) {
|
|
420
|
-
const lower = lang.toLowerCase();
|
|
421
|
-
const map = {
|
|
422
|
-
typescript: [
|
|
423
|
-
'No `any` types. Use `unknown` if the type is truly unknown.',
|
|
424
|
-
'Prefer `const` over `let`. Never use `var`.',
|
|
425
|
-
'All public functions and exported types require JSDoc.',
|
|
426
|
-
'Use strict TypeScript (`strict: true` in tsconfig).',
|
|
427
|
-
],
|
|
428
|
-
javascript: [
|
|
429
|
-
'Prefer `const` over `let`. Never use `var`.',
|
|
430
|
-
'Use strict mode (`"use strict"` or ES modules).',
|
|
431
|
-
],
|
|
432
|
-
python: [
|
|
433
|
-
'Follow PEP 8 style guide.',
|
|
434
|
-
'Use type hints for all function signatures.',
|
|
435
|
-
'Prefer f-strings over `.format()` or `%` formatting.',
|
|
436
|
-
],
|
|
437
|
-
rust: [
|
|
438
|
-
'Run `cargo clippy` before committing.',
|
|
439
|
-
'No `unwrap()` in production code. Use `?` or proper error handling.',
|
|
440
|
-
'All public items require doc comments (`///`).',
|
|
441
|
-
],
|
|
442
|
-
go: [
|
|
443
|
-
'Run `go vet` and `golangci-lint` before committing.',
|
|
444
|
-
'Always handle errors. Never use `_` for error returns.',
|
|
445
|
-
'Follow Effective Go conventions.',
|
|
446
|
-
],
|
|
447
|
-
java: [
|
|
448
|
-
'Follow Google Java Style Guide.',
|
|
449
|
-
'All public classes and methods require Javadoc.',
|
|
450
|
-
'Prefer immutable objects where possible.',
|
|
451
|
-
],
|
|
452
|
-
};
|
|
453
|
-
return map[lower] || [`Follow established ${lang} conventions.`];
|
|
454
|
-
}
|
|
455
|
-
function getFrameworkRules(framework) {
|
|
456
|
-
const lower = framework.toLowerCase();
|
|
457
|
-
const map = {
|
|
458
|
-
react: [
|
|
459
|
-
'Prefer functional components with hooks over class components.',
|
|
460
|
-
'Use `useMemo`/`useCallback` only when profiling shows a need.',
|
|
461
|
-
'Keep components small and focused. Extract custom hooks for shared logic.',
|
|
462
|
-
],
|
|
463
|
-
nextjs: [
|
|
464
|
-
'Use the App Router unless there is a specific reason for Pages Router.',
|
|
465
|
-
'Prefer Server Components by default. Add `"use client"` only when needed.',
|
|
466
|
-
'Use `next/image` for all images.',
|
|
467
|
-
],
|
|
468
|
-
express: [
|
|
469
|
-
'Use async error handling middleware.',
|
|
470
|
-
'Validate all request bodies with a schema validator (zod, joi, etc.).',
|
|
471
|
-
'Never expose stack traces in production error responses.',
|
|
472
|
-
],
|
|
473
|
-
fastify: [
|
|
474
|
-
'Use JSON Schema for request/response validation.',
|
|
475
|
-
'Register plugins in a consistent order.',
|
|
476
|
-
],
|
|
477
|
-
django: [
|
|
478
|
-
'Use class-based views for CRUD, function-based for custom logic.',
|
|
479
|
-
'Always use the ORM. Never write raw SQL unless performance-critical.',
|
|
480
|
-
'Run `manage.py check` before deploying.',
|
|
481
|
-
],
|
|
482
|
-
flask: [
|
|
483
|
-
'Use blueprints for modular organization.',
|
|
484
|
-
'Never use `app.run()` in production.',
|
|
485
|
-
],
|
|
486
|
-
prisma: [
|
|
487
|
-
'Run `prisma generate` after schema changes.',
|
|
488
|
-
'Never edit generated client code.',
|
|
489
|
-
'Use transactions for multi-table operations.',
|
|
490
|
-
],
|
|
491
|
-
vitest: [
|
|
492
|
-
'Use `describe` blocks to group related tests.',
|
|
493
|
-
'Prefer `expect().toBe()` for primitives, `expect().toEqual()` for objects.',
|
|
494
|
-
'Use `beforeEach` for shared setup, not `beforeAll` (test isolation).',
|
|
495
|
-
],
|
|
496
|
-
jest: [
|
|
497
|
-
'Use `describe` blocks to group related tests.',
|
|
498
|
-
'Prefer `expect().toBe()` for primitives, `expect().toEqual()` for objects.',
|
|
499
|
-
'Mock external dependencies, never internal implementation details.',
|
|
500
|
-
],
|
|
501
|
-
};
|
|
502
|
-
return map[lower] || [];
|
|
503
|
-
}
|
|
504
|
-
function getDefaultAgents(profile) {
|
|
505
|
-
const agents = [];
|
|
506
|
-
// Every project gets a coordinator and coder
|
|
507
|
-
agents.push({
|
|
508
|
-
name: 'coordinator',
|
|
509
|
-
type: 'coordinator',
|
|
510
|
-
description: `Coordinates multi-agent workflows for ${profile.name}`,
|
|
511
|
-
category: 'core',
|
|
512
|
-
color: '#4A90D9',
|
|
513
|
-
capabilities: ['task-decomposition', 'agent-routing', 'context-management', 'progress-tracking'],
|
|
514
|
-
temperature: 0.2,
|
|
515
|
-
priority: 'high',
|
|
516
|
-
instructions: [
|
|
517
|
-
'Break complex tasks into subtasks and assign to specialized agents.',
|
|
518
|
-
'Track progress across all active agents.',
|
|
519
|
-
'Resolve conflicts when agents produce contradictory outputs.',
|
|
520
|
-
'Ensure all subtasks align with the original goal.',
|
|
521
|
-
].join('\n'),
|
|
522
|
-
});
|
|
523
|
-
agents.push({
|
|
524
|
-
name: 'coder',
|
|
525
|
-
type: 'developer',
|
|
526
|
-
description: `Implementation specialist for ${profile.name}`,
|
|
527
|
-
category: 'core',
|
|
528
|
-
color: '#FF6B35',
|
|
529
|
-
capabilities: ['code-generation', 'refactoring', 'optimization', 'api-design', 'error-handling'],
|
|
530
|
-
focus: profile.languages,
|
|
531
|
-
temperature: 0.2,
|
|
532
|
-
priority: 'high',
|
|
533
|
-
instructions: [
|
|
534
|
-
`Write clean, idiomatic ${profile.languages.join('/')} code.`,
|
|
535
|
-
'Follow the coding standards defined in CLAUDE.md.',
|
|
536
|
-
'Prefer editing existing files over creating new ones.',
|
|
537
|
-
'Run tests after making changes.',
|
|
538
|
-
].join('\n'),
|
|
539
|
-
});
|
|
540
|
-
agents.push({
|
|
541
|
-
name: 'tester',
|
|
542
|
-
type: 'tester',
|
|
543
|
-
description: `Test specialist for ${profile.name}`,
|
|
544
|
-
category: 'core',
|
|
545
|
-
color: '#2ECC71',
|
|
546
|
-
capabilities: ['unit-testing', 'integration-testing', 'test-coverage', 'edge-cases'],
|
|
547
|
-
temperature: 0.2,
|
|
548
|
-
priority: 'high',
|
|
549
|
-
instructions: [
|
|
550
|
-
'Write tests that cover the happy path and meaningful edge cases.',
|
|
551
|
-
'Use descriptive test names that explain the expected behavior.',
|
|
552
|
-
'Keep tests isolated — no shared mutable state between tests.',
|
|
553
|
-
`Run: \`${profile.testCommand || (profile.packageManager || 'npm') + ' test'}\``,
|
|
554
|
-
].join('\n'),
|
|
555
|
-
});
|
|
556
|
-
agents.push({
|
|
557
|
-
name: 'reviewer',
|
|
558
|
-
type: 'reviewer',
|
|
559
|
-
description: `Code review specialist for ${profile.name}`,
|
|
560
|
-
category: 'core',
|
|
561
|
-
color: '#9B59B6',
|
|
562
|
-
capabilities: ['code-review', 'quality-analysis', 'security-review', 'performance-review'],
|
|
563
|
-
temperature: 0.3,
|
|
564
|
-
priority: 'medium',
|
|
565
|
-
instructions: [
|
|
566
|
-
'Review for correctness, readability, and maintainability.',
|
|
567
|
-
'Check for security issues: injection, XSS, hardcoded secrets.',
|
|
568
|
-
'Flag unnecessary complexity and suggest simpler alternatives.',
|
|
569
|
-
'Verify test coverage for changed code.',
|
|
570
|
-
].join('\n'),
|
|
571
|
-
});
|
|
572
|
-
// Security agent if guidance control plane is enabled
|
|
573
|
-
if (profile.guidanceControlPlane) {
|
|
574
|
-
agents.push({
|
|
575
|
-
name: 'security-auditor',
|
|
576
|
-
type: 'security-specialist',
|
|
577
|
-
description: 'Security analysis integrated with guidance control plane',
|
|
578
|
-
category: 'security',
|
|
579
|
-
color: '#E74C3C',
|
|
580
|
-
capabilities: ['threat-detection', 'secret-scanning', 'input-validation', 'dependency-audit'],
|
|
581
|
-
temperature: 0.1,
|
|
582
|
-
priority: 'high',
|
|
583
|
-
instructions: [
|
|
584
|
-
'Scan all code changes for secrets and credentials.',
|
|
585
|
-
'Check for OWASP Top 10 vulnerabilities.',
|
|
586
|
-
'Validate that enforcement gates are wired for all external inputs.',
|
|
587
|
-
'Report findings through the guidance proof chain for audit trail.',
|
|
588
|
-
].join('\n'),
|
|
589
|
-
});
|
|
590
|
-
}
|
|
591
|
-
return agents;
|
|
592
|
-
}
|
|
593
|
-
function getDefaultSkills(profile) {
|
|
594
|
-
const skills = [];
|
|
595
|
-
// Build & test skill
|
|
596
|
-
skills.push({
|
|
597
|
-
name: 'build-and-test',
|
|
598
|
-
description: `Build and test ${profile.name}`,
|
|
599
|
-
category: 'core',
|
|
600
|
-
tags: ['build', 'test', 'ci'],
|
|
601
|
-
capabilities: ['Run build', 'Run tests', 'Fix build errors', 'Fix test failures'],
|
|
602
|
-
instructions: [
|
|
603
|
-
`## Build`,
|
|
604
|
-
'',
|
|
605
|
-
'```bash',
|
|
606
|
-
profile.buildCommand || `${profile.packageManager || 'npm'} run build`,
|
|
607
|
-
'```',
|
|
608
|
-
'',
|
|
609
|
-
'## Test',
|
|
610
|
-
'',
|
|
611
|
-
'```bash',
|
|
612
|
-
profile.testCommand || `${profile.packageManager || 'npm'} test`,
|
|
613
|
-
'```',
|
|
614
|
-
'',
|
|
615
|
-
'## Workflow',
|
|
616
|
-
'',
|
|
617
|
-
'1. Run the build first to catch type errors',
|
|
618
|
-
'2. Run tests to verify correctness',
|
|
619
|
-
'3. If either fails, fix the issue and re-run',
|
|
620
|
-
'4. Never commit with failing tests or build errors',
|
|
621
|
-
].join('\n'),
|
|
622
|
-
});
|
|
623
|
-
// Code review skill
|
|
624
|
-
skills.push({
|
|
625
|
-
name: 'code-review',
|
|
626
|
-
description: 'Review code for quality, security, and correctness',
|
|
627
|
-
category: 'core',
|
|
628
|
-
tags: ['review', 'quality', 'security'],
|
|
629
|
-
capabilities: ['Security scanning', 'Quality analysis', 'Performance review', 'Style checking'],
|
|
630
|
-
instructions: [
|
|
631
|
-
'## Review Checklist',
|
|
632
|
-
'',
|
|
633
|
-
'1. **Correctness**: Does the code do what it claims?',
|
|
634
|
-
'2. **Security**: Any secrets, injection vectors, or unsafe patterns?',
|
|
635
|
-
'3. **Tests**: Are changes covered by tests?',
|
|
636
|
-
'4. **Readability**: Can another developer understand this without context?',
|
|
637
|
-
'5. **Performance**: Any obvious O(n^2) loops or unnecessary allocations?',
|
|
638
|
-
'6. **Style**: Does it follow the project coding standards?',
|
|
639
|
-
].join('\n'),
|
|
640
|
-
});
|
|
641
|
-
// Guidance control plane skill
|
|
642
|
-
if (profile.guidanceControlPlane) {
|
|
643
|
-
skills.push({
|
|
644
|
-
name: 'guidance-enforcement',
|
|
645
|
-
description: 'Enforce guidance rules through the control plane',
|
|
646
|
-
category: 'security',
|
|
647
|
-
tags: ['guidance', 'enforcement', 'gates', 'policy'],
|
|
648
|
-
requires: ['@claude-flow/guidance'],
|
|
649
|
-
capabilities: [
|
|
650
|
-
'Gate enforcement for commands, edits, and tool calls',
|
|
651
|
-
'Proof chain generation for audit trails',
|
|
652
|
-
'Memory write authorization',
|
|
653
|
-
'Trust score tracking',
|
|
654
|
-
],
|
|
655
|
-
instructions: [
|
|
656
|
-
'## Guidance Control Plane',
|
|
657
|
-
'',
|
|
658
|
-
'This project uses `@claude-flow/guidance` to enforce CLAUDE.md rules programmatically.',
|
|
659
|
-
'',
|
|
660
|
-
'### Before executing commands:',
|
|
661
|
-
'```typescript',
|
|
662
|
-
"const results = plane.evaluateCommand('rm -rf /tmp/build');",
|
|
663
|
-
"if (results.some(r => r.decision === 'deny')) { /* blocked */ }",
|
|
664
|
-
'```',
|
|
665
|
-
'',
|
|
666
|
-
'### Before editing files:',
|
|
667
|
-
'```typescript',
|
|
668
|
-
"const results = plane.evaluateEdit('config.ts', content, lineCount);",
|
|
669
|
-
'```',
|
|
670
|
-
'',
|
|
671
|
-
'### Track every run:',
|
|
672
|
-
'```typescript',
|
|
673
|
-
"const event = plane.startRun('task-id', 'feature');",
|
|
674
|
-
'// ... work ...',
|
|
675
|
-
'await plane.finalizeRun(event);',
|
|
676
|
-
'```',
|
|
677
|
-
].join('\n'),
|
|
678
|
-
});
|
|
679
|
-
}
|
|
680
|
-
return skills;
|
|
681
|
-
}
|
|
682
|
-
//# sourceMappingURL=generators.js.map
|