@slowcook-ai/cli 0.1.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/LICENSE +21 -0
- package/README.md +88 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +47 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/guard.d.ts +2 -0
- package/dist/commands/guard.d.ts.map +1 -0
- package/dist/commands/guard.js +138 -0
- package/dist/commands/guard.js.map +1 -0
- package/package.json +49 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Amin Azar
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
# @slowcook-ai/cli
|
|
2
|
+
|
|
3
|
+
CLI for the slowcook brewing harness. Installs the `slowcook` binary.
|
|
4
|
+
|
|
5
|
+
## Install
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm i -D @slowcook-ai/cli
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Commands (v0.1)
|
|
12
|
+
|
|
13
|
+
### `slowcook guard`
|
|
14
|
+
|
|
15
|
+
Checks for frozen-path violations between two git refs. Intended for CI.
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
npx slowcook guard --base origin/main --head HEAD
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
**Options:**
|
|
22
|
+
|
|
23
|
+
| Flag | Default | Description |
|
|
24
|
+
|---|---|---|
|
|
25
|
+
| `--base <ref>` | `origin/main` | Base git ref to compare from |
|
|
26
|
+
| `--head <ref>` | `HEAD` | Head git ref to compare to |
|
|
27
|
+
| `--override` | false | Report violations but exit 0 (audit-only) |
|
|
28
|
+
| `--config <path>` | `.brewing/frozen-paths.json` | Config file location |
|
|
29
|
+
|
|
30
|
+
**Exit codes:**
|
|
31
|
+
|
|
32
|
+
- `0` — no violations (or `--override` was set and violations existed)
|
|
33
|
+
- `1` — violations detected
|
|
34
|
+
- `2` — script error (missing config, git failure)
|
|
35
|
+
|
|
36
|
+
**Config file** — a JSON file the consumer project ships, typically at `.brewing/frozen-paths.json`:
|
|
37
|
+
|
|
38
|
+
```json
|
|
39
|
+
{
|
|
40
|
+
"directories": ["tests/", "tests-fixtures/"],
|
|
41
|
+
"files": ["vitest.config.ts", "playwright.config.ts"],
|
|
42
|
+
"partial": {
|
|
43
|
+
"package.json": {
|
|
44
|
+
"frozen_key_paths": ["scripts.test", "scripts.e2e"]
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
- `directories` — prefix match; anything under these paths is frozen.
|
|
51
|
+
- `files` — exact path match.
|
|
52
|
+
- `partial` — for files where only certain JSON keys are frozen (e.g., only `scripts.test*` in `package.json`).
|
|
53
|
+
|
|
54
|
+
### Use in GitHub Actions
|
|
55
|
+
|
|
56
|
+
```yaml
|
|
57
|
+
# .github/workflows/frozen-paths-guard.yml
|
|
58
|
+
name: frozen-paths-guard
|
|
59
|
+
on:
|
|
60
|
+
pull_request:
|
|
61
|
+
types: [opened, synchronize, reopened, labeled, unlabeled]
|
|
62
|
+
|
|
63
|
+
jobs:
|
|
64
|
+
check:
|
|
65
|
+
runs-on: ubuntu-latest
|
|
66
|
+
steps:
|
|
67
|
+
- uses: actions/checkout@v4
|
|
68
|
+
with: { fetch-depth: 0 }
|
|
69
|
+
- uses: actions/setup-node@v4
|
|
70
|
+
with: { node-version: 20 }
|
|
71
|
+
- name: Run guard
|
|
72
|
+
env:
|
|
73
|
+
HAS_OVERRIDE: ${{ contains(github.event.pull_request.labels.*.name, 'override-freeze') }}
|
|
74
|
+
run: |
|
|
75
|
+
ARGS="--base origin/${{ github.base_ref }} --head HEAD"
|
|
76
|
+
if [ "$HAS_OVERRIDE" = "true" ]; then ARGS="$ARGS --override"; fi
|
|
77
|
+
npx --yes @slowcook-ai/cli@latest guard $ARGS
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
The guard emits `::error file=...::` annotations and writes to `$GITHUB_STEP_SUMMARY` when run in GitHub Actions.
|
|
81
|
+
|
|
82
|
+
## Coming in later versions
|
|
83
|
+
|
|
84
|
+
See the [monorepo README](../../README.md) for the roadmap.
|
|
85
|
+
|
|
86
|
+
## License
|
|
87
|
+
|
|
88
|
+
MIT
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { guard } from "./commands/guard.js";
|
|
3
|
+
const VERSION = "0.1.0";
|
|
4
|
+
const USAGE = `
|
|
5
|
+
slowcook — TDD-first agentic development harness
|
|
6
|
+
|
|
7
|
+
Usage:
|
|
8
|
+
slowcook guard --base <ref> --head <ref> [--override] [--config <path>]
|
|
9
|
+
slowcook version
|
|
10
|
+
slowcook help
|
|
11
|
+
|
|
12
|
+
Commands available in ${VERSION}:
|
|
13
|
+
guard Check for frozen-path violations between two git refs.
|
|
14
|
+
|
|
15
|
+
Coming in later versions:
|
|
16
|
+
init, manifest, refine, testgen, brew, review, dashboard
|
|
17
|
+
|
|
18
|
+
Docs: https://github.com/aminazar/slowcook
|
|
19
|
+
`;
|
|
20
|
+
async function main() {
|
|
21
|
+
const args = process.argv.slice(2);
|
|
22
|
+
const command = args[0];
|
|
23
|
+
switch (command) {
|
|
24
|
+
case "guard":
|
|
25
|
+
await guard(args.slice(1));
|
|
26
|
+
return;
|
|
27
|
+
case "version":
|
|
28
|
+
case "--version":
|
|
29
|
+
case "-v":
|
|
30
|
+
console.log(`slowcook ${VERSION}`);
|
|
31
|
+
return;
|
|
32
|
+
case undefined:
|
|
33
|
+
case "help":
|
|
34
|
+
case "--help":
|
|
35
|
+
case "-h":
|
|
36
|
+
console.log(USAGE);
|
|
37
|
+
return;
|
|
38
|
+
default:
|
|
39
|
+
console.error(`Unknown command: ${command}\n${USAGE}`);
|
|
40
|
+
process.exit(64); // EX_USAGE
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
main().catch((err) => {
|
|
44
|
+
console.error(err instanceof Error ? err.stack ?? err.message : String(err));
|
|
45
|
+
process.exit(1);
|
|
46
|
+
});
|
|
47
|
+
//# 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,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAE5C,MAAM,OAAO,GAAG,OAAO,CAAC;AAExB,MAAM,KAAK,GAAG;;;;;;;;wBAQU,OAAO;;;;;;;CAO9B,CAAC;AAEF,KAAK,UAAU,IAAI;IACjB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACnC,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IAExB,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,OAAO;YACV,MAAM,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3B,OAAO;QACT,KAAK,SAAS,CAAC;QACf,KAAK,WAAW,CAAC;QACjB,KAAK,IAAI;YACP,OAAO,CAAC,GAAG,CAAC,YAAY,OAAO,EAAE,CAAC,CAAC;YACnC,OAAO;QACT,KAAK,SAAS,CAAC;QACf,KAAK,MAAM,CAAC;QACZ,KAAK,QAAQ,CAAC;QACd,KAAK,IAAI;YACP,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YACnB,OAAO;QACT;YACE,OAAO,CAAC,KAAK,CAAC,oBAAoB,OAAO,KAAK,KAAK,EAAE,CAAC,CAAC;YACvD,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW;IACjC,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;IAC5B,OAAO,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guard.d.ts","sourceRoot":"","sources":["../../src/commands/guard.ts"],"names":[],"mappings":"AAgFA,wBAAsB,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAsFzD"}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import { readFileSync, appendFileSync } from "node:fs";
|
|
2
|
+
import { execSync } from "node:child_process";
|
|
3
|
+
import { checkFrozenPaths, } from "@slowcook-ai/core";
|
|
4
|
+
function parseArgs(argv) {
|
|
5
|
+
const args = {
|
|
6
|
+
base: "origin/main",
|
|
7
|
+
head: "HEAD",
|
|
8
|
+
override: false,
|
|
9
|
+
config: ".brewing/frozen-paths.json",
|
|
10
|
+
};
|
|
11
|
+
for (let i = 0; i < argv.length; i++) {
|
|
12
|
+
const arg = argv[i];
|
|
13
|
+
const next = argv[i + 1];
|
|
14
|
+
if (arg === "--base" && next) {
|
|
15
|
+
args.base = next;
|
|
16
|
+
i++;
|
|
17
|
+
}
|
|
18
|
+
else if (arg === "--head" && next) {
|
|
19
|
+
args.head = next;
|
|
20
|
+
i++;
|
|
21
|
+
}
|
|
22
|
+
else if (arg === "--override") {
|
|
23
|
+
args.override = true;
|
|
24
|
+
}
|
|
25
|
+
else if (arg === "--config" && next) {
|
|
26
|
+
args.config = next;
|
|
27
|
+
i++;
|
|
28
|
+
}
|
|
29
|
+
else if (arg === "--help" || arg === "-h") {
|
|
30
|
+
printHelp();
|
|
31
|
+
process.exit(0);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
return args;
|
|
35
|
+
}
|
|
36
|
+
function printHelp() {
|
|
37
|
+
console.log(`
|
|
38
|
+
slowcook guard — enforce frozen paths between two git refs
|
|
39
|
+
|
|
40
|
+
Usage:
|
|
41
|
+
slowcook guard [options]
|
|
42
|
+
|
|
43
|
+
Options:
|
|
44
|
+
--base <ref> Base git ref to compare from (default: origin/main)
|
|
45
|
+
--head <ref> Head git ref to compare to (default: HEAD)
|
|
46
|
+
--override Report violations but exit 0 (use via CI label for audit)
|
|
47
|
+
--config <path> Config file path (default: .brewing/frozen-paths.json)
|
|
48
|
+
--help, -h Show this help
|
|
49
|
+
|
|
50
|
+
Exit codes:
|
|
51
|
+
0 = no violations (or --override and there were violations)
|
|
52
|
+
1 = violations
|
|
53
|
+
2 = script error (bad config, git failure)
|
|
54
|
+
`);
|
|
55
|
+
}
|
|
56
|
+
function sh(cmd) {
|
|
57
|
+
return execSync(cmd, { encoding: "utf8" }).trim();
|
|
58
|
+
}
|
|
59
|
+
function appendGhSummary(md) {
|
|
60
|
+
const summary = process.env.GITHUB_STEP_SUMMARY;
|
|
61
|
+
if (!summary)
|
|
62
|
+
return;
|
|
63
|
+
try {
|
|
64
|
+
appendFileSync(summary, md);
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
// best effort — CI output is the source of truth
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
export async function guard(argv) {
|
|
71
|
+
const args = parseArgs(argv);
|
|
72
|
+
// Load config
|
|
73
|
+
let config;
|
|
74
|
+
try {
|
|
75
|
+
config = JSON.parse(readFileSync(args.config, "utf8"));
|
|
76
|
+
}
|
|
77
|
+
catch (e) {
|
|
78
|
+
console.error(`Could not read config at ${args.config}: ${e.message}`);
|
|
79
|
+
process.exit(2);
|
|
80
|
+
}
|
|
81
|
+
// Collect changed files
|
|
82
|
+
let paths;
|
|
83
|
+
try {
|
|
84
|
+
const out = sh(`git diff --name-only ${args.base}...${args.head}`);
|
|
85
|
+
paths = out ? out.split("\n").filter(Boolean) : [];
|
|
86
|
+
}
|
|
87
|
+
catch (e) {
|
|
88
|
+
console.error(`git diff failed between ${args.base} and ${args.head}: ${e.message}`);
|
|
89
|
+
process.exit(2);
|
|
90
|
+
}
|
|
91
|
+
if (paths.length === 0) {
|
|
92
|
+
console.log("No changed files.");
|
|
93
|
+
process.exit(0);
|
|
94
|
+
}
|
|
95
|
+
// For partial-freeze files, fetch base/head content
|
|
96
|
+
const partial = config.partial ?? {};
|
|
97
|
+
const changed = paths.map((path) => {
|
|
98
|
+
const out = { path };
|
|
99
|
+
if (partial[path]) {
|
|
100
|
+
try {
|
|
101
|
+
out.baseContent = sh(`git show ${args.base}:${path}`);
|
|
102
|
+
}
|
|
103
|
+
catch {
|
|
104
|
+
// file didn't exist at base — leave undefined
|
|
105
|
+
}
|
|
106
|
+
try {
|
|
107
|
+
out.headContent = readFileSync(path, "utf8");
|
|
108
|
+
}
|
|
109
|
+
catch {
|
|
110
|
+
// file doesn't exist in working tree (deleted)
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
return out;
|
|
114
|
+
});
|
|
115
|
+
const violations = checkFrozenPaths(changed, config);
|
|
116
|
+
if (violations.length === 0) {
|
|
117
|
+
console.log(`No frozen-path violations in ${paths.length} changed file(s).`);
|
|
118
|
+
appendGhSummary(`### Frozen-path guard\n\n✅ No violations in ${paths.length} changed file(s).\n`);
|
|
119
|
+
process.exit(0);
|
|
120
|
+
}
|
|
121
|
+
const lines = violations.map((v) => `- \`${v.file}\` — ${v.rule}`);
|
|
122
|
+
console.error(`Frozen-path violations (${violations.length}):`);
|
|
123
|
+
console.error(lines.join("\n"));
|
|
124
|
+
const mdHeader = `### Frozen-path guard\n\n`;
|
|
125
|
+
if (args.override) {
|
|
126
|
+
appendGhSummary(`${mdHeader}⚠️ ${violations.length} violation(s), but \`--override\` is set — advisory only.\n\n${lines.join("\n")}\n`);
|
|
127
|
+
console.log("::warning::override flag present — not failing.");
|
|
128
|
+
process.exit(0);
|
|
129
|
+
}
|
|
130
|
+
else {
|
|
131
|
+
appendGhSummary(`${mdHeader}❌ ${violations.length} violation(s).\n\n${lines.join("\n")}\n`);
|
|
132
|
+
for (const v of violations) {
|
|
133
|
+
console.log(`::error file=${v.file}::Frozen-path violation — ${v.rule}`);
|
|
134
|
+
}
|
|
135
|
+
process.exit(1);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=guard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guard.js","sourceRoot":"","sources":["../../src/commands/guard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EACL,gBAAgB,GAIjB,MAAM,mBAAmB,CAAC;AAS3B,SAAS,SAAS,CAAC,IAAc;IAC/B,MAAM,IAAI,GAAc;QACtB,IAAI,EAAE,aAAa;QACnB,IAAI,EAAE,MAAM;QACZ,QAAQ,EAAE,KAAK;QACf,MAAM,EAAE,4BAA4B;KACrC,CAAC;IACF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACzB,IAAI,GAAG,KAAK,QAAQ,IAAI,IAAI,EAAE,CAAC;YAC7B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;YACjB,CAAC,EAAE,CAAC;QACN,CAAC;aAAM,IAAI,GAAG,KAAK,QAAQ,IAAI,IAAI,EAAE,CAAC;YACpC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;YACjB,CAAC,EAAE,CAAC;QACN,CAAC;aAAM,IAAI,GAAG,KAAK,YAAY,EAAE,CAAC;YAChC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACvB,CAAC;aAAM,IAAI,GAAG,KAAK,UAAU,IAAI,IAAI,EAAE,CAAC;YACtC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;YACnB,CAAC,EAAE,CAAC;QACN,CAAC;aAAM,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YAC5C,SAAS,EAAE,CAAC;YACZ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,SAAS;IAChB,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;CAiBb,CAAC,CAAC;AACH,CAAC;AAED,SAAS,EAAE,CAAC,GAAW;IACrB,OAAO,QAAQ,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;AACpD,CAAC;AAED,SAAS,eAAe,CAAC,EAAU;IACjC,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;IAChD,IAAI,CAAC,OAAO;QAAE,OAAO;IACrB,IAAI,CAAC;QACH,cAAc,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IAC9B,CAAC;IAAC,MAAM,CAAC;QACP,iDAAiD;IACnD,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,KAAK,CAAC,IAAc;IACxC,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAE7B,cAAc;IACd,IAAI,MAAyB,CAAC;IAC9B,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACzD,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CACX,4BAA4B,IAAI,CAAC,MAAM,KAAM,CAAW,CAAC,OAAO,EAAE,CACnE,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,wBAAwB;IACxB,IAAI,KAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,EAAE,CAAC,wBAAwB,IAAI,CAAC,IAAI,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QACnE,KAAK,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACrD,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CACX,2BAA2B,IAAI,CAAC,IAAI,QAAQ,IAAI,CAAC,IAAI,KAAM,CAAW,CAAC,OAAO,EAAE,CACjF,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;QACjC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,oDAAoD;IACpD,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;IACrC,MAAM,OAAO,GAAkB,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QAChD,MAAM,GAAG,GAAgB,EAAE,IAAI,EAAE,CAAC;QAClC,IAAI,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YAClB,IAAI,CAAC;gBACH,GAAG,CAAC,WAAW,GAAG,EAAE,CAAC,YAAY,IAAI,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC;YACxD,CAAC;YAAC,MAAM,CAAC;gBACP,8CAA8C;YAChD,CAAC;YACD,IAAI,CAAC;gBACH,GAAG,CAAC,WAAW,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YAC/C,CAAC;YAAC,MAAM,CAAC;gBACP,+CAA+C;YACjD,CAAC;QACH,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC,CAAC,CAAC;IAEH,MAAM,UAAU,GAAG,gBAAgB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAErD,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,OAAO,CAAC,GAAG,CACT,gCAAgC,KAAK,CAAC,MAAM,mBAAmB,CAChE,CAAC;QACF,eAAe,CACb,+CAA+C,KAAK,CAAC,MAAM,qBAAqB,CACjF,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,CAC1B,CAAC,CAAY,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,IAAI,EAAE,CAChD,CAAC;IACF,OAAO,CAAC,KAAK,CAAC,2BAA2B,UAAU,CAAC,MAAM,IAAI,CAAC,CAAC;IAChE,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAEhC,MAAM,QAAQ,GAAG,2BAA2B,CAAC;IAC7C,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAClB,eAAe,CACb,GAAG,QAAQ,MAAM,UAAU,CAAC,MAAM,gEAAgE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CACvH,CAAC;QACF,OAAO,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC;QAC/D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;SAAM,CAAC;QACN,eAAe,CACb,GAAG,QAAQ,KAAK,UAAU,CAAC,MAAM,qBAAqB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAC3E,CAAC;QACF,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;YAC3B,OAAO,CAAC,GAAG,CACT,gBAAgB,CAAC,CAAC,IAAI,6BAA6B,CAAC,CAAC,IAAI,EAAE,CAC5D,CAAC;QACJ,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@slowcook-ai/cli",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "CLI for the slowcook brewing harness",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"author": "aminazar",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "https://github.com/aminazar/slowcook.git",
|
|
10
|
+
"directory": "packages/cli"
|
|
11
|
+
},
|
|
12
|
+
"homepage": "https://github.com/aminazar/slowcook/tree/main/packages/cli#readme",
|
|
13
|
+
"bugs": {
|
|
14
|
+
"url": "https://github.com/aminazar/slowcook/issues"
|
|
15
|
+
},
|
|
16
|
+
"keywords": [
|
|
17
|
+
"tdd",
|
|
18
|
+
"ai",
|
|
19
|
+
"agents",
|
|
20
|
+
"testing",
|
|
21
|
+
"cli",
|
|
22
|
+
"brewing",
|
|
23
|
+
"slowcook"
|
|
24
|
+
],
|
|
25
|
+
"type": "module",
|
|
26
|
+
"bin": {
|
|
27
|
+
"slowcook": "./dist/cli.js"
|
|
28
|
+
},
|
|
29
|
+
"main": "./dist/cli.js",
|
|
30
|
+
"types": "./dist/cli.d.ts",
|
|
31
|
+
"files": [
|
|
32
|
+
"dist",
|
|
33
|
+
"README.md"
|
|
34
|
+
],
|
|
35
|
+
"dependencies": {
|
|
36
|
+
"@slowcook-ai/core": "^0.1.0"
|
|
37
|
+
},
|
|
38
|
+
"publishConfig": {
|
|
39
|
+
"access": "public"
|
|
40
|
+
},
|
|
41
|
+
"engines": {
|
|
42
|
+
"node": ">=20"
|
|
43
|
+
},
|
|
44
|
+
"scripts": {
|
|
45
|
+
"build": "tsc -b",
|
|
46
|
+
"test": "vitest run --passWithNoTests",
|
|
47
|
+
"typecheck": "tsc --noEmit"
|
|
48
|
+
}
|
|
49
|
+
}
|