원클릭으로
init
Explore a newly-loaded workspace, map its structure, and write project notes to memory
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
메뉴
Explore a newly-loaded workspace, map its structure, and write project notes to memory
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
SOC 직업 분류 기준
Evaluate workflow run quality by analyzing artifacts and scratch outputs, identify gaps and root causes, and write a structured assessment with actionable recommendations.
Write an Architecture Decision Record (ADR) for a technical decision
Diagnose a bug, identify root cause, implement a targeted fix, and verify it
Analyze requirements and produce a detailed implementation plan before writing code
Create a GitHub branch, commit changes to it, and open a pull request
Restructure code without changing external behavior — extract, rename, split, move
| name | init |
| description | Explore a newly-loaded workspace, map its structure, and write project notes to memory |
Use when a new repository has just been hydrated into the VFS. Explores the codebase, writes a structured summary to /memory/project-notes.md, and recommends which Aaron skills apply.
context.emit({ type: 'progress', message: 'Mapping workspace...' });
const allFiles = context.vfs.list();
const srcFiles = allFiles.filter(p => p.startsWith('/src/'));
const testFiles = allFiles.filter(p =>
p.includes('/test') || p.includes('/spec') || p.includes('.test.') || p.includes('.spec.')
);
const docFiles = allFiles.filter(p =>
p.endsWith('.md') || p.endsWith('.txt') || p.includes('/docs/')
);
context.emit({ type: 'progress', message:
`Found: ${srcFiles.length} src, ${testFiles.length} test, ${docFiles.length} doc files` });
// Priority order for understanding a codebase
const entryPointCandidates = [
'/src/README.md', '/src/CLAUDE.md',
'/src/package.json', '/src/index.js', '/src/main.js',
'/src/app.js', '/src/server.js', '/src/cli.js',
];
const found = {};
for (const p of entryPointCandidates) {
const content = context.vfs.read(p);
if (content) {
found[p] = content.slice(0, 500); // first 500 chars
context.emit({ type: 'file_read', path: p });
}
}
const pkg = (() => {
try { return JSON.parse(context.vfs.read('/src/package.json') ?? '{}'); } catch { return {}; }
})();
const isNode = !!pkg.main || !!pkg.bin || srcFiles.some(p => p.includes('server'));
const isBrowser = srcFiles.some(p => p.endsWith('.html') || p.includes('public/'));
const hasTests = testFiles.length > 0;
const hasDocs = docFiles.some(p => p.endsWith('.md'));
const hasADR = allFiles.some(p => p.includes('/adr/') || p.includes('ADR'));
const projectType = isNode && isBrowser ? 'fullstack' :
isNode ? 'node' :
isBrowser ? 'browser' : 'unknown';
// Find the most-imported files (likely core utilities or interfaces)
const importCounts = {};
for (const p of srcFiles) {
const content = context.vfs.read(p);
if (!content) continue;
const imports = content.matchAll(/from ['"]([^'"]+)['"]/g);
for (const [, dep] of imports) {
if (dep.startsWith('.')) {
importCounts[dep] = (importCounts[dep] ?? 0) + 1;
}
}
}
const coreModules = Object.entries(importCounts)
.sort((a, b) => b[1] - a[1])
.slice(0, 5)
.map(([path, count]) => `${path} (imported ${count}x)`);
const lines = [
'# Project Notes',
`Generated: ${new Date().toISOString().split('T')[0]}`,
'',
'## Overview',
`- **Type:** ${projectType}`,
`- **Name:** ${pkg.name ?? 'unknown'}`,
`- **Version:** ${pkg.version ?? 'unknown'}`,
`- **Description:** ${pkg.description ?? 'none'}`,
'',
'## File counts',
`- Source files: ${srcFiles.length}`,
`- Test files: ${testFiles.length}`,
`- Documentation: ${docFiles.length}`,
'',
'## Key entry points',
...Object.keys(found).map(p => `- ${p}`),
'',
'## Most-imported modules',
...coreModules.map(m => `- ${m}`),
'',
'## Gaps identified',
...(!hasTests ? ['- ⚠ No test files found'] : []),
...(!hasDocs ? ['- ⚠ No documentation files'] : []),
...(!hasADR ? ['- ⚠ No ADRs — architectural decisions undocumented'] : []),
'',
'## Suggested Aaron skills',
...(!hasTests ? ['- `testing` — write test suite for existing code'] : []),
...(!hasDocs ? ['- `documentation` — generate README and API docs'] : []),
...(!hasADR ? ['- `adr-writer` — document key architectural decisions'] : []),
'- `code-review` — review existing code for issues',
'- `code-planner` — plan next feature',
];
context.vfs.write('/memory/project-notes.md', lines.join('\n'));
context.emit({ type: 'file_write', path: '/memory/project-notes.md' });
context.emit({ type: 'result', value: {
project_type: projectType,
src_files: srcFiles.length,
test_files: testFiles.length,
gaps: { tests: !hasTests, docs: !hasDocs, adr: !hasADR },
}});
context.emit({ type: 'done', message:
`Workspace mapped: ${srcFiles.length} src files, ${testFiles.length} tests. ` +
`Notes written to /memory/project-notes.md` });
/memory/project-notes.md already exists and is recent, skip and emit done immediatelycode-planner reads gaps, adr-writer reads existing ADRs)