@sworddut/myclaw 0.1.0 → 0.1.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.md CHANGED
@@ -18,18 +18,27 @@ A CLI coding agent scaffold (TypeScript + oclif).
18
18
  ```bash
19
19
  npm install
20
20
  npm run build
21
- cp .env.example .env
22
- # fill OPENAI_API_KEY in .env
23
- # optional: set model in env
24
- # OPENAI_MODEL=gpt-4o-mini
25
- # optional: for openai-compatible third-party endpoint
26
- # OPENAI_BASE_URL=https://your-endpoint/v1
27
21
  node ./bin/run.js init -f
22
+ # then fill credentials in ~/.myclaw/.env (or $MYCLAW_HOME/.env)
28
23
  ```
29
24
 
30
25
  `OPENAI_BASE_URL` and `.myclawrc.json` `baseURL` both support OpenAI-compatible providers.
31
26
  Model priority: `.myclawrc.json` `model` > `OPENAI_MODEL` > `gpt-4o-mini`.
32
27
 
28
+ ## Global Home Directory
29
+
30
+ - Default home: `~/.myclaw`
31
+ - Override with env: `MYCLAW_HOME=/custom/path`
32
+ - Global env file: `~/.myclaw/.env`
33
+ - Memory file: `~/.myclaw/memory.md`
34
+
35
+ Create your global env:
36
+
37
+ ```bash
38
+ cp ~/.myclaw/.env.example ~/.myclaw/.env
39
+ # edit ~/.myclaw/.env
40
+ ```
41
+
33
42
  ## Commands
34
43
 
35
44
  ```bash
@@ -1,26 +1,34 @@
1
1
  import { Command, Flags } from '@oclif/core';
2
2
  import { mkdir, writeFile } from 'node:fs/promises';
3
3
  import { resolve } from 'node:path';
4
+ import { getMemoryPath, getMyclawHome } from '../config/paths.js';
4
5
  export default class Init extends Command {
5
- static description = 'Initialize myclaw config in current directory';
6
+ static description = 'Initialize local project config and global myclaw home';
6
7
  static flags = {
7
8
  force: Flags.boolean({ char: 'f', description: 'overwrite existing config' })
8
9
  };
9
10
  async run() {
10
11
  const { flags } = await this.parse(Init);
11
12
  const targetDir = process.cwd();
13
+ const homeDir = getMyclawHome();
14
+ const memoryPath = getMemoryPath();
12
15
  const configPath = resolve(targetDir, '.myclawrc.json');
13
- const envPath = resolve(targetDir, '.env.example');
16
+ const globalEnvExamplePath = resolve(homeDir, '.env.example');
14
17
  await mkdir(targetDir, { recursive: true });
18
+ await mkdir(homeDir, { recursive: true });
15
19
  await writeFile(configPath, JSON.stringify({
16
20
  provider: 'openai',
17
21
  model: '',
18
22
  baseURL: '',
19
- workspace: targetDir
23
+ workspace: targetDir,
24
+ homeDir,
25
+ memoryFile: memoryPath
20
26
  }, null, 2) + '\n', { flag: flags.force ? 'w' : 'wx' });
21
- await writeFile(envPath, 'OPENAI_API_KEY=\nOPENAI_MODEL=gpt-4o-mini\nOPENAI_BASE_URL=\nANTHROPIC_API_KEY=\n', { flag: flags.force ? 'w' : 'wx' });
27
+ await writeFile(globalEnvExamplePath, 'OPENAI_API_KEY=\nOPENAI_MODEL=gpt-4o-mini\nOPENAI_BASE_URL=\nANTHROPIC_API_KEY=\n', { flag: flags.force ? 'w' : 'wx' });
28
+ await writeFile(memoryPath, '# myclaw memory\n\n- Add durable preferences and project notes here.\n', { flag: flags.force ? 'w' : 'wx' });
22
29
  this.log(`Created ${configPath}`);
23
- this.log(`Created ${envPath}`);
30
+ this.log(`Created ${globalEnvExamplePath}`);
31
+ this.log(`Created ${memoryPath}`);
24
32
  }
25
33
  }
26
34
  //# sourceMappingURL=init.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,OAAO,EAAE,KAAK,EAAC,MAAM,aAAa,CAAA;AAC1C,OAAO,EAAC,KAAK,EAAE,SAAS,EAAC,MAAM,kBAAkB,CAAA;AACjD,OAAO,EAAC,OAAO,EAAC,MAAM,WAAW,CAAA;AAEjC,MAAM,CAAC,OAAO,OAAO,IAAK,SAAQ,OAAO;IACvC,MAAM,CAAU,WAAW,GAAG,+CAA+C,CAAA;IAE7E,MAAM,CAAU,KAAK,GAAG;QACtB,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,EAAC,IAAI,EAAE,GAAG,EAAE,WAAW,EAAE,2BAA2B,EAAC,CAAC;KAC5E,CAAA;IAEM,KAAK,CAAC,GAAG;QACd,MAAM,EAAC,KAAK,EAAC,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QACtC,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,EAAE,CAAA;QAC/B,MAAM,UAAU,GAAG,OAAO,CAAC,SAAS,EAAE,gBAAgB,CAAC,CAAA;QACvD,MAAM,OAAO,GAAG,OAAO,CAAC,SAAS,EAAE,cAAc,CAAC,CAAA;QAElD,MAAM,KAAK,CAAC,SAAS,EAAE,EAAC,SAAS,EAAE,IAAI,EAAC,CAAC,CAAA;QACzC,MAAM,SAAS,CACb,UAAU,EACV,IAAI,CAAC,SAAS,CACZ;YACE,QAAQ,EAAE,QAAQ;YAClB,KAAK,EAAE,EAAE;YACT,OAAO,EAAE,EAAE;YACX,SAAS,EAAE,SAAS;SACrB,EACD,IAAI,EACJ,CAAC,CACF,GAAG,IAAI,EACR,EAAC,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAC,CACjC,CAAA;QAED,MAAM,SAAS,CACb,OAAO,EACP,mFAAmF,EACnF,EAAC,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAC,CACjC,CAAA;QAED,IAAI,CAAC,GAAG,CAAC,WAAW,UAAU,EAAE,CAAC,CAAA;QACjC,IAAI,CAAC,GAAG,CAAC,WAAW,OAAO,EAAE,CAAC,CAAA;IAChC,CAAC"}
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,OAAO,EAAE,KAAK,EAAC,MAAM,aAAa,CAAA;AAC1C,OAAO,EAAC,KAAK,EAAE,SAAS,EAAC,MAAM,kBAAkB,CAAA;AACjD,OAAO,EAAC,OAAO,EAAC,MAAM,WAAW,CAAA;AACjC,OAAO,EAAC,aAAa,EAAE,aAAa,EAAC,MAAM,oBAAoB,CAAA;AAE/D,MAAM,CAAC,OAAO,OAAO,IAAK,SAAQ,OAAO;IACvC,MAAM,CAAU,WAAW,GAAG,wDAAwD,CAAA;IAEtF,MAAM,CAAU,KAAK,GAAG;QACtB,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,EAAC,IAAI,EAAE,GAAG,EAAE,WAAW,EAAE,2BAA2B,EAAC,CAAC;KAC5E,CAAA;IAEM,KAAK,CAAC,GAAG;QACd,MAAM,EAAC,KAAK,EAAC,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QACtC,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,EAAE,CAAA;QAC/B,MAAM,OAAO,GAAG,aAAa,EAAE,CAAA;QAC/B,MAAM,UAAU,GAAG,aAAa,EAAE,CAAA;QAClC,MAAM,UAAU,GAAG,OAAO,CAAC,SAAS,EAAE,gBAAgB,CAAC,CAAA;QACvD,MAAM,oBAAoB,GAAG,OAAO,CAAC,OAAO,EAAE,cAAc,CAAC,CAAA;QAE7D,MAAM,KAAK,CAAC,SAAS,EAAE,EAAC,SAAS,EAAE,IAAI,EAAC,CAAC,CAAA;QACzC,MAAM,KAAK,CAAC,OAAO,EAAE,EAAC,SAAS,EAAE,IAAI,EAAC,CAAC,CAAA;QACvC,MAAM,SAAS,CACb,UAAU,EACV,IAAI,CAAC,SAAS,CACZ;YACE,QAAQ,EAAE,QAAQ;YAClB,KAAK,EAAE,EAAE;YACT,OAAO,EAAE,EAAE;YACX,SAAS,EAAE,SAAS;YACpB,OAAO;YACP,UAAU,EAAE,UAAU;SACvB,EACD,IAAI,EACJ,CAAC,CACF,GAAG,IAAI,EACR,EAAC,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAC,CACjC,CAAA;QAED,MAAM,SAAS,CACb,oBAAoB,EACpB,mFAAmF,EACnF,EAAC,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAC,CACjC,CAAA;QACD,MAAM,SAAS,CACb,UAAU,EACV,wEAAwE,EACxE,EAAC,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAC,CACjC,CAAA;QAED,IAAI,CAAC,GAAG,CAAC,WAAW,UAAU,EAAE,CAAC,CAAA;QACjC,IAAI,CAAC,GAAG,CAAC,WAAW,oBAAoB,EAAE,CAAC,CAAA;QAC3C,IAAI,CAAC,GAAG,CAAC,WAAW,UAAU,EAAE,CAAC,CAAA;IACnC,CAAC"}
@@ -1,6 +1,8 @@
1
1
  import { cosmiconfig } from 'cosmiconfig';
2
2
  import dotenv from 'dotenv';
3
3
  import { appConfigSchema } from './schema.js';
4
+ import { getGlobalEnvPath } from './paths.js';
5
+ dotenv.config({ path: getGlobalEnvPath() });
4
6
  dotenv.config();
5
7
  export async function loadConfig() {
6
8
  const explorer = cosmiconfig('myclaw');
@@ -1 +1 @@
1
- {"version":3,"file":"load-config.js","sourceRoot":"","sources":["../../src/config/load-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,WAAW,EAAC,MAAM,aAAa,CAAA;AACvC,OAAO,MAAM,MAAM,QAAQ,CAAA;AAC3B,OAAO,EAAC,eAAe,EAAiB,MAAM,aAAa,CAAA;AAE3D,MAAM,CAAC,MAAM,EAAE,CAAA;AAEf,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,MAAM,QAAQ,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAA;IACtC,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,MAAM,EAAE,CAAA;IACtC,OAAO,eAAe,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,IAAI,EAAE,CAAC,CAAA;AACpD,CAAC"}
1
+ {"version":3,"file":"load-config.js","sourceRoot":"","sources":["../../src/config/load-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,WAAW,EAAC,MAAM,aAAa,CAAA;AACvC,OAAO,MAAM,MAAM,QAAQ,CAAA;AAC3B,OAAO,EAAC,eAAe,EAAiB,MAAM,aAAa,CAAA;AAC3D,OAAO,EAAC,gBAAgB,EAAC,MAAM,YAAY,CAAA;AAE3C,MAAM,CAAC,MAAM,CAAC,EAAC,IAAI,EAAE,gBAAgB,EAAE,EAAC,CAAC,CAAA;AACzC,MAAM,CAAC,MAAM,EAAE,CAAA;AAEf,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,MAAM,QAAQ,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAA;IACtC,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,MAAM,EAAE,CAAA;IACtC,OAAO,eAAe,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,IAAI,EAAE,CAAC,CAAA;AACpD,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare function getMyclawHome(): string;
2
+ export declare function getGlobalEnvPath(): string;
3
+ export declare function getMemoryPath(): string;
@@ -0,0 +1,15 @@
1
+ import { homedir } from 'node:os';
2
+ import { resolve } from 'node:path';
3
+ export function getMyclawHome() {
4
+ const custom = process.env.MYCLAW_HOME?.trim();
5
+ if (custom)
6
+ return resolve(custom);
7
+ return resolve(homedir(), '.myclaw');
8
+ }
9
+ export function getGlobalEnvPath() {
10
+ return resolve(getMyclawHome(), '.env');
11
+ }
12
+ export function getMemoryPath() {
13
+ return resolve(getMyclawHome(), 'memory.md');
14
+ }
15
+ //# sourceMappingURL=paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/config/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,OAAO,EAAC,MAAM,SAAS,CAAA;AAC/B,OAAO,EAAC,OAAO,EAAC,MAAM,WAAW,CAAA;AAEjC,MAAM,UAAU,aAAa;IAC3B,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,IAAI,EAAE,CAAA;IAC9C,IAAI,MAAM;QAAE,OAAO,OAAO,CAAC,MAAM,CAAC,CAAA;IAClC,OAAO,OAAO,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAA;AACtC,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,OAAO,OAAO,CAAC,aAAa,EAAE,EAAE,MAAM,CAAC,CAAA;AACzC,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,OAAO,OAAO,CAAC,aAAa,EAAE,EAAE,WAAW,CAAC,CAAA;AAC9C,CAAC"}
@@ -1,18 +1,38 @@
1
1
  import { z } from 'zod';
2
- export declare const appConfigSchema: z.ZodObject<{
2
+ export declare const appConfigSchema: z.ZodEffects<z.ZodObject<{
3
3
  provider: z.ZodDefault<z.ZodEnum<["mock", "openai", "anthropic"]>>;
4
4
  model: z.ZodEffects<z.ZodOptional<z.ZodString>, string | undefined, unknown>;
5
5
  baseURL: z.ZodEffects<z.ZodOptional<z.ZodString>, string | undefined, unknown>;
6
6
  workspace: z.ZodDefault<z.ZodString>;
7
+ homeDir: z.ZodDefault<z.ZodString>;
8
+ memoryFile: z.ZodOptional<z.ZodString>;
7
9
  }, "strip", z.ZodTypeAny, {
8
10
  provider: "mock" | "openai" | "anthropic";
9
11
  workspace: string;
12
+ homeDir: string;
10
13
  model?: string | undefined;
11
14
  baseURL?: string | undefined;
15
+ memoryFile?: string | undefined;
12
16
  }, {
13
17
  provider?: "mock" | "openai" | "anthropic" | undefined;
14
18
  model?: unknown;
15
19
  baseURL?: unknown;
16
20
  workspace?: string | undefined;
21
+ homeDir?: string | undefined;
22
+ memoryFile?: string | undefined;
23
+ }>, {
24
+ memoryFile: string;
25
+ provider: "mock" | "openai" | "anthropic";
26
+ workspace: string;
27
+ homeDir: string;
28
+ model?: string | undefined;
29
+ baseURL?: string | undefined;
30
+ }, {
31
+ provider?: "mock" | "openai" | "anthropic" | undefined;
32
+ model?: unknown;
33
+ baseURL?: unknown;
34
+ workspace?: string | undefined;
35
+ homeDir?: string | undefined;
36
+ memoryFile?: string | undefined;
17
37
  }>;
18
38
  export type AppConfig = z.infer<typeof appConfigSchema>;
@@ -1,8 +1,14 @@
1
1
  import { z } from 'zod';
2
+ import { getMemoryPath, getMyclawHome } from './paths.js';
2
3
  export const appConfigSchema = z.object({
3
4
  provider: z.enum(['mock', 'openai', 'anthropic']).default('openai'),
4
5
  model: z.preprocess((value) => (typeof value === 'string' && value.trim() === '' ? undefined : value), z.string().trim().optional()),
5
6
  baseURL: z.preprocess((value) => (typeof value === 'string' && value.trim() === '' ? undefined : value), z.string().trim().optional()),
6
- workspace: z.string().default(process.cwd())
7
- });
7
+ workspace: z.string().default(process.cwd()),
8
+ homeDir: z.string().default(getMyclawHome()),
9
+ memoryFile: z.string().optional()
10
+ }).transform((config) => ({
11
+ ...config,
12
+ memoryFile: config.memoryFile ?? getMemoryPath()
13
+ }));
8
14
  //# sourceMappingURL=schema.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAA;AAErB,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC;IACtC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC;IACnE,KAAK,EAAE,CAAC,CAAC,UAAU,CACjB,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,EACjF,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE,CAC7B;IACD,OAAO,EAAE,CAAC,CAAC,UAAU,CACnB,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,EACjF,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE,CAC7B;IACD,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;CAC7C,CAAC,CAAA"}
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAA;AACrB,OAAO,EAAC,aAAa,EAAE,aAAa,EAAC,MAAM,YAAY,CAAA;AAEvD,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC;IACtC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC;IACnE,KAAK,EAAE,CAAC,CAAC,UAAU,CACjB,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,EACjF,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE,CAC7B;IACD,OAAO,EAAE,CAAC,CAAC,UAAU,CACnB,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,EACjF,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE,CAC7B;IACD,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;IAC5C,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC;IAC5C,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAClC,CAAC,CAAC,SAAS,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACxB,GAAG,MAAM;IACT,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,aAAa,EAAE;CACjD,CAAC,CAAC,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sworddut/myclaw",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "private": false,
5
5
  "description": "A CLI coding agent inspired by Claude Code",
6
6
  "type": "module",