@rune-kit/rune 2.10.0 → 2.12.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.
- package/LICENSE +21 -21
- package/README.md +65 -6
- package/commands/rune.md +168 -168
- package/compiler/__tests__/detect-invariants.test.js +136 -0
- package/compiler/__tests__/doctor-mesh.test.js +229 -0
- package/compiler/__tests__/hook-dispatch.test.js +91 -0
- package/compiler/__tests__/hooks-antigravity.test.js +118 -0
- package/compiler/__tests__/hooks-cursor.test.js +139 -0
- package/compiler/__tests__/hooks-install.test.js +305 -0
- package/compiler/__tests__/hooks-merge.test.js +204 -0
- package/compiler/__tests__/hooks-tiers.test.js +519 -0
- package/compiler/__tests__/hooks-windsurf.test.js +115 -0
- package/compiler/__tests__/inject-claude-md.test.js +152 -0
- package/compiler/__tests__/load-invariants.test.js +408 -0
- package/compiler/__tests__/onboard-invariants.test.js +240 -0
- package/compiler/adapters/hooks/antigravity.js +140 -0
- package/compiler/adapters/hooks/claude.js +166 -0
- package/compiler/adapters/hooks/cursor.js +191 -0
- package/compiler/adapters/hooks/index.js +82 -0
- package/compiler/adapters/hooks/tier-emitter.js +182 -0
- package/compiler/adapters/hooks/windsurf.js +202 -0
- package/compiler/bin/rune.js +196 -6
- package/compiler/commands/hook-dispatch.js +87 -0
- package/compiler/commands/hooks/install.js +120 -0
- package/compiler/commands/hooks/merge.js +211 -0
- package/compiler/commands/hooks/presets.js +116 -0
- package/compiler/commands/hooks/status.js +112 -0
- package/compiler/commands/hooks/tiers.js +221 -0
- package/compiler/commands/hooks/uninstall.js +94 -0
- package/compiler/doctor.js +236 -0
- package/contexts/dev.md +34 -34
- package/contexts/research.md +43 -43
- package/contexts/review.md +55 -55
- package/extensions/ai-ml/PACK.md +88 -88
- package/extensions/ai-ml/skills/ai-agents.md +172 -172
- package/extensions/ai-ml/skills/code-sandbox.md +187 -187
- package/extensions/ai-ml/skills/deep-research.md +146 -146
- package/extensions/ai-ml/skills/embedding-search.md +66 -66
- package/extensions/ai-ml/skills/fine-tuning-guide.md +74 -74
- package/extensions/ai-ml/skills/llm-architect.md +125 -125
- package/extensions/ai-ml/skills/llm-integration.md +64 -64
- package/extensions/ai-ml/skills/prompt-patterns.md +72 -72
- package/extensions/ai-ml/skills/rag-patterns.md +66 -66
- package/extensions/ai-ml/skills/web-extraction.md +114 -114
- package/extensions/analytics/PACK.md +92 -92
- package/extensions/analytics/skills/ab-testing.md +72 -72
- package/extensions/analytics/skills/dashboard-patterns.md +83 -83
- package/extensions/analytics/skills/data-validation.md +68 -68
- package/extensions/analytics/skills/funnel-analysis.md +81 -81
- package/extensions/analytics/skills/sql-patterns.md +57 -57
- package/extensions/analytics/skills/statistical-analysis.md +79 -79
- package/extensions/analytics/skills/tracking-setup.md +71 -71
- package/extensions/backend/PACK.md +104 -104
- package/extensions/backend/skills/api-patterns.md +84 -84
- package/extensions/backend/skills/async-pipeline.md +193 -193
- package/extensions/backend/skills/auth-patterns.md +97 -97
- package/extensions/backend/skills/background-jobs.md +133 -133
- package/extensions/backend/skills/caching-patterns.md +108 -108
- package/extensions/backend/skills/cli-generation.md +133 -133
- package/extensions/backend/skills/database-patterns.md +87 -87
- package/extensions/backend/skills/middleware-patterns.md +104 -104
- package/extensions/chrome-ext/PACK.md +93 -93
- package/extensions/chrome-ext/skills/cws-preflight.md +143 -143
- package/extensions/chrome-ext/skills/cws-publish.md +104 -104
- package/extensions/chrome-ext/skills/ext-ai-integration.md +251 -251
- package/extensions/chrome-ext/skills/ext-messaging.md +139 -139
- package/extensions/chrome-ext/skills/ext-storage.md +133 -133
- package/extensions/chrome-ext/skills/mv3-scaffold.md +164 -164
- package/extensions/content/PACK.md +96 -96
- package/extensions/content/skills/blog-patterns.md +88 -88
- package/extensions/content/skills/cms-integration.md +131 -131
- package/extensions/content/skills/content-scoring.md +107 -107
- package/extensions/content/skills/i18n.md +83 -83
- package/extensions/content/skills/mdx-authoring.md +137 -137
- package/extensions/content/skills/reference.md +1014 -1014
- package/extensions/content/skills/seo-patterns.md +67 -67
- package/extensions/content/skills/video-repurpose.md +153 -153
- package/extensions/devops/PACK.md +101 -101
- package/extensions/devops/skills/chaos-testing.md +67 -67
- package/extensions/devops/skills/ci-cd.md +75 -75
- package/extensions/devops/skills/docker.md +58 -58
- package/extensions/devops/skills/edge-serverless.md +163 -163
- package/extensions/devops/skills/infra-as-code.md +158 -158
- package/extensions/devops/skills/kubernetes.md +110 -110
- package/extensions/devops/skills/monitoring.md +57 -57
- package/extensions/devops/skills/server-setup.md +64 -64
- package/extensions/devops/skills/ssl-domain.md +42 -42
- package/extensions/ecommerce/PACK.md +116 -116
- package/extensions/ecommerce/skills/cart-system.md +79 -79
- package/extensions/ecommerce/skills/inventory-mgmt.md +102 -102
- package/extensions/ecommerce/skills/order-management.md +126 -126
- package/extensions/ecommerce/skills/payment-integration.md +472 -472
- package/extensions/ecommerce/skills/shopify-dev.md +69 -69
- package/extensions/ecommerce/skills/subscription-billing.md +93 -93
- package/extensions/ecommerce/skills/tax-compliance.md +117 -117
- package/extensions/gamedev/PACK.md +142 -142
- package/extensions/gamedev/skills/asset-pipeline.md +74 -74
- package/extensions/gamedev/skills/audio-system.md +129 -129
- package/extensions/gamedev/skills/camera-system.md +87 -87
- package/extensions/gamedev/skills/ecs.md +98 -98
- package/extensions/gamedev/skills/game-loops.md +72 -72
- package/extensions/gamedev/skills/input-system.md +199 -199
- package/extensions/gamedev/skills/multiplayer.md +180 -180
- package/extensions/gamedev/skills/particles.md +105 -105
- package/extensions/gamedev/skills/physics-engine.md +89 -89
- package/extensions/gamedev/skills/scene-management.md +146 -146
- package/extensions/gamedev/skills/threejs-patterns.md +90 -90
- package/extensions/gamedev/skills/webgl.md +71 -71
- package/extensions/mobile/PACK.md +106 -106
- package/extensions/mobile/skills/app-store-connect.md +152 -152
- package/extensions/mobile/skills/app-store-prep.md +66 -66
- package/extensions/mobile/skills/deep-linking.md +109 -109
- package/extensions/mobile/skills/flutter.md +60 -60
- package/extensions/mobile/skills/ios-build-pipeline.md +142 -142
- package/extensions/mobile/skills/native-bridge.md +66 -66
- package/extensions/mobile/skills/ota-updates.md +97 -97
- package/extensions/mobile/skills/push-notifications.md +111 -111
- package/extensions/mobile/skills/react-native.md +82 -82
- package/extensions/saas/PACK.md +116 -116
- package/extensions/saas/skills/billing-integration.md +200 -200
- package/extensions/saas/skills/feature-flags.md +130 -130
- package/extensions/saas/skills/multi-tenant.md +103 -103
- package/extensions/saas/skills/onboarding-flow.md +139 -139
- package/extensions/saas/skills/subscription-flow.md +95 -95
- package/extensions/saas/skills/team-management.md +144 -144
- package/extensions/security/PACK.md +99 -99
- package/extensions/security/skills/api-security.md +140 -140
- package/extensions/security/skills/compliance.md +68 -68
- package/extensions/security/skills/owasp-audit.md +64 -64
- package/extensions/security/skills/pentest-patterns.md +77 -77
- package/extensions/security/skills/secret-mgmt.md +65 -65
- package/extensions/security/skills/supply-chain.md +65 -65
- package/extensions/trading/PACK.md +80 -80
- package/extensions/trading/skills/chart-components.md +55 -55
- package/extensions/trading/skills/experiment-loop.md +125 -125
- package/extensions/trading/skills/fintech-patterns.md +47 -47
- package/extensions/trading/skills/indicator-library.md +58 -58
- package/extensions/trading/skills/quant-analysis.md +111 -111
- package/extensions/trading/skills/realtime-data.md +58 -58
- package/extensions/trading/skills/trade-logic.md +104 -104
- package/extensions/ui/PACK.md +130 -130
- package/extensions/ui/skills/a11y-audit.md +91 -91
- package/extensions/ui/skills/animation-patterns.md +127 -127
- package/extensions/ui/skills/component-patterns.md +100 -100
- package/extensions/ui/skills/design-decision.md +108 -108
- package/extensions/ui/skills/design-system.md +68 -68
- package/extensions/ui/skills/landing-patterns.md +155 -155
- package/extensions/ui/skills/palette-picker.md +173 -173
- package/extensions/ui/skills/react-health.md +90 -90
- package/extensions/ui/skills/type-system.md +125 -125
- package/extensions/ui/skills/web-vitals.md +153 -153
- package/extensions/zalo/PACK.md +145 -145
- package/extensions/zalo/skills/zalo-oa-mcp.md +317 -317
- package/extensions/zalo/skills/zalo-oa-messaging.md +429 -429
- package/extensions/zalo/skills/zalo-oa-setup.md +236 -236
- package/extensions/zalo/skills/zalo-oa-webhook.md +189 -189
- package/extensions/zalo/skills/zalo-personal-messaging.md +194 -194
- package/extensions/zalo/skills/zalo-personal-setup.md +153 -153
- package/extensions/zalo/skills/zalo-rate-guard.md +219 -219
- package/hooks/auto-format/index.cjs +48 -48
- package/hooks/hooks.json +111 -111
- package/hooks/post-session-reflect/index.cjs +189 -189
- package/hooks/pre-compact/index.cjs +95 -95
- package/hooks/run-hook.cmd +1 -1
- package/hooks/secrets-scan/index.cjs +100 -100
- package/hooks/session-start/index.cjs +71 -71
- package/hooks/typecheck/index.cjs +65 -65
- package/package.json +63 -63
- package/references/ui-pro-max-data/LICENSE-UI-PRO-MAX +21 -21
- package/references/ui-pro-max-data/charts.csv +26 -26
- package/references/ui-pro-max-data/colors.csv +161 -161
- package/references/ui-pro-max-data/styles.csv +68 -68
- package/references/ui-pro-max-data/typography.csv +74 -74
- package/references/ui-pro-max-data/ui-reasoning.csv +162 -162
- package/references/ui-pro-max-data/ux-guidelines.csv +99 -99
- package/skills/adversary/SKILL.md +283 -283
- package/skills/asset-creator/SKILL.md +157 -157
- package/skills/audit/SKILL.md +147 -2
- package/skills/autopsy/SKILL.md +335 -335
- package/skills/ba/SKILL.md +85 -1
- package/skills/brainstorm/SKILL.md +380 -342
- package/skills/browser-pilot/SKILL.md +169 -168
- package/skills/constraint-check/SKILL.md +165 -165
- package/skills/context-engine/SKILL.md +408 -404
- package/skills/cook/SKILL.md +917 -863
- package/skills/db/SKILL.md +273 -273
- package/skills/debug/SKILL.md +465 -465
- package/skills/dependency-doctor/SKILL.md +265 -235
- package/skills/deploy/SKILL.md +274 -231
- package/skills/design/DESIGN-REFERENCE.md +365 -365
- package/skills/design/SKILL.md +590 -589
- package/skills/doc-processor/SKILL.md +254 -254
- package/skills/docs/SKILL.md +374 -374
- package/skills/docs-seeker/SKILL.md +178 -177
- package/skills/fix/SKILL.md +332 -330
- package/skills/git/SKILL.md +339 -339
- package/skills/hallucination-guard/SKILL.md +220 -219
- package/skills/incident/SKILL.md +254 -253
- package/skills/integrity-check/SKILL.md +169 -169
- package/skills/journal/SKILL.md +241 -240
- package/skills/launch/SKILL.md +344 -344
- package/skills/logic-guardian/SKILL.md +269 -251
- package/skills/marketing/SKILL.md +351 -289
- package/skills/mcp-builder/SKILL.md +425 -425
- package/skills/neural-memory/SKILL.md +359 -362
- package/skills/onboard/SKILL.md +432 -403
- package/skills/onboard/references/invariants-template.md +76 -0
- package/skills/onboard/scripts/detect-invariants.js +439 -0
- package/skills/onboard/scripts/inject-claude-md.js +150 -0
- package/skills/onboard/scripts/onboard-invariants.js +194 -0
- package/skills/perf/SKILL.md +347 -346
- package/skills/plan/SKILL.md +435 -428
- package/skills/preflight/SKILL.md +415 -415
- package/skills/problem-solver/SKILL.md +380 -284
- package/skills/rescue/SKILL.md +474 -474
- package/skills/research/SKILL.md +4 -0
- package/skills/retro/SKILL.md +3 -1
- package/skills/review/SKILL.md +614 -588
- package/skills/review-intake/SKILL.md +249 -249
- package/skills/safeguard/SKILL.md +200 -200
- package/skills/sast/SKILL.md +190 -190
- package/skills/scaffold/SKILL.md +328 -287
- package/skills/scope-guard/SKILL.md +183 -180
- package/skills/scout/SKILL.md +269 -263
- package/skills/sentinel/SKILL.md +384 -381
- package/skills/sentinel-env/SKILL.md +254 -254
- package/skills/sequential-thinking/SKILL.md +234 -234
- package/skills/session-bridge/SKILL.md +595 -543
- package/skills/session-bridge/scripts/load-invariants.js +397 -0
- package/skills/skill-forge/SKILL.md +581 -581
- package/skills/skill-router/SKILL.md +3 -0
- package/skills/slides/SKILL.md +19 -0
- package/skills/surgeon/SKILL.md +215 -215
- package/skills/team/SKILL.md +557 -537
- package/skills/test/SKILL.md +620 -614
- package/skills/trend-scout/SKILL.md +145 -145
- package/skills/verification/SKILL.md +334 -326
- package/skills/video-creator/SKILL.md +201 -201
- package/skills/watchdog/SKILL.md +168 -168
- package/skills/worktree/SKILL.md +140 -140
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* onboard-invariants.js — Orchestrate invariant detection, INVARIANTS.md
|
|
5
|
+
* generation (merge-preserving), and CLAUDE.md pointer injection.
|
|
6
|
+
*
|
|
7
|
+
* Writes/updates:
|
|
8
|
+
* - .rune/INVARIANTS.md (seeded from template, append-only on re-run)
|
|
9
|
+
* - CLAUDE.md (pointer block between markers)
|
|
10
|
+
*
|
|
11
|
+
* Safe re-runs:
|
|
12
|
+
* - Existing user sections above the auto-detected block are preserved.
|
|
13
|
+
* - New detections land under `## Auto-detected (new)` — never overwrite.
|
|
14
|
+
*
|
|
15
|
+
* Usage as CLI:
|
|
16
|
+
* node onboard-invariants.js --root <project-root> [--dry]
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
import { existsSync } from 'node:fs';
|
|
20
|
+
import { mkdir, readFile, writeFile } from 'node:fs/promises';
|
|
21
|
+
import path from 'node:path';
|
|
22
|
+
import { parseArgs } from 'node:util';
|
|
23
|
+
import { detectInvariants, renderInvariants } from './detect-invariants.js';
|
|
24
|
+
import { applyInvariantsPointer } from './inject-claude-md.js';
|
|
25
|
+
|
|
26
|
+
const AUTO_HEADER = '## Auto-detected (new)';
|
|
27
|
+
const TEMPLATE_REL_PATH = '../references/invariants-template.md';
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Locate the next `## `-level section boundary in `text`, ignoring any `##`
|
|
31
|
+
* lines that appear inside fenced code blocks (``` or ~~~).
|
|
32
|
+
* Returns the index of the start of the boundary line, or -1 if none.
|
|
33
|
+
*/
|
|
34
|
+
function findNextSectionOffset(text) {
|
|
35
|
+
let offset = 0;
|
|
36
|
+
let inFence = false;
|
|
37
|
+
let fenceDelim = null;
|
|
38
|
+
while (offset < text.length) {
|
|
39
|
+
const eol = text.indexOf('\n', offset);
|
|
40
|
+
const lineEnd = eol === -1 ? text.length : eol;
|
|
41
|
+
const line = text.slice(offset, lineEnd);
|
|
42
|
+
const trimmed = line.trimStart();
|
|
43
|
+
if (inFence) {
|
|
44
|
+
if (trimmed.startsWith(fenceDelim)) {
|
|
45
|
+
inFence = false;
|
|
46
|
+
fenceDelim = null;
|
|
47
|
+
}
|
|
48
|
+
} else {
|
|
49
|
+
if (trimmed.startsWith('```') || trimmed.startsWith('~~~')) {
|
|
50
|
+
inFence = true;
|
|
51
|
+
fenceDelim = trimmed.startsWith('```') ? '```' : '~~~';
|
|
52
|
+
} else if (line.startsWith('## ') && !line.startsWith(AUTO_HEADER)) {
|
|
53
|
+
return offset;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
if (eol === -1) break;
|
|
57
|
+
offset = eol + 1;
|
|
58
|
+
}
|
|
59
|
+
return -1;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
export async function loadTemplate(templatePath) {
|
|
63
|
+
const resolved = templatePath ?? path.resolve(import.meta.dirname, TEMPLATE_REL_PATH);
|
|
64
|
+
return readFile(resolved, 'utf8');
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
export function mergeInvariantsContent({ existing, autoDetected, template }) {
|
|
68
|
+
const freshBody = renderAutoDetectedBlock(autoDetected);
|
|
69
|
+
|
|
70
|
+
if (!existing || existing.trim().length === 0) {
|
|
71
|
+
return replaceAutoBlock(template, freshBody, { seeded: true });
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
if (!existing.includes(AUTO_HEADER)) {
|
|
75
|
+
const trailing = existing.endsWith('\n') ? '' : '\n';
|
|
76
|
+
const appended = `${existing}${trailing}\n---\n\n${AUTO_HEADER}\n\n${freshBody}\n`;
|
|
77
|
+
return { content: appended, seeded: false, replaced: false, appended: true };
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
return replaceAutoBlock(existing, freshBody, { seeded: false });
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
function replaceAutoBlock(source, freshBody, { seeded }) {
|
|
84
|
+
const headerIdx = source.indexOf(AUTO_HEADER);
|
|
85
|
+
if (headerIdx === -1) {
|
|
86
|
+
const trailing = source.endsWith('\n') ? '' : '\n';
|
|
87
|
+
return {
|
|
88
|
+
content: `${source}${trailing}\n${AUTO_HEADER}\n\n${freshBody}\n`,
|
|
89
|
+
seeded,
|
|
90
|
+
replaced: false,
|
|
91
|
+
appended: true,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
const afterHeader = source.slice(headerIdx + AUTO_HEADER.length);
|
|
96
|
+
const nextOffsetRaw = findNextSectionOffset(afterHeader);
|
|
97
|
+
const nextOffset = nextOffsetRaw === -1 ? afterHeader.length : nextOffsetRaw;
|
|
98
|
+
|
|
99
|
+
const before = source.slice(0, headerIdx);
|
|
100
|
+
const after = afterHeader.slice(nextOffset);
|
|
101
|
+
const replaced = `${before}${AUTO_HEADER}\n\n${freshBody}\n\n${after.replace(/^\n+/, '')}`;
|
|
102
|
+
|
|
103
|
+
return { content: replaced, seeded, replaced: true, appended: false };
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
function renderAutoDetectedBlock(result) {
|
|
107
|
+
const total =
|
|
108
|
+
(result?.danger?.length ?? 0) +
|
|
109
|
+
(result?.critical?.length ?? 0) +
|
|
110
|
+
(result?.state?.length ?? 0) +
|
|
111
|
+
(result?.cross?.length ?? 0);
|
|
112
|
+
if (total === 0) return '_No new detections on this run._';
|
|
113
|
+
return renderInvariants(result).trimEnd();
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
export function collectPointerGlobs(result, limit = 8) {
|
|
117
|
+
const danger = (result?.danger ?? []).map((e) => firstWhere(e)).filter(Boolean);
|
|
118
|
+
const critical = (result?.critical ?? []).map((e) => firstWhere(e)).filter(Boolean);
|
|
119
|
+
return Array.from(new Set([...danger, ...critical])).slice(0, limit);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
function firstWhere(entry) {
|
|
123
|
+
if (!entry) return null;
|
|
124
|
+
if (Array.isArray(entry.where)) return entry.where[0] ?? null;
|
|
125
|
+
return entry.where ?? null;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
export async function runOnboardInvariants({ root, dryRun = false, templatePath } = {}) {
|
|
129
|
+
if (!root) throw new Error('root is required');
|
|
130
|
+
|
|
131
|
+
const runeDir = path.join(root, '.rune');
|
|
132
|
+
const invariantsPath = path.join(runeDir, 'INVARIANTS.md');
|
|
133
|
+
const claudeMdPath = path.join(root, 'CLAUDE.md');
|
|
134
|
+
|
|
135
|
+
const result = await detectInvariants({ root });
|
|
136
|
+
const rendered = renderInvariants(result);
|
|
137
|
+
const template = await loadTemplate(templatePath);
|
|
138
|
+
|
|
139
|
+
const existing = existsSync(invariantsPath) ? await readFile(invariantsPath, 'utf8') : '';
|
|
140
|
+
const merged = mergeInvariantsContent({ existing, autoDetected: result, template });
|
|
141
|
+
|
|
142
|
+
if (!dryRun) {
|
|
143
|
+
await mkdir(runeDir, { recursive: true });
|
|
144
|
+
await writeFile(invariantsPath, merged.content, 'utf8');
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
const globs = collectPointerGlobs(result);
|
|
148
|
+
const pointer = await applyInvariantsPointer({
|
|
149
|
+
claudeMdPath,
|
|
150
|
+
globs,
|
|
151
|
+
invariantsPath: path.relative(root, invariantsPath).replaceAll('\\', '/'),
|
|
152
|
+
dryRun,
|
|
153
|
+
});
|
|
154
|
+
|
|
155
|
+
return {
|
|
156
|
+
invariants: {
|
|
157
|
+
path: invariantsPath,
|
|
158
|
+
action: merged.seeded ? 'seeded' : merged.replaced ? 'replaced' : merged.appended ? 'appended' : 'noop',
|
|
159
|
+
stats: result.stats ?? null,
|
|
160
|
+
detected: {
|
|
161
|
+
danger: result.danger?.length ?? 0,
|
|
162
|
+
critical: result.critical?.length ?? 0,
|
|
163
|
+
state: result.state?.length ?? 0,
|
|
164
|
+
cross: result.cross?.length ?? 0,
|
|
165
|
+
},
|
|
166
|
+
},
|
|
167
|
+
claudeMd: {
|
|
168
|
+
path: pointer.path,
|
|
169
|
+
action: pointer.action,
|
|
170
|
+
reason: pointer.reason ?? null,
|
|
171
|
+
},
|
|
172
|
+
rendered,
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
async function main() {
|
|
177
|
+
const { values } = parseArgs({
|
|
178
|
+
options: {
|
|
179
|
+
root: { type: 'string' },
|
|
180
|
+
dry: { type: 'boolean', default: false },
|
|
181
|
+
},
|
|
182
|
+
});
|
|
183
|
+
|
|
184
|
+
const root = values.root ?? process.cwd();
|
|
185
|
+
const result = await runOnboardInvariants({ root, dryRun: values.dry });
|
|
186
|
+
console.log(JSON.stringify(result, null, 2));
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
if (import.meta.url === `file://${process.argv[1]}` || process.argv[1]?.endsWith('onboard-invariants.js')) {
|
|
190
|
+
main().catch((err) => {
|
|
191
|
+
console.error(err.message);
|
|
192
|
+
process.exit(1);
|
|
193
|
+
});
|
|
194
|
+
}
|