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 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
@@ -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,7 @@
1
+ export const log = {
2
+ info: (msg) => console.log(`ℹ️ ${msg}`),
3
+ ok: (msg) => console.log(`✅ ${msg}`),
4
+ warn: (msg) => console.warn(`⚠️ ${msg}`),
5
+ err: (msg) => console.error(`❌ ${msg}`),
6
+ };
7
+ //# sourceMappingURL=log.js.map
@@ -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
+ }