infra-kit 0.1.122 → 0.1.123
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/.omc/state/agent-replay-6be1264f-8069-4412-8119-86118ed1943e.jsonl +3 -0
- package/.omc/state/sessions/6be1264f-8069-4412-8119-86118ed1943e/last-tool-error-state.json +7 -0
- package/.omc/state/sessions/6be1264f-8069-4412-8119-86118ed1943e/mission-state.json +53 -0
- package/.omc/state/sessions/6be1264f-8069-4412-8119-86118ed1943e/pre-tool-advisory-throttle.json +22 -0
- package/.omc/state/sessions/6be1264f-8069-4412-8119-86118ed1943e/skill-active-state.json +15 -0
- package/.omc/state/sessions/6be1264f-8069-4412-8119-86118ed1943e/subagent-tracking-state.json +17 -0
- package/.turbo/turbo-test.log +53 -53
- package/dist/boot-SGM5RVLJ.js +2 -0
- package/dist/boot-SGM5RVLJ.js.map +7 -0
- package/dist/{chunk-WSQZ4MOQ.js → chunk-YMXDO43V.js} +2 -2
- package/dist/{chunk-WSQZ4MOQ.js.map → chunk-YMXDO43V.js.map} +1 -1
- package/dist/cli.js +2 -2
- package/dist/mcp.js +1 -1
- package/package.json +1 -1
- package/src/commands/.omc/state/sessions/f09f401f-56c6-42cd-97be-c742c1956468/pre-tool-advisory-throttle.json +14 -0
- package/src/lib/vendor/.omc/state/sessions/f09f401f-56c6-42cd-97be-c742c1956468/pre-tool-advisory-throttle.json +10 -0
- package/src/tui/__tests__/boot.test.tsx +61 -0
- package/src/tui/boot.tsx +15 -0
- package/tsconfig.tsbuildinfo +1 -1
- package/.eslintcache +0 -1
- package/dist/boot-K4QUAFSP.js +0 -2
- package/dist/boot-K4QUAFSP.js.map +0 -7
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
{"t":0,"agent":"a82c3da","agent_type":"code-reviewer","event":"agent_start","parent_mode":"none"}
|
|
2
|
+
{"t":0,"agent":"system","event":"skill_invoked","skill_name":"oh-my-claudecode:ai-slop-cleaner"}
|
|
3
|
+
{"t":0,"agent":"a82c3da","agent_type":"code-reviewer","event":"agent_stop","success":true,"duration_ms":77951}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"tool_name": "Read",
|
|
3
|
+
"tool_input_preview": "{\"file_path\":\"/Users/arthur/projects/infra-kit/apps/infra-kit/cli/src/tui/boot.ts\"}",
|
|
4
|
+
"error": "File does not exist. Note: your current working directory is /Users/arthur/projects/infra-kit/apps/infra-kit/cli. Did you mean boot.tsx?",
|
|
5
|
+
"timestamp": "2026-06-30T09:55:26.608Z",
|
|
6
|
+
"retry_count": 1
|
|
7
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
{
|
|
2
|
+
"updatedAt": "2026-06-30T10:04:41.753Z",
|
|
3
|
+
"missions": [
|
|
4
|
+
{
|
|
5
|
+
"id": "session:6be1264f-8069-4412-8119-86118ed1943e:none",
|
|
6
|
+
"source": "session",
|
|
7
|
+
"name": "none",
|
|
8
|
+
"objective": "Session mission",
|
|
9
|
+
"createdAt": "2026-06-30T10:03:23.802Z",
|
|
10
|
+
"updatedAt": "2026-06-30T10:04:41.753Z",
|
|
11
|
+
"status": "done",
|
|
12
|
+
"workerCount": 1,
|
|
13
|
+
"taskCounts": {
|
|
14
|
+
"total": 1,
|
|
15
|
+
"pending": 0,
|
|
16
|
+
"blocked": 0,
|
|
17
|
+
"inProgress": 0,
|
|
18
|
+
"completed": 1,
|
|
19
|
+
"failed": 0
|
|
20
|
+
},
|
|
21
|
+
"agents": [
|
|
22
|
+
{
|
|
23
|
+
"name": "code-reviewer:a82c3da",
|
|
24
|
+
"role": "code-reviewer",
|
|
25
|
+
"ownership": "a82c3da3e9d5c0fc8",
|
|
26
|
+
"status": "done",
|
|
27
|
+
"currentStep": null,
|
|
28
|
+
"latestUpdate": "completed",
|
|
29
|
+
"completedSummary": null,
|
|
30
|
+
"updatedAt": "2026-06-30T10:04:41.753Z"
|
|
31
|
+
}
|
|
32
|
+
],
|
|
33
|
+
"timeline": [
|
|
34
|
+
{
|
|
35
|
+
"id": "session-start:a82c3da3e9d5c0fc8:2026-06-30T10:03:23.802Z",
|
|
36
|
+
"at": "2026-06-30T10:03:23.802Z",
|
|
37
|
+
"kind": "update",
|
|
38
|
+
"agent": "code-reviewer:a82c3da",
|
|
39
|
+
"detail": "started code-reviewer:a82c3da",
|
|
40
|
+
"sourceKey": "session-start:a82c3da3e9d5c0fc8"
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
"id": "session-stop:a82c3da3e9d5c0fc8:2026-06-30T10:04:41.753Z",
|
|
44
|
+
"at": "2026-06-30T10:04:41.753Z",
|
|
45
|
+
"kind": "completion",
|
|
46
|
+
"agent": "code-reviewer:a82c3da",
|
|
47
|
+
"detail": "completed",
|
|
48
|
+
"sourceKey": "session-stop:a82c3da3e9d5c0fc8"
|
|
49
|
+
}
|
|
50
|
+
]
|
|
51
|
+
}
|
|
52
|
+
]
|
|
53
|
+
}
|
package/.omc/state/sessions/6be1264f-8069-4412-8119-86118ed1943e/pre-tool-advisory-throttle.json
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 1,
|
|
3
|
+
"entries": {
|
|
4
|
+
"807ea7f1ccb2eaca0f30ec70eca1f733c3ac67515a835835214c429521eab9a7": {
|
|
5
|
+
"last_emitted_at_ms": 1782813803664,
|
|
6
|
+
"message": "Spawning agent: oh-my-claudecode:code-reviewer (inherit) | Task: Review the stdin re-ref fix"
|
|
7
|
+
},
|
|
8
|
+
"466399dafa2d20f60587180bad0a07358eb7f2bce724df0ff682f038ad33f5ad": {
|
|
9
|
+
"last_emitted_at_ms": 1782813724701,
|
|
10
|
+
"message": "Read multiple files in parallel when possible for faster analysis."
|
|
11
|
+
},
|
|
12
|
+
"445ed27a3872b681d98190bae61ccb84954e1bc4e140df5370be958dee776b3a": {
|
|
13
|
+
"last_emitted_at_ms": 1782813637095,
|
|
14
|
+
"message": "Verify changes work after editing. Test functionality before marking complete."
|
|
15
|
+
},
|
|
16
|
+
"79a93d4a2f8f50b95f852280616242fee1855dc99a3c75211917f55e72e95fae": {
|
|
17
|
+
"last_emitted_at_ms": 1782813588314,
|
|
18
|
+
"message": "Use parallel execution for independent tasks. Use run_in_background for long operations (npm install, builds, tests)."
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
"updated_at": "2026-06-30T10:03:23.664Z"
|
|
22
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
"active": true,
|
|
3
|
+
"skill_name": "ai-slop-cleaner",
|
|
4
|
+
"session_id": "6be1264f-8069-4412-8119-86118ed1943e",
|
|
5
|
+
"started_at": "2026-06-30T10:03:24.539Z",
|
|
6
|
+
"last_checked_at": "2026-06-30T10:03:24.539Z",
|
|
7
|
+
"reinforcement_count": 0,
|
|
8
|
+
"max_reinforcements": 5,
|
|
9
|
+
"stale_ttl_ms": 900000,
|
|
10
|
+
"_meta": {
|
|
11
|
+
"written_at": "2026-06-30T10:03:24.539Z",
|
|
12
|
+
"mode": "skill-active",
|
|
13
|
+
"sessionId": "6be1264f-8069-4412-8119-86118ed1943e"
|
|
14
|
+
}
|
|
15
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
{
|
|
2
|
+
"agents": [
|
|
3
|
+
{
|
|
4
|
+
"agent_id": "a82c3da3e9d5c0fc8",
|
|
5
|
+
"agent_type": "oh-my-claudecode:code-reviewer",
|
|
6
|
+
"started_at": "2026-06-30T10:03:23.802Z",
|
|
7
|
+
"parent_mode": "none",
|
|
8
|
+
"status": "completed",
|
|
9
|
+
"completed_at": "2026-06-30T10:04:41.753Z",
|
|
10
|
+
"duration_ms": 77951
|
|
11
|
+
}
|
|
12
|
+
],
|
|
13
|
+
"total_spawned": 1,
|
|
14
|
+
"total_completed": 1,
|
|
15
|
+
"total_failed": 0,
|
|
16
|
+
"last_updated": "2026-06-30T10:04:41.855Z"
|
|
17
|
+
}
|
package/.turbo/turbo-test.log
CHANGED
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
[1m[30m[46m RUN [49m[39m[22m [36mv4.1.9 [39m[90m/Users/arthur/projects/infra-kit/apps/infra-kit/cli[39m
|
|
4
4
|
|
|
5
5
|
Sourcemap for "/Users/arthur/Library/pnpm/store/v11/links/@/ink-testing-library/4.0.0/990ef278cd16926ca8f94e3d73dd86da3c7d702a314086dabc7217c3d9b139d2/node_modules/ink-testing-library/build/index.js" points to missing source files
|
|
6
|
-
[32mINFO[39m: [36m created CLAUDE.md[39m
|
|
7
6
|
[32mINFO[39m: [36m✓ Migrated ~/infra-kit.yml → ~/infra-kit.json[39m
|
|
8
7
|
[32mINFO[39m: [36m⚠ Skipped ~/infra-kit.yml — ~/infra-kit.json already exists (remove the stale .yml manually)[39m
|
|
8
|
+
[32mINFO[39m: [36m created CLAUDE.md[39m
|
|
9
9
|
[32mINFO[39m: [36m✓ Migrated ~/infra-kit.yml → ~/infra-kit.json[39m
|
|
10
10
|
[32mINFO[39m: [36m⚠ Skipped ~/.infra-kit/config.yml — invalid config: ✖ Too small: expected array to have >=1 items
|
|
11
11
|
→ at environments[39m
|
|
@@ -14,80 +14,56 @@ Sourcemap for "/Users/arthur/Library/pnpm/store/v11/links/@/ink-testing-library/
|
|
|
14
14
|
: : :
|
|
15
15
|
^
|
|
16
16
|
[39m
|
|
17
|
-
[32mINFO[39m: [
|
|
17
|
+
[32mINFO[39m: [36m✓ Migrated ~/infra-kit.yml → ~/infra-kit.json[39m
|
|
18
|
+
[32mINFO[39m: [36mAgent-instruction files synced (infra-kit 0.1.123)[39m
|
|
18
19
|
[32mINFO[39m: [36m updated CLAUDE.md[39m
|
|
19
|
-
[32mINFO[39m: [36mAgent-instruction files synced (infra-kit 0.1.
|
|
20
|
+
[32mINFO[39m: [36mAgent-instruction files synced (infra-kit 0.1.123)[39m
|
|
20
21
|
[32mINFO[39m: [36m created CLAUDE.md[39m
|
|
21
|
-
[32mINFO[39m: [36mAgent-instruction files synced (infra-kit 0.1.
|
|
22
|
+
[32mINFO[39m: [36mAgent-instruction files synced (infra-kit 0.1.123)[39m
|
|
22
23
|
[32mINFO[39m: [36m unchanged CLAUDE.md[39m
|
|
23
|
-
[32mINFO[39m: [36mAgent-instruction files synced (infra-kit 0.1.
|
|
24
|
+
[32mINFO[39m: [36mAgent-instruction files synced (infra-kit 0.1.123)[39m
|
|
24
25
|
[32mINFO[39m: [36mSkipped agent-instruction files — no infra-kit.json at the repo root[39m
|
|
25
26
|
[32mINFO[39m: [36m updated CLAUDE.md[39m
|
|
26
|
-
[32mINFO[39m: [36mAgent-instruction files synced (infra-kit 0.1.
|
|
27
|
+
[32mINFO[39m: [36mAgent-instruction files synced (infra-kit 0.1.123)[39m
|
|
27
28
|
[32mINFO[39m: [36m updated CLAUDE.md[39m
|
|
28
29
|
[32mINFO[39m: [36m removed AGENTS.md[39m
|
|
29
|
-
[32mINFO[39m: [36mAgent-instruction files synced (infra-kit 0.1.
|
|
30
|
+
[32mINFO[39m: [36mAgent-instruction files synced (infra-kit 0.1.123)[39m
|
|
30
31
|
[32mINFO[39m: [36m updated CLAUDE.md[39m
|
|
31
32
|
[32mINFO[39m: [36m updated AGENTS.md[39m
|
|
32
|
-
[32mINFO[39m: [36mAgent-instruction files synced (infra-kit 0.1.
|
|
33
|
+
[32mINFO[39m: [36mAgent-instruction files synced (infra-kit 0.1.123)[39m
|
|
33
34
|
[32mINFO[39m: [36m created CLAUDE.md[39m
|
|
34
|
-
[32mINFO[39m: [36mAgent-instruction files synced (infra-kit 0.1.
|
|
35
|
+
[32mINFO[39m: [36mAgent-instruction files synced (infra-kit 0.1.123)[39m
|
|
35
36
|
[32mINFO[39m: [36m updated CLAUDE.md[39m
|
|
36
37
|
[32mINFO[39m: [36m removed AGENTS.md[39m
|
|
37
|
-
[32mINFO[39m: [36mAgent-instruction files synced (infra-kit 0.1.
|
|
38
|
+
[32mINFO[39m: [36mAgent-instruction files synced (infra-kit 0.1.123)[39m
|
|
38
39
|
[32mINFO[39m: [36m unchanged CLAUDE.md[39m
|
|
39
|
-
[32mINFO[39m: [36mAgent-instruction files synced (infra-kit 0.1.
|
|
40
|
+
[32mINFO[39m: [36mAgent-instruction files synced (infra-kit 0.1.123)[39m
|
|
40
41
|
[32mINFO[39m: [36m created CLAUDE.md[39m
|
|
41
|
-
[32mINFO[39m: [36mAgent-instruction files synced (infra-kit 0.1.
|
|
42
|
-
[32mINFO[39m: [36m✓ Migrated ~/infra-kit.yml → ~/infra-kit.json[39m
|
|
42
|
+
[32mINFO[39m: [36mAgent-instruction files synced (infra-kit 0.1.123)[39m
|
|
43
43
|
[32mINFO[39m: [36m✓ Migrated ~/.infra-kit/config.yml → ~/.infra-kit/infra-kit.json[39m
|
|
44
|
-
[32mINFO[39m: [36m✓ Migrated ~/.infra-kit/projects/infra-kit-init-migrate-test-AeSyNJ/infra-kit.yml → ~/.infra-kit/projects/infra-kit-init-migrate-test-AeSyNJ/infra-kit.json[39m
|
|
45
|
-
[32mINFO[39m: [36m✓ Normalized ide config in ~/infra-kit.json (removed legacy "mode")[39m
|
|
46
|
-
[32mINFO[39m: [36m✓ Normalized ide config in ~/infra-kit.json (removed legacy "mode")[39m
|
|
47
|
-
[32mINFO[39m: [36m✓ Normalized ide config in ~/.infra-kit/infra-kit.json (removed legacy "mode")[39m
|
|
48
44
|
[32mINFO[39m: [36mFactory config: ~/.infra-kit/vendor.json [ ][39m
|
|
49
|
-
[32mINFO[39m: [36m✓
|
|
45
|
+
[32mINFO[39m: [36m✓ Migrated ~/.infra-kit/projects/infra-kit-init-migrate-test-RIPviP/infra-kit.yml → ~/.infra-kit/projects/infra-kit-init-migrate-test-RIPviP/infra-kit.json[39m
|
|
50
46
|
[32mINFO[39m: [36m
|
|
51
47
|
Not found — run `infra-kit vendor-config --init` to scaffold it.[39m
|
|
52
48
|
[32mINFO[39m: [36mFactory config: ~/.infra-kit/vendor.json [✓][39m
|
|
53
|
-
[32mINFO[39m: [36mworkspaceDir: /tmp/vendor-config-home-
|
|
49
|
+
[32mINFO[39m: [36mworkspaceDir: /tmp/vendor-config-home-KppX0S/projects (resolved: /tmp/vendor-config-home-KppX0S/projects) [✓ exists][39m
|
|
54
50
|
[32mINFO[39m: [36mTargets:[39m
|
|
55
51
|
[32mINFO[39m: [36m [✓] repo-a ~/projects/repo-a[39m
|
|
56
52
|
[32mINFO[39m: [36mFactory config: ~/.infra-kit/vendor.json [✓][39m
|
|
57
|
-
[32mINFO[39m: [36mworkspaceDir: /tmp/vendor-config-home-
|
|
53
|
+
[32mINFO[39m: [36mworkspaceDir: /tmp/vendor-config-home-9OsSfQ/projects (resolved: /tmp/vendor-config-home-9OsSfQ/projects) [✓ exists][39m
|
|
54
|
+
[32mINFO[39m: [36m✓ Normalized ide config in ~/infra-kit.json (removed legacy "mode")[39m
|
|
55
|
+
[32mINFO[39m: [36m✓ Normalized ide config in ~/infra-kit.json (removed legacy "mode")[39m
|
|
58
56
|
[32mINFO[39m: [36mTargets:[39m
|
|
59
57
|
[32mINFO[39m: [36m [ ] missing-repo ~/projects/missing-repo (not found — clone or remove)[39m
|
|
60
58
|
[32mINFO[39m: [36m✓ Created ~/.infra-kit/vendor.json[39m
|
|
61
|
-
[32mINFO[39m: [36m⚠ Skipped normalizing ~/infra-kit.json — Expected property name or '}' in JSON at position 2 (line 1 column 3)[39m
|
|
62
59
|
[32mINFO[39m: [36m Edit `workspaceDir` (placeholder: ~/projects) to point at where your repos live.[39m
|
|
63
60
|
[32mINFO[39m: [36m Add at least one repo name to `targets` before running vendor sync/manifest/diff.[39m
|
|
64
|
-
[32mINFO[39m: [36m✓ Renamed ~/.infra-kit/config.json → ~/.infra-kit/infra-kit.json[39m
|
|
65
|
-
[32mINFO[39m: [36m✓ Renamed ~/.infra-kit/config.example.jsonc → ~/.infra-kit/infra-kit.example.jsonc[39m
|
|
66
|
-
[32mINFO[39m: [36m⚠ Skipped ~/.infra-kit/config.json — ~/.infra-kit/infra-kit.json already exists (remove the stale file manually)[39m
|
|
67
|
-
[32mINFO[39m: [36m✓ Created ~/.infra-kit/vendor.json[39m
|
|
68
|
-
[32mINFO[39m: [36m✓ Renamed ~/.infra-kit/config.example.jsonc → ~/.infra-kit/infra-kit.example.jsonc[39m
|
|
69
|
-
[32mINFO[39m: [36m Seeded 2 target(s) from the source vendor.config.ts.[39m
|
|
70
|
-
[32mINFO[39m: [36m Edit `workspaceDir` (placeholder: ~/projects) to point at where your repos live.[39m
|
|
71
|
-
[32mINFO[39m: [36mFactory config already exists at ~/.infra-kit/vendor.json — leaving it untouched.[39m
|
|
72
|
-
[32mINFO[39m: [36m✓ Migrated ~/.infra-kit/config.yml → ~/.infra-kit/infra-kit.json[39m
|
|
73
|
-
[32mINFO[39m: [36m✓ Migrated ~/.infra-kit/config.yml → ~/.infra-kit/infra-kit.json[39m
|
|
74
|
-
[32mINFO[39m: [36m⚠ Skipped ~/.infra-kit/config.json — ~/.infra-kit/infra-kit.json already exists (remove the stale file manually)[39m
|
|
75
|
-
[32mINFO[39m: [36m
|
|
76
|
-
@x/ok — PASS[39m
|
|
77
|
-
[32mINFO[39m: [36m [PASS] infra-kit.config.ts: present and valid[39m
|
|
78
|
-
[32mINFO[39m: [36m
|
|
79
|
-
✅ All valid (1 checked)[39m
|
|
80
|
-
[32mINFO[39m: [36m
|
|
81
|
-
@x/no-config — FAIL[39m
|
|
82
|
-
[32mINFO[39m: [36m [FAIL] infra-kit.config.ts: infra-kit.config.ts not found at /tmp/audit-cmd-z0KaSi/infra-kit.config.ts[39m
|
|
83
|
-
[32mINFO[39m: [36m
|
|
84
|
-
❌ Audit failed (1 checked)[39m
|
|
85
61
|
[32mINFO[39m: [36m❌ target-repo → vendor/configs (1 change(s)):[39m
|
|
62
|
+
[32mINFO[39m: [36m✓ Normalized ide config in ~/.infra-kit/infra-kit.json (removed legacy "mode")[39m
|
|
86
63
|
[32mINFO[39m: [36m✅ target-repo: copied 1/1 items + manifest[39m
|
|
87
64
|
[32mINFO[39m: [36m >f.st..... configs/a.js[39m
|
|
88
|
-
[32mINFO[39m: [36m🎉 No drift detected.[39m
|
|
89
|
-
[32mINFO[39m: [36m⚠️ target-repo: target does not exist — skipped[39m
|
|
90
65
|
[32mINFO[39m: [36mℹ️ No vendor/ folder found — nothing to check.[39m
|
|
66
|
+
[32mINFO[39m: [36m✓ Normalized ide config in ~/.infra-kit/projects/infra-kit-init-migrate-test-06Dr2v/infra-kit.json (removed legacy "mode")[39m
|
|
91
67
|
[31mERROR[39m: [36m❌ Missing vendor/.sync-manifest.json. Re-run the vendor sync to generate it.[39m
|
|
92
68
|
[32mINFO[39m: [36m✅ vendor/ matches manifest (2 files).[39m
|
|
93
69
|
[31mERROR[39m: [36m❌ vendor/ has drifted from vendor/.sync-manifest.json.[39m
|
|
@@ -102,26 +78,50 @@ Added (not in manifest) (1):[39m
|
|
|
102
78
|
Removed (in manifest, now missing) (1):[39m
|
|
103
79
|
[32mINFO[39m: [36m b.js[39m
|
|
104
80
|
[31mERROR[39m: [36m❌ vendor/.sync-manifest.json has a newer schemaVersion (2) than this CLI supports. Upgrade infra-kit.[39m
|
|
105
|
-
[32mINFO[39m: [
|
|
106
|
-
[32mINFO[39m: [
|
|
107
|
-
[32mINFO[39m: [
|
|
81
|
+
[32mINFO[39m: [36m⚠ Skipped normalizing ~/infra-kit.json — Expected property name or '}' in JSON at position 2 (line 1 column 3)[39m
|
|
82
|
+
[32mINFO[39m: [36m✓ Renamed ~/.infra-kit/config.json → ~/.infra-kit/infra-kit.json[39m
|
|
83
|
+
[32mINFO[39m: [36m✓ Renamed ~/.infra-kit/config.example.jsonc → ~/.infra-kit/infra-kit.example.jsonc[39m
|
|
84
|
+
[32mINFO[39m: [36m✓ Created ~/.infra-kit/vendor.json[39m
|
|
85
|
+
[32mINFO[39m: [36m⚠ Skipped ~/.infra-kit/config.json — ~/.infra-kit/infra-kit.json already exists (remove the stale file manually)[39m
|
|
86
|
+
[32mINFO[39m: [36m🎉 No drift detected.[39m
|
|
87
|
+
[32mINFO[39m: [36m⚠️ target-repo: target does not exist — skipped[39m
|
|
88
|
+
[32mINFO[39m: [36m Seeded 2 target(s) from the source vendor.config.ts.[39m
|
|
89
|
+
[32mINFO[39m: [36m Edit `workspaceDir` (placeholder: ~/projects) to point at where your repos live.[39m
|
|
90
|
+
[32mINFO[39m: [36mFactory config already exists at ~/.infra-kit/vendor.json — leaving it untouched.[39m
|
|
91
|
+
[32mINFO[39m: [36m✓ Renamed ~/.infra-kit/config.example.jsonc → ~/.infra-kit/infra-kit.example.jsonc[39m
|
|
92
|
+
[32mINFO[39m: [36m✓ Migrated ~/.infra-kit/config.yml → ~/.infra-kit/infra-kit.json[39m
|
|
93
|
+
[32mINFO[39m: [36m✓ Migrated ~/.infra-kit/config.yml → ~/.infra-kit/infra-kit.json[39m
|
|
94
|
+
[32mINFO[39m: [36m⚠ Skipped ~/.infra-kit/config.json — ~/.infra-kit/infra-kit.json already exists (remove the stale file manually)[39m
|
|
108
95
|
[32mINFO[39m: [36m✅ vendor/ matches manifest (1 files).[39m
|
|
109
96
|
[31mERROR[39m: [36m❌ vendor/ has drifted from vendor/.sync-manifest.json.[39m
|
|
110
97
|
[31mERROR[39m: [36m These files are mirrored from the source repo — edit them upstream, not here.[39m
|
|
111
98
|
[32mINFO[39m: [36m
|
|
112
99
|
Modified (1):[39m
|
|
113
100
|
[32mINFO[39m: [36m configs/a.js[39m
|
|
101
|
+
[32mINFO[39m: [36m
|
|
102
|
+
@x/ok — PASS[39m
|
|
103
|
+
[32mINFO[39m: [36m [PASS] infra-kit.config.ts: present and valid[39m
|
|
104
|
+
[32mINFO[39m: [36m
|
|
105
|
+
✅ All valid (1 checked)[39m
|
|
106
|
+
[32mINFO[39m: [36m
|
|
107
|
+
@x/no-config — FAIL[39m
|
|
108
|
+
[32mINFO[39m: [36m [FAIL] infra-kit.config.ts: infra-kit.config.ts not found at /tmp/audit-cmd-t9QrB1/infra-kit.config.ts[39m
|
|
109
|
+
[32mINFO[39m: [36m
|
|
110
|
+
❌ Audit failed (1 checked)[39m
|
|
111
|
+
[32mINFO[39m: [36mWrote user-global config to /tmp/seed-user-global-test-brMrVb/.infra-kit/infra-kit.json (see the sibling .example.jsonc files for reference)[39m
|
|
114
112
|
[32mINFO[39m: [36m created CLAUDE.md[39m
|
|
115
|
-
[32mINFO[39m: [
|
|
113
|
+
[32mINFO[39m: [36mWrote user-global config to /tmp/seed-user-global-test-PBvfJF/.infra-kit/infra-kit.json (see the sibling .example.jsonc files for reference)[39m
|
|
114
|
+
[32mINFO[39m: [36mUser-global config already present at /tmp/seed-user-global-test-knc6t9/.infra-kit/infra-kit.json (refreshed reference examples)[39m
|
|
115
|
+
[32mINFO[39m: [36mAgent-instruction files synced (infra-kit 0.1.123)[39m
|
|
116
116
|
[32mINFO[39m: [36m created CLAUDE.md[39m
|
|
117
|
-
[32mINFO[39m: [36mAgent-instruction files synced (infra-kit 0.1.
|
|
117
|
+
[32mINFO[39m: [36mAgent-instruction files synced (infra-kit 0.1.123)[39m
|
|
118
118
|
[33mWARN[39m: [36m⚠️ Failed to reopen cmux workspace for release/v1.48.0[39m
|
|
119
119
|
[35mtitle[39m: "hulyo-monorepo 1.48.0"
|
|
120
120
|
error: {}
|
|
121
121
|
|
|
122
|
-
[2m Test Files [22m [1m[
|
|
123
|
-
[2m Tests [22m [1m[
|
|
124
|
-
[2m Start at [22m
|
|
125
|
-
[2m Duration [22m 1.
|
|
122
|
+
[2m Test Files [22m [1m[32m58 passed[39m[22m[90m (58)[39m
|
|
123
|
+
[2m Tests [22m [1m[32m536 passed[39m[22m[90m (536)[39m
|
|
124
|
+
[2m Start at [22m 13:05:13
|
|
125
|
+
[2m Duration [22m 1.72s[2m (transform 4.15s, setup 637ms, import 9.34s, tests 1.95s, environment 7ms)[22m
|
|
126
126
|
|
|
127
127
|
[?25h
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{render as M}from"ink";import B from"node:process";import{Box as p,Text as o,useApp as v,useInput as A}from"ink";import{useEffect as b,useMemo as D,useState as C}from"react";import{jsx as r,jsxs as f}from"react/jsx-runtime";var y=x=>{let{items:l,onSelect:i,onCancel:g}=x,s={hint:"Select a command \u2014 type to filter, \u2191\u2193 to move, Enter to run, Esc to cancel",prompt:"\u276F ",empty:"No matching commands"},h=24,{exit:P}=v(),[m,T]=C(""),[E,a]=C(0),[u,w]=C(!1);b(()=>{u&&P()},[u,P]);let c=D(()=>{let e=m.trim().toLowerCase();return e?l.filter(t=>`${t.name} ${t.description}`.toLowerCase().includes(e)):l},[l,m]),d=Math.min(E,Math.max(0,c.length-1));if(A((e,t)=>{if(!u){if(t.escape||t.ctrl&&e==="c"){g(),w(!0);return}if(t.return){let n=c[d];n&&(i(n.name),w(!0));return}if(t.upArrow){let n=c.length;n>0&&a((d-1+n)%n);return}if(t.downArrow){let n=c.length;n>0&&a((d+1)%n);return}if(t.backspace||t.delete){T(m.slice(0,-1)),a(0);return}e&&!t.ctrl&&!t.meta&&(T(m+e),a(0))}}),u)return null;let S="";return f(p,{flexDirection:"column",children:[r(o,{dimColor:!0,children:s.hint}),f(p,{children:[r(o,{color:"cyan",children:s.prompt}),r(o,{children:m})]}),r(p,{flexDirection:"column",marginTop:1,children:c.length===0?r(o,{dimColor:!0,children:s.empty}):c.map((e,t)=>{let n=t===d,I=e.group!==S;return S=e.group,f(p,{flexDirection:"column",children:[I&&t>0?r(o,{children:" "}):null,I?r(o,{color:"yellow",children:`\u2014 ${e.group} \u2014`}):null,f(o,{color:n?"green":void 0,children:[n?"\u203A ":" ",e.name.padEnd(h)," ",r(o,{dimColor:!0,children:e.description})]})]},e.name)})})]})};import{jsx as $}from"react/jsx-runtime";var R=async x=>new Promise(l=>{let i=null,{waitUntilExit:g}=M($(y,{items:x,onSelect:h=>{i=h},onCancel:()=>{i=null}}),{stdout:B.stderr}),s=()=>{B.stdin.ref()};g().then(()=>{s(),l(i)}).catch(()=>{s(),l(null)})});export{R as runCommandPalette};
|
|
2
|
+
//# sourceMappingURL=boot-SGM5RVLJ.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/tui/boot.tsx", "../src/tui/screens/command-palette.tsx"],
|
|
4
|
+
"sourcesContent": ["import { render } from 'ink'\nimport process from 'node:process'\n\nimport { CommandPalette } from './screens/command-palette'\nimport type { PaletteItem } from './types'\n\n/**\n * Entry point for the Ink TUI. This module (and everything under `src/tui/`) is\n * the ONLY place allowed to import `ink`/`react`; it is reached exclusively via a\n * dynamic `await import('src/tui/boot')` from the TTY branch of entry/cli.ts, so\n * React never loads on the MCP / `--json` / non-TTY paths. Build splitting keeps\n * it in a separate lazy chunk (see scripts/build.js).\n */\n\n/**\n * Render the command palette and resolve to the chosen command name, or `null`\n * if the user cancels. Frames are written to stderr so stdout stays clean for\n * the command that runs afterwards (mirrors the previous Inquirer menu).\n */\nexport const runCommandPalette = async (items: PaletteItem[]): Promise<string | null> => {\n return new Promise((resolve) => {\n let selected: string | null = null\n\n const { waitUntilExit } = render(\n <CommandPalette\n items={items}\n onSelect={(name) => {\n selected = name\n }}\n onCancel={() => {\n selected = null\n }}\n />,\n { stdout: process.stderr as unknown as NodeJS.WriteStream },\n )\n\n // Ink `unref()`s process.stdin when it tears down raw mode on exit. That ref\n // is process-wide and never restored, so the next consumer of stdin \u2014 the\n // Inquirer prompt the selected command opens (e.g. the worktrees-remove\n // checkbox) \u2014 reads from an unref'd handle that no longer keeps the event\n // loop alive. Once the command's git/gh subprocesses settle, the loop drains\n // mid-prompt, Node flags entry/cli.ts's top-level await as unsettled, and the\n // process exits with code 13 (the prompt dies on arrival). Re-ref stdin so it\n // holds the loop while a prompt is reading; an idle ref'd stdin does not block\n // exit, so non-interactive follow-up commands still terminate normally.\n const restoreStdinRef = () => {\n process.stdin.ref()\n }\n\n waitUntilExit()\n .then(() => {\n restoreStdinRef()\n resolve(selected)\n })\n .catch(() => {\n restoreStdinRef()\n resolve(null)\n })\n })\n}\n", "import { Box, Text, useApp, useInput } from 'ink'\nimport { useEffect, useMemo, useState } from 'react'\n\nimport type { PaletteItem } from '../types'\n\ninterface CommandPaletteProps {\n items: PaletteItem[]\n /** Called with the chosen command name; the app then exits. */\n onSelect: (name: string) => void\n /** Called when the user cancels (Esc / Ctrl-C); the app then exits. */\n onCancel: () => void\n}\n\n/**\n * Fuzzy-ish command picker rendered with Ink. Pure presentation: it receives a\n * flat list of commands (already grouped/ordered by the catalog) and returns the\n * selected name. It never executes anything \u2014 the caller runs the command via\n * the existing Commander path.\n */\nexport const CommandPalette = (props: CommandPaletteProps) => {\n const { items, onSelect, onCancel } = props\n\n const T = {\n hint: 'Select a command \u2014 type to filter, \u2191\u2193 to move, Enter to run, Esc to cancel',\n prompt: '\u276F ',\n empty: 'No matching commands',\n }\n const nameWidth = 24\n\n const { exit } = useApp()\n const [query, setQuery] = useState('')\n const [index, setIndex] = useState(0)\n // When set, the component renders `null` for one frame so Ink erases the list\n // before unmount commits its final frame (Ink's `log.done()` would otherwise\n // freeze the last drawn frame \u2014 the command list \u2014 into the scrollback).\n const [submitted, setSubmitted] = useState(false)\n\n // Exit only after the empty frame has committed, so the list is wiped first.\n useEffect(() => {\n if (submitted) {\n exit()\n }\n }, [submitted, exit])\n\n const filtered = useMemo(() => {\n const q = query.trim().toLowerCase()\n\n if (!q) {\n return items\n }\n\n return items.filter((item) => {\n return `${item.name} ${item.description}`.toLowerCase().includes(q)\n })\n }, [items, query])\n\n const activeIndex = Math.min(index, Math.max(0, filtered.length - 1))\n\n useInput((input, key) => {\n if (submitted) {\n return\n }\n\n if (key.escape || (key.ctrl && input === 'c')) {\n onCancel()\n setSubmitted(true)\n\n return\n }\n\n if (key.return) {\n const selected = filtered[activeIndex]\n\n if (selected) {\n onSelect(selected.name)\n setSubmitted(true)\n }\n\n return\n }\n\n if (key.upArrow) {\n const n = filtered.length\n\n // Wrap to the bottom when stepping up past the first item. The `+ n`\n // sidesteps JS negative modulo (e.g. -1 % 5 === -1, not 4).\n if (n > 0) {\n setIndex((activeIndex - 1 + n) % n)\n }\n\n return\n }\n\n if (key.downArrow) {\n const n = filtered.length\n\n // Wrap to the top when stepping down past the last item.\n if (n > 0) {\n setIndex((activeIndex + 1) % n)\n }\n\n return\n }\n\n if (key.backspace || key.delete) {\n setQuery(query.slice(0, -1))\n setIndex(0)\n\n return\n }\n\n // Printable character: append to the filter.\n if (input && !key.ctrl && !key.meta) {\n setQuery(query + input)\n setIndex(0)\n }\n })\n\n // Final frame: render nothing so Ink erases the list on its way out.\n if (submitted) {\n return null\n }\n\n let lastGroup = ''\n\n return (\n <Box flexDirection=\"column\">\n <Text dimColor>{T.hint}</Text>\n <Box>\n <Text color=\"cyan\">{T.prompt}</Text>\n <Text>{query}</Text>\n </Box>\n <Box flexDirection=\"column\" marginTop={1}>\n {filtered.length === 0 ? (\n <Text dimColor>{T.empty}</Text>\n ) : (\n filtered.map((item, position) => {\n const isActive = position === activeIndex\n const showGroup = item.group !== lastGroup\n\n lastGroup = item.group\n\n return (\n <Box flexDirection=\"column\" key={item.name}>\n {/* Blank line between groups (not before the very first group). */}\n {showGroup && position > 0 ? <Text> </Text> : null}\n {showGroup ? <Text color=\"yellow\">{`\u2014 ${item.group} \u2014`}</Text> : null}\n <Text color={isActive ? 'green' : undefined}>\n {isActive ? '\u203A ' : ' '}\n {item.name.padEnd(nameWidth)} <Text dimColor>{item.description}</Text>\n </Text>\n </Box>\n )\n })\n )}\n </Box>\n </Box>\n )\n}\n"],
|
|
5
|
+
"mappings": "AAAA,OAAS,UAAAA,MAAc,MACvB,OAAOC,MAAa,eCDpB,OAAS,OAAAC,EAAK,QAAAC,EAAM,UAAAC,EAAQ,YAAAC,MAAgB,MAC5C,OAAS,aAAAC,EAAW,WAAAC,EAAS,YAAAC,MAAgB,QA8HvC,cAAAC,EACA,QAAAC,MADA,oBA5GC,IAAMC,EAAkBC,GAA+B,CAC5D,GAAM,CAAE,MAAAC,EAAO,SAAAC,EAAU,SAAAC,CAAS,EAAIH,EAEhCI,EAAI,CACR,KAAM,4FACN,OAAQ,UACR,MAAO,sBACT,EACMC,EAAY,GAEZ,CAAE,KAAAC,CAAK,EAAId,EAAO,EAClB,CAACe,EAAOC,CAAQ,EAAIZ,EAAS,EAAE,EAC/B,CAACa,EAAOC,CAAQ,EAAId,EAAS,CAAC,EAI9B,CAACe,EAAWC,CAAY,EAAIhB,EAAS,EAAK,EAGhDF,EAAU,IAAM,CACViB,GACFL,EAAK,CAET,EAAG,CAACK,EAAWL,CAAI,CAAC,EAEpB,IAAMO,EAAWlB,EAAQ,IAAM,CAC7B,IAAMmB,EAAIP,EAAM,KAAK,EAAE,YAAY,EAEnC,OAAKO,EAIEb,EAAM,OAAQc,GACZ,GAAGA,EAAK,IAAI,IAAIA,EAAK,WAAW,GAAG,YAAY,EAAE,SAASD,CAAC,CACnE,EALQb,CAMX,EAAG,CAACA,EAAOM,CAAK,CAAC,EAEXS,EAAc,KAAK,IAAIP,EAAO,KAAK,IAAI,EAAGI,EAAS,OAAS,CAAC,CAAC,EA+DpE,GA7DApB,EAAS,CAACwB,EAAOC,IAAQ,CACvB,GAAI,CAAAP,EAIJ,IAAIO,EAAI,QAAWA,EAAI,MAAQD,IAAU,IAAM,CAC7Cd,EAAS,EACTS,EAAa,EAAI,EAEjB,MACF,CAEA,GAAIM,EAAI,OAAQ,CACd,IAAMC,EAAWN,EAASG,CAAW,EAEjCG,IACFjB,EAASiB,EAAS,IAAI,EACtBP,EAAa,EAAI,GAGnB,MACF,CAEA,GAAIM,EAAI,QAAS,CACf,IAAM,EAAIL,EAAS,OAIf,EAAI,GACNH,GAAUM,EAAc,EAAI,GAAK,CAAC,EAGpC,MACF,CAEA,GAAIE,EAAI,UAAW,CACjB,IAAM,EAAIL,EAAS,OAGf,EAAI,GACNH,GAAUM,EAAc,GAAK,CAAC,EAGhC,MACF,CAEA,GAAIE,EAAI,WAAaA,EAAI,OAAQ,CAC/BV,EAASD,EAAM,MAAM,EAAG,EAAE,CAAC,EAC3BG,EAAS,CAAC,EAEV,MACF,CAGIO,GAAS,CAACC,EAAI,MAAQ,CAACA,EAAI,OAC7BV,EAASD,EAAQU,CAAK,EACtBP,EAAS,CAAC,GAEd,CAAC,EAGGC,EACF,OAAO,KAGT,IAAIS,EAAY,GAEhB,OACEtB,EAACR,EAAA,CAAI,cAAc,SACjB,UAAAO,EAACN,EAAA,CAAK,SAAQ,GAAE,SAAAa,EAAE,KAAK,EACvBN,EAACR,EAAA,CACC,UAAAO,EAACN,EAAA,CAAK,MAAM,OAAQ,SAAAa,EAAE,OAAO,EAC7BP,EAACN,EAAA,CAAM,SAAAgB,EAAM,GACf,EACAV,EAACP,EAAA,CAAI,cAAc,SAAS,UAAW,EACpC,SAAAuB,EAAS,SAAW,EACnBhB,EAACN,EAAA,CAAK,SAAQ,GAAE,SAAAa,EAAE,MAAM,EAExBS,EAAS,IAAI,CAACE,EAAMM,IAAa,CAC/B,IAAMC,EAAWD,IAAaL,EACxBO,EAAYR,EAAK,QAAUK,EAEjC,OAAAA,EAAYL,EAAK,MAGfjB,EAACR,EAAA,CAAI,cAAc,SAEhB,UAAAiC,GAAaF,EAAW,EAAIxB,EAACN,EAAA,CAAK,aAAC,EAAU,KAC7CgC,EAAY1B,EAACN,EAAA,CAAK,MAAM,SAAU,mBAAKwB,EAAK,KAAK,UAAK,EAAU,KACjEjB,EAACP,EAAA,CAAK,MAAO+B,EAAW,QAAU,OAC/B,UAAAA,EAAW,UAAO,KAClBP,EAAK,KAAK,OAAOV,CAAS,EAAE,IAACR,EAACN,EAAA,CAAK,SAAQ,GAAE,SAAAwB,EAAK,YAAY,GACjE,IAP+BA,EAAK,IAQtC,CAEJ,CAAC,EAEL,GACF,CAEJ,EDtIM,cAAAS,MAAA,oBALC,IAAMC,EAAoB,MAAOC,GAC/B,IAAI,QAASC,GAAY,CAC9B,IAAIC,EAA0B,KAExB,CAAE,cAAAC,CAAc,EAAIC,EACxBN,EAACO,EAAA,CACC,MAAOL,EACP,SAAWM,GAAS,CAClBJ,EAAWI,CACb,EACA,SAAU,IAAM,CACdJ,EAAW,IACb,EACF,EACA,CAAE,OAAQK,EAAQ,MAAwC,CAC5D,EAWMC,EAAkB,IAAM,CAC5BD,EAAQ,MAAM,IAAI,CACpB,EAEAJ,EAAc,EACX,KAAK,IAAM,CACVK,EAAgB,EAChBP,EAAQC,CAAQ,CAClB,CAAC,EACA,MAAM,IAAM,CACXM,EAAgB,EAChBP,EAAQ,IAAI,CACd,CAAC,CACL,CAAC",
|
|
6
|
+
"names": ["render", "process", "Box", "Text", "useApp", "useInput", "useEffect", "useMemo", "useState", "jsx", "jsxs", "CommandPalette", "props", "items", "onSelect", "onCancel", "T", "nameWidth", "exit", "query", "setQuery", "index", "setIndex", "submitted", "setSubmitted", "filtered", "q", "item", "activeIndex", "input", "key", "selected", "lastGroup", "position", "isActive", "showGroup", "jsx", "runCommandPalette", "items", "resolve", "selected", "waitUntilExit", "render", "CommandPalette", "name", "process", "restoreStdinRef"]
|
|
7
|
+
}
|
|
@@ -7,7 +7,7 @@ ${r}
|
|
|
7
7
|
${t}`,gr=({content:e,body:r,startMarker:t,endMarker:o,placement:n="replace-in-place"})=>{let s=$n(t,r,o),i=He(e,t,o);if(n==="replace-in-place"&&i){let p=e.indexOf(t),d=e.indexOf(o)+o.length;return e.slice(0,p)+s+e.slice(d)}let c=(i?ve(e,t,o)??e:e).replace(/\n+$/,"");return c.length>0?`${c}
|
|
8
8
|
${s}
|
|
9
9
|
`:`${s}
|
|
10
|
-
`};import O from"node:fs";import vr from"node:path";import Kt from"node:fs/promises";import Ni from"node:os";import hr from"node:path";import{z as y}from"zod";var In="infra-kit.json",Yr=".infra-kit",_i="infra-kit.json",Oi="projects",Fi=y.object({provider:y.literal("doppler"),config:y.object({name:y.string().min(1)})}),Di=y.discriminatedUnion("provider",[Fi]),ji=y.object({workspaceConfigPath:y.string().min(1)}),Mi=y.object({provider:y.literal("cursor"),config:ji}),Li=y.object({}),Wi=y.object({provider:y.literal("zed"),config:Li}),Pn=y.discriminatedUnion("provider",[Mi,Wi]),Vi=y.union([Pn,y.array(Pn).min(1)]),Bi=y.object({provider:y.literal("jira"),config:y.object({baseUrl:y.string().url(),projectId:y.number().int().positive()})}),Ji=y.discriminatedUnion("provider",[Bi]),Ki=["two-columns","three-pane"],Gi=y.object({layout:y.enum(Ki).optional()}),zi=y.object({openInGithubDesktop:y.boolean().optional(),openInCmux:y.boolean().optional(),cmux:Gi.optional()}),Ui=y.object({trigger:y.enum(["shell-startup","cli-invocation"]),config:y.string().min(1)}).strict(),Sn=y.object({environments:y.array(y.string().min(1)).min(1),envManagement:Di,ide:Vi.optional(),taskManager:Ji.optional(),worktrees:zi.optional(),envAutoLoad:Ui.optional()}),Qr=Sn.superRefine((e,r)=>{if(!Array.isArray(e.ide))return;let t=new Set;for(let o of e.ide){if(t.has(o.provider)){r.addIssue({code:"custom",message:"each IDE provider may appear at most once",path:["ide"]});return}t.add(o.provider)}}),wr=Sn.partial(),K=e=>{let r=e.ide;return r?Array.isArray(r)?r:[r]:[]},qi="two-columns",Gt=e=>e.worktrees?.cmux?.layout??qi,Ze=null,W=async()=>{let e=await k(),r=hr.basename(e),t=hr.join(Ni.homedir(),Yr);return{main:hr.join(e,In),userGlobal:hr.join(t,_i),userProject:hr.join(t,Oi,r,In),projectName:r}},x=async()=>{let e=await W(),r;try{r=await Kt.stat(e.main)}catch{Ze=null;let c=e.main.replace(/\.json$/,".yml");throw await Jt(c)?new Error(`infra-kit.json not found at ${e.main}. A legacy infra-kit.yml exists \u2014 run \`infra-kit init\` to convert it.`):new Error(`infra-kit.json not found at ${e.main}`)}let[t,o]=await Promise.all([Jt(e.userGlobal),Jt(e.userProject)]),n={main:Number(r.mtimeMs),userGlobal:t?Number(t.mtimeMs):null,userProject:o?Number(o.mtimeMs):null};if(Ze&&Zi(Ze.mtimes,n))return Ze.value;let s=[{label:"infra-kit.json",path:e.main,required:!0},{label:"~/.infra-kit/infra-kit.json",path:e.userGlobal,required:!1},{label:`~/.infra-kit/projects/${e.projectName}/infra-kit.json`,path:e.userProject,required:!1}],i={};for(let c of s){let p=await Xi(c);p!==null&&(i={...i,...p})}let l=Qr.safeParse(i);if(!l.success)throw new Error(`Invalid merged infra-kit config: ${y.prettifyError(l.error)}`);return Ze={mtimes:n,value:l.data},l.data},ye=()=>{Ze=null},Jt=async e=>{try{return await Kt.stat(e)}catch{return null}},Hi=async e=>{try{return await Kt.readFile(e,"utf-8")}catch{return null}},Zi=(e,r)=>{let t=Object.keys(e);return t.length!==Object.keys(r).length?!1:t.every(o=>e[o]===r[o])},Xi=async e=>{let r=await Hi(e.path);if(r===null){if(e.required)throw new Error(`${e.label} not found at ${e.path}`);return null}let t;try{t=r.trim()===""?{}:JSON.parse(r)}catch(n){throw new Error(`Invalid JSON in ${e.label} at ${e.path}: ${n.message}`)}let o=wr.safeParse(t);if(!o.success)throw new Error(`Invalid ${e.label} at ${e.path}: ${y.prettifyError(o.error)}`);return o.data};var et={name:"infra-kit",type:"module",version:"0.1.
|
|
10
|
+
`};import O from"node:fs";import vr from"node:path";import Kt from"node:fs/promises";import Ni from"node:os";import hr from"node:path";import{z as y}from"zod";var In="infra-kit.json",Yr=".infra-kit",_i="infra-kit.json",Oi="projects",Fi=y.object({provider:y.literal("doppler"),config:y.object({name:y.string().min(1)})}),Di=y.discriminatedUnion("provider",[Fi]),ji=y.object({workspaceConfigPath:y.string().min(1)}),Mi=y.object({provider:y.literal("cursor"),config:ji}),Li=y.object({}),Wi=y.object({provider:y.literal("zed"),config:Li}),Pn=y.discriminatedUnion("provider",[Mi,Wi]),Vi=y.union([Pn,y.array(Pn).min(1)]),Bi=y.object({provider:y.literal("jira"),config:y.object({baseUrl:y.string().url(),projectId:y.number().int().positive()})}),Ji=y.discriminatedUnion("provider",[Bi]),Ki=["two-columns","three-pane"],Gi=y.object({layout:y.enum(Ki).optional()}),zi=y.object({openInGithubDesktop:y.boolean().optional(),openInCmux:y.boolean().optional(),cmux:Gi.optional()}),Ui=y.object({trigger:y.enum(["shell-startup","cli-invocation"]),config:y.string().min(1)}).strict(),Sn=y.object({environments:y.array(y.string().min(1)).min(1),envManagement:Di,ide:Vi.optional(),taskManager:Ji.optional(),worktrees:zi.optional(),envAutoLoad:Ui.optional()}),Qr=Sn.superRefine((e,r)=>{if(!Array.isArray(e.ide))return;let t=new Set;for(let o of e.ide){if(t.has(o.provider)){r.addIssue({code:"custom",message:"each IDE provider may appear at most once",path:["ide"]});return}t.add(o.provider)}}),wr=Sn.partial(),K=e=>{let r=e.ide;return r?Array.isArray(r)?r:[r]:[]},qi="two-columns",Gt=e=>e.worktrees?.cmux?.layout??qi,Ze=null,W=async()=>{let e=await k(),r=hr.basename(e),t=hr.join(Ni.homedir(),Yr);return{main:hr.join(e,In),userGlobal:hr.join(t,_i),userProject:hr.join(t,Oi,r,In),projectName:r}},x=async()=>{let e=await W(),r;try{r=await Kt.stat(e.main)}catch{Ze=null;let c=e.main.replace(/\.json$/,".yml");throw await Jt(c)?new Error(`infra-kit.json not found at ${e.main}. A legacy infra-kit.yml exists \u2014 run \`infra-kit init\` to convert it.`):new Error(`infra-kit.json not found at ${e.main}`)}let[t,o]=await Promise.all([Jt(e.userGlobal),Jt(e.userProject)]),n={main:Number(r.mtimeMs),userGlobal:t?Number(t.mtimeMs):null,userProject:o?Number(o.mtimeMs):null};if(Ze&&Zi(Ze.mtimes,n))return Ze.value;let s=[{label:"infra-kit.json",path:e.main,required:!0},{label:"~/.infra-kit/infra-kit.json",path:e.userGlobal,required:!1},{label:`~/.infra-kit/projects/${e.projectName}/infra-kit.json`,path:e.userProject,required:!1}],i={};for(let c of s){let p=await Xi(c);p!==null&&(i={...i,...p})}let l=Qr.safeParse(i);if(!l.success)throw new Error(`Invalid merged infra-kit config: ${y.prettifyError(l.error)}`);return Ze={mtimes:n,value:l.data},l.data},ye=()=>{Ze=null},Jt=async e=>{try{return await Kt.stat(e)}catch{return null}},Hi=async e=>{try{return await Kt.readFile(e,"utf-8")}catch{return null}},Zi=(e,r)=>{let t=Object.keys(e);return t.length!==Object.keys(r).length?!1:t.every(o=>e[o]===r[o])},Xi=async e=>{let r=await Hi(e.path);if(r===null){if(e.required)throw new Error(`${e.label} not found at ${e.path}`);return null}let t;try{t=r.trim()===""?{}:JSON.parse(r)}catch(n){throw new Error(`Invalid JSON in ${e.label} at ${e.path}: ${n.message}`)}let o=wr.safeParse(t);if(!o.success)throw new Error(`Invalid ${e.label} at ${e.path}: ${y.prettifyError(o.error)}`);return o.data};var et={name:"infra-kit",type:"module",version:"0.1.123",description:"infra-kit",main:"dist/index.js",module:"dist/index.js",types:"dist/entry/index.d.ts",exports:{".":{types:"./dist/entry/index.d.ts",import:"./dist/index.js"}},bin:{"infra-kit":"dist/cli.js"},engines:{node:">=24.x"},scripts:{inspector:"npx @modelcontextprotocol/inspector node ./dist/mcp.js --debug",build:"pnpm run clean-artifacts && node ./scripts/build.js",check:"node ./dist/cli.js check","clean-artifacts":"rm -rf dist","clean-cache":"rm -rf node_modules/.cache .eslintcache tsconfig.tsbuildinfo .turbo .swc","prettier-fix":"pnpm exec prettier **/* --write --no-error-on-unmatched-pattern --log-level silent --ignore-path ../../../.prettierignore","prettier-check":"pnpm exec prettier **/* --check --no-error-on-unmatched-pattern --log-level silent --ignore-path ../../../.prettierignore","eslint-check":"pnpm exec eslint --cache --quiet --report-unused-disable-directives ./src","eslint-fix":"pnpm exec eslint --cache --quiet --report-unused-disable-directives ./src --fix","ts-check":"tsc --noEmit",test:"pnpm exec vitest run --reporter=minimal","test-watch":"pnpm exec vitest --watch --silent passed-only","test-ui":"pnpm exec vitest --ui --silent passed-only","test-report":"pnpm exec vitest run --coverage --silent passed-only",qa:"pnpm run prettier-check && pnpm run eslint-check && pnpm run ts-check && pnpm run test && echo \u2705 Success",fix:"pnpm run prettier-fix && pnpm run eslint-fix && pnpm run qa"},dependencies:{"@inquirer/checkbox":"^5.2.1","@inquirer/confirm":"^6.1.1","@inquirer/select":"^5.2.1","@modelcontextprotocol/sdk":"^1.29.0",commander:"^15.0.0",ink:"^7.1.0",pino:"^10.3.1","pino-pretty":"^13.1.3",react:"19.2.7",yaml:"^2.9.0",zod:"^4.4.3",zx:"^8.8.5"},devDependencies:{"@types/react":"catalog:","@wl/eslint-config":"workspace:*","@wl/vitest-config":"workspace:*",esbuild:"^0.28.1","ink-testing-library":"^4.0.0",typescript:"^6.0.3"}};var yr="<!-- infra-kit:begin -->",kr="<!-- infra-kit:end -->",Qi="<!-- infra-kit:version ",ea="<!-- infra-kit:import:begin -->",ra="<!-- infra-kit:import:end -->",ta="AGENTS.md",oa="CLAUDE.md",na=e=>`${Qi}${e} -->`,sa=e=>[na(e),"","# infra-kit","","This repository uses the **infra-kit** CLI for environment, worktree, and release workflows.","This block is generated by `infra-kit init` \u2014 edit text *outside* the markers, never inside.","","## Commands (`ik` = `pnpm exec infra-kit`)","","- `ik env-load -c <config>` / `ik env-clear` / `ik env-status` \u2014 load, clear, or inspect Doppler env vars for a config (e.g. `dev`). Source the returned file to apply.","- `ik worktrees add` / `worktrees list` / `worktrees reload` / `worktrees remove` / `worktrees sync` \u2014 manage release and feature git worktrees.","- `ik release create` / `release list` / `release deploy-all` / `release deploy-selected` / `release deliver` / `release desc-edit` \u2014 release-branch and deploy flow.","- `ik release merge-dev` \u2014 merge the dev branch into every release branch.","- `ik audit` \u2014 audit packages against `infra-kit.config.ts` rules.","- `ik doctor` \u2014 check gh / doppler / aws / rtk install + auth and repo setup.","- `ik init` \u2014 (re)install shell integration and regenerate these agent-instruction files.","","## Conventions","","- Tickets are prefixed by area: `[FE]` frontend, `[BE]` backend, `[DO]` DevOps/infra, `[APP]` mobile app, `[IDEA]` proposal, `[ROOT]` cross-cutting. Pick the single dominant area.","- Environment variables are managed through Doppler via `ik env-load` \u2014 never commit secrets."].join(`
|
|
11
11
|
`),An=e=>{if(O.existsSync(e)&&O.lstatSync(e).isSymbolicLink())throw new Error(`Refusing to write ${e} because the destination is a symlink`)},Nn=e=>{let r=new Date().toISOString().replace(/[:.]/g,"-");O.copyFileSync(e,`${e}.backup.${r}`)},_n=(e,r)=>{An(e);let t=O.existsSync(e);return(t?O.readFileSync(e,"utf-8"):null)===r?"unchanged":(t&&Nn(e),O.mkdirSync(vr.dirname(e),{recursive:!0}),O.writeFileSync(e,r,"utf-8"),t?"updated":"created")},ia=(e,r)=>O.existsSync(e)?O.readFileSync(e,"utf-8"):r,aa=(e,r,t)=>{let o=O.readFileSync(e,"utf-8");if(!He(o,r,t))throw new Error(`Post-write validation failed: managed block missing from ${e}`)},ca=e=>{if(!O.existsSync(e))return"unchanged";An(e);let r=O.readFileSync(e,"utf-8"),t=ve(r,yr,kr);return t===null?"unchanged":t.trim()===""?(Nn(e),O.rmSync(e),"removed"):_n(e,t)},On=async()=>{let e;try{e=(await W()).main}catch{return a.info("Skipped agent-instruction files \u2014 not inside an infra-kit repo"),{skipped:!0,root:null,written:[]}}if(!O.existsSync(e))return a.info("Skipped agent-instruction files \u2014 no infra-kit.json at the repo root"),{skipped:!0,root:null,written:[]};let r=vr.dirname(e),t=et.version,o=sa(t),n=vr.join(r,ta),s=vr.join(r,oa),i=ia(s,"");i=ve(i,ea,ra)??i,i=gr({content:i,body:o,startMarker:yr,endMarker:kr,placement:"replace-in-place"});let l=[{path:s,action:_n(s,i)},{path:n,action:ca(n)}];aa(s,yr,kr);for(let c of l)c.action==="unchanged"&&c.path!==s||a.info(` ${c.action.padEnd(9)} ${vr.relative(r,c.path)}`);return a.info(`Agent-instruction files synced (infra-kit ${t})`),{skipped:!1,root:r,written:l}};import V from"node:fs/promises";import Y from"node:path";import{pathToFileURL as ua}from"node:url";import fa from"yaml";import{z as Mn}from"zod";import la from"node:fs/promises";import pa from"node:os";var pe=async e=>{try{return await la.access(e),!0}catch{return!1}},R=e=>{let r=pa.homedir();return e.startsWith(r)?`~${e.slice(r.length)}`:e};import da from"node:fs/promises";import zt from"node:os";import Ut from"node:path";import{z as ma}from"zod";import{z as rt}from"zod";var Fn="vendor.json",tt=rt.object({workspaceDir:rt.string().min(1),targets:rt.array(rt.string()).min(1)}).strict();var qt=()=>Ut.join(zt.homedir(),Yr,Fn),Dn=e=>{if(e==="~")return zt.homedir();if(e.startsWith("~/"))return Ut.join(zt.homedir(),e.slice(2));if(Ut.isAbsolute(e))return e;throw new Error(`workspaceDir must be absolute or ~-prefixed, got: ${e}`)},Xe=async()=>{let e=qt(),r;try{r=await da.readFile(e,"utf-8")}catch{throw new Error(`Factory config not found at ${e}. infra-kit needs a machine-local factory registry to know where your project repos live and which to stamp. Run \`infra-kit vendor-config --init\` to scaffold it, or create it manually as JSON:
|
|
12
12
|
|
|
13
13
|
{
|
|
@@ -163,4 +163,4 @@ See \`.sync-manifest.json\` for the source commit and per-file checksums.
|
|
|
163
163
|
${i.join(`
|
|
164
164
|
`)}
|
|
165
165
|
`);let l={worktrees:n,count:n.length};return{content:g(JSON.stringify(l,null,2)),structuredContent:l}},sn=w({name:"worktrees-list",description:"List existing release-branch worktrees with version, release type (regular / hotfix), and Jira fix-version description. Read-only.",inputSchema:{},outputSchema:{worktrees:lr.array(lr.object({version:lr.string().describe("Release version"),type:lr.enum(["regular","hotfix"]).describe("Release type"),description:lr.string().nullable().describe("Jira version description")})).describe("List of all worktrees with details"),count:lr.number().describe("Number of worktrees")},handler:ri});import{z as $e}from"zod";var ti=async()=>{m.start("worktrees-reload");try{let e=await k(),r=`${e}${G}`,t=await F("release"),o=await J(),n=await ep({currentBranches:t,repoName:o}),[s,{opened:i}]=await Promise.all([rn({projectRoot:e,worktreeDir:r,currentBranches:t}),rp({worktreeDir:r,currentBranches:t,repoName:o})]),l={closedCmux:n,openedCmux:i,ideProviders:s.filter(c=>c.ran).map(c=>c.provider),ideFoldersAdded:s.reduce((c,p)=>c+p.added,0),ideFoldersRemoved:s.reduce((c,p)=>c+p.removed,0)};return tp(l,{ideRan:s.some(c=>c.ran)}),m.print(),{content:g(JSON.stringify(l,null,2)),structuredContent:{...l}}}catch(e){throw a.error({error:e},"\u274C Error reloading worktrees"),new f(e,{operation:"reload worktrees",remediation:"run 'worktrees-list' to confirm the branches exist"})}},ep=async e=>{let{currentBranches:r,repoName:t}=e;if(r.length===0)return[];let o=await Fr(),n=[];for(let s of r){let i=re({repoName:t,branch:s});o.has(ee(i))&&(await Je(i),n.push(i))}return n},rp=async e=>{let{worktreeDir:r,currentBranches:t,repoName:o}=e,n=[];for(let s of t){let i=re({repoName:o,branch:s});try{await jr({cwd:`${r}/${s}`,title:i}),n.push(i)}catch(l){a.warn({error:l,title:i},`\u26A0\uFE0F Failed to reopen cmux workspace for ${s}`)}}return{opened:n}},tp=(e,r)=>{if(e.closedCmux.length>0&&a.info(`\u{1F9F9} Closed ${e.closedCmux.length} cmux workspace(s)`),r.ideRan){let t=e.ideProviders.map(o=>tn(o)).join(", ");e.ideFoldersAdded>0&&a.info(`\u2705 Added ${e.ideFoldersAdded} folder(s) to ${t} workspace(s)`),e.ideFoldersRemoved>0&&a.info(`\u{1F9F9} Removed ${e.ideFoldersRemoved} dangling folder(s) from ${t} workspace(s)`)}if(e.openedCmux.length>0){a.info("\u2705 Reopened cmux workspaces:");for(let t of e.openedCmux)a.info(t)}!r.ideRan&&e.closedCmux.length===0&&e.openedCmux.length===0&&e.ideFoldersAdded===0&&e.ideFoldersRemoved===0&&a.info("\u2139\uFE0F Nothing to reload")},an=w({name:"worktrees-reload",description:"Close all open cmux workspaces for the current release worktrees, then reopen the full set \u2014 the single window-restore command. Every configured editor (Cursor and/or Zed) is reconciled + relaunched (no per-window close). Disruptive: closes live cmux windows first. Safe to run from any branch. Use to refresh stale windows or to restore everything after a cold start (editor + cmux closed).",inputSchema:{},outputSchema:{closedCmux:$e.array($e.string()).describe("Titles of cmux workspaces a close was attempted for (best-effort)"),openedCmux:$e.array($e.string()).describe("Titles of cmux workspaces reopened during this run"),ideProviders:$e.array($e.string()).describe("Configured IDE providers that were reloaded (cursor | zed); empty if none configured"),ideFoldersAdded:$e.number().describe("Total worktree folders added across all configured editor workspaces"),ideFoldersRemoved:$e.number().describe("Total dangling worktree folders removed across all configured editor workspaces")},handler:ti});import op from"@inquirer/checkbox";import np from"@inquirer/confirm";import sp from"node:process";import{z as zr}from"zod";var oi=async e=>{let{confirmedCommand:r,all:t,versions:o}=e;m.start("worktrees-remove"),await D({operation:"remove worktrees",requiredBranch:"dev"});try{let n=await F("release");if(n.length===0)return a.info("\u2139\uFE0F No active worktrees to remove"),m.print(),{content:g(JSON.stringify({removedWorktrees:[],count:0},null,2)),structuredContent:{removedWorktrees:[],count:0}};let s=await k(),i=`${s}${G}`,l=[];if(t)l=n;else if(o)l=o.split(",").map(b=>ce(Z(b.trim())));else{m.setInteractive();let[b,v]=await Promise.all([P(),T()]),S=new Map(v.map(_=>[_.branch,E(_.title)]));l=await op({required:!0,message:"\u{1F33F} Select release branches",choices:A({branches:n,descriptions:b,types:S})})}let c=l.length===n.length;c?m.addOption("--all",!0):m.addOption("--versions",Be(l));let p=r?!0:await np({message:"Are you sure you want to proceed with these worktree changes?"});r||m.setInteractive(),p||(a.info("Operation cancelled. Exiting..."),sp.exit(0)),r||m.addOption("--yes",!0);let d=await J(),u=await Mr({branches:l,worktreeDir:i,repoName:d,pruneFolder:c});await Kr({projectRoot:s,worktreeDir:i,currentWorktrees:n,removedWorktrees:u,allowEditorRelaunch:!r}),ip(u),m.print();let h={removedWorktrees:u,count:u.length};return{content:g(JSON.stringify(h,null,2)),structuredContent:h}}catch(n){throw a.error({error:n},"\u274C Error managing worktrees"),new f(n,{operation:"remove worktrees",remediation:"check 'git worktree list' for the path; uncommitted changes block removal"})}},ip=e=>{if(e.length>0){a.info("\u274C Removed worktrees:");for(let r of e)a.info(r);a.info("")}else a.info("\u2139\uFE0F No unused worktrees to remove")},cn=w({name:"worktrees-remove",description:'Remove local git worktrees for release branches. When everything is removed, also runs "git worktree prune" to clear stale metadata; the worktrees directory and its release/feature subfolders are left in place. When invoked via MCP, pass either "versions" (comma-separated) or all=true \u2014 the branch picker is unreachable without a TTY, and the CLI confirmation is auto-skipped for MCP calls, so the caller is responsible for gating.',inputSchema:{all:zr.boolean().optional().describe('Remove every existing worktree. Either "all" or "versions" must be provided for MCP calls (the interactive picker is unavailable without a TTY). Ignored if "versions" is provided.'),versions:zr.string().optional().describe('Comma-separated release versions or names to target (e.g. "1.2.5, 1.2.6" or "checkout-redesign, 1.2.5"). Either "versions" or all=true must be provided for MCP calls. Overrides "all" when set.')},outputSchema:{removedWorktrees:zr.array(zr.string()).describe("List of removed git worktree branches"),count:zr.number().describe("Number of git worktrees removed")},handler:oi});import ap from"@inquirer/confirm";import cp from"node:process";import{z as ln}from"zod";import{$ as lp}from"zx";var ni=async e=>{let{confirmedCommand:r}=e;m.start("worktrees-sync"),await D({operation:"sync worktrees",requiredBranch:"dev"});try{let t=await F("release"),o=await k(),n=`${o}${G}`,s=await pt(),i=r?!0:await ap({message:"Are you sure you want to proceed with these worktree changes?"});r||m.setInteractive(),i||(a.info("Operation cancelled. Exiting..."),cp.exit(0)),r||m.addOption("--yes",!0);let{branchesToRemove:l}=pp({releasePRsList:s,currentWorktrees:t}),c=await J(),p=await dp({branches:l,worktreeDir:n,repoName:c});await Kr({projectRoot:o,worktreeDir:n,currentWorktrees:t,removedWorktrees:p,allowEditorRelaunch:!1}),mp(p),m.print();let d={removedWorktrees:p,count:p.length};return{content:g(JSON.stringify(d,null,2)),structuredContent:d}}catch(t){throw a.error({error:t},"\u274C Error managing worktrees"),new f(t,{operation:"sync worktrees with remote",remediation:"ensure 'gh auth status' is ok and you can reach origin"})}},pp=e=>{let{releasePRsList:r,currentWorktrees:t}=e;return{branchesToRemove:t.filter(s=>Ae(s)).filter(s=>!r.includes(s))}},dp=async e=>{let{branches:r,worktreeDir:t,repoName:o}=e,n=[];for(let s of r)try{let i=`${t}/${s}`,l=re({repoName:o,branch:s});await Je(l),await lp`git worktree remove ${i}`,n.push(s)}catch(i){let l=new f(i,{operation:`remove stale worktree for ${s}`,remediation:"inspect the worktree dir manually; rerun with the branch checked out elsewhere"});a.error({error:i,branch:s,msg:l.message})}return n},mp=e=>{if(e.length>0){a.info("\u274C Removed worktrees:");for(let r of e)a.info(r);a.info("")}else a.info("\u2139\uFE0F No unused worktrees to remove")},pn=w({name:"worktrees-sync",description:"Remove worktrees whose release PR is no longer open (stale cleanup). Only removes \u2014 never creates; use worktrees-add to create worktrees for new releases. The CLI confirmation is auto-skipped for MCP calls, so the caller is responsible for gating.",inputSchema:{},outputSchema:{removedWorktrees:ln.array(ln.string()).describe("List of removed worktree branches"),count:ln.number().describe("Number of worktrees removed during sync")},handler:ni});var dn=[{cliName:"merge-dev",menuGroup:"release",mcpTool:go,mcpExposed:!0},{cliName:"release-list",menuGroup:"release",mcpTool:Ro,mcpExposed:!0},{cliName:"release-create",menuGroup:"release",mcpTool:_o,mcpExposed:!0},{cliName:"release-desc-edit",menuGroup:"release",mcpTool:Oo,mcpExposed:!0},{cliName:"release-deploy-all",menuGroup:"release",mcpTool:vo,mcpExposed:!0},{cliName:"release-deploy-selected",menuGroup:"release",mcpTool:ko,mcpExposed:!0},{cliName:"release-deliver",menuGroup:"release",mcpTool:ho,mcpExposed:!1},{cliName:"worktrees-add",menuGroup:"worktrees",mcpTool:nn,mcpExposed:!0},{cliName:"worktrees-list",menuGroup:"worktrees",mcpTool:sn,mcpExposed:!0},{cliName:"worktrees-reload",menuGroup:"worktrees",mcpTool:an,mcpExposed:!0},{cliName:"worktrees-remove",menuGroup:"worktrees",mcpTool:cn,mcpExposed:!1},{cliName:"worktrees-sync",menuGroup:"worktrees",mcpTool:pn,mcpExposed:!0},{cliName:"audit",menuGroup:"environment",mcpTool:Bt,mcpExposed:!0},{cliName:"vendor",menuGroup:"environment",mcpTool:null,mcpExposed:!1},{cliName:"vendor-config",menuGroup:"environment",mcpTool:null,mcpExposed:!1},{cliName:"doctor",menuGroup:"environment",mcpTool:Qt,mcpExposed:!1},{cliName:"init",menuGroup:"environment",mcpTool:null,mcpExposed:!1},{cliName:"version",menuGroup:"environment",mcpTool:qo,mcpExposed:!0},{cliName:"config",menuGroup:"environment",mcpTool:null,mcpExposed:!1},{cliName:"env-status",menuGroup:"environment",mcpTool:lo,mcpExposed:!0},{cliName:"env-list",menuGroup:"environment",mcpTool:co,mcpExposed:!0},{cliName:"env-load",menuGroup:"environment",mcpTool:no,mcpExposed:!0},{cliName:"env-clear",menuGroup:"environment",mcpTool:io,mcpExposed:!0},{cliName:"env-autoload",menuGroup:null,mcpTool:null,mcpExposed:!1},{cliName:"vendor-check",menuGroup:null,mcpTool:Bo,mcpExposed:!0},{cliName:"vendor-diff",menuGroup:null,mcpTool:Go,mcpExposed:!0},{cliName:"vendor-manifest",menuGroup:null,mcpTool:zo,mcpExposed:!1},{cliName:"vendor-sync",menuGroup:null,mcpTool:Uo,mcpExposed:!1}],up=()=>dn.flatMap(e=>e.mcpExposed&&e.mcpTool?[e.mcpTool]:[]),fp=e=>dn.flatMap(r=>r.menuGroup===e?[r.cliName]:[]);export{k as a,fn as b,vp as c,a as d,Tn as e,W as f,x as g,ye as h,pe as i,R as j,qt as k,Dn as l,Xe as m,_m as n,Zn as o,Oe as p,to as q,Tr as r,Fe as s,De as t,Re as u,Me as v,Le as w,rs as x,ts as y,ns as z,ss as A,is as B,ds as C,ws as D,ys as E,Rs as F,bs as G,Vc as H,Ps as I,As as J,js as K,Ks as L,Gs as M,qs as N,Hs as O,Rt as P,ei as Q,ri as R,ti as S,oi as T,ni as U,up as V,fp as W};
|
|
166
|
-
//# sourceMappingURL=chunk-
|
|
166
|
+
//# sourceMappingURL=chunk-YMXDO43V.js.map
|