@hanzlaa/rcode 4.15.0 → 4.15.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 (27) hide show
  1. package/cli/install.js +32 -1
  2. package/dist/rcode.js +91 -91
  3. package/package.json +1 -1
  4. package/rcode/agents/rcode-orchestrator.md +3 -0
  5. package/rcode/agents/rules/orchestrator/contract.md +18 -0
  6. package/rcode/agents/rules/roadmapper/detailed-guide.md +4 -2
  7. package/rcode/agents/rules/sprint-checker/dimensions.md +20 -0
  8. package/rcode/agents/rules/sprint-checker/plan-quality-rubric.md +110 -0
  9. package/rcode/references/agent-shared-rules.md +8 -0
  10. package/rcode/references/planner-playbook.md +17 -1
  11. package/rcode/references/sprint-checker-playbook.md +11 -0
  12. package/rcode/skills/actions/4-implementation/rcode-code-review/SKILL.md +12 -5
  13. package/rcode/skills/actions/4-implementation/rcode-code-review/steps/step-02-review.md +61 -10
  14. package/rcode/skills/actions/4-implementation/rcode-code-review/steps/step-03-triage.md +28 -3
  15. package/rcode/skills/actions/4-implementation/rcode-code-review/workflow.md +8 -1
  16. package/rcode/skills/agents/haitham-frontend/SKILL.md +1 -1
  17. package/rcode/skills/agents/hanzla-engineer/SKILL.md +1 -1
  18. package/rcode/skills/agents/hussain-pm/SKILL.md +1 -1
  19. package/rcode/skills/agents/noor-writer/SKILL.md +2 -2
  20. package/rcode/skills/agents/orchestrator/SKILL.md +35 -5
  21. package/rcode/skills/agents/yousef-backend/SKILL.md +2 -2
  22. package/rcode/skills/agents/zayd-ml/SKILL.md +1 -1
  23. package/rcode/skills/core/rcode-help/SKILL.md +2 -1
  24. package/rcode/workflows/execute-sprint.md +1 -1
  25. package/rcode/workflows/plan.md +19 -0
  26. package/rcode/workflows/secure-phase.md +3 -1
  27. package/rcode/skills/rcode-init/SKILL.md +0 -134
package/cli/install.js CHANGED
@@ -1373,12 +1373,29 @@ function installSkills(packageRoot, target, options = {}) {
1373
1373
  let skippedGlobal = 0;
1374
1374
 
1375
1375
  const _internalSkillCache = new Map();
1376
+ // `user-invocable: true` WINS over `internal: true`.
1377
+ //
1378
+ // These two flags contradict each other and 36 of the 38 internal skills
1379
+ // declared both. The installer read only `internal`, so every one of those
1380
+ // skills went to .rcode/skills/ instead of .claude/skills/ — which means the
1381
+ // model never saw their descriptions and they could never auto-activate. They
1382
+ // worked only if the user typed the exact slash command.
1383
+ //
1384
+ // That is how "review this PR <url>" reached the built-in code-review skill
1385
+ // instead of rcode's: rcode's reviewer was invisible, not out-competed.
1386
+ //
1387
+ // A skill that declares user-invocable, writes its description for activation
1388
+ // ("Activates when the user says..."), and lists trigger phrases is user-facing
1389
+ // by every signal it gives. `internal` is for genuine utility libraries that
1390
+ // other skills call — and those do not claim to be user-invocable.
1376
1391
  function isInternalSkill(skillDir) {
1377
1392
  if (_internalSkillCache.has(skillDir)) return _internalSkillCache.get(skillDir);
1378
1393
  const skillMd = path.join(skillDir, 'SKILL.md');
1379
1394
  if (!fs.existsSync(skillMd)) { _internalSkillCache.set(skillDir, false); return false; }
1380
1395
  const text = fs.readFileSync(skillMd, 'utf8');
1381
- const result = /^internal:\s*true\s*$/m.test(text);
1396
+ const internal = /^internal:\s*true\s*$/m.test(text);
1397
+ const userInvocable = /^user-invocable:\s*true\s*$/m.test(text);
1398
+ const result = internal && !userInvocable;
1382
1399
  _internalSkillCache.set(skillDir, result);
1383
1400
  return result;
1384
1401
  }
@@ -1570,6 +1587,20 @@ function buildInstallPlan(ide = 'claude', target = process.cwd()) {
1570
1587
  plan.push({ src: f, rel: path.join('.rcode', 'data', rel) });
1571
1588
  }
1572
1589
 
1590
+ // .rcode/templates/ — every template, not just the starter projects.
1591
+ //
1592
+ // Only `templates/projects/` was ever copied, so a fresh install had NO
1593
+ // .md templates at all while workflows went on reading them:
1594
+ // plan-research-validation.md and validate-phase.md both read
1595
+ // `.rcode/templates/VALIDATION.md`, which never existed. Any templates found
1596
+ // in an older project were leftovers from a version that did copy them, which
1597
+ // is why this stayed invisible — it only broke on FRESH installs.
1598
+ for (const f of walkFiles(path.join(SOURCE_ROOT, 'templates'))) {
1599
+ const rel = path.relative(path.join(SOURCE_ROOT, 'templates'), f);
1600
+ if (rel.startsWith('projects' + path.sep) || rel === 'projects') continue; // handled below
1601
+ plan.push({ src: f, rel: path.join('.rcode', 'templates', rel) });
1602
+ }
1603
+
1573
1604
  // .rcode/templates/projects/ — starter templates consumed by /rcode-from-template
1574
1605
  const projectTemplatesSrc = path.join(SOURCE_ROOT, 'templates', 'projects');
1575
1606
  const relProjectTemplates = path.relative(target, path.join(target, '.rcode', 'templates', 'projects'));