infra-kit 0.1.102 → 0.1.105

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.
Files changed (127) hide show
  1. package/.eslintcache +1 -1
  2. package/.omc/state/agent-replay-0a58307d-2a37-4c69-851c-83a646502d62.jsonl +1 -0
  3. package/.omc/state/agent-replay-11c41aa0-51fa-49e1-a1dc-26dcd6ac26cc.jsonl +16 -0
  4. package/.omc/state/agent-replay-4cf1c186-81b2-497c-b002-d7f84e7839f3.jsonl +9 -0
  5. package/.omc/state/agent-replay-5c4ab554-64f1-42ae-83e3-21e0237e955c.jsonl +11 -0
  6. package/.omc/state/agent-replay-a60ac2ec-afbd-449f-a540-6df287392fc2.jsonl +1 -0
  7. package/.omc/state/agent-replay-be37e426-6fc8-47f4-8178-221c8494551c.jsonl +3 -0
  8. package/.omc/state/agent-replay-c967c819-3d1c-447b-ab48-56a8448ef9f8.jsonl +2 -0
  9. package/.omc/state/idle-notif-cooldown.json +3 -0
  10. package/.omc/state/last-tool-error.json +4 -4
  11. package/.omc/state/mission-state.json +53 -0
  12. package/.omc/state/sessions/0a58307d-2a37-4c69-851c-83a646502d62/pre-tool-advisory-throttle.json +18 -0
  13. package/.omc/state/sessions/0a58307d-2a37-4c69-851c-83a646502d62/subagent-tracking-state.json +7 -0
  14. package/.omc/state/sessions/11c41aa0-51fa-49e1-a1dc-26dcd6ac26cc/last-tool-error-state.json +7 -0
  15. package/.omc/state/sessions/11c41aa0-51fa-49e1-a1dc-26dcd6ac26cc/mission-state.json +117 -0
  16. package/.omc/state/sessions/11c41aa0-51fa-49e1-a1dc-26dcd6ac26cc/pre-tool-advisory-throttle.json +42 -0
  17. package/.omc/state/sessions/11c41aa0-51fa-49e1-a1dc-26dcd6ac26cc/subagent-tracking-state.json +53 -0
  18. package/.omc/state/sessions/4cf1c186-81b2-497c-b002-d7f84e7839f3/last-tool-error-state.json +7 -0
  19. package/.omc/state/sessions/4cf1c186-81b2-497c-b002-d7f84e7839f3/pre-tool-advisory-throttle.json +18 -0
  20. package/.omc/state/sessions/4cf1c186-81b2-497c-b002-d7f84e7839f3/subagent-tracking-state.json +7 -0
  21. package/.omc/state/sessions/5c4ab554-64f1-42ae-83e3-21e0237e955c/mission-state.json +117 -0
  22. package/.omc/state/sessions/5c4ab554-64f1-42ae-83e3-21e0237e955c/pre-tool-advisory-throttle.json +18 -0
  23. package/.omc/state/sessions/5c4ab554-64f1-42ae-83e3-21e0237e955c/subagent-tracking-state.json +17 -0
  24. package/.omc/state/sessions/a60ac2ec-afbd-449f-a540-6df287392fc2/pre-tool-advisory-throttle.json +18 -0
  25. package/.omc/state/sessions/a60ac2ec-afbd-449f-a540-6df287392fc2/subagent-tracking-state.json +7 -0
  26. package/.omc/state/sessions/c967c819-3d1c-447b-ab48-56a8448ef9f8/pre-tool-advisory-throttle.json +10 -0
  27. package/.omc/state/sessions/c967c819-3d1c-447b-ab48-56a8448ef9f8/subagent-tracking-state.json +7 -0
  28. package/.omc/state/subagent-tracking.json +14 -4
  29. package/.turbo/turbo-build.log +7 -0
  30. package/.turbo/turbo-check.log +14 -0
  31. package/.turbo/turbo-prettier-fix.log +2 -1
  32. package/.turbo/turbo-test.log +28 -5
  33. package/.turbo/turbo-validate.log +14 -0
  34. package/dist/cli.js +81 -74
  35. package/dist/cli.js.map +4 -4
  36. package/dist/entry/index.d.ts +2 -0
  37. package/dist/index.js +2 -0
  38. package/dist/index.js.map +7 -0
  39. package/dist/lib/package-config/package-config.d.ts +71 -0
  40. package/dist/mcp.js +43 -41
  41. package/dist/mcp.js.map +4 -4
  42. package/eslint.config.js +1 -1
  43. package/infra-kit.config.ts +5 -0
  44. package/package.json +20 -13
  45. package/scripts/build.js +32 -3
  46. package/src/.omc/state/sessions/0a58307d-2a37-4c69-851c-83a646502d62/pre-tool-advisory-throttle.json +18 -0
  47. package/src/commands/.omc/state/sessions/c967c819-3d1c-447b-ab48-56a8448ef9f8/pre-tool-advisory-throttle.json +18 -0
  48. package/src/commands/audit/__tests__/audit.test.ts +59 -0
  49. package/src/commands/audit/audit.ts +177 -0
  50. package/src/commands/audit/index.ts +1 -0
  51. package/src/commands/config/config.ts +49 -7
  52. package/src/commands/doctor/doctor.ts +3 -3
  53. package/src/commands/env-clear/env-clear.ts +1 -1
  54. package/src/commands/env-list/env-list.ts +3 -3
  55. package/src/commands/env-load/env-load.ts +1 -1
  56. package/src/commands/env-status/env-status.ts +1 -1
  57. package/src/commands/gh-merge-dev/gh-merge-dev.ts +3 -8
  58. package/src/commands/gh-release-deliver/gh-release-deliver.ts +47 -21
  59. package/src/commands/gh-release-deploy-all/gh-release-deploy-all.ts +13 -7
  60. package/src/commands/gh-release-deploy-selected/gh-release-deploy-selected.ts +12 -6
  61. package/src/commands/gh-release-list/gh-release-list.ts +19 -8
  62. package/src/commands/init/__tests__/migrate-config.test.ts +160 -0
  63. package/src/commands/init/init.ts +48 -35
  64. package/src/commands/init/migrate-config.ts +146 -0
  65. package/src/commands/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -0
  66. package/src/commands/release-create/__tests__/release-create.test.ts +55 -0
  67. package/src/commands/release-create/release-create.ts +142 -38
  68. package/src/commands/release-desc-edit/release-desc-edit.ts +28 -8
  69. package/src/commands/version/version.ts +1 -1
  70. package/src/commands/worktrees-add/worktrees-add.ts +7 -12
  71. package/src/commands/worktrees-list/worktrees-list.ts +13 -5
  72. package/src/commands/worktrees-open/worktrees-open.ts +1 -1
  73. package/src/commands/worktrees-remove/worktrees-remove.ts +6 -10
  74. package/src/commands/worktrees-sync/worktrees-sync.ts +3 -5
  75. package/src/entry/cli.ts +49 -6
  76. package/src/entry/index.ts +5 -0
  77. package/src/integrations/cmux/open-workspace-with-layout.ts +4 -4
  78. package/src/integrations/cmux/workspace-title.ts +10 -4
  79. package/src/integrations/doppler/doppler-project.ts +1 -1
  80. package/src/integrations/gh/gh-release-prs/__tests__/gh-release-prs.test.ts +115 -0
  81. package/src/integrations/gh/gh-release-prs/gh-release-prs.ts +49 -32
  82. package/src/lib/.omc/state/sessions/a60ac2ec-afbd-449f-a540-6df287392fc2/pre-tool-advisory-throttle.json +14 -0
  83. package/src/lib/constants/index.ts +15 -0
  84. package/src/lib/git-utils/__tests__/git-utils.test.ts +49 -0
  85. package/src/lib/git-utils/git-utils.ts +3 -1
  86. package/src/lib/infra-kit-config/__tests__/infra-kit-config.test.ts +270 -0
  87. package/src/lib/infra-kit-config/index.ts +7 -1
  88. package/src/lib/infra-kit-config/infra-kit-config.ts +46 -28
  89. package/src/lib/package-config/__tests__/package-config.test.ts +95 -0
  90. package/src/lib/package-config/index.ts +3 -0
  91. package/src/lib/package-config/package-config-schema.ts +19 -0
  92. package/src/lib/package-config/package-config.ts +99 -0
  93. package/src/lib/package-validator/__tests__/package-validator.test.ts +263 -0
  94. package/src/lib/package-validator/checks/__tests__/checks.test.ts +130 -0
  95. package/src/lib/package-validator/checks/config-check.ts +30 -0
  96. package/src/lib/package-validator/checks/files-check.ts +29 -0
  97. package/src/lib/package-validator/checks/index.ts +4 -0
  98. package/src/lib/package-validator/checks/scripts-check.ts +23 -0
  99. package/src/lib/package-validator/checks/turbo-check.ts +47 -0
  100. package/src/lib/package-validator/fs-utils.ts +18 -0
  101. package/src/lib/package-validator/index.ts +3 -0
  102. package/src/lib/package-validator/loader/config-loader.ts +77 -0
  103. package/src/lib/package-validator/loader/index.ts +2 -0
  104. package/src/lib/package-validator/loader/package-discovery.ts +98 -0
  105. package/src/lib/package-validator/package-validator.ts +48 -0
  106. package/src/lib/package-validator/types.ts +15 -0
  107. package/src/lib/release-id/__tests__/release-id.test.ts +351 -0
  108. package/src/lib/release-id/__tests__/versioned-regression.test.ts +69 -0
  109. package/src/lib/release-id/index.ts +15 -0
  110. package/src/lib/release-id/release-id.ts +257 -0
  111. package/src/lib/release-utils/__tests__/release-utils.test.ts +122 -0
  112. package/src/lib/release-utils/index.ts +4 -0
  113. package/src/lib/release-utils/release-utils.ts +85 -17
  114. package/src/lib/version-utils/__tests__/load-existing-versions.test.ts +37 -0
  115. package/src/lib/version-utils/__tests__/next-version.test.ts +119 -13
  116. package/src/lib/version-utils/index.ts +3 -0
  117. package/src/lib/version-utils/load-existing-versions.ts +29 -10
  118. package/src/lib/version-utils/next-version.ts +67 -12
  119. package/src/lib/version-utils/version-utils.ts +13 -4
  120. package/src/mcp/tools/index.ts +2 -0
  121. package/src/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -0
  122. package/src/types.ts +1 -1
  123. package/tsconfig.tsbuildinfo +1 -1
  124. package/src/lib/__tests__/infra-kit-config.test.ts +0 -231
  125. /package/src/integrations/{clickup → linear}/.gitkeep +0 -0
  126. /package/src/lib/{__tests__ → constants/__tests__}/constants.test.ts +0 -0
  127. /package/src/lib/{constants.ts → constants/constants.ts} +0 -0
@@ -1,231 +0,0 @@
1
- import fs from 'node:fs'
2
- import os from 'node:os'
3
- import path from 'node:path'
4
- import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
5
-
6
- // Import AFTER the mock is declared so the module picks up the mocked dep.
7
- import { getProjectRoot, getRepoName } from 'src/lib/git-utils'
8
-
9
- import { getInfraKitConfig, resetInfraKitConfigCache } from '../infra-kit-config'
10
-
11
- vi.mock('src/lib/git-utils', () => {
12
- return {
13
- getProjectRoot: vi.fn(),
14
- getRepoName: vi.fn(),
15
- }
16
- })
17
-
18
- const VALID_YML = `environments:
19
- - dev
20
- - staging
21
- envManagement:
22
- provider: doppler
23
- config:
24
- name: my-project
25
- `
26
-
27
- const ALTERNATE_YML = `environments:
28
- - dev
29
- envManagement:
30
- provider: doppler
31
- config:
32
- name: other-project
33
- `
34
-
35
- const withTmpRepo = async (fn: (tmp: string) => Promise<void>): Promise<void> => {
36
- const tmp = fs.mkdtempSync(path.join(os.tmpdir(), 'infra-kit-config-test-'))
37
-
38
- vi.mocked(getProjectRoot).mockResolvedValue(tmp)
39
- vi.mocked(getRepoName).mockResolvedValue(path.basename(tmp))
40
- // Point os.homedir() at the tmp dir so user-scope override layers
41
- // (~/.infra-kit/config.yml, ~/.infra-kit/projects/<repo>/infra-kit.yml)
42
- // can't leak the developer's real config into the test.
43
- const homedirSpy = vi.spyOn(os, 'homedir').mockReturnValue(tmp)
44
-
45
- resetInfraKitConfigCache()
46
-
47
- try {
48
- await fn(tmp)
49
- } finally {
50
- homedirSpy.mockRestore()
51
- resetInfraKitConfigCache()
52
- fs.rmSync(tmp, { recursive: true, force: true })
53
- }
54
- }
55
-
56
- describe('getInfraKitConfig', () => {
57
- beforeEach(() => {
58
- resetInfraKitConfigCache()
59
- })
60
-
61
- afterEach(() => {
62
- resetInfraKitConfigCache()
63
- vi.clearAllMocks()
64
- })
65
-
66
- it('reads and validates a well-formed infra-kit.yml', async () => {
67
- await withTmpRepo(async (tmp) => {
68
- fs.writeFileSync(path.join(tmp, 'infra-kit.yml'), VALID_YML)
69
-
70
- const cfg = await getInfraKitConfig()
71
-
72
- expect(cfg.envManagement.config.name).toBe('my-project')
73
- expect(cfg.environments).toEqual(['dev', 'staging'])
74
- expect(cfg.taskManager).toBeUndefined()
75
- expect(cfg.ide).toBeUndefined()
76
- })
77
- })
78
-
79
- it('accepts ide and taskManager when provided', async () => {
80
- await withTmpRepo(async (tmp) => {
81
- fs.writeFileSync(
82
- path.join(tmp, 'infra-kit.yml'),
83
- `environments: [dev]
84
- envManagement:
85
- provider: doppler
86
- config:
87
- name: p
88
- ide:
89
- provider: cursor
90
- config:
91
- mode: workspace
92
- workspaceConfigPath: ./ws.code-workspace
93
- taskManager:
94
- provider: jira
95
- config:
96
- baseUrl: https://example.atlassian.net
97
- projectId: 123
98
- `,
99
- )
100
-
101
- const cfg = await getInfraKitConfig()
102
-
103
- expect(cfg.ide?.provider).toBe('cursor')
104
-
105
- if (cfg.ide?.provider === 'cursor') {
106
- expect(cfg.ide.config.mode).toBe('workspace')
107
- expect(cfg.ide.config.workspaceConfigPath).toBe('./ws.code-workspace')
108
- }
109
-
110
- expect(cfg.taskManager?.provider).toBe('jira')
111
- })
112
- })
113
-
114
- it('accepts a worktrees prompt-defaults block', async () => {
115
- await withTmpRepo(async (tmp) => {
116
- fs.writeFileSync(
117
- path.join(tmp, 'infra-kit.yml'),
118
- `environments: [dev]
119
- envManagement:
120
- provider: doppler
121
- config:
122
- name: p
123
- worktrees:
124
- openInGithubDesktop: false
125
- openInCmux: true
126
- `,
127
- )
128
-
129
- const cfg = await getInfraKitConfig()
130
-
131
- expect(cfg.worktrees?.openInGithubDesktop).toBe(false)
132
- expect(cfg.worktrees?.openInCmux).toBe(true)
133
- })
134
- })
135
-
136
- it('lets the user-global config layer supply a worktrees block when the project omits it', async () => {
137
- await withTmpRepo(async (tmp) => {
138
- fs.writeFileSync(path.join(tmp, 'infra-kit.yml'), VALID_YML)
139
-
140
- const userGlobalDir = path.join(tmp, '.infra-kit')
141
-
142
- fs.mkdirSync(userGlobalDir, { recursive: true })
143
- fs.writeFileSync(
144
- path.join(userGlobalDir, 'config.yml'),
145
- `worktrees:
146
- openInGithubDesktop: false
147
- openInCmux: true
148
- `,
149
- )
150
-
151
- const cfg = await getInfraKitConfig()
152
-
153
- expect(cfg.worktrees?.openInGithubDesktop).toBe(false)
154
- expect(cfg.worktrees?.openInCmux).toBe(true)
155
- })
156
- })
157
-
158
- it('rejects ide.cursor mode=workspace without workspaceConfigPath', async () => {
159
- await withTmpRepo(async (tmp) => {
160
- fs.writeFileSync(
161
- path.join(tmp, 'infra-kit.yml'),
162
- `environments: [dev]
163
- envManagement:
164
- provider: doppler
165
- config:
166
- name: p
167
- ide:
168
- provider: cursor
169
- config:
170
- mode: workspace
171
- `,
172
- )
173
-
174
- await expect(getInfraKitConfig()).rejects.toThrow(/workspaceConfigPath/)
175
- })
176
- })
177
-
178
- it('throws when infra-kit.yml is missing', async () => {
179
- await withTmpRepo(async () => {
180
- await expect(getInfraKitConfig()).rejects.toThrow(/not found/)
181
- })
182
- })
183
-
184
- it('throws a descriptive error on schema violations', async () => {
185
- await withTmpRepo(async (tmp) => {
186
- fs.writeFileSync(
187
- path.join(tmp, 'infra-kit.yml'),
188
- 'environments: []\nenvManagement:\n provider: doppler\n config:\n name: ""\n',
189
- )
190
-
191
- await expect(getInfraKitConfig()).rejects.toThrow(/Invalid infra-kit.yml/)
192
- })
193
- })
194
-
195
- it('re-reads the file when mtime changes (long-running MCP scenario)', async () => {
196
- await withTmpRepo(async (tmp) => {
197
- const ymlPath = path.join(tmp, 'infra-kit.yml')
198
-
199
- fs.writeFileSync(ymlPath, VALID_YML)
200
-
201
- const first = await getInfraKitConfig()
202
-
203
- expect(first.envManagement.config.name).toBe('my-project')
204
-
205
- // Advance mtime past the previous stat to simulate an edit; write new content.
206
- const future = new Date(Date.now() + 2_000)
207
-
208
- fs.writeFileSync(ymlPath, ALTERNATE_YML)
209
- fs.utimesSync(ymlPath, future, future)
210
-
211
- const second = await getInfraKitConfig()
212
-
213
- expect(second.envManagement.config.name).toBe('other-project')
214
- expect(second.environments).toEqual(['dev'])
215
- })
216
- })
217
-
218
- it('returns the cached value on repeated calls when mtime is unchanged', async () => {
219
- await withTmpRepo(async (tmp) => {
220
- const ymlPath = path.join(tmp, 'infra-kit.yml')
221
-
222
- fs.writeFileSync(ymlPath, VALID_YML)
223
-
224
- const a = await getInfraKitConfig()
225
- const b = await getInfraKitConfig()
226
-
227
- // Same object reference — no re-parse.
228
- expect(a).toBe(b)
229
- })
230
- })
231
- })
File without changes