simple-codex 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.ko.md +94 -0
- package/README.md +94 -0
- package/dist/cli.js +54 -0
- package/dist/cli.js.map +1 -0
- package/dist/command/doctor.js +34 -0
- package/dist/command/doctor.js.map +1 -0
- package/dist/command/prompt.js +40 -0
- package/dist/command/prompt.js.map +1 -0
- package/dist/command/setup.js +42 -0
- package/dist/command/setup.js.map +1 -0
- package/dist/commands/doctor.js +34 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/prompt.js +40 -0
- package/dist/commands/prompt.js.map +1 -0
- package/dist/commands/setup.js +42 -0
- package/dist/commands/setup.js.map +1 -0
- package/dist/paths.js +23 -0
- package/dist/paths.js.map +1 -0
- package/dist/templates/codex/config.toml.js +30 -0
- package/dist/templates/codex/config.toml.js.map +1 -0
- package/dist/utils/fsx.js +41 -0
- package/dist/utils/fsx.js.map +1 -0
- package/dist/utils/log.js +7 -0
- package/dist/utils/log.js.map +1 -0
- package/package.json +27 -0
package/README.ko.md
ADDED
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
# simple-codex
|
|
2
|
+
|
|
3
|
+
Codex 작업 환경을 빠르게 초기화하고 상태를 점검하는 경량 CLI 도구(MVP)입니다.
|
|
4
|
+
|
|
5
|
+
영문 문서: [README.md](./README.md)
|
|
6
|
+
|
|
7
|
+
## 주요 기능
|
|
8
|
+
|
|
9
|
+
- Codex/Agent 기본 템플릿 설치
|
|
10
|
+
- `AGENTS.md`가 없으면 자동 생성
|
|
11
|
+
- 설치/구성 상태 점검
|
|
12
|
+
- 프롬프트 파일 생성 및 목록 조회
|
|
13
|
+
|
|
14
|
+
## 명령어
|
|
15
|
+
|
|
16
|
+
패키지 실행 바이너리는 `simple-codex`이며, CLI 내부 프로그램명은 현재 `mycodex`입니다.
|
|
17
|
+
|
|
18
|
+
### `setup`
|
|
19
|
+
|
|
20
|
+
프롬프트/스킬/설정 템플릿을 설치합니다.
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
simple-codex setup --scope project
|
|
24
|
+
# 또는
|
|
25
|
+
simple-codex setup --scope user
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
### `doctor`
|
|
29
|
+
|
|
30
|
+
필수 파일/디렉터리 상태를 점검합니다.
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
simple-codex doctor --scope project
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
### `prompt add`
|
|
37
|
+
|
|
38
|
+
`<CODEX_HOME>/prompts`에 새 프롬프트 파일을 만듭니다.
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
simple-codex prompt add architect --scope project
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
### `prompt list`
|
|
45
|
+
|
|
46
|
+
사용 가능한 프롬프트 목록을 출력합니다.
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
simple-codex prompt list --scope project
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## Scope 동작
|
|
53
|
+
|
|
54
|
+
`--scope project`
|
|
55
|
+
- `codexHome`: `<cwd>/.codex`
|
|
56
|
+
- `agentsHome`: `<cwd>/.agents`
|
|
57
|
+
- `agentsMd`: `<cwd>/AGENTS.md`
|
|
58
|
+
- `stateHome`: `<cwd>/.myx`
|
|
59
|
+
|
|
60
|
+
`--scope user`
|
|
61
|
+
- `codexHome`: `~/.codex`
|
|
62
|
+
- `agentsHome`: `~/.agents`
|
|
63
|
+
- `agentsMd`: `<cwd>/AGENTS.md`
|
|
64
|
+
- `stateHome`: `~/.myx`
|
|
65
|
+
|
|
66
|
+
## 개발
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
pnpm install
|
|
70
|
+
pnpm build
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
빌드된 CLI 실행:
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
node dist/cli.js --help
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
## 프로젝트 구조
|
|
80
|
+
|
|
81
|
+
```text
|
|
82
|
+
src/
|
|
83
|
+
cli.ts
|
|
84
|
+
command/
|
|
85
|
+
setup.ts
|
|
86
|
+
doctor.ts
|
|
87
|
+
prompt.ts
|
|
88
|
+
templates/
|
|
89
|
+
utils/
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
## License
|
|
93
|
+
|
|
94
|
+
ISC
|
package/README.md
ADDED
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
# simple-codex
|
|
2
|
+
|
|
3
|
+
Lightweight CLI for bootstrapping and checking a Codex workspace (MVP).
|
|
4
|
+
|
|
5
|
+
Korean documentation: [README.ko.md](./README.ko.md)
|
|
6
|
+
|
|
7
|
+
## What It Does
|
|
8
|
+
|
|
9
|
+
- Installs baseline templates for Codex and agents
|
|
10
|
+
- Creates `AGENTS.md` if missing
|
|
11
|
+
- Checks local setup health
|
|
12
|
+
- Adds and lists prompt files
|
|
13
|
+
|
|
14
|
+
## Commands
|
|
15
|
+
|
|
16
|
+
The package binary is `simple-codex`, and the CLI program name is currently `mycodex`.
|
|
17
|
+
|
|
18
|
+
### `setup`
|
|
19
|
+
|
|
20
|
+
Install prompt/skill/config templates.
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
simple-codex setup --scope project
|
|
24
|
+
# or
|
|
25
|
+
simple-codex setup --scope user
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
### `doctor`
|
|
29
|
+
|
|
30
|
+
Validate required files and directories.
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
simple-codex doctor --scope project
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
### `prompt add`
|
|
37
|
+
|
|
38
|
+
Create a new prompt file under `<CODEX_HOME>/prompts`.
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
simple-codex prompt add architect --scope project
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
### `prompt list`
|
|
45
|
+
|
|
46
|
+
List available prompts.
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
simple-codex prompt list --scope project
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## Scope Behavior
|
|
53
|
+
|
|
54
|
+
`--scope project`
|
|
55
|
+
- `codexHome`: `<cwd>/.codex`
|
|
56
|
+
- `agentsHome`: `<cwd>/.agents`
|
|
57
|
+
- `agentsMd`: `<cwd>/AGENTS.md`
|
|
58
|
+
- `stateHome`: `<cwd>/.myx`
|
|
59
|
+
|
|
60
|
+
`--scope user`
|
|
61
|
+
- `codexHome`: `~/.codex`
|
|
62
|
+
- `agentsHome`: `~/.agents`
|
|
63
|
+
- `agentsMd`: `<cwd>/AGENTS.md`
|
|
64
|
+
- `stateHome`: `~/.myx`
|
|
65
|
+
|
|
66
|
+
## Development
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
pnpm install
|
|
70
|
+
pnpm build
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
Run compiled CLI:
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
node dist/cli.js --help
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
## Project Structure
|
|
80
|
+
|
|
81
|
+
```text
|
|
82
|
+
src/
|
|
83
|
+
cli.ts
|
|
84
|
+
command/
|
|
85
|
+
setup.ts
|
|
86
|
+
doctor.ts
|
|
87
|
+
prompt.ts
|
|
88
|
+
templates/
|
|
89
|
+
utils/
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
## License
|
|
93
|
+
|
|
94
|
+
ISC
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Command } from "commander";
|
|
3
|
+
import { runSetup } from "./commands/setup.js";
|
|
4
|
+
import { runDoctor } from "./commands/doctor.js";
|
|
5
|
+
import { runPromptAdd, runPromptList } from "./commands/prompt.js";
|
|
6
|
+
function parseScope(v) {
|
|
7
|
+
if (v !== "user" && v !== "project")
|
|
8
|
+
throw new Error(`scope must be one of: user | project (received: ${v})`);
|
|
9
|
+
return v;
|
|
10
|
+
}
|
|
11
|
+
const program = new Command();
|
|
12
|
+
program
|
|
13
|
+
.name("simple-codex")
|
|
14
|
+
.description("A lightweight orchestration layer for the Codex CLI (MVP)")
|
|
15
|
+
.version("0.1.0");
|
|
16
|
+
program
|
|
17
|
+
.command("setup")
|
|
18
|
+
.description("Install prompt, skill, and config templates")
|
|
19
|
+
.option("--scope <scope>", "user | project", "project")
|
|
20
|
+
.action(async (opts) => {
|
|
21
|
+
const scope = parseScope(opts.scope);
|
|
22
|
+
await runSetup(scope);
|
|
23
|
+
});
|
|
24
|
+
program
|
|
25
|
+
.command("doctor")
|
|
26
|
+
.description("Check installation and configuration status")
|
|
27
|
+
.option("--scope <scope>", "user | project", "project")
|
|
28
|
+
.action(async (opts) => {
|
|
29
|
+
const scope = parseScope(opts.scope);
|
|
30
|
+
await runDoctor(scope);
|
|
31
|
+
});
|
|
32
|
+
const prompt = program.command("prompt").description("Manage prompts");
|
|
33
|
+
prompt
|
|
34
|
+
.command("add")
|
|
35
|
+
.description("Create a prompt file")
|
|
36
|
+
.argument("<name>", "prompt name")
|
|
37
|
+
.option("--scope <scope>", "user | project", "project")
|
|
38
|
+
.action(async (name, opts) => {
|
|
39
|
+
const scope = parseScope(opts.scope);
|
|
40
|
+
await runPromptAdd(scope, name);
|
|
41
|
+
});
|
|
42
|
+
prompt
|
|
43
|
+
.command("list")
|
|
44
|
+
.description("List prompts")
|
|
45
|
+
.option("--scope <scope>", "user | project", "project")
|
|
46
|
+
.action(async (opts) => {
|
|
47
|
+
const scope = parseScope(opts.scope);
|
|
48
|
+
await runPromptList(scope);
|
|
49
|
+
});
|
|
50
|
+
program.parseAsync(process.argv).catch((e) => {
|
|
51
|
+
console.error(e?.message ?? e);
|
|
52
|
+
process.exit(1);
|
|
53
|
+
});
|
|
54
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAGnE,SAAS,UAAU,CAAC,CAAS;IAC3B,IAAI,CAAC,KAAK,MAAM,IAAI,CAAC,KAAK,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,GAAG,CAAC,CAAC;IAC9G,OAAO,CAAC,CAAC;AACX,CAAC;AAED,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,cAAc,CAAC;KACpB,WAAW,CAAC,2DAA2D,CAAC;KACxE,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,6CAA6C,CAAC;KAC1D,MAAM,CAAC,iBAAiB,EAAE,gBAAgB,EAAE,SAAS,CAAC;KACtD,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;IACrB,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrC,MAAM,QAAQ,CAAC,KAAK,CAAC,CAAC;AACxB,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,6CAA6C,CAAC;KAC1D,MAAM,CAAC,iBAAiB,EAAE,gBAAgB,EAAE,SAAS,CAAC;KACtD,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;IACrB,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrC,MAAM,SAAS,CAAC,KAAK,CAAC,CAAC;AACzB,CAAC,CAAC,CAAC;AAEL,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,CAAC,gBAAgB,CAAC,CAAC;AAEvE,MAAM;KACH,OAAO,CAAC,KAAK,CAAC;KACd,WAAW,CAAC,sBAAsB,CAAC;KACnC,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC;KACjC,MAAM,CAAC,iBAAiB,EAAE,gBAAgB,EAAE,SAAS,CAAC;KACtD,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE;IAC3B,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrC,MAAM,YAAY,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;AAClC,CAAC,CAAC,CAAC;AAEL,MAAM;KACH,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,cAAc,CAAC;KAC3B,MAAM,CAAC,iBAAiB,EAAE,gBAAgB,EAAE,SAAS,CAAC;KACtD,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;IACrB,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrC,MAAM,aAAa,CAAC,KAAK,CAAC,CAAC;AAC7B,CAAC,CAAC,CAAC;AAEL,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE;IAC3C,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,IAAI,CAAC,CAAC,CAAC;IAC/B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { getTargets } from "../paths.js";
|
|
3
|
+
import { exists } from "../utils/fsx.js";
|
|
4
|
+
import { log } from "../utils/log.js";
|
|
5
|
+
export async function runDoctor(scope) {
|
|
6
|
+
const t = getTargets(scope);
|
|
7
|
+
const checks = [
|
|
8
|
+
["codexHome", t.codexHome],
|
|
9
|
+
["agentsHome", t.agentsHome],
|
|
10
|
+
["stateHome", t.stateHome],
|
|
11
|
+
["AGENTS.md", t.agentsMd],
|
|
12
|
+
["config.toml", path.join(t.codexHome, "config.toml")],
|
|
13
|
+
["prompts dir", path.join(t.codexHome, "prompts")],
|
|
14
|
+
["skills dir", path.join(t.agentsHome, "skills")],
|
|
15
|
+
];
|
|
16
|
+
let ok = true;
|
|
17
|
+
for (const [name, p] of checks) {
|
|
18
|
+
const e = await exists(p);
|
|
19
|
+
if (e)
|
|
20
|
+
log.ok(`${name}: ${p}`);
|
|
21
|
+
else {
|
|
22
|
+
ok = false;
|
|
23
|
+
log.warn(`Missing ${name}: ${p}`);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
if (!ok) {
|
|
27
|
+
log.err(`Some components are missing. Run "mycodex setup --scope ${scope}" first.`);
|
|
28
|
+
process.exitCode = 2;
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
log.ok("All checks passed.");
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=doctor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/command/doctor.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAS,UAAU,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AAEtC,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,KAAY;IAC1C,MAAM,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;IAE5B,MAAM,MAAM,GAA4B;QACtC,CAAC,WAAW,EAAE,CAAC,CAAC,SAAS,CAAC;QAC1B,CAAC,YAAY,EAAE,CAAC,CAAC,UAAU,CAAC;QAC5B,CAAC,WAAW,EAAE,CAAC,CAAC,SAAS,CAAC;QAC1B,CAAC,WAAW,EAAE,CAAC,CAAC,QAAQ,CAAC;QACzB,CAAC,aAAa,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;QACtD,CAAC,aAAa,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QAClD,CAAC,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;KAClD,CAAC;IAEF,IAAI,EAAE,GAAG,IAAI,CAAC;IACd,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,MAAM,EAAE,CAAC;QAC/B,MAAM,CAAC,GAAG,MAAM,MAAM,CAAC,CAAC,CAAC,CAAC;QAC1B,IAAI,CAAC;YAAE,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,KAAK,CAAC,EAAE,CAAC,CAAC;aAC1B,CAAC;YACJ,EAAE,GAAG,KAAK,CAAC;YACX,GAAG,CAAC,IAAI,CAAC,WAAW,IAAI,KAAK,CAAC,EAAE,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;IAED,IAAI,CAAC,EAAE,EAAE,CAAC;QACR,GAAG,CAAC,GAAG,CAAC,2DAA2D,KAAK,UAAU,CAAC,CAAC;QACpF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC;SAAM,CAAC;QACN,GAAG,CAAC,EAAE,CAAC,oBAAoB,CAAC,CAAC;IAC/B,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { getTargets } from "../paths.js";
|
|
3
|
+
import { ensureDir, exists, writeText } from "../utils/fsx.js";
|
|
4
|
+
import { log } from "../utils/log.js";
|
|
5
|
+
function promptDir(scope) {
|
|
6
|
+
const t = getTargets(scope);
|
|
7
|
+
return path.join(t.codexHome, "prompts");
|
|
8
|
+
}
|
|
9
|
+
export async function runPromptAdd(scope, name) {
|
|
10
|
+
if (!name || !/^[a-z0-9-_]+$/i.test(name)) {
|
|
11
|
+
throw new Error("Prompt name can contain only letters, numbers, '-', and '_'. Example: architect, code-review");
|
|
12
|
+
}
|
|
13
|
+
const dir = promptDir(scope);
|
|
14
|
+
await ensureDir(dir);
|
|
15
|
+
const file = path.join(dir, `${name}.md`);
|
|
16
|
+
if (await exists(file)) {
|
|
17
|
+
log.warn(`Already exists: ${file}`);
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
const content = `# ${name}\n\n- 역할: (여기에 설명)\n- 출력 규칙: (여기에 규칙)\n`;
|
|
21
|
+
await writeText(file, content);
|
|
22
|
+
log.ok(`Created prompt: ${file}`);
|
|
23
|
+
}
|
|
24
|
+
export async function runPromptList(scope) {
|
|
25
|
+
const dir = promptDir(scope);
|
|
26
|
+
if (!(await exists(dir))) {
|
|
27
|
+
log.warn(`Prompt directory does not exist: ${dir}`);
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
const { promises: fs } = await import("node:fs");
|
|
31
|
+
const items = await fs.readdir(dir);
|
|
32
|
+
const md = items.filter((x) => x.endsWith(".md")).sort();
|
|
33
|
+
if (md.length === 0) {
|
|
34
|
+
log.info("No prompts found yet.");
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
for (const f of md)
|
|
38
|
+
console.log(`- ${f.replace(/\.md$/, "")}`);
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=prompt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/command/prompt.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAS,UAAU,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,EAAY,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACzE,OAAO,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AAEtC,SAAS,SAAS,CAAC,KAAY;IAC7B,MAAM,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;IAC5B,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,KAAY,EAAE,IAAY;IAC3D,IAAI,CAAC,IAAI,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1C,MAAM,IAAI,KAAK,CAAC,8FAA8F,CAAC,CAAC;IAClH,CAAC;IAED,MAAM,GAAG,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;IAC7B,MAAM,SAAS,CAAC,GAAG,CAAC,CAAC;IAErB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,KAAK,CAAC,CAAC;IAC1C,IAAI,MAAM,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;QACvB,GAAG,CAAC,IAAI,CAAC,mBAAmB,IAAI,EAAE,CAAC,CAAC;QACpC,OAAO;IACT,CAAC;IAED,MAAM,OAAO,GAAG,KAAK,IAAI,yCAAyC,CAAC;IACnE,MAAM,SAAS,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC/B,GAAG,CAAC,EAAE,CAAC,mBAAmB,IAAI,EAAE,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,KAAY;IAC9C,MAAM,GAAG,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;IAC7B,IAAI,CAAC,CAAC,MAAM,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;QACzB,GAAG,CAAC,IAAI,CAAC,oCAAoC,GAAG,EAAE,CAAC,CAAC;QACpD,OAAO;IACT,CAAC;IACD,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC;IACjD,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACpC,MAAM,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACzD,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACpB,GAAG,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;QAClC,OAAO;IACT,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,EAAE;QAAE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;AACjE,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { promises as fs } from "node:fs";
|
|
3
|
+
import { getTargets, templatesRoot } from "../paths.js";
|
|
4
|
+
import { copyDir, ensureDir, exists, writeTextIfMissing } from "../utils/fsx.js";
|
|
5
|
+
import { log } from "../utils/log.js";
|
|
6
|
+
export async function runSetup(scope) {
|
|
7
|
+
const t = getTargets(scope);
|
|
8
|
+
const tpl = templatesRoot();
|
|
9
|
+
// 기본 디렉터리
|
|
10
|
+
await ensureDir(t.codexHome);
|
|
11
|
+
await ensureDir(t.agentsHome);
|
|
12
|
+
await ensureDir(t.stateHome);
|
|
13
|
+
// 템플릿 복사: codex/, agents/
|
|
14
|
+
const srcCodex = path.join(tpl, "codex");
|
|
15
|
+
const srcAgents = path.join(tpl, "agents");
|
|
16
|
+
if (!(await exists(srcCodex)) || !(await exists(srcAgents))) {
|
|
17
|
+
throw new Error(`Could not find templates/ directory. Current working directory: ${process.cwd()}`);
|
|
18
|
+
}
|
|
19
|
+
await copyDir(srcCodex, t.codexHome);
|
|
20
|
+
await copyDir(srcAgents, t.agentsHome);
|
|
21
|
+
// AGENTS.md
|
|
22
|
+
const agentsTplPath = path.join(tpl, "AGENTS.md");
|
|
23
|
+
const agentsTpl = await fs.readFile(agentsTplPath, "utf8");
|
|
24
|
+
const created = await writeTextIfMissing(t.agentsMd, agentsTpl);
|
|
25
|
+
if (created)
|
|
26
|
+
log.ok(`Created AGENTS.md: ${t.agentsMd}`);
|
|
27
|
+
else
|
|
28
|
+
log.info(`AGENTS.md already exists: ${t.agentsMd}`);
|
|
29
|
+
// 안내
|
|
30
|
+
log.ok(`Setup complete (scope=${scope})`);
|
|
31
|
+
log.info(`CODEX_HOME: ${t.codexHome}`);
|
|
32
|
+
log.info(`AGENTS_HOME: ${t.agentsHome}`);
|
|
33
|
+
log.info(`STATE_HOME: ${t.stateHome}`);
|
|
34
|
+
// project scope면 실행 힌트
|
|
35
|
+
if (scope === "project") {
|
|
36
|
+
log.info(`Example: CODEX_HOME=./.codex codex -c model_instructions_file="./AGENTS.md"`);
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
log.info(`Example: codex -c model_instructions_file="./AGENTS.md"`);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/command/setup.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAS,UAAU,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC/D,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAY,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAC3F,OAAO,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AAEtC,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,KAAY;IACzC,MAAM,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;IAC5B,MAAM,GAAG,GAAG,aAAa,EAAE,CAAC;IAE5B,UAAU;IACV,MAAM,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAC7B,MAAM,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;IAC9B,MAAM,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAE7B,0BAA0B;IAC1B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IACzC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAE3C,IAAI,CAAC,CAAC,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC;QAC5D,MAAM,IAAI,KAAK,CAAC,mEAAmE,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IACtG,CAAC;IAED,MAAM,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC;IACrC,MAAM,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC;IAEvC,YAAY;IACZ,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;IAClD,MAAM,SAAS,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;IAC3D,MAAM,OAAO,GAAG,MAAM,kBAAkB,CAAC,CAAC,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IAChE,IAAI,OAAO;QAAE,GAAG,CAAC,EAAE,CAAC,sBAAsB,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;;QACnD,GAAG,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;IAEzD,KAAK;IACL,GAAG,CAAC,EAAE,CAAC,yBAAyB,KAAK,GAAG,CAAC,CAAC;IAC1C,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;IACvC,GAAG,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC;IACzC,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;IAEvC,uBAAuB;IACvB,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,GAAG,CAAC,IAAI,CAAC,6EAA6E,CAAC,CAAC;IAC1F,CAAC;SAAM,CAAC;QACN,GAAG,CAAC,IAAI,CAAC,yDAAyD,CAAC,CAAC;IACtE,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { getTargets } from "../paths.js";
|
|
3
|
+
import { exists } from "../utils/fsx.js";
|
|
4
|
+
import { log } from "../utils/log.js";
|
|
5
|
+
export async function runDoctor(scope) {
|
|
6
|
+
const t = getTargets(scope);
|
|
7
|
+
const checks = [
|
|
8
|
+
["codexHome", t.codexHome],
|
|
9
|
+
["agentsHome", t.agentsHome],
|
|
10
|
+
["stateHome", t.stateHome],
|
|
11
|
+
["AGENTS.md", t.agentsMd],
|
|
12
|
+
["config.toml", path.join(t.codexHome, "config.toml")],
|
|
13
|
+
["prompts dir", path.join(t.codexHome, "prompts")],
|
|
14
|
+
["skills dir", path.join(t.agentsHome, "skills")],
|
|
15
|
+
];
|
|
16
|
+
let ok = true;
|
|
17
|
+
for (const [name, p] of checks) {
|
|
18
|
+
const e = await exists(p);
|
|
19
|
+
if (e)
|
|
20
|
+
log.ok(`${name}: ${p}`);
|
|
21
|
+
else {
|
|
22
|
+
ok = false;
|
|
23
|
+
log.warn(`Missing ${name}: ${p}`);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
if (!ok) {
|
|
27
|
+
log.err(`Some components are missing. Run "mycodex setup --scope ${scope}" first.`);
|
|
28
|
+
process.exitCode = 2;
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
log.ok("All checks passed.");
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=doctor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAS,UAAU,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AAEtC,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,KAAY;IAC1C,MAAM,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;IAE5B,MAAM,MAAM,GAA4B;QACtC,CAAC,WAAW,EAAE,CAAC,CAAC,SAAS,CAAC;QAC1B,CAAC,YAAY,EAAE,CAAC,CAAC,UAAU,CAAC;QAC5B,CAAC,WAAW,EAAE,CAAC,CAAC,SAAS,CAAC;QAC1B,CAAC,WAAW,EAAE,CAAC,CAAC,QAAQ,CAAC;QACzB,CAAC,aAAa,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;QACtD,CAAC,aAAa,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QAClD,CAAC,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;KAClD,CAAC;IAEF,IAAI,EAAE,GAAG,IAAI,CAAC;IACd,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,MAAM,EAAE,CAAC;QAC/B,MAAM,CAAC,GAAG,MAAM,MAAM,CAAC,CAAC,CAAC,CAAC;QAC1B,IAAI,CAAC;YAAE,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,KAAK,CAAC,EAAE,CAAC,CAAC;aAC1B,CAAC;YACJ,EAAE,GAAG,KAAK,CAAC;YACX,GAAG,CAAC,IAAI,CAAC,WAAW,IAAI,KAAK,CAAC,EAAE,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;IAED,IAAI,CAAC,EAAE,EAAE,CAAC;QACR,GAAG,CAAC,GAAG,CAAC,2DAA2D,KAAK,UAAU,CAAC,CAAC;QACpF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC;SAAM,CAAC;QACN,GAAG,CAAC,EAAE,CAAC,oBAAoB,CAAC,CAAC;IAC/B,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { getTargets } from "../paths.js";
|
|
3
|
+
import { ensureDir, exists, writeText } from "../utils/fsx.js";
|
|
4
|
+
import { log } from "../utils/log.js";
|
|
5
|
+
function promptDir(scope) {
|
|
6
|
+
const t = getTargets(scope);
|
|
7
|
+
return path.join(t.codexHome, "prompts");
|
|
8
|
+
}
|
|
9
|
+
export async function runPromptAdd(scope, name) {
|
|
10
|
+
if (!name || !/^[a-z0-9-_]+$/i.test(name)) {
|
|
11
|
+
throw new Error("Prompt name can contain only letters, numbers, '-', and '_'. Example: architect, code-review");
|
|
12
|
+
}
|
|
13
|
+
const dir = promptDir(scope);
|
|
14
|
+
await ensureDir(dir);
|
|
15
|
+
const file = path.join(dir, `${name}.md`);
|
|
16
|
+
if (await exists(file)) {
|
|
17
|
+
log.warn(`Already exists: ${file}`);
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
const content = `# ${name}\n\n- 역할: (여기에 설명)\n- 출력 규칙: (여기에 규칙)\n`;
|
|
21
|
+
await writeText(file, content);
|
|
22
|
+
log.ok(`Created prompt: ${file}`);
|
|
23
|
+
}
|
|
24
|
+
export async function runPromptList(scope) {
|
|
25
|
+
const dir = promptDir(scope);
|
|
26
|
+
if (!(await exists(dir))) {
|
|
27
|
+
log.warn(`Prompt directory does not exist: ${dir}`);
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
const { promises: fs } = await import("node:fs");
|
|
31
|
+
const items = await fs.readdir(dir);
|
|
32
|
+
const md = items.filter((x) => x.endsWith(".md")).sort();
|
|
33
|
+
if (md.length === 0) {
|
|
34
|
+
log.info("No prompts found yet.");
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
for (const f of md)
|
|
38
|
+
console.log(`- ${f.replace(/\.md$/, "")}`);
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=prompt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/commands/prompt.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAS,UAAU,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,EAAY,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACzE,OAAO,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AAEtC,SAAS,SAAS,CAAC,KAAY;IAC7B,MAAM,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;IAC5B,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,KAAY,EAAE,IAAY;IAC3D,IAAI,CAAC,IAAI,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1C,MAAM,IAAI,KAAK,CAAC,8FAA8F,CAAC,CAAC;IAClH,CAAC;IAED,MAAM,GAAG,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;IAC7B,MAAM,SAAS,CAAC,GAAG,CAAC,CAAC;IAErB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,KAAK,CAAC,CAAC;IAC1C,IAAI,MAAM,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;QACvB,GAAG,CAAC,IAAI,CAAC,mBAAmB,IAAI,EAAE,CAAC,CAAC;QACpC,OAAO;IACT,CAAC;IAED,MAAM,OAAO,GAAG,KAAK,IAAI,yCAAyC,CAAC;IACnE,MAAM,SAAS,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC/B,GAAG,CAAC,EAAE,CAAC,mBAAmB,IAAI,EAAE,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,KAAY;IAC9C,MAAM,GAAG,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;IAC7B,IAAI,CAAC,CAAC,MAAM,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;QACzB,GAAG,CAAC,IAAI,CAAC,oCAAoC,GAAG,EAAE,CAAC,CAAC;QACpD,OAAO;IACT,CAAC;IACD,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC;IACjD,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACpC,MAAM,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACzD,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACpB,GAAG,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;QAClC,OAAO;IACT,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,EAAE;QAAE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;AACjE,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { promises as fs } from "node:fs";
|
|
3
|
+
import { getTargets, templatesRoot } from "../paths.js";
|
|
4
|
+
import { copyDir, ensureDir, exists, writeTextIfMissing } from "../utils/fsx.js";
|
|
5
|
+
import { log } from "../utils/log.js";
|
|
6
|
+
export async function runSetup(scope) {
|
|
7
|
+
const t = getTargets(scope);
|
|
8
|
+
const tpl = templatesRoot();
|
|
9
|
+
// 기본 디렉터리
|
|
10
|
+
await ensureDir(t.codexHome);
|
|
11
|
+
await ensureDir(t.agentsHome);
|
|
12
|
+
await ensureDir(t.stateHome);
|
|
13
|
+
// 템플릿 복사: codex/, agents/
|
|
14
|
+
const srcCodex = path.join(tpl, "codex");
|
|
15
|
+
const srcAgents = path.join(tpl, "agents");
|
|
16
|
+
if (!(await exists(srcCodex)) || !(await exists(srcAgents))) {
|
|
17
|
+
throw new Error(`Could not find templates/ directory. Current working directory: ${process.cwd()}`);
|
|
18
|
+
}
|
|
19
|
+
await copyDir(srcCodex, t.codexHome);
|
|
20
|
+
await copyDir(srcAgents, t.agentsHome);
|
|
21
|
+
// AGENTS.md
|
|
22
|
+
const agentsTplPath = path.join(tpl, "AGENTS.md");
|
|
23
|
+
const agentsTpl = await fs.readFile(agentsTplPath, "utf8");
|
|
24
|
+
const created = await writeTextIfMissing(t.agentsMd, agentsTpl);
|
|
25
|
+
if (created)
|
|
26
|
+
log.ok(`Created AGENTS.md: ${t.agentsMd}`);
|
|
27
|
+
else
|
|
28
|
+
log.info(`AGENTS.md already exists: ${t.agentsMd}`);
|
|
29
|
+
// 안내
|
|
30
|
+
log.ok(`Setup complete (scope=${scope})`);
|
|
31
|
+
log.info(`CODEX_HOME: ${t.codexHome}`);
|
|
32
|
+
log.info(`AGENTS_HOME: ${t.agentsHome}`);
|
|
33
|
+
log.info(`STATE_HOME: ${t.stateHome}`);
|
|
34
|
+
// project scope면 실행 힌트
|
|
35
|
+
if (scope === "project") {
|
|
36
|
+
log.info(`Example: CODEX_HOME=./.codex codex -c model_instructions_file="./AGENTS.md"`);
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
log.info(`Example: codex -c model_instructions_file="./AGENTS.md"`);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/commands/setup.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAS,UAAU,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC/D,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAY,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAC3F,OAAO,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AAEtC,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,KAAY;IACzC,MAAM,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;IAC5B,MAAM,GAAG,GAAG,aAAa,EAAE,CAAC;IAE5B,UAAU;IACV,MAAM,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAC7B,MAAM,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;IAC9B,MAAM,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAE7B,0BAA0B;IAC1B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IACzC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAE3C,IAAI,CAAC,CAAC,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC;QAC5D,MAAM,IAAI,KAAK,CAAC,mEAAmE,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IACtG,CAAC;IAED,MAAM,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC;IACrC,MAAM,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC;IAEvC,YAAY;IACZ,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;IAClD,MAAM,SAAS,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;IAC3D,MAAM,OAAO,GAAG,MAAM,kBAAkB,CAAC,CAAC,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IAChE,IAAI,OAAO;QAAE,GAAG,CAAC,EAAE,CAAC,sBAAsB,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;;QACnD,GAAG,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;IAEzD,KAAK;IACL,GAAG,CAAC,EAAE,CAAC,yBAAyB,KAAK,GAAG,CAAC,CAAC;IAC1C,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;IACvC,GAAG,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC;IACzC,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;IAEvC,uBAAuB;IACvB,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,GAAG,CAAC,IAAI,CAAC,6EAA6E,CAAC,CAAC;IAC1F,CAAC;SAAM,CAAC;QACN,GAAG,CAAC,IAAI,CAAC,yDAAyD,CAAC,CAAC;IACtE,CAAC;AACH,CAAC"}
|
package/dist/paths.js
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import os from "node:os";
|
|
3
|
+
export function getTargets(scope, cwd = process.cwd()) {
|
|
4
|
+
if (scope === "project") {
|
|
5
|
+
return {
|
|
6
|
+
codexHome: path.join(cwd, ".codex"),
|
|
7
|
+
agentsHome: path.join(cwd, ".agents"),
|
|
8
|
+
agentsMd: path.join(cwd, "AGENTS.md"),
|
|
9
|
+
stateHome: path.join(cwd, ".myx"),
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
const home = os.homedir();
|
|
13
|
+
return {
|
|
14
|
+
codexHome: path.join(home, ".codex"),
|
|
15
|
+
agentsHome: path.join(home, ".agents"),
|
|
16
|
+
agentsMd: path.join(cwd, "AGENTS.md"),
|
|
17
|
+
stateHome: path.join(home, ".myx"),
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
export function templatesRoot() {
|
|
21
|
+
return path.join(process.cwd(), "templates");
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AAIzB,MAAM,UAAU,UAAU,CAAC,KAAY,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE;IAC1D,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO;YACL,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC;YACnC,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC;YACrC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC;YACrC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC;SAClC,CAAC;IACJ,CAAC;IACD,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC;IAC1B,OAAO;QACL,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC;QACpC,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC;QACtC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC;QACrC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC;KACnC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,WAAW,CAAC,CAAC;AAC/C,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
#;
|
|
3
|
+
Default;
|
|
4
|
+
mycodex;
|
|
5
|
+
configuration;
|
|
6
|
+
example;
|
|
7
|
+
#;
|
|
8
|
+
You;
|
|
9
|
+
can;
|
|
10
|
+
extend;
|
|
11
|
+
this;
|
|
12
|
+
file;
|
|
13
|
+
#;
|
|
14
|
+
Optionally;
|
|
15
|
+
inject;
|
|
16
|
+
AGENTS.md;
|
|
17
|
+
at;
|
|
18
|
+
runtime;
|
|
19
|
+
using: #;
|
|
20
|
+
codex - c;
|
|
21
|
+
model_instructions_file = "./AGENTS.md"[ui];
|
|
22
|
+
notify = true[environment];
|
|
23
|
+
#;
|
|
24
|
+
Add;
|
|
25
|
+
environment - related;
|
|
26
|
+
configurations;
|
|
27
|
+
here;
|
|
28
|
+
if (needed.)
|
|
29
|
+
;
|
|
30
|
+
//# sourceMappingURL=config.toml.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.toml.js","sourceRoot":"","sources":["../../../src/templates/codex/config.toml.ts"],"names":[],"mappings":";AAAA,CAAC,CAAA;AAAC,OAAO,CAAA;AAAC,OAAO,CAAA;AAAC,aAAa,CAAA;AAAC,OAAO,CAAA;AACvC,CAAC,CAAA;AAAC,GAAG,CAAA;AAAC,GAAG,CAAA;AAAC,MAAM,CAAA;AAAC,IAAI,CAAA;AAAC,IAAe,CAAA;AAErC,CAAC,CAAA;AAAC,UAAU,CAAA;AAAC,MAAM,CAAA;AAAC,MAAM,CAAC,EAAE,CAAA;AAAC,EAAE,CAAA;AAAC,OAAO,CAAA;AAAC,KAAK,EAC5C,CAAC,CAAA;AAAC,KAAK,GAAE,CAAC,CAAA;AAAC,uBAAuB,GAAC,aAAa,CAE/C,EAAE,CAAC,CAAA;AACN,MAAM,GAAG,IAAI,CAEV,WAAW,CAAC,CAAA;AACf,CAAC,CAAA;AAAC,GAAG,CAAA;AAAC,WAAW,GAAC,OAAO,CAAA;AAAC,cAAc,CAAA;AAAC,IAAI,CAAA;AAAC,IAAG,MAAM,CAAC;IAAA,CAAA"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { promises as fs } from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
export async function exists(p) {
|
|
4
|
+
try {
|
|
5
|
+
await fs.access(p);
|
|
6
|
+
return true;
|
|
7
|
+
}
|
|
8
|
+
catch {
|
|
9
|
+
return false;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
export async function ensureDir(dir) {
|
|
13
|
+
await fs.mkdir(dir, { recursive: true });
|
|
14
|
+
}
|
|
15
|
+
export async function copyDir(srcDir, destDir) {
|
|
16
|
+
await ensureDir(destDir);
|
|
17
|
+
const entries = await fs.readdir(srcDir, { withFileTypes: true });
|
|
18
|
+
for (const e of entries) {
|
|
19
|
+
const s = path.join(srcDir, e.name);
|
|
20
|
+
const d = path.join(destDir, e.name);
|
|
21
|
+
if (e.isDirectory())
|
|
22
|
+
await copyDir(s, d);
|
|
23
|
+
else if (e.isFile())
|
|
24
|
+
await fs.copyFile(s, d);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
export async function writeTextIfMissing(filePath, content) {
|
|
28
|
+
if (await exists(filePath))
|
|
29
|
+
return false;
|
|
30
|
+
await ensureDir(path.dirname(filePath));
|
|
31
|
+
await fs.writeFile(filePath, content, "utf8");
|
|
32
|
+
return true;
|
|
33
|
+
}
|
|
34
|
+
export async function readText(filePath) {
|
|
35
|
+
return fs.readFile(filePath, "utf8");
|
|
36
|
+
}
|
|
37
|
+
export async function writeText(filePath, content) {
|
|
38
|
+
await ensureDir(path.dirname(filePath));
|
|
39
|
+
await fs.writeFile(filePath, content, "utf8");
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=fsx.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fsx.js","sourceRoot":"","sources":["../../src/utils/fsx.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,CAAS;IACpC,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACnB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,GAAW;IACzC,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,MAAc,EAAE,OAAe;IAC3D,MAAM,SAAS,CAAC,OAAO,CAAC,CAAC;IACzB,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAClE,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QACpC,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QACrC,IAAI,CAAC,CAAC,WAAW,EAAE;YAAE,MAAM,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;aACpC,IAAI,CAAC,CAAC,MAAM,EAAE;YAAE,MAAM,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC/C,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,QAAgB,EAAE,OAAe;IACxE,IAAI,MAAM,MAAM,CAAC,QAAQ,CAAC;QAAE,OAAO,KAAK,CAAC;IACzC,MAAM,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;IACxC,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IAC9C,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,QAAgB;IAC7C,OAAO,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,QAAgB,EAAE,OAAe;IAC/D,MAAM,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;IACxC,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;AAChD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"log.js","sourceRoot":"","sources":["../../src/utils/log.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,GAAG,GAAG;IACjB,IAAI,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,GAAG,EAAE,CAAC;IAChD,EAAE,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,EAAE,CAAC;IAC5C,IAAI,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;IACjD,GAAG,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC;CAChD,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "simple-codex",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"description": "A lightweight orchestration layer for the Codex CLI (MVP)",
|
|
5
|
+
"main": "index.js",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"bin": {
|
|
8
|
+
"simple-codex": "dist/cli.js"
|
|
9
|
+
},
|
|
10
|
+
"scripts": {
|
|
11
|
+
"build": "tsc -p tsconfig.json",
|
|
12
|
+
"dev": "node --enable-source-maps dist/cli.js",
|
|
13
|
+
"prepare": "npm run build"
|
|
14
|
+
},
|
|
15
|
+
"keywords": [],
|
|
16
|
+
"author": "jiyoon",
|
|
17
|
+
"license": "ISC",
|
|
18
|
+
"repository": "https://github.com/yCZwIqY/simple-codex",
|
|
19
|
+
"packageManager": "pnpm@10.13.1",
|
|
20
|
+
"devDependencies": {
|
|
21
|
+
"@types/node": "^25.3.3",
|
|
22
|
+
"typescript": "^5.9.3"
|
|
23
|
+
},
|
|
24
|
+
"dependencies": {
|
|
25
|
+
"commander": "^14.0.3"
|
|
26
|
+
}
|
|
27
|
+
}
|