@ps-neko/nekowork 0.1.0-alpha.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/AGENTS.md +112 -0
- package/CLAUDE.md +81 -0
- package/LICENSE +21 -0
- package/README.md +283 -0
- package/REVIEW.md +96 -0
- package/RULES.md +51 -0
- package/SOUL.md +21 -0
- package/WORKING-CONTEXT.md +52 -0
- package/agent.yaml +219 -0
- package/agents/architect.md +57 -0
- package/agents/code-reviewer.md +60 -0
- package/agents/codex-challenger.md +53 -0
- package/agents/codex-reviewer.md +56 -0
- package/agents/debugger.md +33 -0
- package/agents/doc-writer.md +51 -0
- package/agents/executor.md +41 -0
- package/agents/planner.md +49 -0
- package/agents/research.md +50 -0
- package/agents/security-reviewer.md +47 -0
- package/agents/test-engineer.md +41 -0
- package/bridge/mcp-server.js +301 -0
- package/commands/claude-led-codex-review.md +29 -0
- package/docs/ADVANCED.md +321 -0
- package/docs/AI-DEVELOPMENT-LIFECYCLE.md +105 -0
- package/docs/ARCHITECTURE.md +205 -0
- package/docs/AUDIT.md +114 -0
- package/docs/AUTH-MIGRATION.md +282 -0
- package/docs/CHANGELOG.md +97 -0
- package/docs/CLI-STAGES.md +89 -0
- package/docs/CODEMAPS/README.md +15 -0
- package/docs/CODEMAPS/agents.md +22 -0
- package/docs/CODEMAPS/bridge.md +18 -0
- package/docs/CODEMAPS/hooks.md +28 -0
- package/docs/CODEMAPS/manifests.md +14 -0
- package/docs/CODEMAPS/rules.md +22 -0
- package/docs/CODEMAPS/schemas.md +21 -0
- package/docs/CODEMAPS/scripts.md +158 -0
- package/docs/CODEMAPS/skills.md +29 -0
- package/docs/CODEMAPS/tests.md +98 -0
- package/docs/CORE-INVARIANTS.md +38 -0
- package/docs/DEMO.md +110 -0
- package/docs/EXAMPLE-PROJECT.md +92 -0
- package/docs/PORTING.md +154 -0
- package/docs/PRODUCT-PRINCIPLES.md +303 -0
- package/docs/PUBLISH-ALPHA.md +106 -0
- package/docs/QUICKSTART.md +344 -0
- package/docs/RELEASE-READINESS.md +140 -0
- package/docs/RISK-CLASSIFIER.md +50 -0
- package/docs/RUNBOOK.md +146 -0
- package/docs/SECURITY.md +79 -0
- package/docs/SETUP.md +142 -0
- package/docs/WHY-NEKOWORK.md +64 -0
- package/docs/case-studies/README.md +16 -0
- package/docs/case-studies/SINDRESORHUS-IS-PLAIN-OBJ.md +141 -0
- package/docs/dev-log/2026-04-29-p1-recovery.md +142 -0
- package/docs/dev-log/2026-04-29-week1-4.md +81 -0
- package/docs/examples/GITHUB-ACTIONS-HARDENING.md +86 -0
- package/docs/examples/QUALITY-LIFECYCLE-SMOKE.md +32 -0
- package/docs/examples/TRADING-DASHBOARD-MOCK.md +65 -0
- package/docs/workflows-stash/README.md +32 -0
- package/docs/workflows-stash/harness-review.yml +166 -0
- package/docs/workflows-stash/harness-validate.yml +48 -0
- package/examples/github-actions-hardening/.github/workflows/hardened-validate.yml +38 -0
- package/examples/github-actions-hardening/README.md +31 -0
- package/examples/github-actions-hardening/case-study/ASK.md +26 -0
- package/examples/github-actions-hardening/case-study/GATE_STATUS.md +28 -0
- package/examples/github-actions-hardening/case-study/PLAN.md +25 -0
- package/examples/github-actions-hardening/case-study/SHIP_READY.md +21 -0
- package/examples/github-actions-hardening/case-study/TASK.md +30 -0
- package/examples/github-actions-hardening/case-study/TEAM_HANDOFFS.md +37 -0
- package/examples/github-actions-hardening/case-study/VERIFY_SUMMARY.md +35 -0
- package/examples/github-actions-hardening/case-study/WORK_SUMMARY.md +24 -0
- package/examples/github-actions-hardening/package.json +12 -0
- package/examples/github-actions-hardening/scripts/check.mjs +43 -0
- package/examples/quality-lifecycle-smoke/README.md +30 -0
- package/examples/quality-lifecycle-smoke/case-study/ASK.md +24 -0
- package/examples/quality-lifecycle-smoke/case-study/GATE_STATUS.md +10 -0
- package/examples/quality-lifecycle-smoke/case-study/PLAN.md +19 -0
- package/examples/quality-lifecycle-smoke/case-study/SHIP_READY.md +11 -0
- package/examples/quality-lifecycle-smoke/case-study/TASK.md +19 -0
- package/examples/quality-lifecycle-smoke/case-study/TEAM_HANDOFFS.md +21 -0
- package/examples/quality-lifecycle-smoke/case-study/VERIFY_SUMMARY.md +44 -0
- package/examples/quality-lifecycle-smoke/case-study/WORK_SUMMARY.md +19 -0
- package/examples/quality-lifecycle-smoke/package.json +8 -0
- package/examples/quality-lifecycle-smoke/scripts/check.mjs +44 -0
- package/examples/trading-dashboard-mock/README.md +33 -0
- package/examples/trading-dashboard-mock/case-study/ASK.md +24 -0
- package/examples/trading-dashboard-mock/case-study/GATE_STATUS.md +28 -0
- package/examples/trading-dashboard-mock/case-study/PLAN.md +23 -0
- package/examples/trading-dashboard-mock/case-study/SHIP_READY.md +21 -0
- package/examples/trading-dashboard-mock/case-study/TASK.md +29 -0
- package/examples/trading-dashboard-mock/case-study/TEAM_HANDOFFS.md +49 -0
- package/examples/trading-dashboard-mock/case-study/VERIFY_SUMMARY.md +35 -0
- package/examples/trading-dashboard-mock/case-study/WORK_SUMMARY.md +27 -0
- package/examples/trading-dashboard-mock/fixtures/market.json +9 -0
- package/examples/trading-dashboard-mock/index.html +76 -0
- package/examples/trading-dashboard-mock/package.json +9 -0
- package/examples/trading-dashboard-mock/scripts/check.mjs +54 -0
- package/examples/trading-dashboard-mock/src/app.js +83 -0
- package/examples/trading-dashboard-mock/src/styles.css +227 -0
- package/hooks/hooks.json +44 -0
- package/hooks/scripts/config-protection.js +34 -0
- package/hooks/scripts/gateguard-fact-force.js +146 -0
- package/hooks/scripts/persistent-mode.mjs +27 -0
- package/hooks/scripts/pre-bash-dispatcher.js +63 -0
- package/hooks/scripts/quality-gate.js +106 -0
- package/manifests/install-components.json +195 -0
- package/manifests/install-modules.json +101 -0
- package/manifests/install-profiles.json +134 -0
- package/package.json +96 -0
- package/rules/common/coding-style.md +71 -0
- package/rules/common/security.md +69 -0
- package/rules/common/testing.md +58 -0
- package/rules/python/coding-style.md +80 -0
- package/rules/python/testing.md +86 -0
- package/rules/typescript/coding-style.md +97 -0
- package/rules/typescript/security.md +67 -0
- package/rules/typescript/testing.md +78 -0
- package/schemas/agent-yaml.schema.json +168 -0
- package/schemas/agent.schema.json +32 -0
- package/schemas/handoff.schema.json +105 -0
- package/schemas/hooks.schema.json +35 -0
- package/schemas/install-components.schema.json +46 -0
- package/schemas/install-modules.schema.json +39 -0
- package/schemas/install-profiles.schema.json +32 -0
- package/schemas/install-state.schema.json +42 -0
- package/schemas/routing.schema.json +42 -0
- package/schemas/skill.schema.json +19 -0
- package/scripts/agents/dispatch.js +144 -0
- package/scripts/agents/runners/claude.js +214 -0
- package/scripts/agents/runners/codex.js +233 -0
- package/scripts/agents/runners/gemini.js +92 -0
- package/scripts/agents/runners/mock.js +107 -0
- package/scripts/auth/github-import-gh.js +52 -0
- package/scripts/auth/github-login.js +79 -0
- package/scripts/auth/github-logout.js +21 -0
- package/scripts/auth/github-status.js +46 -0
- package/scripts/build-claude.js +101 -0
- package/scripts/build-codemaps.js +286 -0
- package/scripts/build-codex.js +93 -0
- package/scripts/build-cursor.js +132 -0
- package/scripts/build-gemini.js +117 -0
- package/scripts/build-opencode.js +117 -0
- package/scripts/ci/catalog.js +120 -0
- package/scripts/ci/check-markers.js +48 -0
- package/scripts/ci/security-hardening.js +270 -0
- package/scripts/ci/validate-agents.js +88 -0
- package/scripts/ci/validate-hooks.js +99 -0
- package/scripts/ci/validate-manifests.js +128 -0
- package/scripts/ci/validate-skills.js +93 -0
- package/scripts/cli.js +1134 -0
- package/scripts/core/auth-guard.js +22 -0
- package/scripts/core/build-roots.js +11 -0
- package/scripts/core/cli-resolver.js +64 -0
- package/scripts/core/execution-workspace.js +84 -0
- package/scripts/core/git-mutation-guard.js +79 -0
- package/scripts/core/install-state.js +125 -0
- package/scripts/core/json-extractor.js +32 -0
- package/scripts/core/subprocess.js +74 -0
- package/scripts/daemon/wait.js +278 -0
- package/scripts/demo-external-project.js +222 -0
- package/scripts/demo-quick-run.js +193 -0
- package/scripts/demo-review.js +204 -0
- package/scripts/doctor.js +296 -0
- package/scripts/install-apply.js +185 -0
- package/scripts/install-plan.js +411 -0
- package/scripts/lib/acceptance-criteria.js +105 -0
- package/scripts/lib/costs.js +82 -0
- package/scripts/lib/instincts.js +194 -0
- package/scripts/lib/keychain.js +85 -0
- package/scripts/lib/profile-policy.js +134 -0
- package/scripts/lib/profile-safety.js +81 -0
- package/scripts/lib/risk-classifier.js +145 -0
- package/scripts/lib/router.js +138 -0
- package/scripts/lib/severity.js +99 -0
- package/scripts/lib/token-vault.js +136 -0
- package/scripts/orchestrators/apply.js +225 -0
- package/scripts/orchestrators/ask.js +143 -0
- package/scripts/orchestrators/gate.js +179 -0
- package/scripts/orchestrators/ralph.js +179 -0
- package/scripts/orchestrators/review.js +452 -0
- package/scripts/orchestrators/run.js +151 -0
- package/scripts/orchestrators/ship.js +339 -0
- package/scripts/orchestrators/team-lite.js +270 -0
- package/scripts/orchestrators/team.js +244 -0
- package/scripts/orchestrators/verify.js +306 -0
- package/scripts/orchestrators/work.js +207 -0
- package/scripts/portability/simulate-port.js +220 -0
- package/scripts/repair.js +184 -0
- package/scripts/sync-claude-md.js +220 -0
- package/scripts/verify/claude-live.js +30 -0
- package/scripts/verify/codex-live.js +60 -0
- package/scripts/verify/gemini-live.js +48 -0
- package/scripts/verify/runtime.js +105 -0
- package/skills/claude-led-codex-review/SKILL.md +133 -0
- package/skills/plan-eng-review/SKILL.md +51 -0
- package/skills/porting/SKILL.md +69 -0
- package/skills/ralph/SKILL.md +48 -0
- package/skills/release-readiness/SKILL.md +62 -0
- package/skills/review/SKILL.md +42 -0
- package/skills/security-hardening/SKILL.md +59 -0
- package/skills/ship/SKILL.md +44 -0
- package/skills/tdd-workflow/SKILL.md +42 -0
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// Stop persistent-mode.
|
|
3
|
+
// If .harness/state/sessions/<id>/active exists, drop wakeup.json for
|
|
4
|
+
// `harness wait start` to process.
|
|
5
|
+
|
|
6
|
+
import fs from 'node:fs';
|
|
7
|
+
import path from 'node:path';
|
|
8
|
+
|
|
9
|
+
if (process.env.HARNESS_HOOK_PERSISTENT_MODE === '0') process.exit(0);
|
|
10
|
+
|
|
11
|
+
const sessionId = process.env.HARNESS_SESSION_ID || 'default';
|
|
12
|
+
const sessionDir = path.join('.harness', 'state', 'sessions', sessionId);
|
|
13
|
+
const activeFlag = path.join(sessionDir, 'active');
|
|
14
|
+
|
|
15
|
+
if (!fs.existsSync(activeFlag)) process.exit(0);
|
|
16
|
+
|
|
17
|
+
const wakeup = path.join(sessionDir, 'wakeup.json');
|
|
18
|
+
const payload = {
|
|
19
|
+
session_id: sessionId,
|
|
20
|
+
scheduled_at: new Date().toISOString(),
|
|
21
|
+
reason: 'Stop hook detected active flag',
|
|
22
|
+
};
|
|
23
|
+
fs.writeFileSync(wakeup, JSON.stringify(payload, null, 2));
|
|
24
|
+
process.stderr.write(`[persistent-mode] wakeup signal: ${wakeup}\n`);
|
|
25
|
+
process.stderr.write('[persistent-mode] wait daemon can resume supported active sessions\n');
|
|
26
|
+
|
|
27
|
+
process.exit(0);
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// PreToolUse(Bash) 디스패처. ECC pre-bash-dispatcher.js 패턴.
|
|
3
|
+
// 단일 진입점 → 매처 분기 → 모듈. ENV 토글로 개별 on/off.
|
|
4
|
+
// stdin JSON 으로 Claude Code hook 입력을 받고, 위험 패턴 발견 시 차단 메시지 출력.
|
|
5
|
+
|
|
6
|
+
import fs from 'node:fs';
|
|
7
|
+
|
|
8
|
+
if (process.env.HARNESS_HOOK_PRE_BASH === '0') process.exit(0);
|
|
9
|
+
|
|
10
|
+
let input = '';
|
|
11
|
+
try {
|
|
12
|
+
input = fs.readFileSync(0, 'utf8');
|
|
13
|
+
} catch { /* TTY 호출도 허용 */ }
|
|
14
|
+
|
|
15
|
+
let payload;
|
|
16
|
+
try { payload = JSON.parse(input); } catch { payload = { tool_input: { command: '' } }; }
|
|
17
|
+
|
|
18
|
+
const cmd = String(payload?.tool_input?.command ?? '');
|
|
19
|
+
|
|
20
|
+
const RULES = [
|
|
21
|
+
{ re: /\bgit\s+push\s+(-f|--force)/i, msg: '금지: git push --force. 사용자 확인 필요.' },
|
|
22
|
+
{ re: /\bgit\s+reset\s+--hard\b/i, msg: '금지: git reset --hard 자동 실행. 사용자 확인 필요.' },
|
|
23
|
+
{ re: /\brm\s+-rf\b/, msg: '금지: rm -rf 자동 실행.' },
|
|
24
|
+
{ re: /--no-verify\b/, msg: '금지: --no-verify (hook 우회).' },
|
|
25
|
+
{ re: /\bicacls\b.*Everyone:F/i, msg: '금지: 전체 권한 부여.' },
|
|
26
|
+
{ re: /\b(curl|wget)\b.*\|\s*(bash|sh)\b/, msg: '금지: curl|bash 패턴 (공급망 위험).' },
|
|
27
|
+
{ re: /\b(npm|pip)\s+(install|publish)\b/i, msg: '확인 필요: 패키지 설치/배포 (사용자 룰).' },
|
|
28
|
+
{ re: /\bshutdown\b|\breboot\b|\bformat\b/i, msg: '금지: 시스템 명령.' },
|
|
29
|
+
];
|
|
30
|
+
|
|
31
|
+
const blocks = [];
|
|
32
|
+
for (const r of RULES) if (r.re.test(cmd)) blocks.push(r.msg);
|
|
33
|
+
|
|
34
|
+
// auth.policy.block_subscription_override 가드.
|
|
35
|
+
// agent.yaml: providers.<name>.disallow_env_keys 와 동기. 자세한 배경은 docs/AUTH-MIGRATION.md.
|
|
36
|
+
// LLM CLI 호출 직전 환경 변수에 long-lived API key 가 있으면 구독 OAuth 가 무시되어
|
|
37
|
+
// 종량제 과금으로 빠지는 사고를 막는다. HARNESS_AUTH_ALLOW_ENV_OVERRIDE=1 로 명시 옵트아웃.
|
|
38
|
+
const SUBSCRIPTION_GUARDS = [
|
|
39
|
+
{ cli: /\bclaude\b/, keys: ['ANTHROPIC_API_KEY'], provider: 'Claude (Anthropic)' },
|
|
40
|
+
{ cli: /\bcodex\b/, keys: ['OPENAI_API_KEY'], provider: 'Codex (OpenAI)' },
|
|
41
|
+
{ cli: /\bgemini\b|\bgcloud\b/, keys: ['GEMINI_API_KEY', 'GOOGLE_API_KEY'], provider: 'Gemini (Google)' },
|
|
42
|
+
];
|
|
43
|
+
|
|
44
|
+
if (process.env.HARNESS_AUTH_ALLOW_ENV_OVERRIDE !== '1') {
|
|
45
|
+
for (const g of SUBSCRIPTION_GUARDS) {
|
|
46
|
+
if (!g.cli.test(cmd)) continue;
|
|
47
|
+
const set = g.keys.filter((k) => process.env[k]);
|
|
48
|
+
if (!set.length) continue;
|
|
49
|
+
blocks.push(
|
|
50
|
+
`구독 보호: ${g.provider} CLI 호출 직전 ${set.join(', ')} 가 환경에 설정되어 있습니다. ` +
|
|
51
|
+
`구독 OAuth 세션이 무시되어 종량제 과금으로 빠질 수 있습니다. ` +
|
|
52
|
+
`\`unset ${set.join(' ')}\` 또는 HARNESS_AUTH_ALLOW_ENV_OVERRIDE=1 로 명시 옵트아웃.`
|
|
53
|
+
);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
if (blocks.length) {
|
|
58
|
+
process.stderr.write('[pre-bash-dispatcher] 차단:\n');
|
|
59
|
+
for (const b of blocks) process.stderr.write(' - ' + b + '\n');
|
|
60
|
+
process.exit(2);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
process.exit(0);
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// PostToolUse(Edit|Write) quality-gate.
|
|
3
|
+
// 변경 파일의 확장자에 따라 빠른 검증:
|
|
4
|
+
// - .ts/.tsx: tsc --noEmit (해당 파일 + transitive). 가능하면 isolated.
|
|
5
|
+
// - .js/.mjs/.cjs: node --check 구문만.
|
|
6
|
+
// - .py: ruff check (있으면) + py_compile 폴백.
|
|
7
|
+
// 실패 시 exit 2 → Claude Code 가 다음 도구 호출 차단.
|
|
8
|
+
|
|
9
|
+
import fs from 'node:fs';
|
|
10
|
+
import path from 'node:path';
|
|
11
|
+
import { spawnSync } from 'node:child_process';
|
|
12
|
+
|
|
13
|
+
if (process.env.HARNESS_HOOK_QUALITY_GATE === '0') process.exit(0);
|
|
14
|
+
|
|
15
|
+
let input = '';
|
|
16
|
+
try { input = fs.readFileSync(0, 'utf8'); } catch { /* TTY */ }
|
|
17
|
+
let payload;
|
|
18
|
+
try { payload = JSON.parse(input); } catch { payload = {}; }
|
|
19
|
+
|
|
20
|
+
const targetPath = String(payload?.tool_input?.file_path ?? payload?.tool_input?.path ?? '').trim();
|
|
21
|
+
if (!targetPath || !fs.existsSync(targetPath)) process.exit(0);
|
|
22
|
+
|
|
23
|
+
const ext = path.extname(targetPath);
|
|
24
|
+
const checks = [];
|
|
25
|
+
|
|
26
|
+
if (['.ts', '.tsx'].includes(ext)) {
|
|
27
|
+
const tscBin = which('tsc');
|
|
28
|
+
if (tscBin) {
|
|
29
|
+
// Windows .cmd / .bat 호환: shell: true 사용. 인자에 공백 있는 경로는 따옴표.
|
|
30
|
+
const isWin = process.platform === 'win32';
|
|
31
|
+
const q = isWin ? `"${targetPath}"` : targetPath;
|
|
32
|
+
checks.push({
|
|
33
|
+
name: 'tsc',
|
|
34
|
+
cmd: tscBin,
|
|
35
|
+
args: ['--noEmit', '--allowJs', '--skipLibCheck', q],
|
|
36
|
+
shell: isWin,
|
|
37
|
+
});
|
|
38
|
+
} else {
|
|
39
|
+
checks.push({ name: 'node-syntax', cmd: process.execPath, args: ['--check', targetPath], allowFail: true });
|
|
40
|
+
}
|
|
41
|
+
} else if (['.js', '.mjs', '.cjs'].includes(ext)) {
|
|
42
|
+
// ESM 은 --check 가 import 해석을 하지 않아 OK. 빠르고 false-negative 적음.
|
|
43
|
+
checks.push({ name: 'node-syntax', cmd: process.execPath, args: ['--check', targetPath] });
|
|
44
|
+
} else if (ext === '.py') {
|
|
45
|
+
const ruff = which('ruff');
|
|
46
|
+
if (ruff) {
|
|
47
|
+
checks.push({ name: 'ruff', cmd: ruff, args: ['check', targetPath] });
|
|
48
|
+
}
|
|
49
|
+
checks.push({ name: 'py-compile', cmd: pythonCmd(), args: ['-m', 'py_compile', targetPath] });
|
|
50
|
+
} else {
|
|
51
|
+
process.exit(0);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
let failed = false;
|
|
55
|
+
for (const c of checks) {
|
|
56
|
+
const r = spawnSync(c.cmd, c.args, { encoding: 'utf8', shell: c.shell || false });
|
|
57
|
+
if (r.status === 0) {
|
|
58
|
+
process.stderr.write(`[quality-gate] ${c.name}: OK ${targetPath}\n`);
|
|
59
|
+
} else if (c.allowFail) {
|
|
60
|
+
process.stderr.write(`[quality-gate] ${c.name}: WARN (allowed) ${targetPath}\n`);
|
|
61
|
+
} else {
|
|
62
|
+
failed = true;
|
|
63
|
+
process.stderr.write(`[quality-gate] ${c.name}: FAIL ${targetPath}\n`);
|
|
64
|
+
if (r.stdout) process.stderr.write(r.stdout);
|
|
65
|
+
if (r.stderr) process.stderr.write(r.stderr);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
if (failed) {
|
|
70
|
+
process.stderr.write('[quality-gate] 다음 도구 호출 차단됨. 위 오류 수정 후 다시 진행.\n');
|
|
71
|
+
process.exit(2);
|
|
72
|
+
}
|
|
73
|
+
process.exit(0);
|
|
74
|
+
|
|
75
|
+
// ----------------
|
|
76
|
+
|
|
77
|
+
function which(bin) {
|
|
78
|
+
const sep = process.platform === 'win32' ? ';' : ':';
|
|
79
|
+
const exts = process.platform === 'win32'
|
|
80
|
+
? (process.env.PATHEXT || '.EXE;.CMD;.BAT').split(';').map(e => e.toLowerCase())
|
|
81
|
+
: [''];
|
|
82
|
+
|
|
83
|
+
// 로컬 node_modules/.bin 을 우선 탐색 (cwd 부터 부모 디렉터리로 올라감).
|
|
84
|
+
const dirs = [];
|
|
85
|
+
let cur = process.cwd();
|
|
86
|
+
for (let i = 0; i < 6; i++) {
|
|
87
|
+
dirs.push(path.join(cur, 'node_modules', '.bin'));
|
|
88
|
+
const parent = path.dirname(cur);
|
|
89
|
+
if (parent === cur) break;
|
|
90
|
+
cur = parent;
|
|
91
|
+
}
|
|
92
|
+
// 그 다음 PATH
|
|
93
|
+
for (const d of (process.env.PATH || '').split(sep)) if (d) dirs.push(d);
|
|
94
|
+
|
|
95
|
+
for (const dir of dirs) {
|
|
96
|
+
for (const x of exts) {
|
|
97
|
+
const full = path.join(dir, bin + x);
|
|
98
|
+
if (fs.existsSync(full)) return full;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return null;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
function pythonCmd() {
|
|
105
|
+
return which('python3') || which('python') || 'python';
|
|
106
|
+
}
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "../schemas/install-components.schema.json",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"components": {
|
|
5
|
+
"rules:soul": {
|
|
6
|
+
"type": "rule",
|
|
7
|
+
"source": "SOUL.md",
|
|
8
|
+
"target": { "claude": "SOUL.md", "codex": "SOUL.md" }
|
|
9
|
+
},
|
|
10
|
+
"rules:rules": {
|
|
11
|
+
"type": "rule",
|
|
12
|
+
"source": "RULES.md",
|
|
13
|
+
"target": { "claude": "RULES.md", "codex": "RULES.md" }
|
|
14
|
+
},
|
|
15
|
+
"rules:claude": {
|
|
16
|
+
"type": "rule",
|
|
17
|
+
"source": "CLAUDE.md",
|
|
18
|
+
"target": { "claude": "CLAUDE.md" },
|
|
19
|
+
"marker_managed": true
|
|
20
|
+
},
|
|
21
|
+
"rules:agents": {
|
|
22
|
+
"type": "rule",
|
|
23
|
+
"source": "AGENTS.md",
|
|
24
|
+
"target": { "claude": "AGENTS.md", "codex": "AGENTS.md", "cursor": "AGENTS.md" },
|
|
25
|
+
"marker_managed": true
|
|
26
|
+
},
|
|
27
|
+
"rules:working-context": {
|
|
28
|
+
"type": "rule",
|
|
29
|
+
"source": "WORKING-CONTEXT.md",
|
|
30
|
+
"target": { "claude": "WORKING-CONTEXT.md" }
|
|
31
|
+
},
|
|
32
|
+
"rules:review": {
|
|
33
|
+
"type": "rule",
|
|
34
|
+
"source": "REVIEW.md",
|
|
35
|
+
"target": { "claude": "REVIEW.md", "codex": "REVIEW.md" }
|
|
36
|
+
},
|
|
37
|
+
"rules:common": {
|
|
38
|
+
"type": "rule_set",
|
|
39
|
+
"source": "rules/common/",
|
|
40
|
+
"target": { "claude": "rules/common/" }
|
|
41
|
+
},
|
|
42
|
+
"rules:typescript": {
|
|
43
|
+
"type": "rule_set",
|
|
44
|
+
"source": "rules/typescript/",
|
|
45
|
+
"target": { "claude": "rules/typescript/" }
|
|
46
|
+
},
|
|
47
|
+
"rules:python": {
|
|
48
|
+
"type": "rule_set",
|
|
49
|
+
"source": "rules/python/",
|
|
50
|
+
"target": { "claude": "rules/python/" }
|
|
51
|
+
},
|
|
52
|
+
|
|
53
|
+
"agent:architect": {
|
|
54
|
+
"type": "agent",
|
|
55
|
+
"source": "agents/architect.md",
|
|
56
|
+
"target": { "claude": ".claude/agents/architect.md" }
|
|
57
|
+
},
|
|
58
|
+
"agent:planner": {
|
|
59
|
+
"type": "agent",
|
|
60
|
+
"source": "agents/planner.md",
|
|
61
|
+
"target": { "claude": ".claude/agents/planner.md" }
|
|
62
|
+
},
|
|
63
|
+
"agent:executor": {
|
|
64
|
+
"type": "agent",
|
|
65
|
+
"source": "agents/executor.md",
|
|
66
|
+
"target": { "claude": ".claude/agents/executor.md" }
|
|
67
|
+
},
|
|
68
|
+
"agent:code-reviewer": {
|
|
69
|
+
"type": "agent",
|
|
70
|
+
"source": "agents/code-reviewer.md",
|
|
71
|
+
"target": { "claude": ".claude/agents/code-reviewer.md" }
|
|
72
|
+
},
|
|
73
|
+
"agent:codex-reviewer": {
|
|
74
|
+
"type": "agent",
|
|
75
|
+
"source": "agents/codex-reviewer.md",
|
|
76
|
+
"target": { "codex": ".codex/agents/codex-reviewer.toml" }
|
|
77
|
+
},
|
|
78
|
+
"agent:codex-challenger": {
|
|
79
|
+
"type": "agent",
|
|
80
|
+
"source": "agents/codex-challenger.md",
|
|
81
|
+
"target": { "codex": ".codex/agents/codex-challenger.toml" }
|
|
82
|
+
},
|
|
83
|
+
"agent:security-reviewer": {
|
|
84
|
+
"type": "agent",
|
|
85
|
+
"source": "agents/security-reviewer.md",
|
|
86
|
+
"target": { "claude": ".claude/agents/security-reviewer.md" }
|
|
87
|
+
},
|
|
88
|
+
"agent:debugger": {
|
|
89
|
+
"type": "agent",
|
|
90
|
+
"source": "agents/debugger.md",
|
|
91
|
+
"target": { "claude": ".claude/agents/debugger.md" }
|
|
92
|
+
},
|
|
93
|
+
"agent:test-engineer": {
|
|
94
|
+
"type": "agent",
|
|
95
|
+
"source": "agents/test-engineer.md",
|
|
96
|
+
"target": { "claude": ".claude/agents/test-engineer.md" }
|
|
97
|
+
},
|
|
98
|
+
"agent:research": {
|
|
99
|
+
"type": "agent",
|
|
100
|
+
"source": "agents/research.md",
|
|
101
|
+
"target": { "claude": ".claude/agents/research.md", "gemini": ".gemini/agents/research.md" }
|
|
102
|
+
},
|
|
103
|
+
"agent:doc-writer": {
|
|
104
|
+
"type": "agent",
|
|
105
|
+
"source": "agents/doc-writer.md",
|
|
106
|
+
"target": { "claude": ".claude/agents/doc-writer.md" }
|
|
107
|
+
},
|
|
108
|
+
|
|
109
|
+
"skill:claude-led-codex-review": {
|
|
110
|
+
"type": "skill",
|
|
111
|
+
"source": "skills/claude-led-codex-review/",
|
|
112
|
+
"target": { "claude": ".claude/skills/claude-led-codex-review/" }
|
|
113
|
+
},
|
|
114
|
+
"skill:plan-eng-review": {
|
|
115
|
+
"type": "skill",
|
|
116
|
+
"source": "skills/plan-eng-review/",
|
|
117
|
+
"target": { "claude": ".claude/skills/plan-eng-review/" }
|
|
118
|
+
},
|
|
119
|
+
"skill:tdd-workflow": {
|
|
120
|
+
"type": "skill",
|
|
121
|
+
"source": "skills/tdd-workflow/",
|
|
122
|
+
"target": { "claude": ".claude/skills/tdd-workflow/" }
|
|
123
|
+
},
|
|
124
|
+
"skill:review": {
|
|
125
|
+
"type": "skill",
|
|
126
|
+
"source": "skills/review/",
|
|
127
|
+
"target": { "claude": ".claude/skills/review/" }
|
|
128
|
+
},
|
|
129
|
+
"skill:ship": {
|
|
130
|
+
"type": "skill",
|
|
131
|
+
"source": "skills/ship/",
|
|
132
|
+
"target": { "claude": ".claude/skills/ship/" }
|
|
133
|
+
},
|
|
134
|
+
"skill:security-hardening": {
|
|
135
|
+
"type": "skill",
|
|
136
|
+
"source": "skills/security-hardening/",
|
|
137
|
+
"target": { "claude": ".claude/skills/security-hardening/" }
|
|
138
|
+
},
|
|
139
|
+
"skill:release-readiness": {
|
|
140
|
+
"type": "skill",
|
|
141
|
+
"source": "skills/release-readiness/",
|
|
142
|
+
"target": { "claude": ".claude/skills/release-readiness/" }
|
|
143
|
+
},
|
|
144
|
+
"skill:porting": {
|
|
145
|
+
"type": "skill",
|
|
146
|
+
"source": "skills/porting/",
|
|
147
|
+
"target": { "claude": ".claude/skills/porting/" }
|
|
148
|
+
},
|
|
149
|
+
|
|
150
|
+
"command:claude-led-codex-review": {
|
|
151
|
+
"type": "command",
|
|
152
|
+
"source": "commands/claude-led-codex-review.md",
|
|
153
|
+
"target": { "claude": ".claude/commands/claude-led-codex-review.md" }
|
|
154
|
+
},
|
|
155
|
+
|
|
156
|
+
"hook:gateguard-fact-force": {
|
|
157
|
+
"type": "hook",
|
|
158
|
+
"source": "hooks/scripts/gateguard-fact-force.js",
|
|
159
|
+
"target": { "claude": ".claude/hooks/gateguard-fact-force.js" },
|
|
160
|
+
"event": "PreToolUse",
|
|
161
|
+
"matcher": "Edit|Write"
|
|
162
|
+
},
|
|
163
|
+
"hook:quality-gate": {
|
|
164
|
+
"type": "hook",
|
|
165
|
+
"source": "hooks/scripts/quality-gate.js",
|
|
166
|
+
"target": { "claude": ".claude/hooks/quality-gate.js" },
|
|
167
|
+
"event": "PostToolUse",
|
|
168
|
+
"matcher": "Edit|Write"
|
|
169
|
+
},
|
|
170
|
+
"hook:pre-bash-dispatcher": {
|
|
171
|
+
"type": "hook",
|
|
172
|
+
"source": "hooks/scripts/pre-bash-dispatcher.js",
|
|
173
|
+
"target": { "claude": ".claude/hooks/pre-bash-dispatcher.js" },
|
|
174
|
+
"event": "PreToolUse",
|
|
175
|
+
"matcher": "Bash"
|
|
176
|
+
},
|
|
177
|
+
"hook:persistent-mode": {
|
|
178
|
+
"type": "hook",
|
|
179
|
+
"source": "hooks/scripts/persistent-mode.mjs",
|
|
180
|
+
"target": { "claude": ".claude/hooks/persistent-mode.mjs" },
|
|
181
|
+
"event": "Stop"
|
|
182
|
+
},
|
|
183
|
+
|
|
184
|
+
"platform:claude": {
|
|
185
|
+
"type": "platform",
|
|
186
|
+
"builder": "scripts/build-claude.js",
|
|
187
|
+
"output_dir": ".claude"
|
|
188
|
+
},
|
|
189
|
+
"platform:codex": {
|
|
190
|
+
"type": "platform",
|
|
191
|
+
"builder": "scripts/build-codex.js",
|
|
192
|
+
"output_dir": ".codex"
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "../schemas/install-modules.schema.json",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"modules": {
|
|
5
|
+
"rules-core": {
|
|
6
|
+
"description": "거버넌스 4계층 (SOUL/RULES/CLAUDE/AGENTS) + 공통/언어별 룰",
|
|
7
|
+
"components": [
|
|
8
|
+
"rules:soul",
|
|
9
|
+
"rules:rules",
|
|
10
|
+
"rules:claude",
|
|
11
|
+
"rules:agents",
|
|
12
|
+
"rules:working-context",
|
|
13
|
+
"rules:review",
|
|
14
|
+
"rules:common",
|
|
15
|
+
"rules:typescript",
|
|
16
|
+
"rules:python"
|
|
17
|
+
],
|
|
18
|
+
"level": 3,
|
|
19
|
+
"required": true
|
|
20
|
+
},
|
|
21
|
+
"agents-core": {
|
|
22
|
+
"description": "11개 핵심 에이전트 카탈로그 (Claude + Codex + Gemini)",
|
|
23
|
+
"components": [
|
|
24
|
+
"agent:architect",
|
|
25
|
+
"agent:planner",
|
|
26
|
+
"agent:executor",
|
|
27
|
+
"agent:code-reviewer",
|
|
28
|
+
"agent:codex-reviewer",
|
|
29
|
+
"agent:codex-challenger",
|
|
30
|
+
"agent:security-reviewer",
|
|
31
|
+
"agent:debugger",
|
|
32
|
+
"agent:test-engineer",
|
|
33
|
+
"agent:research",
|
|
34
|
+
"agent:doc-writer"
|
|
35
|
+
],
|
|
36
|
+
"level": 3,
|
|
37
|
+
"required": true
|
|
38
|
+
},
|
|
39
|
+
"hooks-runtime": {
|
|
40
|
+
"description": "PreToolUse / PostToolUse / Stop 훅 4종 + 디스패처",
|
|
41
|
+
"components": [
|
|
42
|
+
"hook:gateguard-fact-force",
|
|
43
|
+
"hook:quality-gate",
|
|
44
|
+
"hook:pre-bash-dispatcher",
|
|
45
|
+
"hook:persistent-mode"
|
|
46
|
+
],
|
|
47
|
+
"level": 2,
|
|
48
|
+
"required": true,
|
|
49
|
+
"env_toggles": {
|
|
50
|
+
"HARNESS_HOOK_GATEGUARD": "1",
|
|
51
|
+
"HARNESS_HOOK_QUALITY_GATE": "1",
|
|
52
|
+
"HARNESS_HOOK_PRE_BASH": "1",
|
|
53
|
+
"HARNESS_HOOK_PERSISTENT_MODE": "1"
|
|
54
|
+
}
|
|
55
|
+
},
|
|
56
|
+
"platform-configs": {
|
|
57
|
+
"description": "Claude Code / Codex CLI 등 하네스별 빌드 출력 위치 정의",
|
|
58
|
+
"components": [
|
|
59
|
+
"platform:claude",
|
|
60
|
+
"platform:codex"
|
|
61
|
+
],
|
|
62
|
+
"level": 2,
|
|
63
|
+
"required": true,
|
|
64
|
+
"depends_on": ["agents-core", "hooks-runtime"]
|
|
65
|
+
},
|
|
66
|
+
"workflow-quality": {
|
|
67
|
+
"description": "TDD + 품질 게이트 워크플로우 스킬",
|
|
68
|
+
"components": [
|
|
69
|
+
"skill:tdd-workflow",
|
|
70
|
+
"skill:plan-eng-review",
|
|
71
|
+
"skill:review",
|
|
72
|
+
"skill:ship"
|
|
73
|
+
],
|
|
74
|
+
"level": 2,
|
|
75
|
+
"required": false
|
|
76
|
+
},
|
|
77
|
+
"codex-loop": {
|
|
78
|
+
"description": "claude-led-codex-review 7단계 풀사이클 + Codex 검증 루프",
|
|
79
|
+
"components": [
|
|
80
|
+
"skill:claude-led-codex-review",
|
|
81
|
+
"agent:codex-reviewer",
|
|
82
|
+
"agent:codex-challenger",
|
|
83
|
+
"command:claude-led-codex-review"
|
|
84
|
+
],
|
|
85
|
+
"level": 3,
|
|
86
|
+
"required": false,
|
|
87
|
+
"depends_on": ["agents-core", "workflow-quality"]
|
|
88
|
+
},
|
|
89
|
+
"ops-readiness": {
|
|
90
|
+
"description": "Release, security-hardening, and external project porting operating skills.",
|
|
91
|
+
"components": [
|
|
92
|
+
"skill:security-hardening",
|
|
93
|
+
"skill:release-readiness",
|
|
94
|
+
"skill:porting"
|
|
95
|
+
],
|
|
96
|
+
"level": 2,
|
|
97
|
+
"required": false,
|
|
98
|
+
"depends_on": ["workflow-quality"]
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "../schemas/install-profiles.schema.json",
|
|
3
|
+
"version": "0.0.3",
|
|
4
|
+
"profiles": {
|
|
5
|
+
"core": {
|
|
6
|
+
"description": "Minimal NEKOWORK surface: rules, core agents, runtime hooks, platform configs, and safety gates.",
|
|
7
|
+
"modules": [
|
|
8
|
+
"rules-core",
|
|
9
|
+
"agents-core",
|
|
10
|
+
"hooks-runtime",
|
|
11
|
+
"platform-configs"
|
|
12
|
+
]
|
|
13
|
+
},
|
|
14
|
+
"developer": {
|
|
15
|
+
"description": "Daily development profile with quality workflow, Codex loop, and release readiness helpers.",
|
|
16
|
+
"modules": [
|
|
17
|
+
"rules-core",
|
|
18
|
+
"agents-core",
|
|
19
|
+
"hooks-runtime",
|
|
20
|
+
"platform-configs",
|
|
21
|
+
"workflow-quality",
|
|
22
|
+
"codex-loop",
|
|
23
|
+
"ops-readiness"
|
|
24
|
+
]
|
|
25
|
+
},
|
|
26
|
+
"security": {
|
|
27
|
+
"description": "Secure development profile that keeps Codex verification and human gates active for sensitive work.",
|
|
28
|
+
"modules": [
|
|
29
|
+
"rules-core",
|
|
30
|
+
"agents-core",
|
|
31
|
+
"hooks-runtime",
|
|
32
|
+
"platform-configs",
|
|
33
|
+
"codex-loop",
|
|
34
|
+
"ops-readiness"
|
|
35
|
+
],
|
|
36
|
+
"defaults": {
|
|
37
|
+
"review_mode": "secure",
|
|
38
|
+
"human_gate_on_critical": true,
|
|
39
|
+
"outbound_network": "deny"
|
|
40
|
+
}
|
|
41
|
+
},
|
|
42
|
+
"product": {
|
|
43
|
+
"description": "Product planning profile for question gates, scope review, acceptance criteria, and handoff-first planning.",
|
|
44
|
+
"modules": [
|
|
45
|
+
"rules-core",
|
|
46
|
+
"agents-core",
|
|
47
|
+
"hooks-runtime",
|
|
48
|
+
"platform-configs",
|
|
49
|
+
"workflow-quality"
|
|
50
|
+
],
|
|
51
|
+
"defaults": {
|
|
52
|
+
"question_gate": true,
|
|
53
|
+
"mutation_policy": "single_executor"
|
|
54
|
+
}
|
|
55
|
+
},
|
|
56
|
+
"quality": {
|
|
57
|
+
"description": "Disciplined development profile for brainstorm, test-first planning, systematic debugging, evidence-based review, and verification before completion.",
|
|
58
|
+
"modules": [
|
|
59
|
+
"rules-core",
|
|
60
|
+
"agents-core",
|
|
61
|
+
"hooks-runtime",
|
|
62
|
+
"platform-configs",
|
|
63
|
+
"workflow-quality",
|
|
64
|
+
"codex-loop",
|
|
65
|
+
"ops-readiness"
|
|
66
|
+
],
|
|
67
|
+
"defaults": {
|
|
68
|
+
"brainstorm_before_work": true,
|
|
69
|
+
"test_first_plan": true,
|
|
70
|
+
"systematic_debugging": true,
|
|
71
|
+
"evidence_based_review": true,
|
|
72
|
+
"verification_before_completion": true,
|
|
73
|
+
"quality_gate_required": true,
|
|
74
|
+
"require_codex_verification": true,
|
|
75
|
+
"human_gate_on_critical": true,
|
|
76
|
+
"mutation_policy": "single_executor"
|
|
77
|
+
}
|
|
78
|
+
},
|
|
79
|
+
"frontend": {
|
|
80
|
+
"description": "Frontend profile for UI mockups, component review, accessibility checks, and Codex-reviewed implementation.",
|
|
81
|
+
"modules": [
|
|
82
|
+
"rules-core",
|
|
83
|
+
"agents-core",
|
|
84
|
+
"hooks-runtime",
|
|
85
|
+
"platform-configs",
|
|
86
|
+
"workflow-quality",
|
|
87
|
+
"codex-loop"
|
|
88
|
+
],
|
|
89
|
+
"defaults": {
|
|
90
|
+
"question_gate": true,
|
|
91
|
+
"ui_mock_data_first": true
|
|
92
|
+
}
|
|
93
|
+
},
|
|
94
|
+
"testing": {
|
|
95
|
+
"description": "Testing profile for test planning, regression review, coverage-oriented handoffs, and quality gates.",
|
|
96
|
+
"modules": [
|
|
97
|
+
"rules-core",
|
|
98
|
+
"agents-core",
|
|
99
|
+
"hooks-runtime",
|
|
100
|
+
"platform-configs",
|
|
101
|
+
"workflow-quality",
|
|
102
|
+
"codex-loop"
|
|
103
|
+
],
|
|
104
|
+
"defaults": {
|
|
105
|
+
"test_plan_required": true,
|
|
106
|
+
"mutation_policy": "single_executor"
|
|
107
|
+
}
|
|
108
|
+
},
|
|
109
|
+
"research": {
|
|
110
|
+
"description": "Research profile for read-only investigation handoffs and optional external knowledge surfaces.",
|
|
111
|
+
"modules": [
|
|
112
|
+
"rules-core",
|
|
113
|
+
"agents-core",
|
|
114
|
+
"hooks-runtime",
|
|
115
|
+
"platform-configs",
|
|
116
|
+
"workflow-quality",
|
|
117
|
+
"ops-readiness"
|
|
118
|
+
],
|
|
119
|
+
"post_install_note": "External research connectors remain opt-in and cannot weaken core safety gates."
|
|
120
|
+
},
|
|
121
|
+
"full": {
|
|
122
|
+
"description": "All stable modules in the current release, still bounded by NEKOWORK core safety invariants.",
|
|
123
|
+
"modules": [
|
|
124
|
+
"rules-core",
|
|
125
|
+
"agents-core",
|
|
126
|
+
"hooks-runtime",
|
|
127
|
+
"platform-configs",
|
|
128
|
+
"workflow-quality",
|
|
129
|
+
"codex-loop",
|
|
130
|
+
"ops-readiness"
|
|
131
|
+
]
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|