create-claude-cabinet 0.6.0

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 (135) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +196 -0
  3. package/bin/create-claude-cabinet.js +8 -0
  4. package/lib/cli.js +624 -0
  5. package/lib/copy.js +152 -0
  6. package/lib/db-setup.js +51 -0
  7. package/lib/metadata.js +42 -0
  8. package/lib/reset.js +193 -0
  9. package/lib/settings-merge.js +93 -0
  10. package/package.json +29 -0
  11. package/templates/EXTENSIONS.md +311 -0
  12. package/templates/README.md +485 -0
  13. package/templates/briefing/_briefing-api-template.md +21 -0
  14. package/templates/briefing/_briefing-architecture-template.md +16 -0
  15. package/templates/briefing/_briefing-cabinet-template.md +20 -0
  16. package/templates/briefing/_briefing-identity-template.md +18 -0
  17. package/templates/briefing/_briefing-scopes-template.md +39 -0
  18. package/templates/briefing/_briefing-template.md +148 -0
  19. package/templates/briefing/_briefing-work-tracking-template.md +18 -0
  20. package/templates/cabinet/committees-template.yaml +49 -0
  21. package/templates/cabinet/composition-patterns.md +240 -0
  22. package/templates/cabinet/eval-protocol.md +208 -0
  23. package/templates/cabinet/lifecycle.md +93 -0
  24. package/templates/cabinet/output-contract.md +148 -0
  25. package/templates/cabinet/prompt-guide.md +266 -0
  26. package/templates/hooks/cor-upstream-guard.sh +79 -0
  27. package/templates/hooks/git-guardrails.sh +67 -0
  28. package/templates/hooks/skill-telemetry.sh +66 -0
  29. package/templates/hooks/skill-tool-telemetry.sh +54 -0
  30. package/templates/hooks/stop-hook.md +56 -0
  31. package/templates/memory/patterns/_pattern-template.md +119 -0
  32. package/templates/memory/patterns/pattern-intelligence-first.md +41 -0
  33. package/templates/rules/enforcement-pipeline.md +151 -0
  34. package/templates/scripts/cor-drift-check.cjs +84 -0
  35. package/templates/scripts/finding-schema.json +94 -0
  36. package/templates/scripts/load-triage-history.js +151 -0
  37. package/templates/scripts/merge-findings.js +126 -0
  38. package/templates/scripts/pib-db-schema.sql +68 -0
  39. package/templates/scripts/pib-db.js +365 -0
  40. package/templates/scripts/triage-server.mjs +98 -0
  41. package/templates/scripts/triage-ui.html +536 -0
  42. package/templates/skills/audit/SKILL.md +273 -0
  43. package/templates/skills/audit/phases/finding-output.md +56 -0
  44. package/templates/skills/audit/phases/member-execution.md +83 -0
  45. package/templates/skills/audit/phases/member-selection.md +44 -0
  46. package/templates/skills/audit/phases/structural-checks.md +54 -0
  47. package/templates/skills/audit/phases/triage-history.md +45 -0
  48. package/templates/skills/cabinet-accessibility/SKILL.md +180 -0
  49. package/templates/skills/cabinet-anti-confirmation/SKILL.md +172 -0
  50. package/templates/skills/cabinet-architecture/SKILL.md +279 -0
  51. package/templates/skills/cabinet-boundary-man/SKILL.md +265 -0
  52. package/templates/skills/cabinet-cor-health/SKILL.md +342 -0
  53. package/templates/skills/cabinet-data-integrity/SKILL.md +157 -0
  54. package/templates/skills/cabinet-debugger/SKILL.md +221 -0
  55. package/templates/skills/cabinet-historian/SKILL.md +253 -0
  56. package/templates/skills/cabinet-organized-mind/SKILL.md +338 -0
  57. package/templates/skills/cabinet-process-therapist/SKILL.md +261 -0
  58. package/templates/skills/cabinet-qa/SKILL.md +205 -0
  59. package/templates/skills/cabinet-record-keeper/SKILL.md +168 -0
  60. package/templates/skills/cabinet-roster-check/SKILL.md +297 -0
  61. package/templates/skills/cabinet-security/SKILL.md +181 -0
  62. package/templates/skills/cabinet-small-screen/SKILL.md +154 -0
  63. package/templates/skills/cabinet-speed-freak/SKILL.md +169 -0
  64. package/templates/skills/cabinet-system-advocate/SKILL.md +194 -0
  65. package/templates/skills/cabinet-technical-debt/SKILL.md +115 -0
  66. package/templates/skills/cabinet-usability/SKILL.md +189 -0
  67. package/templates/skills/cabinet-workflow-cop/SKILL.md +238 -0
  68. package/templates/skills/cor-upgrade/SKILL.md +302 -0
  69. package/templates/skills/debrief/SKILL.md +409 -0
  70. package/templates/skills/debrief/phases/auto-maintenance.md +48 -0
  71. package/templates/skills/debrief/phases/close-work.md +88 -0
  72. package/templates/skills/debrief/phases/health-checks.md +54 -0
  73. package/templates/skills/debrief/phases/inventory.md +40 -0
  74. package/templates/skills/debrief/phases/loose-ends.md +52 -0
  75. package/templates/skills/debrief/phases/record-lessons.md +67 -0
  76. package/templates/skills/debrief/phases/report.md +59 -0
  77. package/templates/skills/debrief/phases/update-state.md +48 -0
  78. package/templates/skills/debrief/phases/upstream-feedback.md +129 -0
  79. package/templates/skills/debrief-quick/SKILL.md +12 -0
  80. package/templates/skills/execute/SKILL.md +293 -0
  81. package/templates/skills/execute/phases/cabinet.md +49 -0
  82. package/templates/skills/execute/phases/commit-and-deploy.md +66 -0
  83. package/templates/skills/execute/phases/load-plan.md +49 -0
  84. package/templates/skills/execute/phases/validators.md +50 -0
  85. package/templates/skills/execute/phases/verification-tools.md +67 -0
  86. package/templates/skills/extract/SKILL.md +168 -0
  87. package/templates/skills/investigate/SKILL.md +160 -0
  88. package/templates/skills/link/SKILL.md +52 -0
  89. package/templates/skills/menu/SKILL.md +61 -0
  90. package/templates/skills/onboard/SKILL.md +356 -0
  91. package/templates/skills/onboard/phases/detect-state.md +79 -0
  92. package/templates/skills/onboard/phases/generate-briefing.md +127 -0
  93. package/templates/skills/onboard/phases/generate-session-loop.md +87 -0
  94. package/templates/skills/onboard/phases/interview.md +233 -0
  95. package/templates/skills/onboard/phases/modularity-menu.md +162 -0
  96. package/templates/skills/onboard/phases/options.md +98 -0
  97. package/templates/skills/onboard/phases/post-onboard-audit.md +121 -0
  98. package/templates/skills/onboard/phases/summary.md +122 -0
  99. package/templates/skills/onboard/phases/work-tracking.md +231 -0
  100. package/templates/skills/orient/SKILL.md +251 -0
  101. package/templates/skills/orient/phases/auto-maintenance.md +48 -0
  102. package/templates/skills/orient/phases/briefing.md +53 -0
  103. package/templates/skills/orient/phases/cabinet.md +46 -0
  104. package/templates/skills/orient/phases/context.md +63 -0
  105. package/templates/skills/orient/phases/data-sync.md +35 -0
  106. package/templates/skills/orient/phases/health-checks.md +50 -0
  107. package/templates/skills/orient/phases/work-scan.md +69 -0
  108. package/templates/skills/orient-quick/SKILL.md +12 -0
  109. package/templates/skills/plan/SKILL.md +358 -0
  110. package/templates/skills/plan/phases/cabinet-critique.md +47 -0
  111. package/templates/skills/plan/phases/calibration-examples.md +75 -0
  112. package/templates/skills/plan/phases/completeness-check.md +44 -0
  113. package/templates/skills/plan/phases/composition-check.md +36 -0
  114. package/templates/skills/plan/phases/overlap-check.md +62 -0
  115. package/templates/skills/plan/phases/plan-template.md +69 -0
  116. package/templates/skills/plan/phases/present.md +60 -0
  117. package/templates/skills/plan/phases/research.md +43 -0
  118. package/templates/skills/plan/phases/work-tracker.md +95 -0
  119. package/templates/skills/publish/SKILL.md +74 -0
  120. package/templates/skills/pulse/SKILL.md +242 -0
  121. package/templates/skills/pulse/phases/auto-fix-scope.md +40 -0
  122. package/templates/skills/pulse/phases/checks.md +58 -0
  123. package/templates/skills/pulse/phases/output.md +54 -0
  124. package/templates/skills/seed/SKILL.md +257 -0
  125. package/templates/skills/seed/phases/build-member.md +93 -0
  126. package/templates/skills/seed/phases/evaluate-existing.md +61 -0
  127. package/templates/skills/seed/phases/maintain.md +92 -0
  128. package/templates/skills/seed/phases/scan-signals.md +86 -0
  129. package/templates/skills/triage-audit/SKILL.md +251 -0
  130. package/templates/skills/triage-audit/phases/apply-verdicts.md +90 -0
  131. package/templates/skills/triage-audit/phases/load-findings.md +38 -0
  132. package/templates/skills/triage-audit/phases/triage-ui.md +66 -0
  133. package/templates/skills/unlink/SKILL.md +35 -0
  134. package/templates/skills/validate/SKILL.md +116 -0
  135. package/templates/skills/validate/phases/validators.md +53 -0
@@ -0,0 +1,151 @@
1
+ #!/usr/bin/env node
2
+ // Build suppression lists from triage history.
3
+ //
4
+ // Outputs JSON with rejected/deferred finding IDs and fingerprints.
5
+ // The audit skill uses this to skip previously-triaged findings.
6
+ //
7
+ // Usage:
8
+ // node scripts/load-triage-history.js # Auto-detect source
9
+ // node scripts/load-triage-history.js --db-only # Only check database
10
+ // node scripts/load-triage-history.js --files-only # Only check triage.json files
11
+ //
12
+ // Two sources (tried in order):
13
+ // 1. pib-db (SQLite) — if PIB_DB_PATH exists
14
+ // 2. Filesystem — scan reviews/*/triage.json files
15
+ //
16
+ // Environment:
17
+ // PIB_DB_PATH — path to SQLite file (default: ./pib.db)
18
+ // REVIEWS_DIR — path to reviews directory (default: ./reviews)
19
+
20
+ import { existsSync, readdirSync, readFileSync, statSync } from 'node:fs';
21
+ import { join } from 'node:path';
22
+ import { createRequire } from 'node:module';
23
+
24
+ const DB_PATH = process.env.PIB_DB_PATH || join(process.cwd(), 'pib.db');
25
+ const REVIEWS_DIR = process.env.REVIEWS_DIR || join(process.cwd(), 'reviews');
26
+ const args = process.argv.slice(2);
27
+ const dbOnly = args.includes('--db-only');
28
+ const filesOnly = args.includes('--files-only');
29
+
30
+ const result = {
31
+ rejectedIds: [],
32
+ rejectedFingerprints: [],
33
+ deferredIds: [],
34
+ deferredFingerprints: [],
35
+ };
36
+
37
+ // ---------------------------------------------------------------------------
38
+ // Source 1: Database
39
+ // ---------------------------------------------------------------------------
40
+ function tryDatabase() {
41
+ if (filesOnly) return false;
42
+ if (!existsSync(DB_PATH)) return false;
43
+
44
+ try {
45
+ const require = createRequire(import.meta.url);
46
+ const Database = require('better-sqlite3');
47
+ const db = new Database(DB_PATH, { readonly: true });
48
+
49
+ const rejected = db.prepare(`
50
+ SELECT id, perspective, title FROM audit_findings
51
+ WHERE triage_status = 'rejected'
52
+ `).all();
53
+
54
+ const deferred = db.prepare(`
55
+ SELECT id, perspective, title FROM audit_findings
56
+ WHERE triage_status = 'deferred'
57
+ `).all();
58
+
59
+ db.close();
60
+
61
+ result.rejectedIds = rejected.map(r => r.id);
62
+ result.rejectedFingerprints = rejected.map(r => ({
63
+ perspective: r.perspective,
64
+ title: r.title,
65
+ }));
66
+ result.deferredIds = deferred.map(r => r.id);
67
+ result.deferredFingerprints = deferred.map(r => ({
68
+ perspective: r.perspective,
69
+ title: r.title,
70
+ }));
71
+
72
+ return true;
73
+ } catch {
74
+ return false;
75
+ }
76
+ }
77
+
78
+ // ---------------------------------------------------------------------------
79
+ // Source 2: Filesystem (triage.json files)
80
+ // ---------------------------------------------------------------------------
81
+ function tryFilesystem() {
82
+ if (dbOnly) return false;
83
+ if (!existsSync(REVIEWS_DIR)) return false;
84
+
85
+ const MAX_AGE_DAYS = 30;
86
+ const cutoff = Date.now() - MAX_AGE_DAYS * 24 * 60 * 60 * 1000;
87
+
88
+ try {
89
+ const dateDirs = readdirSync(REVIEWS_DIR)
90
+ .filter(d => /^\d{4}-\d{2}-\d{2}$/.test(d))
91
+ .sort()
92
+ .reverse();
93
+
94
+ for (const dateDir of dateDirs) {
95
+ const datePath = join(REVIEWS_DIR, dateDir);
96
+ if (!statSync(datePath).isDirectory()) continue;
97
+
98
+ // Check age
99
+ const dirDate = new Date(dateDir).getTime();
100
+ if (dirDate < cutoff) break;
101
+
102
+ // Look for triage.json in date dir or run subdirs
103
+ const triagePaths = [];
104
+ const directTriage = join(datePath, 'triage.json');
105
+ if (existsSync(directTriage)) triagePaths.push(directTriage);
106
+
107
+ // Check run subdirectories
108
+ for (const sub of readdirSync(datePath)) {
109
+ const subTriage = join(datePath, sub, 'triage.json');
110
+ if (existsSync(subTriage)) triagePaths.push(subTriage);
111
+ }
112
+
113
+ for (const triagePath of triagePaths) {
114
+ try {
115
+ const data = JSON.parse(readFileSync(triagePath, 'utf-8'));
116
+ const verdicts = data.verdicts || data;
117
+
118
+ for (const v of (Array.isArray(verdicts) ? verdicts : [])) {
119
+ const fp = { perspective: v.perspective, title: v.title };
120
+
121
+ if (v.verdict === 'reject' || v.status === 'rejected') {
122
+ if (v.id && !result.rejectedIds.includes(v.id)) {
123
+ result.rejectedIds.push(v.id);
124
+ result.rejectedFingerprints.push(fp);
125
+ }
126
+ } else if (v.verdict === 'defer' || v.status === 'deferred') {
127
+ if (v.id && !result.deferredIds.includes(v.id)) {
128
+ result.deferredIds.push(v.id);
129
+ result.deferredFingerprints.push(fp);
130
+ }
131
+ }
132
+ }
133
+ } catch {
134
+ // Skip malformed triage files
135
+ }
136
+ }
137
+ }
138
+
139
+ return result.rejectedIds.length > 0 || result.deferredIds.length > 0;
140
+ } catch {
141
+ return false;
142
+ }
143
+ }
144
+
145
+ // ---------------------------------------------------------------------------
146
+ // Main
147
+ // ---------------------------------------------------------------------------
148
+ const foundDb = tryDatabase();
149
+ if (!foundDb) tryFilesystem();
150
+
151
+ console.log(JSON.stringify(result, null, 2));
@@ -0,0 +1,126 @@
1
+ #!/usr/bin/env node
2
+ // Merge cabinet member JSON outputs into a unified run-summary.json.
3
+ //
4
+ // Usage:
5
+ // node scripts/merge-findings.js <run-dir> # Merge only
6
+ // node scripts/merge-findings.js <run-dir> --db # Merge + ingest to pib-db
7
+ //
8
+ // Reads all *.json files in <run-dir> (one per cabinet member), validates
9
+ // against finding-schema.json, deduplicates by finding ID, and writes
10
+ // run-summary.json with merged findings and metadata.
11
+ //
12
+ // Environment:
13
+ // PIB_DB_PATH — path to SQLite file (for --db mode)
14
+
15
+ import { readdirSync, readFileSync, writeFileSync, existsSync } from 'node:fs';
16
+ import { join, dirname, basename } from 'node:path';
17
+ import { fileURLToPath } from 'node:url';
18
+ import { execSync } from 'node:child_process';
19
+
20
+ const __dirname = dirname(fileURLToPath(import.meta.url));
21
+ const SKIP_FILES = new Set(['run-summary.json', 'day-summary.json', 'layer1-results.json', 'triage.json']);
22
+
23
+ // ---------------------------------------------------------------------------
24
+ // Args
25
+ // ---------------------------------------------------------------------------
26
+ const args = process.argv.slice(2);
27
+ const runDir = args.find(a => !a.startsWith('--'));
28
+ const useDb = args.includes('--db');
29
+
30
+ if (!runDir) {
31
+ console.log(`Usage: merge-findings.js <run-dir> [--db]
32
+
33
+ Merges per-cabinet-member JSON files into run-summary.json.
34
+ --db Also ingest findings into the pib-db database.`);
35
+ process.exit(1);
36
+ }
37
+
38
+ if (!existsSync(runDir)) {
39
+ console.error(`Directory not found: ${runDir}`);
40
+ process.exit(1);
41
+ }
42
+
43
+ // ---------------------------------------------------------------------------
44
+ // Read and merge
45
+ // ---------------------------------------------------------------------------
46
+ const files = readdirSync(runDir).filter(f =>
47
+ f.endsWith('.json') && !SKIP_FILES.has(f)
48
+ );
49
+
50
+ if (files.length === 0) {
51
+ console.error(`No cabinet member JSON files found in ${runDir}`);
52
+ process.exit(1);
53
+ }
54
+
55
+ const allFindings = [];
56
+ const seenIds = new Set();
57
+ const perspectiveCounts = {};
58
+ const severityCounts = { critical: 0, warn: 0, info: 0, idea: 0 };
59
+ let positiveCount = 0;
60
+
61
+ for (const file of files) {
62
+ try {
63
+ const data = JSON.parse(readFileSync(join(runDir, file), 'utf-8'));
64
+ const findings = data.findings || [];
65
+ const perspective = data.meta?.perspective || basename(file, '.json');
66
+
67
+ for (const f of findings) {
68
+ if (seenIds.has(f.id)) continue;
69
+ seenIds.add(f.id);
70
+
71
+ allFindings.push(f);
72
+
73
+ if (f.type === 'positive') {
74
+ positiveCount++;
75
+ } else {
76
+ severityCounts[f.severity] = (severityCounts[f.severity] || 0) + 1;
77
+ perspectiveCounts[perspective] = (perspectiveCounts[perspective] || 0) + 1;
78
+ }
79
+ }
80
+
81
+ console.log(` ${perspective}: ${findings.length} findings`);
82
+ } catch (err) {
83
+ console.error(` Error reading ${file}: ${err.message}`);
84
+ }
85
+ }
86
+
87
+ // ---------------------------------------------------------------------------
88
+ // Write run-summary.json
89
+ // ---------------------------------------------------------------------------
90
+ const timestamp = new Date().toISOString();
91
+ const runId = `run-${basename(runDir)}`;
92
+
93
+ const summary = {
94
+ findings: allFindings,
95
+ meta: {
96
+ runId,
97
+ timestamp,
98
+ trigger: 'manual',
99
+ perspectives: Object.keys(perspectiveCounts),
100
+ counts: {
101
+ total: allFindings.length,
102
+ findings: allFindings.length - positiveCount,
103
+ positive: positiveCount,
104
+ ...severityCounts,
105
+ },
106
+ byPerspective: perspectiveCounts,
107
+ },
108
+ };
109
+
110
+ const summaryPath = join(runDir, 'run-summary.json');
111
+ writeFileSync(summaryPath, JSON.stringify(summary, null, 2));
112
+ console.log(`\nMerged ${allFindings.length} findings → ${summaryPath}`);
113
+ console.log(` critical: ${severityCounts.critical}, warn: ${severityCounts.warn}, info: ${severityCounts.info}, idea: ${severityCounts.idea}, positive: ${positiveCount}`);
114
+
115
+ // ---------------------------------------------------------------------------
116
+ // Optional: ingest to pib-db
117
+ // ---------------------------------------------------------------------------
118
+ if (useDb) {
119
+ try {
120
+ const pibDb = join(__dirname, 'pib-db.js');
121
+ execSync(`node "${pibDb}" ingest-findings "${runDir}"`, { stdio: 'inherit' });
122
+ } catch (err) {
123
+ console.error(`DB ingest failed: ${err.message}`);
124
+ console.error('Findings are still saved in run-summary.json.');
125
+ }
126
+ }
@@ -0,0 +1,68 @@
1
+ -- Process-in-a-Box reference data layer
2
+ -- Local SQLite database for work tracking and audit findings.
3
+ -- This is the default persistence layer. Projects that outgrow it
4
+ -- override via phase files (pointing to their own API, DB, or service).
5
+ --
6
+ -- Initialize: node scripts/pib-db.js init
7
+ -- Query: node scripts/pib-db.js query "SELECT ..."
8
+
9
+ CREATE TABLE IF NOT EXISTS projects (
10
+ fid TEXT PRIMARY KEY CHECK(fid GLOB 'prj:*'),
11
+ name TEXT NOT NULL,
12
+ area TEXT,
13
+ status TEXT NOT NULL DEFAULT 'active'
14
+ CHECK(status IN ('active','paused','done','dropped','someday')),
15
+ notes TEXT NOT NULL DEFAULT '',
16
+ created TEXT NOT NULL CHECK(created GLOB '????-??-??'),
17
+ completed_at TEXT,
18
+ due TEXT,
19
+ deleted_at TEXT
20
+ );
21
+
22
+ CREATE TABLE IF NOT EXISTS actions (
23
+ fid TEXT PRIMARY KEY CHECK(fid GLOB 'act:*'),
24
+ text TEXT NOT NULL,
25
+ area TEXT,
26
+ project_fid TEXT REFERENCES projects(fid) ON DELETE SET NULL,
27
+ due TEXT,
28
+ flagged INTEGER NOT NULL DEFAULT 0 CHECK(flagged IN (0, 1)),
29
+ completed INTEGER NOT NULL DEFAULT 0 CHECK(completed IN (0, 1)),
30
+ completed_at TEXT,
31
+ status TEXT NOT NULL DEFAULT 'open'
32
+ CHECK(status IN ('open','in-progress','blocked','deferred','done')),
33
+ tags TEXT NOT NULL DEFAULT '',
34
+ sort_order INTEGER NOT NULL DEFAULT 0,
35
+ created TEXT NOT NULL CHECK(created GLOB '????-??-??'),
36
+ notes TEXT NOT NULL DEFAULT '',
37
+ deleted_at TEXT
38
+ );
39
+
40
+ CREATE TABLE IF NOT EXISTS audit_runs (
41
+ id TEXT PRIMARY KEY,
42
+ date TEXT NOT NULL,
43
+ timestamp TEXT NOT NULL,
44
+ trigger TEXT NOT NULL,
45
+ finding_count INTEGER DEFAULT 0
46
+ );
47
+
48
+ CREATE TABLE IF NOT EXISTS audit_findings (
49
+ id TEXT PRIMARY KEY,
50
+ run_id TEXT NOT NULL REFERENCES audit_runs(id),
51
+ perspective TEXT NOT NULL,
52
+ severity TEXT NOT NULL CHECK(severity IN ('critical','warn','info','idea')),
53
+ title TEXT NOT NULL,
54
+ description TEXT,
55
+ assumption TEXT,
56
+ evidence TEXT,
57
+ question TEXT,
58
+ file TEXT,
59
+ line INTEGER,
60
+ suggested_fix TEXT,
61
+ auto_fixable INTEGER DEFAULT 0,
62
+ type TEXT DEFAULT 'finding' CHECK(type IN ('finding','positive')),
63
+ triage_status TEXT DEFAULT 'open'
64
+ CHECK(triage_status IN ('open','approved','rejected','deferred','fixed','archived')),
65
+ triage_notes TEXT,
66
+ triaged_at TEXT,
67
+ fix_description TEXT
68
+ );