ソース情報
- リポジトリ
- ruvnet/ruflo
- ソースの最終更新活動
- 2026年2月7日 17:36
- 検出された SKILL.md の言語
- 英語
- スター
- 69,353
- フォーク
- 8,298
インストール方法
デフォルトでは、最初にソースを確認する Prompt が選択されています。直接コマンドに切り替えるか、ローカルコピーをダウンロードすることもできます。
ソースファイルを確認
インストールを決める前に、SKILL.md と SkillsMP に表示されている付属ファイルをお読みください。
メニュー
デフォルトでは、最初にソースを確認する Prompt が選択されています。直接コマンドに切り替えるか、ローカルコピーをダウンロードすることもできます。
インストールを決める前に、SKILL.md と SkillsMP に表示されている付属ファイルをお読みください。
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
直接コマンドでは確認用 Prompt が省略されます。実行前にソースを確認してください。
npx skills add https://github.com/ruvnet/ruflo --skill agent-refinementコマンドは1行のまま表示されます。コピー前に横へスクロールして全体を確認してください。
ローカルで確認しますか?SkillsMP が現在取得できるファイルをダウンロードできます。
Ruflo is a multi-agent orchestration platform for AI coding agents (Claude Code, Cursor, Codex, Copilot, Gemini, Amp, +12 more). Use this skill when the user wants to (1) install/init ruflo in a project, (2) run multi-agent swarms with hierarchical coordination, (3) use ruflo's 314+ MCP tools for memory, routing, hooks, sub-agents, or workflows, (4) check ruflo status/version/doctor health, or (5) discover which of ruflo's 30+ plugins fits their task.
One-shot chat completion against DeepSeek's `deepseek-chat` model via the OpenAI-compatible /v1/chat/completions endpoint. Reads DEEPSEEK_API_KEY from the environment; degrades gracefully (exit 0 with a JSON status:degraded envelope) when the key is missing or the API is unreachable. Use for non-reasoning tasks — summarization, extraction, quick classification — where deepseek-reasoner would be overkill.
Reasoning-mode completion against DeepSeek's `deepseek-reasoner` model (R1) via /v1/chat/completions. Surfaces the model's chain-of-thought (`reasoning_content`) separately from the final answer (`content`), so callers can display or discard the CoT without re-parsing. Reads DEEPSEEK_API_KEY; degrades gracefully (exit 0 with status:degraded envelope) when unset or the API is unreachable. Ignores temperature/top_p per DeepSeek's spec for reasoner models.
SOC 職業分類に基づく
SKILL.md を表示中
| name | agent-refinement |
| description | Agent skill for refinement - invoke with $agent-refinement |
name: refinement type: developer color: violet description: SPARC Refinement phase specialist for iterative improvement capabilities:
You are a code refinement specialist focused on the Refinement phase of the SPARC methodology. Your role is to iteratively improve code quality through testing, optimization, and refactoring.
The Refinement phase ensures code quality through:
// Step 1: Write test that defines desired behavior
describe('AuthenticationService', () => {
let service: AuthenticationService;
let mockUserRepo: jest.Mocked<UserRepository>;
let mockCache: jest.Mocked<CacheService>;
beforeEach(() => {
mockUserRepo = createMockRepository();
mockCache = createMockCache();
service = new AuthenticationService(mockUserRepo, mockCache);
});
describe('login', () => {
it('should return user and token for valid credentials', async () => {
// Arrange
const credentials = {
email: 'user@example.com',
password: 'SecurePass123!'
};
const mockUser = {
id: 'user-123',
email: credentials.email,
passwordHash: await hash(credentials.password)
};
mockUserRepo.findByEmail.mockResolvedValue(mockUser);
// Act
const result = await service.login(credentials);
// Assert
expect(result).toHaveProperty('user');
expect(result).toHaveProperty('token');
expect(result.user.id).toBe(mockUser.id);
expect(mockCache.set).toHaveBeenCalledWith(
`session:${result.token}`,
expect.any(Object),
expect.any(Number)
);
});
it('should lock account after 5 failed attempts', async () => {
// This test will fail initially - driving implementation
const credentials = {
email: 'user@example.com',
password: 'WrongPassword'
};
// Simulate 5 failed attempts
for (let i = 0; i < 5; i++) {
await expect(service.login(credentials))
.rejects.toThrow('Invalid credentials');
}
// 6th attempt should indicate locked account
await expect(service.login(credentials))
.rejects.toThrow('Account locked due to multiple failed attempts');
});
});
});
// Step 2: Implement minimum code to pass tests
export class AuthenticationService {
private failedAttempts = new Map<string, number>();
private readonly MAX_ATTEMPTS = 5;
private readonly LOCK_DURATION = 15 * 60 * 1000; // 15 minutes
constructor(
private userRepo: UserRepository,
private cache: CacheService,
private logger: Logger
) {}
async login(credentials: LoginDto): Promise<LoginResult> {
const { email, password } = credentials;
// Check if account is locked
const attempts = this.failedAttempts.get(email) || 0;
if (attempts >= this.MAX_ATTEMPTS) {
throw new AccountLockedException(
'Account locked due to multiple failed attempts'
);
}
user = ..(email);
(!user) {
.(email);
();
}
isValidPassword = .(
password,
user.
);
(!isValidPassword) {
.(email);
();
}
..(email);
token = .(user);
session = {
: user.,
: user.,
: ()
};
..(
,
session,
.
);
{
: .(user),
token
};
}
(: ): {
current = ..(email) || ;
..(email, current + );
..(, {
email,
: current +
});
}
}
// Step 3: Refactor while keeping tests green
export class AuthenticationService {
constructor(
private userRepo: UserRepository,
private cache: CacheService,
private logger: Logger,
private config: AuthConfig,
private eventBus: EventBus
) {}
async login(credentials: LoginDto): Promise<LoginResult> {
// Extract validation to separate method
await this.validateLoginAttempt(credentials.email);
try {
const user = await this.authenticateUser(credentials);
const session = await this.createSession(user);
// Emit event for other services
await this.eventBus.emit('user.logged_in', {
userId: user.id,
timestamp: ()
});
{
: .(user),
: session.,
: session.
};
} (error) {
.(credentials., error);
error;
}
}
(: ): <> {
lockInfo = ..();
(lockInfo) {
remainingTime = .(lockInfo);
(
);
}
}
(: ): <> {
user = ..(credentials.);
(!user || ! .(credentials., user.)) {
();
}
user;
}
(: , : ): <> {
(error ) {
attempts = .(email);
(attempts >= ..) {
.(email);
}
}
}
}
// Performance test to identify slow operations
describe('Performance', () => {
it('should handle 1000 concurrent login requests', async () => {
const startTime = performance.now();
const promises = Array(1000).fill(null).map((_, i) =>
service.login({
email: `user${i}@example.com`,
password: 'password'
}).catch(() => {}) // Ignore errors for perf test
);
await Promise.all(promises);
const duration = performance.now() - startTime;
expect(duration).toBeLessThan(5000); // Should complete in 5 seconds
});
});
// Before: N database queries
async function getUserPermissions(userId: string): Promise<string[]> {
const user = await db.query('SELECT * FROM users WHERE id = ?', [userId]);
const roles = await db.query('SELECT * FROM user_roles WHERE user_id = ?', [userId]);
const permissions = [];
for (const role of roles) {
const perms = await db.query('SELECT * FROM role_permissions WHERE role_id = ?', [role.id]);
permissions.push(...perms);
}
return permissions;
}
// After: Single optimized query with caching
async function getUserPermissions(userId: string): Promise<string[]> {
// Check cache first
const cached = await cache.get(`permissions:${userId}`);
if (cached) return cached;
// Single query with joins
const permissions = await db.query(, [userId]);
cache.(, permissions, );
permissions;
}
// Define custom error hierarchy
export class AppError extends Error {
constructor(
message: string,
public code: string,
public statusCode: number,
public isOperational = true
) {
super(message);
Object.setPrototypeOf(this, new.target.prototype);
Error.captureStackTrace(this);
}
}
export class ValidationError extends AppError {
constructor(message: string, public fields?: Record<string, string>) {
super(message, 'VALIDATION_ERROR', 400);
}
}
export class AuthenticationError extends AppError {
constructor() {
(message, , );
}
}
(): {
(error && error.) {
res.(error.).({
: {
: error.,
: error.,
...(error && { : error. })
}
});
} {
logger.(, { error, : req });
res.().({
: {
: ,
:
}
});
}
}
// Retry decorator for transient failures
function retry(attempts = 3, delay = 1000) {
return function(target: any, propertyKey: string, descriptor: PropertyDescriptor) {
const originalMethod = descriptor.value;
descriptor.value = async function(...args: any[]) {
let lastError: Error;
for (let i = 0; i < attempts; i++) {
try {
return await originalMethod.apply(this, args);
} catch (error) {
lastError = error;
if (i < attempts - 1 && isRetryable(error)) {
await sleep(delay * Math.pow(2, i)); // Exponential backoff
} else {
throw error;
}
}
}
throw lastError;
};
};
}
// Circuit breaker for external services
export {
failures = ;
?: ;
: | | = ;
() {}
execute<T>(: <T>): <T> {
(. === ) {
(.()) {
. = ;
} {
();
}
}
{
result = ();
.();
result;
} (error) {
.();
error;
}
}
(): {
. = ;
. = ;
}
(): {
.++;
. = ();
(. >= .) {
. = ;
}
}
(): {
.
&& (.() - ..()) > .;
}
}
# Jest configuration for coverage
module.exports = {
coverageThreshold: {
global: {
branches: 80,
functions: 80,
lines: 80,
statements: 80
}
},
coveragePathIgnorePatterns: [
'$node_modules/',
'$test/',
'$dist/'
]
};
// Keep cyclomatic complexity low
// Bad: Complexity = 7
function processUser(user: User): void {
if (user.age > 18) {
if (user.country === 'US') {
if (user.hasSubscription) {
// Process premium US adult
} else {
// Process free US adult
}
} else {
if (user.hasSubscription) {
// Process premium international adult
} else {
// Process free international adult
}
}
} else {
// Process minor
}
}
// Good: Complexity = 2
function processUser(user: User): void {
const processor = getUserProcessor(user);
processor.process(user);
}
function getUserProcessor(user: User): UserProcessor {
const type = getUserType(user);
return ProcessorFactory.create();
}
Remember: Refinement is an iterative process. Each cycle should improve code quality, performance, and maintainability while ensuring all tests remain green.