@lkangd/cc-env 1.1.1 → 1.1.2

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 (71) hide show
  1. package/LICENSE +15 -0
  2. package/package.json +8 -1
  3. package/.claude/settings.json +0 -6
  4. package/.claude/settings.local.json +0 -8
  5. package/.nvmrc +0 -1
  6. package/CHANGELOG.md +0 -71
  7. package/docs/product-specs/index.draft.md +0 -106
  8. package/docs/product-specs/index.md +0 -911
  9. package/docs/product-specs/optional.md +0 -42
  10. package/docs/references/claude-code-env.md +0 -224
  11. package/docs/superpowers/plans/2026-04-24-cc-env-init-shell-migration.md +0 -1331
  12. package/docs/superpowers/plans/2026-04-24-cc-env.md +0 -1666
  13. package/docs/superpowers/plans/2026-04-26-preset-create-interactive-refactor.md +0 -1432
  14. package/docs/superpowers/specs/2026-04-24-cc-env-design.md +0 -438
  15. package/docs/superpowers/specs/2026-04-24-cc-env-init-shell-migration-design.md +0 -181
  16. package/docs/superpowers/specs/2026-04-26-preset-create-interactive-refactor-design.md +0 -78
  17. package/src/cli.ts +0 -340
  18. package/src/commands/init.ts +0 -139
  19. package/src/commands/preset/create.ts +0 -96
  20. package/src/commands/preset/delete.ts +0 -62
  21. package/src/commands/preset/show.ts +0 -51
  22. package/src/commands/restore.ts +0 -150
  23. package/src/commands/run.ts +0 -158
  24. package/src/core/errors.ts +0 -13
  25. package/src/core/find-claude.ts +0 -70
  26. package/src/core/format.ts +0 -29
  27. package/src/core/fs.ts +0 -18
  28. package/src/core/gitignore.ts +0 -26
  29. package/src/core/logger.ts +0 -11
  30. package/src/core/mask.ts +0 -17
  31. package/src/core/paths.ts +0 -41
  32. package/src/core/process-env.ts +0 -11
  33. package/src/core/schema.ts +0 -55
  34. package/src/core/spawn.ts +0 -36
  35. package/src/flows/init-flow.ts +0 -61
  36. package/src/flows/preset-create-flow.ts +0 -129
  37. package/src/flows/restore-flow.ts +0 -144
  38. package/src/ink/init-app.tsx +0 -110
  39. package/src/ink/preset-create-app.tsx +0 -451
  40. package/src/ink/preset-delete-app.tsx +0 -114
  41. package/src/ink/preset-show-app.tsx +0 -76
  42. package/src/ink/restore-app.tsx +0 -230
  43. package/src/ink/run-preset-select-app.tsx +0 -83
  44. package/src/ink/summary.tsx +0 -91
  45. package/src/services/claude-settings-env-service.ts +0 -72
  46. package/src/services/history-service.ts +0 -48
  47. package/src/services/preset-service.ts +0 -72
  48. package/src/services/project-env-service.ts +0 -128
  49. package/src/services/project-state-service.ts +0 -31
  50. package/src/services/settings-env-service.ts +0 -40
  51. package/src/services/shell-env-service.ts +0 -112
  52. package/src/types.d.ts +0 -19
  53. package/tests/cli/help.test.ts +0 -133
  54. package/tests/cli/init.test.ts +0 -76
  55. package/tests/cli/restore.test.ts +0 -172
  56. package/tests/commands/create.test.ts +0 -263
  57. package/tests/commands/output.test.ts +0 -119
  58. package/tests/commands/run.test.ts +0 -218
  59. package/tests/core/gitignore.test.ts +0 -98
  60. package/tests/core/paths.test.ts +0 -24
  61. package/tests/core/schema-mask.test.ts +0 -182
  62. package/tests/core/spawn.test.ts +0 -47
  63. package/tests/flows/init-flow.test.ts +0 -40
  64. package/tests/flows/preset-create-flow.test.ts +0 -225
  65. package/tests/flows/restore-flow.test.ts +0 -157
  66. package/tests/integration/init-restore.test.ts +0 -406
  67. package/tests/services/claude-shell.test.ts +0 -183
  68. package/tests/services/storage.test.ts +0 -143
  69. package/tsconfig.build.json +0 -9
  70. package/tsconfig.json +0 -22
  71. 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
- })