Skip to content

Commit a9dc4d4

Browse files
committed
refactor: remove MA_COMMAND env var, use --command flag only
Command resolution is now simpler and safer: 1. --command / -c flag 2. Filename pattern (task.claude.md → claude) Removes risk of forgotten env vars causing unexpected behavior.
1 parent 2d6907e commit a9dc4d4

4 files changed

Lines changed: 16 additions & 45 deletions

File tree

README.md

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -99,8 +99,9 @@ bun install && bun link
9999
ma task.claude.md
100100
ma task.gemini.md
101101

102-
# Override command via environment variable
103-
MA_COMMAND=claude ma task.md
102+
# Override command via --command flag
103+
ma task.md --command claude
104+
ma task.md -c gemini
104105

105106
# Pass additional flags to the command
106107
ma task.claude.md --verbose --debug
@@ -115,8 +116,7 @@ ma task.claude.md --verbose --debug
115116
Commands are resolved in this priority order:
116117

117118
1. **CLI flag**: `--command claude` or `-c claude`
118-
2. **Environment variable**: `MA_COMMAND=claude`
119-
3. **Filename pattern**: `task.claude.md``claude`
119+
2. **Filename pattern**: `task.claude.md``claude`
120120

121121
If no command can be resolved, you'll get an error with instructions.
122122

@@ -426,8 +426,7 @@ Usage: ma <file.md> [any flags for the command]
426426
427427
Command resolution:
428428
1. --command flag (e.g., ma task.md --command claude)
429-
2. MA_COMMAND env var (e.g., MA_COMMAND=claude ma task.md)
430-
3. Filename pattern (e.g., task.claude.md → claude)
429+
2. Filename pattern (e.g., task.claude.md → claude)
431430
432431
All frontmatter keys are passed as CLI flags to the command.
433432
Global defaults can be set in ~/.markdown-agent/config.yaml
@@ -438,7 +437,6 @@ Examples:
438437
ma commit.gemini.md
439438
ma task.md --command claude
440439
ma task.md -c gemini
441-
MA_COMMAND=claude ma task.md
442440
443441
Without a file:
444442
ma --setup Configure shell to run .md files directly
@@ -450,7 +448,6 @@ Without a file:
450448

451449
| Variable | Description |
452450
|----------|-------------|
453-
| `MA_COMMAND` | Override command (e.g., `MA_COMMAND=claude ma task.md`) |
454451
| `MA_FORCE_CONTEXT` | Set to `1` to disable the 100k token limit for glob imports |
455452
| `NODE_ENV` | Controls which `.env.[NODE_ENV]` file is loaded (default: `development`) |
456453

src/cli.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,12 +58,13 @@ export function parseCliArgs(argv: string[]): CliArgs {
5858
function printHelp() {
5959
console.log(`
6060
Usage: ma <file.md> [any flags for the command]
61+
ma <file.md> --command <cmd>
6162
ma --setup
6263
ma --logs
6364
ma --help
6465
6566
Command resolution:
66-
1. MA_COMMAND env var (e.g., MA_COMMAND=claude ma task.md)
67+
1. --command flag (e.g., ma task.md --command claude)
6768
2. Filename pattern (e.g., task.claude.md → claude)
6869
6970
All frontmatter keys are passed as CLI flags to the command.
@@ -73,7 +74,8 @@ Examples:
7374
ma task.claude.md -p "print mode"
7475
ma task.claude.md --model opus --verbose
7576
ma commit.gemini.md
76-
MA_COMMAND=claude ma task.md
77+
ma task.md --command claude
78+
ma task.md -c gemini
7779
7880
Config file example (~/.markdown-agent/config.yaml):
7981
commands:

src/command.test.ts

Lines changed: 4 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { expect, test, describe, beforeEach, afterEach } from "bun:test";
1+
import { expect, test, describe } from "bun:test";
22
import { parseCommandFromFilename, resolveCommand, buildArgs, extractPositionalMappings, extractEnvVars } from "./command";
33

44
describe("parseCommandFromFilename", () => {
@@ -25,29 +25,9 @@ describe("parseCommandFromFilename", () => {
2525
});
2626

2727
describe("resolveCommand", () => {
28-
const originalEnv = process.env.MA_COMMAND;
29-
30-
beforeEach(() => {
31-
delete process.env.MA_COMMAND;
32-
});
33-
34-
afterEach(() => {
35-
if (originalEnv !== undefined) {
36-
process.env.MA_COMMAND = originalEnv;
37-
} else {
38-
delete process.env.MA_COMMAND;
39-
}
40-
});
41-
42-
test("MA_COMMAND env var takes priority over filename", () => {
43-
process.env.MA_COMMAND = "gemini";
44-
const result = resolveCommand("task.claude.md");
45-
expect(result).toBe("gemini");
46-
});
47-
48-
test("filename inference works when no env var", () => {
49-
const result = resolveCommand("task.claude.md");
50-
expect(result).toBe("claude");
28+
test("resolves command from filename pattern", () => {
29+
expect(resolveCommand("task.claude.md")).toBe("claude");
30+
expect(resolveCommand("review.gemini.md")).toBe("gemini");
5131
});
5232

5333
test("throws when no command can be resolved", () => {

src/command.ts

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -36,25 +36,17 @@ export function parseCommandFromFilename(filePath: string): string | undefined {
3636
}
3737

3838
/**
39-
* Resolve which command to use
40-
* Priority: MA_COMMAND env var > filename inference
39+
* Resolve command from filename pattern
40+
* Note: --command flag is handled in index.ts before this is called
4141
*/
4242
export function resolveCommand(filePath: string): string {
43-
// 1. MA_COMMAND environment variable
44-
const fromEnv = process.env.MA_COMMAND;
45-
if (fromEnv) {
46-
return fromEnv;
47-
}
48-
49-
// 2. Infer from filename
5043
const fromFilename = parseCommandFromFilename(filePath);
5144
if (fromFilename) {
5245
return fromFilename;
5346
}
5447

55-
// 3. No command specified - error
5648
throw new Error(
57-
"No command specified. Set MA_COMMAND env var, " +
49+
"No command specified. Use --command flag, " +
5850
"or name your file like 'task.claude.md'"
5951
);
6052
}

0 commit comments

Comments
 (0)