@codeyam/codeyam-cli 0.1.29 → 0.1.30
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/analyzer-template/.build-info.json +6 -6
- package/analyzer-template/log.txt +3 -3
- package/analyzer-template/package.json +1 -1
- package/analyzer-template/packages/aws/package.json +1 -1
- package/analyzer-template/packages/database/package.json +1 -1
- package/codeyam-cli/src/commands/__tests__/init.gitignore.test.js +38 -3
- package/codeyam-cli/src/commands/__tests__/init.gitignore.test.js.map +1 -1
- package/codeyam-cli/src/commands/editor.js +94 -0
- package/codeyam-cli/src/commands/editor.js.map +1 -1
- package/codeyam-cli/src/commands/init.js +19 -0
- package/codeyam-cli/src/commands/init.js.map +1 -1
- package/codeyam-cli/src/utils/__tests__/editorProxySession.test.js +98 -1
- package/codeyam-cli/src/utils/__tests__/editorProxySession.test.js.map +1 -1
- package/codeyam-cli/src/utils/install-skills.js +27 -6
- package/codeyam-cli/src/utils/install-skills.js.map +1 -1
- package/codeyam-cli/src/webserver/__tests__/editorProxy.test.js +115 -0
- package/codeyam-cli/src/webserver/__tests__/editorProxy.test.js.map +1 -1
- package/codeyam-cli/src/webserver/app/lib/database.js.map +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/editor.entity.(_sha)-CsYVRiNH.js +147 -0
- package/codeyam-cli/src/webserver/build/client/assets/globals-Gp2o-NMc.css +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{manifest-3d8cde80.js → manifest-ef0f624d.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{root-CVjDQwjJ.js → root-Didv9PLi.js} +5 -5
- package/codeyam-cli/src/webserver/build/server/assets/{analysisRunner-CTJYMVFP.js → analysisRunner-BKMsxwqe.js} +1 -1
- package/codeyam-cli/src/webserver/build/server/assets/{index-CCth4Hgw.js → index-CvuvIPEn.js} +1 -1
- package/codeyam-cli/src/webserver/build/server/assets/init-B3gVLAAJ.js +14 -0
- package/codeyam-cli/src/webserver/build/server/assets/{server-build-DSW2mE30.js → server-build-B4LxStYP.js} +140 -140
- package/codeyam-cli/src/webserver/build/server/index.js +1 -1
- package/codeyam-cli/src/webserver/build-info.json +5 -5
- package/codeyam-cli/src/webserver/editorProxy.js +77 -4
- package/codeyam-cli/src/webserver/editorProxy.js.map +1 -1
- package/codeyam-cli/templates/codeyam-editor-gemini.md +59 -0
- package/codeyam-cli/templates/seed-adapters/supabase.ts +42 -53
- package/package.json +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/editor.entity.(_sha)-785deXbZ.js +0 -147
- package/codeyam-cli/src/webserver/build/client/assets/globals-Bt7TsgQz.css +0 -1
- package/codeyam-cli/src/webserver/build/server/assets/init-UXl-3vVp.js +0 -10
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
{
|
|
2
|
-
"buildTimestamp": "2026-
|
|
3
|
-
"buildTime":
|
|
4
|
-
"gitCommit": "
|
|
2
|
+
"buildTimestamp": "2026-04-01T01:07:46.592Z",
|
|
3
|
+
"buildTime": 1775005666592,
|
|
4
|
+
"gitCommit": "1963f3fe25d06de746759d0b71265b6ca9de5451",
|
|
5
5
|
"nodeVersion": "v20.20.1",
|
|
6
6
|
"contentHash": "c92230c027acb71cab56d2a696876a6a52206bfadd59fbc31a512b00a7ee8826",
|
|
7
|
-
"buildNumber":
|
|
8
|
-
"semanticVersion": "0.1.
|
|
9
|
-
"version": "0.1.
|
|
7
|
+
"buildNumber": 1315,
|
|
8
|
+
"semanticVersion": "0.1.1315",
|
|
9
|
+
"version": "0.1.1315 (2026-04-01T01:07+c92230c)"
|
|
10
10
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
|
|
2
|
-
[
|
|
3
|
-
[
|
|
2
|
+
[4/1/2026, 1:07:46 AM] > codeyam-combo@1.0.0 mergeDependencies
|
|
3
|
+
[4/1/2026, 1:07:46 AM] > node ./scripts/mergePackageJsonFiles.cjs
|
|
4
4
|
|
|
5
5
|
|
|
6
|
-
[
|
|
6
|
+
[4/1/2026, 1:07:46 AM] Merged dependencies into root package.json
|
|
7
7
|
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
"@aws-sdk/client-ecr": "^3.1019.0",
|
|
18
18
|
"@aws-sdk/client-ecs": "^3.1009.0",
|
|
19
19
|
"@aws-sdk/client-s3": "^3.1019.0",
|
|
20
|
-
"@aws-sdk/client-sqs": "^3.
|
|
20
|
+
"@aws-sdk/client-sqs": "^3.1020.0",
|
|
21
21
|
"@aws-sdk/lib-storage": "^3.1019.0",
|
|
22
22
|
"@aws-sdk/s3-request-presigner": "^3.1019.0",
|
|
23
23
|
"@aws-sdk/util-dynamodb": "^3.990.0"
|
|
@@ -17,6 +17,7 @@ const CODEYAM_GITIGNORE_ENTRIES = [
|
|
|
17
17
|
'.codeyam/active-scenario.json',
|
|
18
18
|
'.codeyam/editor-step.json',
|
|
19
19
|
'.codeyam/editor-user-prompt.txt',
|
|
20
|
+
'.codeyam/claude-session-id.txt',
|
|
20
21
|
'.codeyam/editor-mode-context.md',
|
|
21
22
|
'.codeyam/dev-mode-context.md',
|
|
22
23
|
'.codeyam/logs/',
|
|
@@ -26,6 +27,7 @@ const CODEYAM_GITIGNORE_ENTRIES = [
|
|
|
26
27
|
'.codeyam/tmp/',
|
|
27
28
|
'.codeyam/rules/',
|
|
28
29
|
'.codeyam/bin/',
|
|
30
|
+
'.codeyam/docs/',
|
|
29
31
|
];
|
|
30
32
|
/**
|
|
31
33
|
* Extract the ensureGitignoreEntry function for testing.
|
|
@@ -63,6 +65,17 @@ async function ensureGitignoreEntry(projectRoot) {
|
|
|
63
65
|
block;
|
|
64
66
|
await fs.writeFile(gitignorePath, newContent, 'utf8');
|
|
65
67
|
}
|
|
68
|
+
else {
|
|
69
|
+
// Add any missing entries from the current list
|
|
70
|
+
const missingEntries = CODEYAM_GITIGNORE_ENTRIES.filter((entry) => !lines.some((line) => line.trim() === entry));
|
|
71
|
+
if (missingEntries.length > 0) {
|
|
72
|
+
const updatedContent = gitignoreContent +
|
|
73
|
+
(gitignoreContent && !gitignoreContent.endsWith('\n') ? '\n' : '') +
|
|
74
|
+
missingEntries.join('\n') +
|
|
75
|
+
'\n';
|
|
76
|
+
await fs.writeFile(gitignorePath, updatedContent, 'utf8');
|
|
77
|
+
}
|
|
78
|
+
}
|
|
66
79
|
}
|
|
67
80
|
describe('init command - gitignore management', () => {
|
|
68
81
|
let testDir;
|
|
@@ -100,12 +113,15 @@ describe('init command - gitignore management', () => {
|
|
|
100
113
|
expect(content).toContain('.codeyam/db.sqlite3');
|
|
101
114
|
expect(content).toContain('.codeyam/secrets.json');
|
|
102
115
|
});
|
|
103
|
-
test('does not duplicate when granular patterns already exist', async () => {
|
|
116
|
+
test('does not duplicate when all granular patterns already exist', async () => {
|
|
104
117
|
const gitignorePath = path.join(testDir, '.gitignore');
|
|
105
|
-
await fs.writeFile(gitignorePath, 'node_modules\n
|
|
118
|
+
await fs.writeFile(gitignorePath, 'node_modules\n\n# CodeYam - local only (not shared)\n' +
|
|
119
|
+
CODEYAM_GITIGNORE_ENTRIES.join('\n') +
|
|
120
|
+
'\n', 'utf8');
|
|
106
121
|
await ensureGitignoreEntry(testDir);
|
|
107
122
|
const content = await fs.readFile(gitignorePath, 'utf8');
|
|
108
|
-
|
|
123
|
+
// Exact match on the line — no duplicates
|
|
124
|
+
const matches = content.match(/^\.codeyam\/db\.sqlite3$/gm);
|
|
109
125
|
expect(matches).toHaveLength(1);
|
|
110
126
|
});
|
|
111
127
|
test('replaces blanket .codeyam with granular patterns', async () => {
|
|
@@ -172,6 +188,25 @@ build
|
|
|
172
188
|
expect(content).toContain('dist');
|
|
173
189
|
expect(content).toContain('.codeyam/db.sqlite3');
|
|
174
190
|
});
|
|
191
|
+
test('adds missing entries to existing granular block', async () => {
|
|
192
|
+
const gitignorePath = path.join(testDir, '.gitignore');
|
|
193
|
+
// Simulate an older gitignore that has most entries but is missing claude-session-id.txt and docs/
|
|
194
|
+
const oldEntries = CODEYAM_GITIGNORE_ENTRIES.filter((e) => e !== '.codeyam/claude-session-id.txt' && e !== '.codeyam/docs/');
|
|
195
|
+
await fs.writeFile(gitignorePath, 'node_modules\n\n# CodeYam - local only (not shared)\n' +
|
|
196
|
+
oldEntries.join('\n') +
|
|
197
|
+
'\n', 'utf8');
|
|
198
|
+
await ensureGitignoreEntry(testDir);
|
|
199
|
+
const content = await fs.readFile(gitignorePath, 'utf8');
|
|
200
|
+
// New entries should be added
|
|
201
|
+
expect(content).toContain('.codeyam/claude-session-id.txt');
|
|
202
|
+
expect(content).toContain('.codeyam/docs/');
|
|
203
|
+
// Existing entries should still be there
|
|
204
|
+
expect(content).toContain('.codeyam/db.sqlite3');
|
|
205
|
+
expect(content).toContain('.codeyam/secrets.json');
|
|
206
|
+
// No duplicates
|
|
207
|
+
const dbMatches = content.match(/\.codeyam\/db\.sqlite3$/gm);
|
|
208
|
+
expect(dbMatches).toHaveLength(1);
|
|
209
|
+
});
|
|
175
210
|
test('config.json is NOT ignored (allows sharing via git)', async () => {
|
|
176
211
|
await ensureGitignoreEntry(testDir);
|
|
177
212
|
const gitignorePath = path.join(testDir, '.gitignore');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.gitignore.test.js","sourceRoot":"","sources":["../../../../../src/commands/__tests__/init.gitignore.test.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AAEzB;;;;GAIG;AACH,MAAM,yBAAyB,GAAG;IAChC,qBAAqB;IACrB,yBAAyB;IACzB,yBAAyB;IACzB,uBAAuB;IACvB,sBAAsB;IACtB,4BAA4B;IAC5B,qBAAqB;IACrB,+BAA+B;IAC/B,2BAA2B;IAC3B,iCAAiC;IACjC,iCAAiC;IACjC,8BAA8B;IAC9B,gBAAgB;IAChB,qBAAqB;IACrB,oBAAoB;IACpB,mBAAmB;IACnB,eAAe;IACf,iBAAiB;IACjB,eAAe;
|
|
1
|
+
{"version":3,"file":"init.gitignore.test.js","sourceRoot":"","sources":["../../../../../src/commands/__tests__/init.gitignore.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -387,6 +387,37 @@ function checkbox(text) {
|
|
|
387
387
|
const highlighted = text.replace(/`([^`]+)`/g, (_m, code) => chalk.cyan(code));
|
|
388
388
|
console.log(` ${chalk.dim('[ ]')} ${highlighted}`);
|
|
389
389
|
}
|
|
390
|
+
/**
|
|
391
|
+
* Print a checklist item for the handoff summary.
|
|
392
|
+
*/
|
|
393
|
+
function checkboxHandoff() {
|
|
394
|
+
checkbox('Update the handoff summary in `.codeyam/config.json` for the next session/AI: `codeyam editor handoff \'{"summary":"..."}\'`');
|
|
395
|
+
}
|
|
396
|
+
/**
|
|
397
|
+
* Print the handoff context from a previous session or AI provider.
|
|
398
|
+
*/
|
|
399
|
+
function printHandoffContext(root) {
|
|
400
|
+
try {
|
|
401
|
+
const configPath = path.join(root, '.codeyam', 'config.json');
|
|
402
|
+
if (!fs.existsSync(configPath))
|
|
403
|
+
return;
|
|
404
|
+
const config = JSON.parse(fs.readFileSync(configPath, 'utf8'));
|
|
405
|
+
const handoff = config.handoff;
|
|
406
|
+
if (!handoff || !handoff.summary)
|
|
407
|
+
return;
|
|
408
|
+
console.log();
|
|
409
|
+
console.log(chalk.bold.magenta(`━━━ HANDOFF FROM ${String(handoff.lastProvider || 'unknown').toUpperCase()} (Step ${handoff.lastStep || 'unknown'}) ━━━`));
|
|
410
|
+
console.log(chalk.magenta(handoff.summary));
|
|
411
|
+
if (handoff.lastUpdated) {
|
|
412
|
+
console.log(chalk.dim(` Updated: ${handoff.lastUpdated}`));
|
|
413
|
+
}
|
|
414
|
+
console.log(chalk.bold.magenta('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━'));
|
|
415
|
+
console.log();
|
|
416
|
+
}
|
|
417
|
+
catch {
|
|
418
|
+
// Non-fatal
|
|
419
|
+
}
|
|
420
|
+
}
|
|
390
421
|
/**
|
|
391
422
|
* Instructions for creating/updating .codeyam/data-structure.json.
|
|
392
423
|
* Only prints creation instructions if the file doesn't exist yet.
|
|
@@ -1188,6 +1219,8 @@ function printStep1(root, feature, options, userPrompt) {
|
|
|
1188
1219
|
console.log(chalk.yellow(' Option 2 label: "I\'d like some changes"') +
|
|
1189
1220
|
chalk.dim(' — user describes changes, you revise the plan, then re-present'));
|
|
1190
1221
|
console.log();
|
|
1222
|
+
checkboxHandoff();
|
|
1223
|
+
console.log();
|
|
1191
1224
|
console.log(chalk.dim('This step is for understanding user goals and getting buy-in. Code comes in Step 2.'));
|
|
1192
1225
|
console.log();
|
|
1193
1226
|
console.log(chalk.bold.red('━━━ STOP ━━━'));
|
|
@@ -1315,6 +1348,8 @@ function printStep2(root, feature) {
|
|
|
1315
1348
|
console.log();
|
|
1316
1349
|
printDataStructureInstructions();
|
|
1317
1350
|
}
|
|
1351
|
+
console.log();
|
|
1352
|
+
checkboxHandoff();
|
|
1318
1353
|
stopGate(2);
|
|
1319
1354
|
}
|
|
1320
1355
|
// ─── Step 3: Prototype ────────────────────────────────────────────────
|
|
@@ -1431,6 +1466,7 @@ function printStep3(root, feature) {
|
|
|
1431
1466
|
console.log(chalk.red.bold(' NEVER claim "you should see X" or "the preview shows X" unless you just ran a preview command.'));
|
|
1432
1467
|
console.log(chalk.red(' The preview only updates when you explicitly refresh it. Verify, then describe.'));
|
|
1433
1468
|
console.log();
|
|
1469
|
+
checkboxHandoff();
|
|
1434
1470
|
stopGate(3);
|
|
1435
1471
|
}
|
|
1436
1472
|
// ─── Step 4: Verify Prototype ─────────────────────────────────────────
|
|
@@ -1488,6 +1524,8 @@ function printStep4(root, feature) {
|
|
|
1488
1524
|
console.log(chalk.dim(' A new clone should work with just: git clone → npm run setup → npm run dev'));
|
|
1489
1525
|
console.log();
|
|
1490
1526
|
console.log(chalk.dim('Focus on building the prototype. Scenarios and refactoring happen in later steps.'));
|
|
1527
|
+
console.log();
|
|
1528
|
+
checkboxHandoff();
|
|
1491
1529
|
stopGate(4);
|
|
1492
1530
|
}
|
|
1493
1531
|
// ─── Step 5: Confirm ──────────────────────────────────────────────────
|
|
@@ -1551,6 +1589,8 @@ function printStep5(root, feature) {
|
|
|
1551
1589
|
chalk.dim(' — make changes, refresh preview, re-run `codeyam editor 5`'));
|
|
1552
1590
|
console.log();
|
|
1553
1591
|
console.log(chalk.dim('Wait for user approval before moving on. Refactoring and scenarios happen in later steps.'));
|
|
1592
|
+
console.log();
|
|
1593
|
+
checkboxHandoff();
|
|
1554
1594
|
stopGate(5, { confirm: true });
|
|
1555
1595
|
}
|
|
1556
1596
|
// ─── Step 6: Deconstruct ──────────────────────────────────────────────
|
|
@@ -1576,6 +1616,8 @@ function printStep6(root, feature) {
|
|
|
1576
1616
|
console.log(chalk.yellow('This step is read and plan only. Code extraction happens in step 7.'));
|
|
1577
1617
|
console.log();
|
|
1578
1618
|
printExtractionPlanInstructions();
|
|
1619
|
+
console.log();
|
|
1620
|
+
checkboxHandoff();
|
|
1579
1621
|
stopGate(6);
|
|
1580
1622
|
}
|
|
1581
1623
|
// ─── Step 7: Extract ──────────────────────────────────────────────────
|
|
@@ -1658,6 +1700,8 @@ function printStep7(root, feature) {
|
|
|
1658
1700
|
console.log(chalk.dim('Reuse glossary functions when they fit naturally. Extract a new function when the use case diverges.'));
|
|
1659
1701
|
console.log();
|
|
1660
1702
|
console.log(chalk.dim('Focus on TDD for functions and extraction for components. Scenarios come in later steps.'));
|
|
1703
|
+
console.log();
|
|
1704
|
+
checkboxHandoff();
|
|
1661
1705
|
stopGate(7);
|
|
1662
1706
|
}
|
|
1663
1707
|
// ─── Step 8: Glossary ─────────────────────────────────────────────────
|
|
@@ -3346,6 +3390,50 @@ function formatApiSubcommandResult(subcommand, data) {
|
|
|
3346
3390
|
return null; // journal-list, show/hide-results: keep full JSON
|
|
3347
3391
|
}
|
|
3348
3392
|
}
|
|
3393
|
+
/**
|
|
3394
|
+
* `codeyam editor handoff '{"summary":"..."}'`
|
|
3395
|
+
*
|
|
3396
|
+
* Update the handoff summary in .codeyam/config.json for other AI providers.
|
|
3397
|
+
*/
|
|
3398
|
+
function handleHandoff(jsonArg) {
|
|
3399
|
+
if (!jsonArg) {
|
|
3400
|
+
console.error(chalk.red('Error: JSON argument required.'));
|
|
3401
|
+
console.error(chalk.dim(' Usage: codeyam editor handoff \'{"summary":"Built the X component..."}\''));
|
|
3402
|
+
process.exit(1);
|
|
3403
|
+
}
|
|
3404
|
+
let summary;
|
|
3405
|
+
try {
|
|
3406
|
+
const parsed = JSON.parse(jsonArg);
|
|
3407
|
+
summary = parsed.summary;
|
|
3408
|
+
}
|
|
3409
|
+
catch {
|
|
3410
|
+
console.error(chalk.red('Error: Invalid JSON.'));
|
|
3411
|
+
process.exit(1);
|
|
3412
|
+
}
|
|
3413
|
+
if (!summary) {
|
|
3414
|
+
console.error(chalk.red('Error: "summary" field is required.'));
|
|
3415
|
+
process.exit(1);
|
|
3416
|
+
}
|
|
3417
|
+
const root = getProjectRoot();
|
|
3418
|
+
const configPath = path.join(root, '.codeyam', 'config.json');
|
|
3419
|
+
try {
|
|
3420
|
+
const config = JSON.parse(fs.readFileSync(configPath, 'utf8'));
|
|
3421
|
+
const state = readState(root);
|
|
3422
|
+
const provider = config.provider || 'claude';
|
|
3423
|
+
config.handoff = {
|
|
3424
|
+
summary,
|
|
3425
|
+
lastProvider: provider,
|
|
3426
|
+
lastStep: state?.step,
|
|
3427
|
+
lastUpdated: new Date().toISOString(),
|
|
3428
|
+
};
|
|
3429
|
+
fs.writeFileSync(configPath, JSON.stringify(config, null, 2), 'utf8');
|
|
3430
|
+
console.log(chalk.green('✓ Handoff summary updated in .codeyam/config.json'));
|
|
3431
|
+
}
|
|
3432
|
+
catch (err) {
|
|
3433
|
+
console.error(chalk.red(`Error: Could not update config.json: ${err.message}`));
|
|
3434
|
+
process.exit(1);
|
|
3435
|
+
}
|
|
3436
|
+
}
|
|
3349
3437
|
/**
|
|
3350
3438
|
* `codeyam editor register '{"name":"...","componentName":"...",...}'`
|
|
3351
3439
|
*
|
|
@@ -5504,6 +5592,11 @@ const editorCommand = {
|
|
|
5504
5592
|
}
|
|
5505
5593
|
return;
|
|
5506
5594
|
}
|
|
5595
|
+
// Subcommand: codeyam editor handoff '{"summary":"..."}'
|
|
5596
|
+
if (argv.step === 'handoff') {
|
|
5597
|
+
await handleHandoff(argv.json || '');
|
|
5598
|
+
return;
|
|
5599
|
+
}
|
|
5507
5600
|
// Subcommand: codeyam editor register '{"name":"..."}'
|
|
5508
5601
|
if (argv.step === 'register') {
|
|
5509
5602
|
await handleRegister(argv.json || '');
|
|
@@ -6101,6 +6194,7 @@ const editorCommand = {
|
|
|
6101
6194
|
process.exit(1);
|
|
6102
6195
|
}
|
|
6103
6196
|
}
|
|
6197
|
+
printHandoffContext(root);
|
|
6104
6198
|
switch (step) {
|
|
6105
6199
|
case 1: {
|
|
6106
6200
|
const feature = argv.feature || undefined;
|