@nforma.ai/nforma 0.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 (215) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +1024 -0
  3. package/agents/qgsd-codebase-mapper.md +764 -0
  4. package/agents/qgsd-debugger.md +1201 -0
  5. package/agents/qgsd-executor.md +472 -0
  6. package/agents/qgsd-integration-checker.md +443 -0
  7. package/agents/qgsd-phase-researcher.md +502 -0
  8. package/agents/qgsd-plan-checker.md +643 -0
  9. package/agents/qgsd-planner.md +1182 -0
  10. package/agents/qgsd-project-researcher.md +621 -0
  11. package/agents/qgsd-quorum-orchestrator.md +628 -0
  12. package/agents/qgsd-quorum-slot-worker.md +41 -0
  13. package/agents/qgsd-quorum-synthesizer.md +133 -0
  14. package/agents/qgsd-quorum-test-worker.md +37 -0
  15. package/agents/qgsd-quorum-worker.md +161 -0
  16. package/agents/qgsd-research-synthesizer.md +239 -0
  17. package/agents/qgsd-roadmapper.md +660 -0
  18. package/agents/qgsd-verifier.md +628 -0
  19. package/bin/accept-debug-invariant.cjs +165 -0
  20. package/bin/account-manager.cjs +719 -0
  21. package/bin/aggregate-requirements.cjs +466 -0
  22. package/bin/analyze-assumptions.cjs +757 -0
  23. package/bin/analyze-state-space.cjs +921 -0
  24. package/bin/attribute-trace-divergence.cjs +150 -0
  25. package/bin/auth-drivers/gh-cli.cjs +93 -0
  26. package/bin/auth-drivers/index.cjs +46 -0
  27. package/bin/auth-drivers/pool.cjs +67 -0
  28. package/bin/auth-drivers/simple.cjs +95 -0
  29. package/bin/autoClosePtoF.cjs +110 -0
  30. package/bin/blessed-terminal.cjs +350 -0
  31. package/bin/build-phase-index.cjs +472 -0
  32. package/bin/call-quorum-slot.cjs +541 -0
  33. package/bin/ccr-secure-config.cjs +99 -0
  34. package/bin/ccr-secure-start.cjs +83 -0
  35. package/bin/check-bundled-sdks.cjs +177 -0
  36. package/bin/check-coverage-guard.cjs +112 -0
  37. package/bin/check-liveness-fairness.cjs +95 -0
  38. package/bin/check-mcp-health.cjs +123 -0
  39. package/bin/check-provider-health.cjs +395 -0
  40. package/bin/check-results-exit.cjs +24 -0
  41. package/bin/check-spec-sync.cjs +360 -0
  42. package/bin/check-trace-redaction.cjs +271 -0
  43. package/bin/check-trace-schema-drift.cjs +99 -0
  44. package/bin/compareDrift.cjs +21 -0
  45. package/bin/conformance-schema.cjs +12 -0
  46. package/bin/count-scenarios.cjs +420 -0
  47. package/bin/debt-dedup.cjs +144 -0
  48. package/bin/debt-ledger.cjs +61 -0
  49. package/bin/debt-retention.cjs +76 -0
  50. package/bin/debt-state-machine.cjs +80 -0
  51. package/bin/detect-coverage-gaps.cjs +204 -0
  52. package/bin/detect-project-intent.cjs +362 -0
  53. package/bin/export-prism-constants.cjs +164 -0
  54. package/bin/extract-annotations.cjs +633 -0
  55. package/bin/extractFormalExpected.cjs +104 -0
  56. package/bin/fingerprint-drift.cjs +24 -0
  57. package/bin/fingerprint-issue.cjs +46 -0
  58. package/bin/formal-core.cjs +519 -0
  59. package/bin/formal-ref-linker.cjs +141 -0
  60. package/bin/formal-test-sync.cjs +788 -0
  61. package/bin/generate-formal-specs.cjs +588 -0
  62. package/bin/generate-petri-net.cjs +397 -0
  63. package/bin/generate-phase-spec.cjs +249 -0
  64. package/bin/generate-proposed-changes.cjs +194 -0
  65. package/bin/generate-tla-cfg.cjs +122 -0
  66. package/bin/generate-traceability-matrix.cjs +701 -0
  67. package/bin/generate-triage-bundle.cjs +300 -0
  68. package/bin/gh-account-rotate.cjs +34 -0
  69. package/bin/initialize-model-registry.cjs +105 -0
  70. package/bin/install-formal-tools.cjs +382 -0
  71. package/bin/install.js +2424 -0
  72. package/bin/isNumericThreshold.cjs +34 -0
  73. package/bin/issue-classifier.cjs +151 -0
  74. package/bin/levenshtein.cjs +74 -0
  75. package/bin/lint-formal-models.cjs +580 -0
  76. package/bin/load-baseline-requirements.cjs +275 -0
  77. package/bin/manage-agents-core.cjs +815 -0
  78. package/bin/migrate-formal-dir.cjs +172 -0
  79. package/bin/migrate-planning.cjs +206 -0
  80. package/bin/migrate-to-slots.cjs +255 -0
  81. package/bin/nForma.cjs +2726 -0
  82. package/bin/observe-config.cjs +353 -0
  83. package/bin/observe-debt-writer.cjs +140 -0
  84. package/bin/observe-handler-grafana.cjs +128 -0
  85. package/bin/observe-handler-internal.cjs +301 -0
  86. package/bin/observe-handler-logstash.cjs +153 -0
  87. package/bin/observe-handler-prometheus.cjs +185 -0
  88. package/bin/observe-handlers.cjs +436 -0
  89. package/bin/observe-registry.cjs +131 -0
  90. package/bin/observe-render.cjs +168 -0
  91. package/bin/planning-paths.cjs +167 -0
  92. package/bin/polyrepo.cjs +560 -0
  93. package/bin/prism-priority.cjs +153 -0
  94. package/bin/probe-quorum-slots.cjs +167 -0
  95. package/bin/promote-model.cjs +225 -0
  96. package/bin/propose-debug-invariants.cjs +165 -0
  97. package/bin/providers.json +392 -0
  98. package/bin/pty-proxy.py +129 -0
  99. package/bin/qgsd-solve.cjs +2477 -0
  100. package/bin/quorum-consensus-gate.cjs +238 -0
  101. package/bin/quorum-formal-context.cjs +183 -0
  102. package/bin/quorum-slot-dispatch.cjs +934 -0
  103. package/bin/read-policy.cjs +60 -0
  104. package/bin/requirement-map.cjs +63 -0
  105. package/bin/requirements-core.cjs +247 -0
  106. package/bin/resolve-cli.cjs +101 -0
  107. package/bin/review-mcp-logs.cjs +294 -0
  108. package/bin/run-account-manager-tlc.cjs +188 -0
  109. package/bin/run-account-pool-alloy.cjs +158 -0
  110. package/bin/run-alloy.cjs +153 -0
  111. package/bin/run-audit-alloy.cjs +187 -0
  112. package/bin/run-breaker-tlc.cjs +181 -0
  113. package/bin/run-formal-check.cjs +395 -0
  114. package/bin/run-formal-verify.cjs +701 -0
  115. package/bin/run-installer-alloy.cjs +188 -0
  116. package/bin/run-oauth-rotation-prism.cjs +132 -0
  117. package/bin/run-oscillation-tlc.cjs +202 -0
  118. package/bin/run-phase-tlc.cjs +228 -0
  119. package/bin/run-prism.cjs +446 -0
  120. package/bin/run-protocol-tlc.cjs +201 -0
  121. package/bin/run-quorum-composition-alloy.cjs +155 -0
  122. package/bin/run-sensitivity-sweep.cjs +231 -0
  123. package/bin/run-stop-hook-tlc.cjs +188 -0
  124. package/bin/run-tlc.cjs +467 -0
  125. package/bin/run-transcript-alloy.cjs +173 -0
  126. package/bin/run-uppaal.cjs +264 -0
  127. package/bin/secrets.cjs +134 -0
  128. package/bin/sensitivity-report.cjs +219 -0
  129. package/bin/sensitivity-sweep-feedback.cjs +194 -0
  130. package/bin/set-secret.cjs +29 -0
  131. package/bin/setup-telemetry-cron.sh +36 -0
  132. package/bin/sweepPtoF.cjs +63 -0
  133. package/bin/sync-baseline-requirements.cjs +290 -0
  134. package/bin/task-envelope.cjs +360 -0
  135. package/bin/telemetry-collector.cjs +229 -0
  136. package/bin/unified-mcp-server.mjs +735 -0
  137. package/bin/update-agents.cjs +369 -0
  138. package/bin/update-scoreboard.cjs +1134 -0
  139. package/bin/validate-debt-entry.cjs +207 -0
  140. package/bin/validate-invariant.cjs +419 -0
  141. package/bin/validate-memory.cjs +389 -0
  142. package/bin/validate-requirements-haiku.cjs +435 -0
  143. package/bin/validate-traces.cjs +438 -0
  144. package/bin/verify-formal-results.cjs +124 -0
  145. package/bin/verify-quorum-health.cjs +273 -0
  146. package/bin/write-check-result.cjs +106 -0
  147. package/bin/xstate-to-tla.cjs +483 -0
  148. package/bin/xstate-trace-walker.cjs +205 -0
  149. package/commands/qgsd/add-phase.md +43 -0
  150. package/commands/qgsd/add-requirement.md +24 -0
  151. package/commands/qgsd/add-todo.md +47 -0
  152. package/commands/qgsd/audit-milestone.md +37 -0
  153. package/commands/qgsd/check-todos.md +45 -0
  154. package/commands/qgsd/cleanup.md +18 -0
  155. package/commands/qgsd/close-formal-gaps.md +33 -0
  156. package/commands/qgsd/complete-milestone.md +136 -0
  157. package/commands/qgsd/debug.md +166 -0
  158. package/commands/qgsd/discuss-phase.md +83 -0
  159. package/commands/qgsd/execute-phase.md +117 -0
  160. package/commands/qgsd/fix-tests.md +27 -0
  161. package/commands/qgsd/formal-test-sync.md +32 -0
  162. package/commands/qgsd/health.md +22 -0
  163. package/commands/qgsd/help.md +22 -0
  164. package/commands/qgsd/insert-phase.md +32 -0
  165. package/commands/qgsd/join-discord.md +18 -0
  166. package/commands/qgsd/list-phase-assumptions.md +46 -0
  167. package/commands/qgsd/map-codebase.md +71 -0
  168. package/commands/qgsd/map-requirements.md +20 -0
  169. package/commands/qgsd/mcp-restart.md +176 -0
  170. package/commands/qgsd/mcp-set-model.md +134 -0
  171. package/commands/qgsd/mcp-setup.md +1371 -0
  172. package/commands/qgsd/mcp-status.md +274 -0
  173. package/commands/qgsd/mcp-update.md +238 -0
  174. package/commands/qgsd/new-milestone.md +44 -0
  175. package/commands/qgsd/new-project.md +42 -0
  176. package/commands/qgsd/observe.md +260 -0
  177. package/commands/qgsd/pause-work.md +38 -0
  178. package/commands/qgsd/plan-milestone-gaps.md +34 -0
  179. package/commands/qgsd/plan-phase.md +44 -0
  180. package/commands/qgsd/polyrepo.md +50 -0
  181. package/commands/qgsd/progress.md +24 -0
  182. package/commands/qgsd/queue.md +54 -0
  183. package/commands/qgsd/quick.md +133 -0
  184. package/commands/qgsd/quorum-test.md +275 -0
  185. package/commands/qgsd/quorum.md +707 -0
  186. package/commands/qgsd/reapply-patches.md +110 -0
  187. package/commands/qgsd/remove-phase.md +31 -0
  188. package/commands/qgsd/research-phase.md +189 -0
  189. package/commands/qgsd/resume-work.md +40 -0
  190. package/commands/qgsd/set-profile.md +34 -0
  191. package/commands/qgsd/settings.md +39 -0
  192. package/commands/qgsd/solve.md +565 -0
  193. package/commands/qgsd/sync-baselines.md +119 -0
  194. package/commands/qgsd/triage.md +233 -0
  195. package/commands/qgsd/update.md +37 -0
  196. package/commands/qgsd/verify-work.md +38 -0
  197. package/hooks/dist/config-loader.js +297 -0
  198. package/hooks/dist/conformance-schema.cjs +12 -0
  199. package/hooks/dist/gsd-context-monitor.js +64 -0
  200. package/hooks/dist/qgsd-check-update.js +62 -0
  201. package/hooks/dist/qgsd-circuit-breaker.js +682 -0
  202. package/hooks/dist/qgsd-precompact.js +156 -0
  203. package/hooks/dist/qgsd-prompt.js +653 -0
  204. package/hooks/dist/qgsd-session-start.js +122 -0
  205. package/hooks/dist/qgsd-slot-correlator.js +58 -0
  206. package/hooks/dist/qgsd-spec-regen.js +86 -0
  207. package/hooks/dist/qgsd-statusline.js +91 -0
  208. package/hooks/dist/qgsd-stop.js +553 -0
  209. package/hooks/dist/qgsd-token-collector.js +133 -0
  210. package/hooks/dist/unified-mcp-server.mjs +669 -0
  211. package/package.json +95 -0
  212. package/scripts/build-hooks.js +46 -0
  213. package/scripts/postinstall.js +48 -0
  214. package/scripts/secret-audit.sh +45 -0
  215. package/templates/qgsd.json +49 -0
@@ -0,0 +1,165 @@
1
+ #!/usr/bin/env node
2
+ 'use strict';
3
+ // bin/accept-debug-invariant.cjs
4
+ // Debug invariant write path (ARCH-03): writes a PROPERTY definition directly
5
+ // to a canonical .planning/formal/tla/ spec with full provenance tracking.
6
+ //
7
+ // When /qgsd:debug accepts a new invariant candidate, this script writes it to
8
+ // the canonical spec and records update_source=debug + session_id in model-registry.json.
9
+ //
10
+ // Usage:
11
+ // node bin/accept-debug-invariant.cjs <target-spec.tla> --property-name <name> --property-body <body> --session-id <id>
12
+ //
13
+ // Exit codes:
14
+ // 0 — success (PROPERTY written, registry updated)
15
+ // 1 — error (missing args, malformed session-id, spec not found, duplicate name, etc.)
16
+ //
17
+ // Session ID generation for callers:
18
+ // `debug-sess-${Math.floor(Date.now()/1000)}-${Math.random().toString(16).slice(2,10)}`
19
+
20
+ const fs = require('fs');
21
+ const path = require('path');
22
+
23
+ // ── Find project root from target path (walk up to .planning/formal/ ancestor) ─────────
24
+ function findProjectRoot(startPath) {
25
+ let current = path.dirname(startPath);
26
+ while (true) {
27
+ if (path.basename(current) === 'formal' && path.basename(path.dirname(current)) === '.planning') {
28
+ return path.dirname(path.dirname(current));
29
+ }
30
+ const parent = path.dirname(current);
31
+ if (parent === current) break; // filesystem root
32
+ current = parent;
33
+ }
34
+ return path.join(__dirname, '..'); // fallback to QGSD project root
35
+ }
36
+
37
+ // ── Parse CLI arguments ───────────────────────────────────────────────────────
38
+ const args = process.argv.slice(2);
39
+
40
+ let targetPath = null;
41
+ let propertyName = null;
42
+ let propertyBody = null;
43
+ let sessionId = null;
44
+
45
+ for (let i = 0; i < args.length; i++) {
46
+ if (args[i] === '--property-name' && i + 1 < args.length) {
47
+ propertyName = args[++i];
48
+ } else if (args[i] === '--property-body' && i + 1 < args.length) {
49
+ propertyBody = args[++i];
50
+ } else if (args[i] === '--session-id' && i + 1 < args.length) {
51
+ sessionId = args[++i];
52
+ } else if (!targetPath) {
53
+ targetPath = args[i];
54
+ }
55
+ }
56
+
57
+ // ── Validate required arguments — before any file I/O ─────────────────────
58
+ if (!targetPath || !propertyName || !propertyBody) {
59
+ process.stderr.write('Usage: node bin/accept-debug-invariant.cjs <target-spec.tla> --property-name <name> --property-body <body> --session-id <id>\n');
60
+ process.exit(1);
61
+ }
62
+
63
+ // --session-id is required (FV traceability contract)
64
+ if (!sessionId) {
65
+ process.stderr.write('Error: --session-id is required for debug invariant writes\n');
66
+ process.exit(1);
67
+ }
68
+
69
+ // Validate session-id format: debug-sess-<unix-timestamp-seconds>-<8-char-hex>
70
+ const SESSION_ID_RE = /^debug-sess-\d+-[0-9a-f]{8}$/;
71
+ if (!SESSION_ID_RE.test(sessionId)) {
72
+ process.stderr.write(
73
+ 'Error: --session-id must match format debug-sess-<unix-timestamp-seconds>-<8-char-hex> ' +
74
+ '(e.g., debug-sess-1740835200-a3f9c012)\n'
75
+ );
76
+ process.exit(1);
77
+ }
78
+
79
+ // ── Resolve target path ────────────────────────────────────────────────────
80
+ const resolvedTarget = path.resolve(targetPath);
81
+
82
+ // ── Read target spec ───────────────────────────────────────────────────────
83
+ if (!fs.existsSync(resolvedTarget)) {
84
+ process.stderr.write('Error: spec not found: ' + resolvedTarget + '\n');
85
+ process.exit(1);
86
+ }
87
+ const specContent = fs.readFileSync(resolvedTarget, 'utf8');
88
+
89
+ // ── Check for duplicate property name ─────────────────────────────────────
90
+ const duplicateRe = new RegExp('^PROPERTY\\s+' + propertyName + '\\b', 'm');
91
+ if (duplicateRe.test(specContent)) {
92
+ process.stderr.write('Error: PROPERTY ' + propertyName + ' already exists in spec\n');
93
+ process.exit(1);
94
+ }
95
+
96
+ // ── Build invariant block ──────────────────────────────────────────────────
97
+ const invariantBlock =
98
+ '\n(* DEBUG SESSION: ' + sessionId + ' *)\n' +
99
+ 'PROPERTY ' + propertyName + ' == ' + propertyBody + '\n';
100
+
101
+ // ── Merge into spec ────────────────────────────────────────────────────────
102
+ // Insert before the closing ==== if present, otherwise append.
103
+ let mergedContent;
104
+ const endMarkerIndex = specContent.lastIndexOf('\n====');
105
+
106
+ if (endMarkerIndex !== -1) {
107
+ const before = specContent.slice(0, endMarkerIndex);
108
+ const after = specContent.slice(endMarkerIndex);
109
+ mergedContent = before + invariantBlock + after;
110
+ } else {
111
+ mergedContent = specContent.trimEnd() + invariantBlock;
112
+ }
113
+
114
+ // ── Atomic write of spec ───────────────────────────────────────────────────
115
+ const tmpSpec = resolvedTarget + '.tmp.' + Date.now() + '.' + Math.random().toString(36).slice(2);
116
+ fs.writeFileSync(tmpSpec, mergedContent, 'utf8');
117
+ fs.renameSync(tmpSpec, resolvedTarget);
118
+
119
+ // ── Update model-registry.json ─────────────────────────────────────────────
120
+ const projectRoot = findProjectRoot(resolvedTarget);
121
+ const registryPath = path.join(projectRoot, '.planning', 'formal', 'model-registry.json');
122
+ let newVersion = null;
123
+
124
+ if (!fs.existsSync(registryPath)) {
125
+ process.stderr.write('[accept-debug-invariant] Warning: .planning/formal/model-registry.json not found — skipping registry update\n');
126
+ } else {
127
+ let registry;
128
+ try {
129
+ registry = JSON.parse(fs.readFileSync(registryPath, 'utf8'));
130
+ } catch (err) {
131
+ process.stderr.write('[accept-debug-invariant] Warning: cannot parse registry — skipping update: ' + err.message + '\n');
132
+ registry = null;
133
+ }
134
+
135
+ if (registry) {
136
+ if (!registry.models) registry.models = {};
137
+ const key = path.relative(projectRoot, resolvedTarget).replace(/\\/g, '/');
138
+ const now = new Date().toISOString();
139
+ const existing = registry.models[key] || {};
140
+ newVersion = (existing.version || 0) + 1;
141
+
142
+ registry.models[key] = {
143
+ version: newVersion,
144
+ last_updated: now,
145
+ update_source: 'debug',
146
+ source_id: null,
147
+ session_id: sessionId,
148
+ description: existing.description || ''
149
+ };
150
+ registry.last_sync = now;
151
+
152
+ // Atomic write of registry
153
+ const tmpReg = registryPath + '.tmp.' + Date.now() + '.' + Math.random().toString(36).slice(2);
154
+ fs.writeFileSync(tmpReg, JSON.stringify(registry, null, 2), 'utf8');
155
+ fs.renameSync(tmpReg, registryPath);
156
+ }
157
+ }
158
+
159
+ // ── Report success ─────────────────────────────────────────────────────────
160
+ const versionStr = newVersion !== null ? '. Registry version: ' + newVersion : '';
161
+ process.stdout.write(
162
+ '[accept-debug-invariant] Wrote PROPERTY ' + propertyName +
163
+ ' to ' + path.relative(process.cwd(), resolvedTarget) +
164
+ '. session_id: ' + sessionId + versionStr + '\n'
165
+ );