@lkangd/cc-env 1.1.1 → 1.2.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.
Files changed (78) hide show
  1. package/LICENSE +15 -0
  2. package/dist/cli.js +68 -6
  3. package/dist/commands/completion.js +60 -0
  4. package/dist/commands/doctor.js +73 -0
  5. package/dist/commands/preset/edit.js +16 -11
  6. package/dist/commands/preset/rename.js +16 -0
  7. package/dist/commands/run.js +9 -1
  8. package/dist/ink/preset-edit-app.js +112 -0
  9. package/package.json +11 -2
  10. package/.claude/settings.json +0 -6
  11. package/.claude/settings.local.json +0 -8
  12. package/.nvmrc +0 -1
  13. package/CHANGELOG.md +0 -71
  14. package/docs/product-specs/index.draft.md +0 -106
  15. package/docs/product-specs/index.md +0 -911
  16. package/docs/product-specs/optional.md +0 -42
  17. package/docs/references/claude-code-env.md +0 -224
  18. package/docs/superpowers/plans/2026-04-24-cc-env-init-shell-migration.md +0 -1331
  19. package/docs/superpowers/plans/2026-04-24-cc-env.md +0 -1666
  20. package/docs/superpowers/plans/2026-04-26-preset-create-interactive-refactor.md +0 -1432
  21. package/docs/superpowers/specs/2026-04-24-cc-env-design.md +0 -438
  22. package/docs/superpowers/specs/2026-04-24-cc-env-init-shell-migration-design.md +0 -181
  23. package/docs/superpowers/specs/2026-04-26-preset-create-interactive-refactor-design.md +0 -78
  24. package/src/cli.ts +0 -340
  25. package/src/commands/init.ts +0 -139
  26. package/src/commands/preset/create.ts +0 -96
  27. package/src/commands/preset/delete.ts +0 -62
  28. package/src/commands/preset/show.ts +0 -51
  29. package/src/commands/restore.ts +0 -150
  30. package/src/commands/run.ts +0 -158
  31. package/src/core/errors.ts +0 -13
  32. package/src/core/find-claude.ts +0 -70
  33. package/src/core/format.ts +0 -29
  34. package/src/core/fs.ts +0 -18
  35. package/src/core/gitignore.ts +0 -26
  36. package/src/core/logger.ts +0 -11
  37. package/src/core/mask.ts +0 -17
  38. package/src/core/paths.ts +0 -41
  39. package/src/core/process-env.ts +0 -11
  40. package/src/core/schema.ts +0 -55
  41. package/src/core/spawn.ts +0 -36
  42. package/src/flows/init-flow.ts +0 -61
  43. package/src/flows/preset-create-flow.ts +0 -129
  44. package/src/flows/restore-flow.ts +0 -144
  45. package/src/ink/init-app.tsx +0 -110
  46. package/src/ink/preset-create-app.tsx +0 -451
  47. package/src/ink/preset-delete-app.tsx +0 -114
  48. package/src/ink/preset-show-app.tsx +0 -76
  49. package/src/ink/restore-app.tsx +0 -230
  50. package/src/ink/run-preset-select-app.tsx +0 -83
  51. package/src/ink/summary.tsx +0 -91
  52. package/src/services/claude-settings-env-service.ts +0 -72
  53. package/src/services/history-service.ts +0 -48
  54. package/src/services/preset-service.ts +0 -72
  55. package/src/services/project-env-service.ts +0 -128
  56. package/src/services/project-state-service.ts +0 -31
  57. package/src/services/settings-env-service.ts +0 -40
  58. package/src/services/shell-env-service.ts +0 -112
  59. package/src/types.d.ts +0 -19
  60. package/tests/cli/help.test.ts +0 -133
  61. package/tests/cli/init.test.ts +0 -76
  62. package/tests/cli/restore.test.ts +0 -172
  63. package/tests/commands/create.test.ts +0 -263
  64. package/tests/commands/output.test.ts +0 -119
  65. package/tests/commands/run.test.ts +0 -218
  66. package/tests/core/gitignore.test.ts +0 -98
  67. package/tests/core/paths.test.ts +0 -24
  68. package/tests/core/schema-mask.test.ts +0 -182
  69. package/tests/core/spawn.test.ts +0 -47
  70. package/tests/flows/init-flow.test.ts +0 -40
  71. package/tests/flows/preset-create-flow.test.ts +0 -225
  72. package/tests/flows/restore-flow.test.ts +0 -157
  73. package/tests/integration/init-restore.test.ts +0 -406
  74. package/tests/services/claude-shell.test.ts +0 -183
  75. package/tests/services/storage.test.ts +0 -143
  76. package/tsconfig.build.json +0 -9
  77. package/tsconfig.json +0 -22
  78. package/vitest.config.ts +0 -8
@@ -1,143 +0,0 @@
1
- import { access, mkdtemp, readdir, rm } from 'node:fs/promises'
2
- import { dirname, join } from 'node:path'
3
- import { tmpdir } from 'node:os'
4
-
5
- import { afterEach, describe, expect, it } from 'vitest'
6
-
7
- import { atomicWriteFile } from '../../src/core/fs.js'
8
- import { CliError } from '../../src/core/errors.js'
9
- import type { HistoryRecord } from '../../src/core/schema.js'
10
- import { createHistoryService } from '../../src/services/history-service.js'
11
- import { createPresetService } from '../../src/services/preset-service.js'
12
-
13
- const tempRoots: string[] = []
14
-
15
- async function createTempRoot(): Promise<string> {
16
- const root = await mkdtemp(join(tmpdir(), 'cc-env-storage-'))
17
- tempRoots.push(root)
18
- return root
19
- }
20
-
21
- afterEach(async () => {
22
- await Promise.all(tempRoots.splice(0).map((root) => rm(root, { recursive: true, force: true })))
23
- })
24
-
25
- describe('atomicWriteFile', () => {
26
- it('replaces the target file without leaving temp files behind', async () => {
27
- const globalRoot = await createTempRoot()
28
- const filePath = join(globalRoot, 'config.json')
29
-
30
- await atomicWriteFile(filePath, '{"defaultPreset":"openai"}\n')
31
-
32
- await expect(access(filePath)).resolves.toBeUndefined()
33
- await expect(access(`${filePath}.tmp`)).rejects.toMatchObject({ code: 'ENOENT' })
34
-
35
- const entries = await readdir(dirname(filePath))
36
- expect(entries).toEqual(['config.json'])
37
- })
38
- })
39
-
40
- describe('preset service', () => {
41
- it('writes, reads, lists names, removes, and throws when preset is missing', async () => {
42
- const globalRoot = await createTempRoot()
43
- const service = createPresetService(globalRoot)
44
-
45
- await expect(
46
- service.write({
47
- name: 'openai',
48
- createdAt: '2026-04-24T12:00:00.000Z',
49
- updatedAt: '2026-04-24T12:00:00.000Z',
50
- env: {
51
- OPENAI_API_KEY: 'sk-123',
52
- },
53
- }),
54
- ).resolves.toMatchObject({
55
- name: 'openai',
56
- filePath: expect.stringContaining('presets/openai.json'),
57
- })
58
-
59
- await expect(service.read('openai')).resolves.toMatchObject({
60
- name: 'openai',
61
- filePath: expect.stringContaining('presets/openai.json'),
62
- })
63
- await expect(service.listNames()).resolves.toEqual(['openai'])
64
-
65
- await service.remove('openai')
66
-
67
- await expect(service.listNames()).resolves.toEqual([])
68
- await expect(service.read('openai')).rejects.toThrowError(new CliError('Preset not found: openai'))
69
- })
70
- })
71
-
72
- describe('history service', () => {
73
- it('writes restore records and lists them with targetName preserved', async () => {
74
- const globalRoot = await createTempRoot()
75
- const service = createHistoryService(globalRoot)
76
-
77
- await service.write({
78
- action: 'restore',
79
- targetType: 'preset',
80
- targetName: 'openai',
81
- timestamp: '2026-04-24T12:34:56.000Z',
82
- backup: {
83
- OPENAI_API_KEY: 'sk-123',
84
- },
85
- })
86
-
87
- await expect(service.list()).resolves.toEqual([
88
- {
89
- action: 'restore',
90
- targetType: 'preset',
91
- targetName: 'openai',
92
- timestamp: '2026-04-24T12:34:56.000Z',
93
- backup: {
94
- OPENAI_API_KEY: 'sk-123',
95
- },
96
- },
97
- ])
98
- })
99
-
100
- it('persists expanded init history records', async () => {
101
- const globalRoot = await createTempRoot()
102
- const service = createHistoryService(globalRoot)
103
-
104
- const record: HistoryRecord = {
105
- timestamp: '2026-04-24T10:00:00.000Z',
106
- action: 'init',
107
- migratedKeys: ['ANTHROPIC_AUTH_TOKEN'],
108
- sources: [
109
- {
110
- file: '/Users/test/.claude/settings.json',
111
- backup: {},
112
- },
113
- {
114
- file: '/Users/test/.claude/settings.local.json',
115
- backup: {
116
- ANTHROPIC_AUTH_TOKEN: 'local-token',
117
- },
118
- },
119
- ],
120
- shellWrites: [
121
- {
122
- shell: 'fish',
123
- filePath: '/Users/test/.config/fish/config.fish',
124
- env: {
125
- ANTHROPIC_AUTH_TOKEN: 'local-token',
126
- },
127
- },
128
- ],
129
- }
130
-
131
- await expect(service.write(record)).resolves.toEqual(record)
132
- await expect(service.list()).resolves.toMatchObject([
133
- {
134
- action: 'init',
135
- shellWrites: [
136
- {
137
- shell: 'fish',
138
- },
139
- ],
140
- },
141
- ])
142
- })
143
- })
@@ -1,9 +0,0 @@
1
- {
2
- "extends": "./tsconfig.json",
3
- "compilerOptions": {
4
- "noEmit": false,
5
- "rootDir": "src",
6
- "outDir": "dist"
7
- },
8
- "include": ["src/**/*.ts"]
9
- }
package/tsconfig.json DELETED
@@ -1,22 +0,0 @@
1
- {
2
- "compilerOptions": {
3
- "target": "ES2022",
4
- "module": "NodeNext",
5
- "moduleResolution": "NodeNext",
6
- "lib": ["ES2022"],
7
- "strict": true,
8
- "noImplicitOverride": true,
9
- "noUncheckedIndexedAccess": true,
10
- "exactOptionalPropertyTypes": true,
11
- "forceConsistentCasingInFileNames": true,
12
- "isolatedModules": true,
13
- "esModuleInterop": true,
14
- "skipLibCheck": true,
15
- "resolveJsonModule": true,
16
- "jsx": "react-jsx",
17
- "types": ["node", "vitest/globals"],
18
- "noEmit": true
19
- },
20
- "include": ["src/**/*.ts", "tests/**/*.ts"],
21
- "exclude": ["dist", "node_modules"]
22
- }
package/vitest.config.ts DELETED
@@ -1,8 +0,0 @@
1
- import { defineConfig } from 'vitest/config'
2
-
3
- export default defineConfig({
4
- test: {
5
- environment: 'node',
6
- include: ['tests/**/*.test.ts'],
7
- },
8
- })