rdap-q 1.2.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.
Files changed (178) hide show
  1. package/.agents/plugins/rdap-q/plugin.json +11 -0
  2. package/.agents/skills/rdap-q/README.md +171 -0
  3. package/.agents/skills/rdap-q/SKILL.md +55 -0
  4. package/.agents/skills/rdap-q/core/capabilities.md +9 -0
  5. package/.agents/skills/rdap-q/core/controller.md +14 -0
  6. package/.agents/skills/rdap-q/core/exit-logic.md +9 -0
  7. package/.agents/skills/rdap-q/core/gates.md +12 -0
  8. package/.agents/skills/rdap-q/core/memory.md +11 -0
  9. package/.agents/skills/rdap-q/core/scoring.md +7 -0
  10. package/.agents/skills/rdap-q/diagrams/rdapq-command-flow.mmd +9 -0
  11. package/.agents/skills/rdap-q/diagrams/rdapq-control-loop.mmd +31 -0
  12. package/.agents/skills/rdap-q/diagrams/rdapq-evidence-flow.mmd +31 -0
  13. package/.agents/skills/rdap-q/diagrams/rdapq-memory-model.mmd +26 -0
  14. package/.agents/skills/rdap-q/diagrams/rdapq-score-decision.mmd +24 -0
  15. package/.agents/skills/rdap-q/diagrams/rdapq-selective-loading.mmd +40 -0
  16. package/.agents/skills/rdap-q/install/install-unix.sh +48 -0
  17. package/.agents/skills/rdap-q/install/install-windows.ps1 +65 -0
  18. package/.agents/skills/rdap-q/manifest.json +87 -0
  19. package/.agents/skills/rdap-q/memory/README.md +4 -0
  20. package/.agents/skills/rdap-q/memory/constraints.md +3 -0
  21. package/.agents/skills/rdap-q/memory/engineering-preferences.md +3 -0
  22. package/.agents/skills/rdap-q/memory/lessons.md +3 -0
  23. package/.agents/skills/rdap-q/memory/patterns.md +3 -0
  24. package/.agents/skills/rdap-q/memory/tooling.md +3 -0
  25. package/.agents/skills/rdap-q/playbooks/00-bootstrap.md +17 -0
  26. package/.agents/skills/rdap-q/playbooks/01-discovery.md +9 -0
  27. package/.agents/skills/rdap-q/playbooks/02-planning.md +6 -0
  28. package/.agents/skills/rdap-q/playbooks/03-architecture.md +6 -0
  29. package/.agents/skills/rdap-q/playbooks/04-implementation.md +8 -0
  30. package/.agents/skills/rdap-q/playbooks/05-verification.md +6 -0
  31. package/.agents/skills/rdap-q/playbooks/06-final-audit.md +7 -0
  32. package/.agents/skills/rdap-q/playbooks/07-git-worktree.md +13 -0
  33. package/.agents/skills/rdap-q/projects/architecture.md +3 -0
  34. package/.agents/skills/rdap-q/projects/decisions.md +3 -0
  35. package/.agents/skills/rdap-q/projects/lessons.md +3 -0
  36. package/.agents/skills/rdap-q/projects/project.md +3 -0
  37. package/.agents/skills/rdap-q/state/README.md +4 -0
  38. package/.agents/skills/rdap-q/state/assumptions.md +3 -0
  39. package/.agents/skills/rdap-q/state/decisions.md +2 -0
  40. package/.agents/skills/rdap-q/state/evidence.md +3 -0
  41. package/.agents/skills/rdap-q/state/iteration-log.md +1 -0
  42. package/.agents/skills/rdap-q/state/plan.md +4 -0
  43. package/.agents/skills/rdap-q/state/research.md +13 -0
  44. package/.agents/skills/rdap-q/state/risks.md +2 -0
  45. package/.agents/skills/rdap-q/state/scope.md +9 -0
  46. package/.agents/skills/rdap-q/state/scorecard.md +15 -0
  47. package/.agents/skills/rdap-q/templates/final-report.md +31 -0
  48. package/.agents/skills/rdap-q/templates/milestone.md +8 -0
  49. package/.agents/skills/rdap-q/templates/task.md +12 -0
  50. package/.claude/commands/rdapq.md +8 -0
  51. package/.claude-plugin/marketplace.json +40 -0
  52. package/.claude-plugin/plugin-index.json +16 -0
  53. package/.claude-plugin/plugin.json +25 -0
  54. package/.clinerules +8 -0
  55. package/.codex/skill.json +9 -0
  56. package/.github/copilot-instructions.md +8 -0
  57. package/.github/workflows/ci.yml +25 -0
  58. package/.github/workflows/release.yml +34 -0
  59. package/.goosehints +8 -0
  60. package/.grok/rules.md +8 -0
  61. package/.grok/skill.json +9 -0
  62. package/.grok-plugin/marketplace.json +40 -0
  63. package/.grok-plugin/plugin-index.json +16 -0
  64. package/AGENTS.md +8 -0
  65. package/CLAUDE.md +8 -0
  66. package/GEMINI.md +8 -0
  67. package/LICENSE +674 -0
  68. package/README.md +657 -0
  69. package/agentskills.json +20 -0
  70. package/bin/rdapq.js +14 -0
  71. package/install.ps1 +65 -0
  72. package/install.sh +41 -0
  73. package/lib/installer.js +479 -0
  74. package/manifest.json +87 -0
  75. package/marketplace.json +112 -0
  76. package/package.json +102 -0
  77. package/plugin.json +12 -0
  78. package/plugins/rdap-q/plugin.json +21 -0
  79. package/plugins/rdap-q/skills/rdap-q/README.md +171 -0
  80. package/plugins/rdap-q/skills/rdap-q/SKILL.md +55 -0
  81. package/plugins/rdap-q/skills/rdap-q/core/capabilities.md +9 -0
  82. package/plugins/rdap-q/skills/rdap-q/core/controller.md +14 -0
  83. package/plugins/rdap-q/skills/rdap-q/core/exit-logic.md +9 -0
  84. package/plugins/rdap-q/skills/rdap-q/core/gates.md +12 -0
  85. package/plugins/rdap-q/skills/rdap-q/core/memory.md +11 -0
  86. package/plugins/rdap-q/skills/rdap-q/core/scoring.md +7 -0
  87. package/plugins/rdap-q/skills/rdap-q/diagrams/rdapq-command-flow.mmd +9 -0
  88. package/plugins/rdap-q/skills/rdap-q/diagrams/rdapq-control-loop.mmd +31 -0
  89. package/plugins/rdap-q/skills/rdap-q/diagrams/rdapq-evidence-flow.mmd +31 -0
  90. package/plugins/rdap-q/skills/rdap-q/diagrams/rdapq-memory-model.mmd +26 -0
  91. package/plugins/rdap-q/skills/rdap-q/diagrams/rdapq-score-decision.mmd +24 -0
  92. package/plugins/rdap-q/skills/rdap-q/diagrams/rdapq-selective-loading.mmd +40 -0
  93. package/plugins/rdap-q/skills/rdap-q/install/install-unix.sh +48 -0
  94. package/plugins/rdap-q/skills/rdap-q/install/install-windows.ps1 +65 -0
  95. package/plugins/rdap-q/skills/rdap-q/manifest.json +87 -0
  96. package/plugins/rdap-q/skills/rdap-q/memory/README.md +4 -0
  97. package/plugins/rdap-q/skills/rdap-q/memory/constraints.md +3 -0
  98. package/plugins/rdap-q/skills/rdap-q/memory/engineering-preferences.md +3 -0
  99. package/plugins/rdap-q/skills/rdap-q/memory/lessons.md +3 -0
  100. package/plugins/rdap-q/skills/rdap-q/memory/patterns.md +3 -0
  101. package/plugins/rdap-q/skills/rdap-q/memory/tooling.md +3 -0
  102. package/plugins/rdap-q/skills/rdap-q/playbooks/00-bootstrap.md +17 -0
  103. package/plugins/rdap-q/skills/rdap-q/playbooks/01-discovery.md +9 -0
  104. package/plugins/rdap-q/skills/rdap-q/playbooks/02-planning.md +6 -0
  105. package/plugins/rdap-q/skills/rdap-q/playbooks/03-architecture.md +6 -0
  106. package/plugins/rdap-q/skills/rdap-q/playbooks/04-implementation.md +8 -0
  107. package/plugins/rdap-q/skills/rdap-q/playbooks/05-verification.md +6 -0
  108. package/plugins/rdap-q/skills/rdap-q/playbooks/06-final-audit.md +7 -0
  109. package/plugins/rdap-q/skills/rdap-q/playbooks/07-git-worktree.md +13 -0
  110. package/plugins/rdap-q/skills/rdap-q/projects/architecture.md +3 -0
  111. package/plugins/rdap-q/skills/rdap-q/projects/decisions.md +3 -0
  112. package/plugins/rdap-q/skills/rdap-q/projects/lessons.md +3 -0
  113. package/plugins/rdap-q/skills/rdap-q/projects/project.md +3 -0
  114. package/plugins/rdap-q/skills/rdap-q/state/README.md +4 -0
  115. package/plugins/rdap-q/skills/rdap-q/state/assumptions.md +3 -0
  116. package/plugins/rdap-q/skills/rdap-q/state/decisions.md +2 -0
  117. package/plugins/rdap-q/skills/rdap-q/state/evidence.md +3 -0
  118. package/plugins/rdap-q/skills/rdap-q/state/iteration-log.md +1 -0
  119. package/plugins/rdap-q/skills/rdap-q/state/plan.md +4 -0
  120. package/plugins/rdap-q/skills/rdap-q/state/research.md +13 -0
  121. package/plugins/rdap-q/skills/rdap-q/state/risks.md +2 -0
  122. package/plugins/rdap-q/skills/rdap-q/state/scope.md +9 -0
  123. package/plugins/rdap-q/skills/rdap-q/state/scorecard.md +15 -0
  124. package/plugins/rdap-q/skills/rdap-q/templates/final-report.md +31 -0
  125. package/plugins/rdap-q/skills/rdap-q/templates/milestone.md +8 -0
  126. package/plugins/rdap-q/skills/rdap-q/templates/task.md +12 -0
  127. package/rdap-q-skill/README.md +171 -0
  128. package/rdap-q-skill/SKILL.md +55 -0
  129. package/rdap-q-skill/core/capabilities.md +9 -0
  130. package/rdap-q-skill/core/controller.md +14 -0
  131. package/rdap-q-skill/core/exit-logic.md +9 -0
  132. package/rdap-q-skill/core/gates.md +12 -0
  133. package/rdap-q-skill/core/memory.md +11 -0
  134. package/rdap-q-skill/core/scoring.md +7 -0
  135. package/rdap-q-skill/diagrams/rdapq-command-flow.mmd +9 -0
  136. package/rdap-q-skill/diagrams/rdapq-control-loop.mmd +31 -0
  137. package/rdap-q-skill/diagrams/rdapq-evidence-flow.mmd +31 -0
  138. package/rdap-q-skill/diagrams/rdapq-memory-model.mmd +26 -0
  139. package/rdap-q-skill/diagrams/rdapq-score-decision.mmd +24 -0
  140. package/rdap-q-skill/diagrams/rdapq-selective-loading.mmd +40 -0
  141. package/rdap-q-skill/install/install-unix.sh +48 -0
  142. package/rdap-q-skill/install/install-windows.ps1 +65 -0
  143. package/rdap-q-skill/manifest.json +87 -0
  144. package/rdap-q-skill/memory/README.md +4 -0
  145. package/rdap-q-skill/memory/constraints.md +3 -0
  146. package/rdap-q-skill/memory/engineering-preferences.md +3 -0
  147. package/rdap-q-skill/memory/lessons.md +3 -0
  148. package/rdap-q-skill/memory/patterns.md +3 -0
  149. package/rdap-q-skill/memory/tooling.md +3 -0
  150. package/rdap-q-skill/playbooks/00-bootstrap.md +17 -0
  151. package/rdap-q-skill/playbooks/01-discovery.md +9 -0
  152. package/rdap-q-skill/playbooks/02-planning.md +6 -0
  153. package/rdap-q-skill/playbooks/03-architecture.md +6 -0
  154. package/rdap-q-skill/playbooks/04-implementation.md +8 -0
  155. package/rdap-q-skill/playbooks/05-verification.md +6 -0
  156. package/rdap-q-skill/playbooks/06-final-audit.md +7 -0
  157. package/rdap-q-skill/playbooks/07-git-worktree.md +13 -0
  158. package/rdap-q-skill/projects/architecture.md +3 -0
  159. package/rdap-q-skill/projects/decisions.md +3 -0
  160. package/rdap-q-skill/projects/lessons.md +3 -0
  161. package/rdap-q-skill/projects/project.md +3 -0
  162. package/rdap-q-skill/state/README.md +4 -0
  163. package/rdap-q-skill/state/assumptions.md +3 -0
  164. package/rdap-q-skill/state/decisions.md +2 -0
  165. package/rdap-q-skill/state/evidence.md +3 -0
  166. package/rdap-q-skill/state/iteration-log.md +1 -0
  167. package/rdap-q-skill/state/plan.md +4 -0
  168. package/rdap-q-skill/state/research.md +13 -0
  169. package/rdap-q-skill/state/risks.md +2 -0
  170. package/rdap-q-skill/state/scope.md +9 -0
  171. package/rdap-q-skill/state/scorecard.md +15 -0
  172. package/rdap-q-skill/templates/final-report.md +31 -0
  173. package/rdap-q-skill/templates/milestone.md +8 -0
  174. package/rdap-q-skill/templates/task.md +12 -0
  175. package/scripts/check-static.js +86 -0
  176. package/scripts/check-versions.js +86 -0
  177. package/scripts/materialize-skill-links.js +83 -0
  178. package/skills.json +15 -0
package/bin/rdapq.js ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env node
2
+ 'use strict';
3
+
4
+ const path = require('path');
5
+ const { runCli } = require('../lib/installer');
6
+
7
+ const code = runCli(process.argv.slice(2), {
8
+ pkgRoot: path.resolve(__dirname, '..'),
9
+ cwd: process.cwd(),
10
+ env: process.env,
11
+ invokedAs: path.basename(process.argv[1] || ''),
12
+ });
13
+
14
+ process.exit(code);
package/install.ps1 ADDED
@@ -0,0 +1,65 @@
1
+ # RDAP-Q installer wrapper for Windows PowerShell.
2
+ # The implementation lives in bin/rdapq.js. A piped `irm | iex` launch is refused.
3
+ #Requires -Version 5.1
4
+ [CmdletBinding()]
5
+ param(
6
+ [switch]$All,
7
+ [switch]$Antigravity,
8
+ [switch]$Claude,
9
+ [switch]$Cline,
10
+ [switch]$Copilot,
11
+ [switch]$Codex,
12
+ [switch]$Grok,
13
+ [switch]$Goose,
14
+ [switch]$Cursor,
15
+ [switch]$GlobalOnly,
16
+ [switch]$Force,
17
+ [switch]$Quiet,
18
+ [string]$Repo = "",
19
+ [switch]$Help
20
+ )
21
+
22
+ $ErrorActionPreference = "Stop"
23
+
24
+ if (-not $PSCommandPath) {
25
+ Write-Error "refusing a piped install (irm | iex). Use: npx --yes github:coldcanuk/rdapq install --all`nOr clone the repo and run .\install.ps1 -All"
26
+ exit 1
27
+ }
28
+
29
+ $ScriptDir = Split-Path -Parent $PSCommandPath
30
+ $Skill = Join-Path $ScriptDir "rdap-q-skill\SKILL.md"
31
+ $Cli = Join-Path $ScriptDir "bin\rdapq.js"
32
+
33
+ if (-not (Test-Path -LiteralPath $Skill) -or -not (Test-Path -LiteralPath $Cli)) {
34
+ Write-Error "install.ps1 must be run from a full RDAP-Q checkout."
35
+ exit 1
36
+ }
37
+
38
+ $Node = Get-Command node -ErrorAction SilentlyContinue
39
+ if (-not $Node) {
40
+ Write-Error "Node.js >= 18 is required. Install Node, then re-run .\install.ps1 or use npx --yes github:coldcanuk/rdapq."
41
+ exit 1
42
+ }
43
+
44
+ $nodeArgs = @()
45
+ if ($Help) {
46
+ $nodeArgs = @("--help")
47
+ } else {
48
+ $nodeArgs = @("install")
49
+ if ($All) { $nodeArgs += "--all" }
50
+ if ($Antigravity) { $nodeArgs += "--antigravity" }
51
+ if ($Claude) { $nodeArgs += "--claude" }
52
+ if ($Cline) { $nodeArgs += "--cline" }
53
+ if ($Copilot) { $nodeArgs += "--copilot" }
54
+ if ($Codex) { $nodeArgs += "--codex" }
55
+ if ($Grok) { $nodeArgs += "--grok" }
56
+ if ($Goose) { $nodeArgs += "--goose" }
57
+ if ($Cursor) { $nodeArgs += "--cursor" }
58
+ if ($GlobalOnly) { $nodeArgs += "--global-only" }
59
+ if ($Force) { $nodeArgs += "--force" }
60
+ if ($Quiet) { $nodeArgs += "--quiet" }
61
+ if ($Repo -ne "") { $nodeArgs += @("--repo", $Repo) }
62
+ }
63
+
64
+ & node $Cli @nodeArgs
65
+ exit $LASTEXITCODE
package/install.sh ADDED
@@ -0,0 +1,41 @@
1
+ #!/usr/bin/env bash
2
+ # RDAP-Q installer wrapper. The implementation lives in bin/rdapq.js.
3
+ # Refuse a piped launch: `curl | bash` cannot see the skill tree and older
4
+ # revisions deleted ~/.rdapq/skills/rdap-q before the copy failed.
5
+ set -euo pipefail
6
+
7
+ if [[ -z "${BASH_SOURCE[0]:-}" || "${BASH_SOURCE[0]}" == "-" || ! -f "${BASH_SOURCE[0]}" ]]; then
8
+ echo "error: refusing a piped install (curl | bash / bash -s)." >&2
9
+ echo "That path cannot see the skill tree and used to delete an existing install before failing." >&2
10
+ echo "Use one of:" >&2
11
+ echo " git clone https://github.com/coldcanuk/rdapq.git && cd rdapq && ./install.sh --all" >&2
12
+ echo " npx --yes github:coldcanuk/rdapq install --all" >&2
13
+ exit 1
14
+ fi
15
+
16
+ SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)"
17
+
18
+ if [[ ! -f "$SCRIPT_DIR/rdap-q-skill/SKILL.md" || ! -f "$SCRIPT_DIR/bin/rdapq.js" ]]; then
19
+ echo "error: install.sh must be run from a full RDAP-Q checkout." >&2
20
+ exit 1
21
+ fi
22
+
23
+ if ! command -v node >/dev/null 2>&1; then
24
+ echo "error: Node.js >= 18 is required. Install Node, then re-run ./install.sh or use npx --yes github:coldcanuk/rdapq." >&2
25
+ exit 1
26
+ fi
27
+
28
+ NODE_MAJOR="$(node -p 'process.versions.node.split(".")[0]')"
29
+ if [[ "$NODE_MAJOR" -lt 18 ]]; then
30
+ echo "error: Node.js >= 18 is required (found $(node -v))." >&2
31
+ exit 1
32
+ fi
33
+
34
+ args=("$@")
35
+ if [[ $# -eq 0 ]]; then
36
+ args=(install)
37
+ elif [[ "$1" != "install" && "$1" != "init" && "$1" != "status" && "$1" != "--help" && "$1" != "-h" ]]; then
38
+ args=(install "$@")
39
+ fi
40
+
41
+ exec node "$SCRIPT_DIR/bin/rdapq.js" "${args[@]}"
@@ -0,0 +1,479 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * RDAP-Q installer — single implementation used by the CLI and the
5
+ * shell / PowerShell wrappers. Skill trees are staged and renamed into
6
+ * place. Personal harness files are never replaced unless --force is set.
7
+ */
8
+
9
+ const fs = require('fs');
10
+ const path = require('path');
11
+
12
+ const HARNESS_IDS = ['antigravity', 'claude', 'cline', 'copilot', 'codex', 'grok', 'goose', 'cursor'];
13
+ const COMMANDS = new Set(['install', 'init', 'status']);
14
+
15
+ function say(stream, message) {
16
+ const text = String(message);
17
+ stream(text.endsWith('\n') ? text : `${text}\n`);
18
+ }
19
+
20
+ function exists(target) {
21
+ try {
22
+ fs.lstatSync(target);
23
+ return true;
24
+ } catch (err) {
25
+ if (err && err.code === 'ENOENT') return false;
26
+ throw err;
27
+ }
28
+ }
29
+
30
+ function readVersion(pkgRoot) {
31
+ const pkg = JSON.parse(fs.readFileSync(path.join(pkgRoot, 'package.json'), 'utf8'));
32
+ if (!pkg.version || typeof pkg.version !== 'string') {
33
+ throw new Error('package.json is missing a version');
34
+ }
35
+ return pkg.version;
36
+ }
37
+
38
+ function resolveLayout(env) {
39
+ const home = env.HOME || env.USERPROFILE || require('os').homedir();
40
+ const roaming = env.APPDATA || path.join(home, 'AppData', 'Roaming');
41
+ return {
42
+ rdapq: env.RDAPQ_HOME || path.join(home, '.rdapq'),
43
+ gemini: env.GEMINI_HOME || path.join(home, '.gemini'),
44
+ goose: env.GOOSE_HOME || path.join(home, '.config', 'goose'),
45
+ claude: env.CLAUDE_HOME || path.join(home, '.claude'),
46
+ cursor: env.CURSOR_HOME || path.join(home, '.cursor'),
47
+ cline: env.CLINE_HOME || path.join(home, '.cline'),
48
+ codex: env.CODEX_HOME || path.join(home, '.codex'),
49
+ grok: env.GROK_HOME || path.join(home, '.grok'),
50
+ copilot: env.COPILOT_HOME || (process.platform === 'win32'
51
+ ? path.join(roaming, 'github-copilot')
52
+ : path.join(home, '.config', 'github-copilot')),
53
+ };
54
+ }
55
+
56
+ function skillSource(pkgRoot) {
57
+ const src = path.join(pkgRoot, 'rdap-q-skill');
58
+ if (!exists(path.join(src, 'SKILL.md'))) {
59
+ throw new Error(`RDAP-Q skill source is missing (${src}). Install from a full checkout or via npx --yes github:coldcanuk/rdapq.`);
60
+ }
61
+ return src;
62
+ }
63
+
64
+ /**
65
+ * Copy a file or directory. Symlinks are reproduced, never followed, and
66
+ * rejected when they point outside `root`.
67
+ */
68
+ function copyTreeSafe(src, dest, root) {
69
+ const st = fs.lstatSync(src);
70
+ if (st.isSymbolicLink()) {
71
+ const link = fs.readlinkSync(src);
72
+ const resolved = path.resolve(path.dirname(src), link);
73
+ const rel = path.relative(root, resolved);
74
+ if (rel === '' || rel.startsWith('..') || path.isAbsolute(rel)) {
75
+ throw new Error(`refusing outbound symlink ${src} -> ${link}`);
76
+ }
77
+ if (!exists(resolved)) {
78
+ throw new Error(`refusing dangling symlink ${src} -> ${link}`);
79
+ }
80
+ fs.symlinkSync(link, dest);
81
+ return;
82
+ }
83
+ if (st.isDirectory()) {
84
+ fs.mkdirSync(dest, { recursive: true });
85
+ for (const name of fs.readdirSync(src)) {
86
+ copyTreeSafe(path.join(src, name), path.join(dest, name), root);
87
+ }
88
+ return;
89
+ }
90
+ if (st.isFile()) {
91
+ fs.copyFileSync(src, dest);
92
+ return;
93
+ }
94
+ throw new Error(`unsupported filesystem entry: ${src}`);
95
+ }
96
+
97
+ /**
98
+ * Publish `src` to `dest` by copying into a sibling staging directory and
99
+ * renaming. The previous tree is removed only after the staged copy verifies.
100
+ */
101
+ function publishTree(src, dest) {
102
+ if (!exists(src)) {
103
+ throw new Error(`source tree does not exist: ${src}`);
104
+ }
105
+ const parent = path.dirname(dest);
106
+ fs.mkdirSync(parent, { recursive: true });
107
+ const token = `${process.pid}-${Date.now()}-${Math.random().toString(16).slice(2)}`;
108
+ const staging = path.join(parent, `.${path.basename(dest)}.staging-${token}`);
109
+ const backup = path.join(parent, `.${path.basename(dest)}.backup-${token}`);
110
+ fs.rmSync(staging, { recursive: true, force: true });
111
+ let movedAside = false;
112
+ try {
113
+ copyTreeSafe(src, staging, src);
114
+ if (!exists(path.join(staging, 'SKILL.md'))) {
115
+ throw new Error(`staged copy is missing SKILL.md; left ${dest} untouched`);
116
+ }
117
+ if (exists(dest)) {
118
+ fs.renameSync(dest, backup);
119
+ movedAside = true;
120
+ }
121
+ fs.renameSync(staging, dest);
122
+ if (movedAside) fs.rmSync(backup, { recursive: true, force: true });
123
+ } catch (err) {
124
+ if (exists(staging)) fs.rmSync(staging, { recursive: true, force: true });
125
+ if (movedAside && !exists(dest) && exists(backup)) {
126
+ fs.renameSync(backup, dest);
127
+ }
128
+ throw err;
129
+ }
130
+ }
131
+
132
+ function assertRegularFile(target, label) {
133
+ if (!exists(target)) return;
134
+ const st = fs.lstatSync(target);
135
+ if (st.isSymbolicLink()) {
136
+ throw new Error(`refusing to follow symlink ${label || target}`);
137
+ }
138
+ if (!st.isFile()) {
139
+ throw new Error(`refusing to replace non-file ${label || target}`);
140
+ }
141
+ }
142
+
143
+ /**
144
+ * Write a harness bridge. Existing different content is kept unless `force`.
145
+ * A skipped write leaves the packaged bytes at `dest.rdapq`. A forced
146
+ * replacement keeps the previous bytes at `dest.rdapq-backup`.
147
+ */
148
+ function placeConfigFile(src, dest, { force }) {
149
+ if (!exists(src)) {
150
+ throw new Error(`missing packaged file: ${src}`);
151
+ }
152
+ assertRegularFile(src, src);
153
+ const packaged = fs.readFileSync(src);
154
+ fs.mkdirSync(path.dirname(dest), { recursive: true });
155
+ if (!exists(dest)) {
156
+ fs.writeFileSync(dest, packaged);
157
+ return { action: 'created', dest };
158
+ }
159
+ assertRegularFile(dest, dest);
160
+ const current = fs.readFileSync(dest);
161
+ if (current.equals(packaged)) {
162
+ return { action: 'unchanged', dest };
163
+ }
164
+ if (!force) {
165
+ const sidecar = `${dest}.rdapq`;
166
+ assertRegularFile(sidecar, sidecar);
167
+ fs.writeFileSync(sidecar, packaged);
168
+ return { action: 'kept', dest, sidecar };
169
+ }
170
+ const backup = `${dest}.rdapq-backup`;
171
+ assertRegularFile(backup, backup);
172
+ fs.writeFileSync(backup, current);
173
+ fs.writeFileSync(dest, packaged);
174
+ return { action: 'replaced', dest, backup };
175
+ }
176
+
177
+ function describePlace(result) {
178
+ if (result.action === 'created') return ` ✓ created ${result.dest}`;
179
+ if (result.action === 'unchanged') return ` = unchanged ${result.dest}`;
180
+ if (result.action === 'kept') {
181
+ return ` ! kept existing ${result.dest} (pass --force to replace). Proposed copy: ${result.sidecar}`;
182
+ }
183
+ return ` ✓ replaced ${result.dest} (backup: ${result.backup})`;
184
+ }
185
+
186
+ function harnessFiles(id, layout, pkgRoot) {
187
+ switch (id) {
188
+ case 'claude':
189
+ return [[path.join(pkgRoot, '.claude', 'commands', 'rdapq.md'), path.join(layout.claude, 'commands', 'rdapq.md')]];
190
+ case 'cline':
191
+ return [[path.join(pkgRoot, '.clinerules'), path.join(layout.cline, 'rdapq.rules.md')]];
192
+ case 'copilot':
193
+ return [[path.join(pkgRoot, '.github', 'copilot-instructions.md'), path.join(layout.copilot, 'rdapq-instructions.md')]];
194
+ case 'codex':
195
+ return [[path.join(pkgRoot, 'AGENTS.md'), path.join(layout.codex, 'AGENTS.md')]];
196
+ case 'grok':
197
+ return [[path.join(pkgRoot, '.grok', 'rules.md'), path.join(layout.grok, 'rules.md')]];
198
+ case 'cursor':
199
+ return [];
200
+ default:
201
+ return [];
202
+ }
203
+ }
204
+
205
+ function harnessLabel(id) {
206
+ return {
207
+ antigravity: 'Google Antigravity',
208
+ claude: 'Anthropic Claude / Claude Code',
209
+ cline: 'Cline / Roo Code',
210
+ copilot: 'GitHub Copilot',
211
+ codex: 'OpenAI Codex',
212
+ grok: 'xAI Grok',
213
+ goose: 'Block Goose',
214
+ cursor: 'Cursor',
215
+ }[id];
216
+ }
217
+
218
+ function harnessTreeDest(id, layout) {
219
+ if (id === 'antigravity') return path.join(layout.gemini, 'antigravity-cli', 'skills', 'rdap-q');
220
+ if (id === 'goose') return path.join(layout.goose, 'toolkits', 'rdap-q');
221
+ if (id === 'cursor') return path.join(layout.cursor, 'skills', 'rdap-q');
222
+ return null;
223
+ }
224
+
225
+ const REPO_BRIDGES = [
226
+ ['AGENTS.md', 'AGENTS.md'],
227
+ ['CLAUDE.md', 'CLAUDE.md'],
228
+ ['GEMINI.md', 'GEMINI.md'],
229
+ ['.clinerules', '.clinerules'],
230
+ ['.goosehints', '.goosehints'],
231
+ [path.join('.grok', 'rules.md'), path.join('.grok', 'rules.md')],
232
+ [path.join('.github', 'copilot-instructions.md'), path.join('.github', 'copilot-instructions.md')],
233
+ [path.join('.claude', 'commands', 'rdapq.md'), path.join('.claude', 'commands', 'rdapq.md')],
234
+ ];
235
+
236
+ function statusRows(layout) {
237
+ return [
238
+ ['Core Protocol ($RDAPQ_HOME)', path.join(layout.rdapq, 'skills', 'rdap-q', 'SKILL.md')],
239
+ ['Google Antigravity', path.join(layout.gemini, 'antigravity-cli', 'skills', 'rdap-q', 'SKILL.md')],
240
+ ['Anthropic Claude Code', path.join(layout.claude, 'commands', 'rdapq.md')],
241
+ ['Cline / Roo Code', path.join(layout.cline, 'rdapq.rules.md')],
242
+ ['GitHub Copilot', path.join(layout.copilot, 'rdapq-instructions.md')],
243
+ ['OpenAI Codex', path.join(layout.codex, 'AGENTS.md')],
244
+ ['xAI Grok', path.join(layout.grok, 'rules.md')],
245
+ ['Block Goose', path.join(layout.goose, 'toolkits', 'rdap-q', 'SKILL.md')],
246
+ ['Cursor', path.join(layout.cursor, 'skills', 'rdap-q', 'SKILL.md')],
247
+ ];
248
+ }
249
+
250
+ function parseArgs(argv) {
251
+ const flags = {
252
+ help: false,
253
+ force: false,
254
+ quiet: false,
255
+ all: false,
256
+ globalOnly: false,
257
+ repo: null,
258
+ command: null,
259
+ harnesses: [],
260
+ };
261
+ for (let i = 0; i < argv.length; i += 1) {
262
+ const arg = argv[i];
263
+ if (arg === '--help' || arg === '-h') {
264
+ flags.help = true;
265
+ } else if (arg === '--force') {
266
+ flags.force = true;
267
+ } else if (arg === '--quiet') {
268
+ flags.quiet = true;
269
+ } else if (arg === '--all') {
270
+ flags.all = true;
271
+ } else if (arg === '--global-only') {
272
+ flags.globalOnly = true;
273
+ } else if (arg === '--repo') {
274
+ const value = argv[i + 1];
275
+ if (!value || value.startsWith('-')) throw new Error('--repo requires a directory path');
276
+ i += 1;
277
+ flags.repo = value;
278
+ } else if (arg.startsWith('--') && HARNESS_IDS.includes(arg.slice(2))) {
279
+ const id = arg.slice(2);
280
+ if (!flags.harnesses.includes(id)) flags.harnesses.push(id);
281
+ } else if (COMMANDS.has(arg)) {
282
+ if (flags.command) throw new Error(`multiple commands: ${flags.command} and ${arg}`);
283
+ flags.command = arg;
284
+ } else {
285
+ throw new Error(`unknown option: ${arg}`);
286
+ }
287
+ }
288
+ return flags;
289
+ }
290
+
291
+ function helpText(version) {
292
+ return `Usage: rdapq [COMMAND] [OPTIONS]
293
+ npx --yes github:coldcanuk/rdapq [COMMAND] [OPTIONS]
294
+
295
+ Research-Driven Adaptive Planning with Quality Gates (v${version})
296
+
297
+ Commands:
298
+ install Install the core skill and harness bridges (default)
299
+ init Write workspace bridges into the current repository
300
+ status Show install status across all 8 harnesses
301
+
302
+ Options:
303
+ --all Install every harness (default when none are named)
304
+ --antigravity Install for Google Antigravity
305
+ --claude Install for Anthropic Claude / Claude Code
306
+ --cline Install for Cline / Roo Code
307
+ --copilot Install for GitHub Copilot
308
+ --codex Install for OpenAI Codex
309
+ --grok Install for xAI Grok
310
+ --goose Install for Block Goose
311
+ --cursor Install for Cursor
312
+ --repo PATH Write workspace bridges into PATH
313
+ --global-only Install only ~/.rdapq (or $RDAPQ_HOME)
314
+ --force Replace existing harness files (keeps a .rdapq-backup)
315
+ --quiet Suppress the banner and per-file chatter
316
+ --help, -h Show this help message
317
+
318
+ There is no separate update command. Run install again with the same flags.
319
+ Skill trees are replaced after the new copy verifies. Edited harness files
320
+ are kept unless you pass --force. The npm name rdap-q is not published yet.
321
+
322
+ Examples:
323
+ npx --yes github:coldcanuk/rdapq install --claude
324
+ npx --yes github:coldcanuk/rdapq install --cursor
325
+ npx --yes github:coldcanuk/rdapq#v${version} install --all
326
+ rdapq init
327
+ rdapq init --force
328
+ rdapq status
329
+ `;
330
+ }
331
+
332
+ function banner(version) {
333
+ return `
334
+ ____ ____ _ ____ ___
335
+ | _ \\| _ \\ / \\ | _ \\ / _ \\
336
+ | |_) | | | |/ _ \\ | |_) |_____| | | |
337
+ | _ <| |_| / ___ \\| __/|_____| |_| |
338
+ |_| \\_\\____/_/ \\_\\_| \\__\\_\\
339
+
340
+ Research-Driven Adaptive Planning with Quality Gates (v${version})
341
+ Universal AI Agent Protocol (Codex, Grok, Copilot, Antigravity, Goose, Claude, Cline, Cursor)
342
+ `;
343
+ }
344
+
345
+ function installCore(pkgRoot, layout, log) {
346
+ const src = skillSource(pkgRoot);
347
+ log(`==> Setting up RDAP-Q core at: ${layout.rdapq}`);
348
+ for (const sub of ['memory', 'projects', 'registry']) {
349
+ fs.mkdirSync(path.join(layout.rdapq, sub), { recursive: true });
350
+ }
351
+ const dest = path.join(layout.rdapq, 'skills', 'rdap-q');
352
+ publishTree(src, dest);
353
+ log(` ✓ Core skill installed to ${dest}`);
354
+ }
355
+
356
+ function installHarness(id, pkgRoot, layout, force, log) {
357
+ log(`==> Configuring for ${harnessLabel(id)}...`);
358
+ const treeDest = harnessTreeDest(id, layout);
359
+ if (treeDest) {
360
+ publishTree(skillSource(pkgRoot), treeDest);
361
+ log(` ✓ skill tree installed to ${treeDest}`);
362
+ }
363
+ for (const [fromRel, dest] of harnessFiles(id, layout, pkgRoot)) {
364
+ const from = path.isAbsolute(fromRel) ? fromRel : path.join(pkgRoot, fromRel);
365
+ log(describePlace(placeConfigFile(from, dest, { force })));
366
+ }
367
+ }
368
+
369
+ function installRepo(pkgRoot, repoArg, cwd, force, log) {
370
+ const abs = path.resolve(cwd, repoArg);
371
+ if (!exists(abs) || !fs.statSync(abs).isDirectory()) {
372
+ throw new Error(`directory does not exist: ${abs}`);
373
+ }
374
+ log(`==> Installing RDAP-Q workspace configuration into: ${abs}`);
375
+ fs.mkdirSync(path.join(abs, '.rdapq', 'state'), { recursive: true });
376
+ for (const [relSrc, relDest] of REPO_BRIDGES) {
377
+ log(describePlace(placeConfigFile(path.join(pkgRoot, relSrc), path.join(abs, relDest), { force })));
378
+ }
379
+ const skillDest = path.join(abs, '.agents', 'skills', 'rdap-q');
380
+ publishTree(skillSource(pkgRoot), skillDest);
381
+ log(` ✓ skill tree installed to ${skillDest}`);
382
+ log(' ✓ Workspace bridges processed for Codex, Grok, Copilot, Antigravity, Goose, Claude, and Cline.');
383
+ }
384
+
385
+ function printStatus(layout, log) {
386
+ log('==> Inspecting RDAP-Q Multi-Harness Status:');
387
+ for (const [name, target] of statusRows(layout)) {
388
+ const installed = exists(target) && fs.statSync(target).isFile();
389
+ const icon = installed ? '✓' : '✗';
390
+ const detail = installed ? `Installed (${target})` : 'Not installed';
391
+ log(` [${icon}] ${name.padEnd(28)}: ${detail}`);
392
+ }
393
+ }
394
+
395
+ function selectedHarnesses(flags) {
396
+ if (flags.globalOnly) return [];
397
+ if (flags.all || flags.harnesses.length === 0) return HARNESS_IDS.slice();
398
+ return flags.harnesses.slice();
399
+ }
400
+
401
+ function normalizeArgv(argv, invokedAs) {
402
+ const args = argv.slice();
403
+ const name = String(invokedAs || '').replace(/\.js$/, '');
404
+ const known = new Set(['install', 'init', 'status', '--help', '-h']);
405
+ if (name === 'rdapq-install' && !args.some((arg) => known.has(arg))) {
406
+ args.unshift('install');
407
+ }
408
+ return args;
409
+ }
410
+
411
+ function runCli(argv, options = {}) {
412
+ const pkgRoot = options.pkgRoot || path.resolve(__dirname, '..');
413
+ const env = options.env || process.env;
414
+ const cwd = options.cwd || process.cwd();
415
+ const stdout = options.stdout || ((line) => process.stdout.write(line));
416
+ const stderr = options.stderr || ((line) => process.stderr.write(line));
417
+ const log = (message) => say(stdout, message);
418
+ const error = (message) => say(stderr, message);
419
+ const started = Date.now();
420
+
421
+ try {
422
+ const version = readVersion(pkgRoot);
423
+ const flags = parseArgs(normalizeArgv(argv, options.invokedAs));
424
+ if (flags.help) {
425
+ if (!flags.quiet) log(banner(version).replace(/^\n/, ''));
426
+ log(helpText(version).replace(/\n$/, ''));
427
+ return 0;
428
+ }
429
+ if (!flags.quiet) log(banner(version).replace(/^\n/, ''));
430
+
431
+ const repoMode = Boolean(flags.repo) || flags.command === 'init';
432
+ const harnessMode = flags.all || flags.globalOnly || flags.harnesses.length > 0;
433
+ if (repoMode && harnessMode) {
434
+ throw new Error('init/--repo only writes workspace bridges. Run a separate install command for global harnesses.');
435
+ }
436
+ if (flags.globalOnly && (flags.all || flags.harnesses.length > 0)) {
437
+ throw new Error('--global-only cannot be combined with harness selectors or --all');
438
+ }
439
+ if (flags.command === 'status' && (repoMode || harnessMode || flags.force)) {
440
+ throw new Error('status does not take install selectors');
441
+ }
442
+
443
+ const layout = resolveLayout(env);
444
+
445
+ if (flags.command === 'status') {
446
+ printStatus(layout, log);
447
+ } else if (repoMode) {
448
+ installRepo(pkgRoot, flags.repo || cwd, cwd, flags.force, flags.quiet ? () => {} : log);
449
+ } else {
450
+ installCore(pkgRoot, layout, flags.quiet ? () => {} : log);
451
+ for (const id of selectedHarnesses(flags)) {
452
+ installHarness(id, pkgRoot, layout, flags.force, flags.quiet ? () => {} : log);
453
+ }
454
+ if (!flags.quiet) {
455
+ log("\n==> Installation complete. Invoke '/rdapq <task>' in your AI harness.");
456
+ }
457
+ }
458
+
459
+ if (!flags.quiet) log(`==> Done in ${Date.now() - started}ms`);
460
+ return 0;
461
+ } catch (err) {
462
+ error(`error: ${err.message}`);
463
+ return 1;
464
+ }
465
+ }
466
+
467
+ module.exports = {
468
+ HARNESS_IDS,
469
+ REPO_BRIDGES,
470
+ copyTreeSafe,
471
+ harnessFiles,
472
+ parseArgs,
473
+ placeConfigFile,
474
+ publishTree,
475
+ readVersion,
476
+ resolveLayout,
477
+ runCli,
478
+ statusRows,
479
+ };
package/manifest.json ADDED
@@ -0,0 +1,87 @@
1
+ {
2
+ "name": "rdap-q",
3
+ "version": "1.2.1",
4
+ "protocol_name": "RDAP-Q Agent Engineering Protocol",
5
+ "entrypoint": "rdap-q-skill/SKILL.md",
6
+ "invocation": "/rdapq",
7
+ "home_env": "RDAPQ_HOME",
8
+ "home_defaults": {
9
+ "windows": "%USERPROFILE%\\.rdapq",
10
+ "unix": "${HOME}/.rdapq"
11
+ },
12
+ "repository_state": ".rdapq/state",
13
+ "always_load": [
14
+ "rdap-q-skill/SKILL.md"
15
+ ],
16
+ "phase_load": {
17
+ "BOOTSTRAP": [
18
+ "rdap-q-skill/playbooks/00-bootstrap.md"
19
+ ],
20
+ "DISCOVERY": [
21
+ "rdap-q-skill/playbooks/01-discovery.md"
22
+ ],
23
+ "PLAN": [
24
+ "rdap-q-skill/playbooks/02-planning.md"
25
+ ],
26
+ "ARCHITECTURE": [
27
+ "rdap-q-skill/playbooks/03-architecture.md"
28
+ ],
29
+ "IMPLEMENT": [
30
+ "rdap-q-skill/playbooks/04-implementation.md"
31
+ ],
32
+ "VERIFY": [
33
+ "rdap-q-skill/playbooks/05-verification.md"
34
+ ],
35
+ "AUDIT": [
36
+ "rdap-q-skill/playbooks/06-final-audit.md",
37
+ "rdap-q-skill/playbooks/07-git-worktree.md"
38
+ ]
39
+ },
40
+ "event_load": {
41
+ "controller_ambiguity": [
42
+ "rdap-q-skill/core/controller.md"
43
+ ],
44
+ "tool_mapping": [
45
+ "rdap-q-skill/core/capabilities.md"
46
+ ],
47
+ "memory_read_write_invalidate": [
48
+ "rdap-q-skill/core/memory.md"
49
+ ],
50
+ "gate_evaluation": [
51
+ "rdap-q-skill/core/gates.md"
52
+ ],
53
+ "score_calculation": [
54
+ "rdap-q-skill/core/scoring.md"
55
+ ],
56
+ "milestone_quality_decision": [
57
+ "rdap-q-skill/core/scoring.md",
58
+ "rdap-q-skill/core/gates.md",
59
+ "rdap-q-skill/core/exit-logic.md"
60
+ ],
61
+ "terminal_decision": [
62
+ "rdap-q-skill/core/scoring.md",
63
+ "rdap-q-skill/core/gates.md",
64
+ "rdap-q-skill/core/exit-logic.md"
65
+ ],
66
+ "git_mutation": [
67
+ "rdap-q-skill/playbooks/07-git-worktree.md"
68
+ ]
69
+ },
70
+ "commands": {
71
+ "/rdapq": "Start or continue RDAP-Q execution on the supplied task.",
72
+ "/rdapq status": "Show phase, quality, confidence, gates, blockers, and iteration state.",
73
+ "/rdapq score": "Calculate or display the current evidence-linked scorecard.",
74
+ "/rdapq audit": "Run the adversarial final-audit procedure.",
75
+ "/rdapq resume": "Reload persistent memory/state, inspect drift, and resume safely.",
76
+ "/rdapq memory": "Show relevant RDAP-Q memory and its validity status.",
77
+ "/rdapq research": "Enter or re-enter discovery/research.",
78
+ "/rdapq explain": "Explain the current RDAP-Q phase/decision."
79
+ },
80
+ "terminal_states": [
81
+ "COMPLETE",
82
+ "BLOCKED",
83
+ "STALLED",
84
+ "CONSTRAINT_LIMITED",
85
+ "FAILED_VERIFICATION"
86
+ ]
87
+ }