@orderful/droid 0.35.0 → 0.35.1

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.
@@ -61,7 +61,7 @@
61
61
  {
62
62
  "name": "droid-codex",
63
63
  "description": "Shared organizational knowledge - PRDs, tech designs, domains, proposals, patterns, and explored topics. Use when loading project context, searching codex, capturing decisions, or creating new entries.",
64
- "version": "0.2.0",
64
+ "version": "0.2.1",
65
65
  "source": {
66
66
  "source": "github",
67
67
  "repo": "orderful/droid",
package/CHANGELOG.md CHANGED
@@ -1,5 +1,19 @@
1
1
  # @orderful/droid
2
2
 
3
+ ## 0.35.1
4
+
5
+ ### Patch Changes
6
+
7
+ - [#211](https://github.com/Orderful/droid/pull/211) [`6df8a25`](https://github.com/Orderful/droid/commit/6df8a2511a1680bec65618d0f5e6e684811cd922) Thanks [@frytyler](https://github.com/frytyler)! - Bump codex tool version to force reinstall with fixed subdirectory copying
8
+
9
+ Users who installed codex 0.2.0 before the fix would be missing references/review/ subdirectory. Bumping to 0.2.1 ensures they get the complete installation with all reference files.
10
+
11
+ - [#211](https://github.com/Orderful/droid/pull/211) [`6df8a25`](https://github.com/Orderful/droid/commit/6df8a2511a1680bec65618d0f5e6e684811cd922) Thanks [@frytyler](https://github.com/frytyler)! - Fix skill installation not copying reference and script subdirectories
12
+
13
+ The installSkill() function was only copying top-level files from references/ and scripts/ directories, causing subdirectories to be skipped. This blocked the /codex review feature which relies on references/review/workflow.md.
14
+
15
+ Added a generic copyDirectoryRecursive() helper that preserves directory structure while maintaining the existing file type filters (.md for references, .ts/.js/.py for scripts). Applied to both references/ and scripts/ copying.
16
+
3
17
  ## 0.35.0
4
18
 
5
19
  ### Minor Changes
package/dist/bin/droid.js CHANGED
@@ -1305,6 +1305,22 @@ function updateAllSkills() {
1305
1305
  }
1306
1306
  return result;
1307
1307
  }
1308
+ function copyDirectoryRecursive(source, target, fileFilter) {
1309
+ if (!existsSync6(target)) {
1310
+ mkdirSync4(target, { recursive: true });
1311
+ }
1312
+ const entries = readdirSync5(source, { withFileTypes: true });
1313
+ for (const entry of entries) {
1314
+ const sourcePath = join7(source, entry.name);
1315
+ const targetPath = join7(target, entry.name);
1316
+ if (entry.isDirectory()) {
1317
+ copyDirectoryRecursive(sourcePath, targetPath, fileFilter);
1318
+ } else if (entry.isFile() && fileFilter(entry.name)) {
1319
+ const content = readFileSync6(sourcePath, "utf-8");
1320
+ writeFileSync4(targetPath, content);
1321
+ }
1322
+ }
1323
+ }
1308
1324
  function installSkill(skillName) {
1309
1325
  const config = loadConfig();
1310
1326
  const skillPath = findSkillPath(skillName);
@@ -1418,34 +1434,20 @@ function installSkill(skillName) {
1418
1434
  const referencesSource = join7(skillDir, "references");
1419
1435
  if (existsSync6(referencesSource)) {
1420
1436
  const targetReferencesDir = join7(targetSkillDir, "references");
1421
- if (!existsSync6(targetReferencesDir)) {
1422
- mkdirSync4(targetReferencesDir, { recursive: true });
1423
- }
1424
- const referenceFiles = readdirSync5(referencesSource).filter(
1437
+ copyDirectoryRecursive(
1438
+ referencesSource,
1439
+ targetReferencesDir,
1425
1440
  (f) => f.endsWith(".md")
1426
1441
  );
1427
- for (const file of referenceFiles) {
1428
- const sourcePath = join7(referencesSource, file);
1429
- const targetPath = join7(targetReferencesDir, file);
1430
- const content = readFileSync6(sourcePath, "utf-8");
1431
- writeFileSync4(targetPath, content);
1432
- }
1433
1442
  }
1434
1443
  const scriptsSource = join7(skillDir, "scripts");
1435
1444
  if (existsSync6(scriptsSource)) {
1436
1445
  const targetScriptsDir = join7(targetSkillDir, "scripts");
1437
- if (!existsSync6(targetScriptsDir)) {
1438
- mkdirSync4(targetScriptsDir, { recursive: true });
1439
- }
1440
- const scriptFiles = readdirSync5(scriptsSource).filter(
1446
+ copyDirectoryRecursive(
1447
+ scriptsSource,
1448
+ targetScriptsDir,
1441
1449
  (f) => f.endsWith(".ts") || f.endsWith(".js") || f.endsWith(".py")
1442
1450
  );
1443
- for (const file of scriptFiles) {
1444
- const sourcePath = join7(scriptsSource, file);
1445
- const targetPath = join7(targetScriptsDir, file);
1446
- const content = readFileSync6(sourcePath, "utf-8");
1447
- writeFileSync4(targetPath, content);
1448
- }
1449
1451
  }
1450
1452
  const activePlatforms = getActivePlatforms(config);
1451
1453
  const targetPlatforms = activePlatforms.length > 0 ? activePlatforms : [config.platform];
package/dist/index.js CHANGED
@@ -1262,6 +1262,22 @@ function updateAllSkills() {
1262
1262
  }
1263
1263
  return result;
1264
1264
  }
1265
+ function copyDirectoryRecursive(source, target, fileFilter) {
1266
+ if (!existsSync6(target)) {
1267
+ mkdirSync4(target, { recursive: true });
1268
+ }
1269
+ const entries = readdirSync5(source, { withFileTypes: true });
1270
+ for (const entry of entries) {
1271
+ const sourcePath = join7(source, entry.name);
1272
+ const targetPath = join7(target, entry.name);
1273
+ if (entry.isDirectory()) {
1274
+ copyDirectoryRecursive(sourcePath, targetPath, fileFilter);
1275
+ } else if (entry.isFile() && fileFilter(entry.name)) {
1276
+ const content = readFileSync6(sourcePath, "utf-8");
1277
+ writeFileSync4(targetPath, content);
1278
+ }
1279
+ }
1280
+ }
1265
1281
  function installSkill(skillName) {
1266
1282
  const config = loadConfig();
1267
1283
  const skillPath = findSkillPath(skillName);
@@ -1375,34 +1391,20 @@ function installSkill(skillName) {
1375
1391
  const referencesSource = join7(skillDir, "references");
1376
1392
  if (existsSync6(referencesSource)) {
1377
1393
  const targetReferencesDir = join7(targetSkillDir, "references");
1378
- if (!existsSync6(targetReferencesDir)) {
1379
- mkdirSync4(targetReferencesDir, { recursive: true });
1380
- }
1381
- const referenceFiles = readdirSync5(referencesSource).filter(
1394
+ copyDirectoryRecursive(
1395
+ referencesSource,
1396
+ targetReferencesDir,
1382
1397
  (f) => f.endsWith(".md")
1383
1398
  );
1384
- for (const file of referenceFiles) {
1385
- const sourcePath = join7(referencesSource, file);
1386
- const targetPath = join7(targetReferencesDir, file);
1387
- const content = readFileSync6(sourcePath, "utf-8");
1388
- writeFileSync4(targetPath, content);
1389
- }
1390
1399
  }
1391
1400
  const scriptsSource = join7(skillDir, "scripts");
1392
1401
  if (existsSync6(scriptsSource)) {
1393
1402
  const targetScriptsDir = join7(targetSkillDir, "scripts");
1394
- if (!existsSync6(targetScriptsDir)) {
1395
- mkdirSync4(targetScriptsDir, { recursive: true });
1396
- }
1397
- const scriptFiles = readdirSync5(scriptsSource).filter(
1403
+ copyDirectoryRecursive(
1404
+ scriptsSource,
1405
+ targetScriptsDir,
1398
1406
  (f) => f.endsWith(".ts") || f.endsWith(".js") || f.endsWith(".py")
1399
1407
  );
1400
- for (const file of scriptFiles) {
1401
- const sourcePath = join7(scriptsSource, file);
1402
- const targetPath = join7(targetScriptsDir, file);
1403
- const content = readFileSync6(sourcePath, "utf-8");
1404
- writeFileSync4(targetPath, content);
1405
- }
1406
1408
  }
1407
1409
  const activePlatforms = getActivePlatforms(config);
1408
1410
  const targetPlatforms = activePlatforms.length > 0 ? activePlatforms : [config.platform];
@@ -1 +1 @@
1
- {"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../../src/lib/skills.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../../src/lib/skills.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "droid-codex",
3
- "version": "0.2.0",
3
+ "version": "0.2.1",
4
4
  "description": "Shared organizational knowledge - PRDs, tech designs, domains, proposals, patterns, and explored topics. Use when loading project context, searching codex, capturing decisions, or creating new entries.",
5
5
  "author": {
6
6
  "name": "Orderful",
@@ -1,6 +1,6 @@
1
1
  name: codex
2
2
  description: "Shared organizational knowledge - PRDs, tech designs, domains, proposals, patterns, and explored topics. Use when loading project context, searching codex, capturing decisions, or creating new entries."
3
- version: 0.2.0
3
+ version: 0.2.1
4
4
  status: beta
5
5
 
6
6
  includes:
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@orderful/droid",
3
- "version": "0.35.0",
3
+ "version": "0.35.1",
4
4
  "description": "AI workflow toolkit for sharing skills, commands, and agents across the team",
5
5
  "type": "module",
6
6
  "bin": {
package/src/lib/skills.ts CHANGED
@@ -393,6 +393,39 @@ export function updateAllSkills(): {
393
393
  return result;
394
394
  }
395
395
 
396
+ /**
397
+ * Recursively copy a directory and all its contents
398
+ * @param source Source directory path
399
+ * @param target Target directory path
400
+ * @param fileFilter Function that returns true if the file should be copied
401
+ */
402
+ function copyDirectoryRecursive(
403
+ source: string,
404
+ target: string,
405
+ fileFilter: (filename: string) => boolean,
406
+ ): void {
407
+ if (!existsSync(target)) {
408
+ mkdirSync(target, { recursive: true });
409
+ }
410
+
411
+ const entries = readdirSync(source, { withFileTypes: true });
412
+
413
+ for (const entry of entries) {
414
+ const sourcePath = join(source, entry.name);
415
+ const targetPath = join(target, entry.name);
416
+
417
+ if (entry.isDirectory()) {
418
+ // Recursively copy subdirectory
419
+ copyDirectoryRecursive(sourcePath, targetPath, fileFilter);
420
+ } else if (entry.isFile() && fileFilter(entry.name)) {
421
+ // Copy file if it passes the filter
422
+ const content = readFileSync(sourcePath, 'utf-8');
423
+ writeFileSync(targetPath, content);
424
+ }
425
+ // Ignore files that don't pass the filter
426
+ }
427
+ }
428
+
396
429
  /**
397
430
  * Install a skill
398
431
  */
@@ -553,36 +586,20 @@ export function installSkill(skillName: string): {
553
586
  const referencesSource = join(skillDir, 'references');
554
587
  if (existsSync(referencesSource)) {
555
588
  const targetReferencesDir = join(targetSkillDir, 'references');
556
- if (!existsSync(targetReferencesDir)) {
557
- mkdirSync(targetReferencesDir, { recursive: true });
558
- }
559
- const referenceFiles = readdirSync(referencesSource).filter((f) =>
589
+ copyDirectoryRecursive(referencesSource, targetReferencesDir, (f) =>
560
590
  f.endsWith('.md'),
561
591
  );
562
- for (const file of referenceFiles) {
563
- const sourcePath = join(referencesSource, file);
564
- const targetPath = join(targetReferencesDir, file);
565
- const content = readFileSync(sourcePath, 'utf-8');
566
- writeFileSync(targetPath, content);
567
- }
568
592
  }
569
593
 
570
594
  // Copy scripts if present (deterministic CLI scripts for the skill)
571
595
  const scriptsSource = join(skillDir, 'scripts');
572
596
  if (existsSync(scriptsSource)) {
573
597
  const targetScriptsDir = join(targetSkillDir, 'scripts');
574
- if (!existsSync(targetScriptsDir)) {
575
- mkdirSync(targetScriptsDir, { recursive: true });
576
- }
577
- const scriptFiles = readdirSync(scriptsSource).filter(
598
+ copyDirectoryRecursive(
599
+ scriptsSource,
600
+ targetScriptsDir,
578
601
  (f) => f.endsWith('.ts') || f.endsWith('.js') || f.endsWith('.py'),
579
602
  );
580
- for (const file of scriptFiles) {
581
- const sourcePath = join(scriptsSource, file);
582
- const targetPath = join(targetScriptsDir, file);
583
- const content = readFileSync(sourcePath, 'utf-8');
584
- writeFileSync(targetPath, content);
585
- }
586
603
  }
587
604
 
588
605
  // Get active platforms for multi-platform install
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "droid-codex",
3
- "version": "0.2.0",
3
+ "version": "0.2.1",
4
4
  "description": "Shared organizational knowledge - PRDs, tech designs, domains, proposals, patterns, and explored topics. Use when loading project context, searching codex, capturing decisions, or creating new entries.",
5
5
  "author": {
6
6
  "name": "Orderful",
@@ -1,6 +1,6 @@
1
1
  name: codex
2
2
  description: "Shared organizational knowledge - PRDs, tech designs, domains, proposals, patterns, and explored topics. Use when loading project context, searching codex, capturing decisions, or creating new entries."
3
- version: 0.2.0
3
+ version: 0.2.1
4
4
  status: beta
5
5
 
6
6
  includes: