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