cabloy 5.1.190 → 5.1.192
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/.cabloy-version +1 -1
- package/.github/workflows/agent-governance.yml +39 -0
- package/.github/workflows/docs-pages.yml +1 -0
- package/.gitignore +3 -0
- package/CHANGELOG.md +17 -0
- package/README.md +2 -2
- package/package.json +11 -5
- package/repo-agent-governance/adapters/claude/contract-loop-gate.ts +199 -0
- package/{.claude → repo-agent-governance}/commands/release.md +20 -20
- package/repo-agent-governance/managed-assets.json +887 -0
- package/repo-agent-governance/manifest.json +56 -0
- package/{CLAUDE.md → repo-agent-governance/policies/repository.md} +4 -2
- package/repo-agent-governance/scripts/governance.mjs +570 -0
- package/repo-agent-governance/scripts/pack-check.mjs +43 -0
- package/{.claude → repo-agent-governance}/skills/cabloy-contract-loop/references/contract-loop-map.md +4 -4
- package/{.claude → repo-agent-governance}/skills/cabloy-master-detail/SKILL.md +1 -1
- package/{.claude → repo-agent-governance}/skills/cabloy-module-removal/SKILL.md +1 -1
- package/{.claude → repo-agent-governance}/skills/cabloy-spec-execution/SKILL.md +1 -1
- package/{.claude → repo-agent-governance}/skills/cabloy-spec-execution/references/execution-protocol.md +8 -8
- package/{.claude → repo-agent-governance}/skills/cabloy-spec-execution/references/status-and-evidence.md +9 -9
- package/{.claude → repo-agent-governance}/skills/cabloy-spec-generation/SKILL.md +2 -2
- package/{.claude → repo-agent-governance}/skills/cabloy-spec-generation/references/repo-aware-discovery.md +7 -7
- package/{.claude → repo-agent-governance}/skills/cabloy-spec-generation/references/repo-specs-document-set.md +30 -30
- package/{.claude → repo-agent-governance}/skills/cabloy-spec-generation/references/traceability-and-status-rules.md +9 -9
- package/{.claude → repo-agent-governance}/skills/cabloy-workflow/SKILL.md +7 -8
- package/{.claude → repo-agent-governance}/skills/cabloy-worktree-environment/SKILL.md +9 -9
- package/{.claude → repo-agent-governance}/skills/cabloy-zova-source-reading/SKILL.md +5 -5
- package/repo-agent-governance/tests/governance.test.mjs +295 -0
- package/repo-agent-governance/tools/contract-loop/check.mjs +71 -0
- package/repo-agent-governance/tools/contract-loop/core.mjs +189 -0
- package/repo-agent-governance/tools/spec-charts/generate-implementation-charts.mjs +858 -0
- package/{.claude/skills/cabloy-spec-generation/scripts → repo-agent-governance/tools/spec-charts}/generate-implementation-charts.test.mjs +95 -20
- package/repo-docs/.vitepress/config.mjs +2 -0
- package/repo-docs/ai/agent-governance.md +80 -0
- package/repo-docs/ai/cli-to-skill-map.md +3 -3
- package/repo-docs/ai/docs-skills-rules-mapping.md +27 -26
- package/repo-docs/ai/edition-consistency-checklist.md +8 -6
- package/repo-docs/ai/future-skill-roadmap.md +2 -2
- package/repo-docs/ai/introduction.md +7 -6
- package/repo-docs/ai/repo-guidance.md +3 -2
- package/repo-docs/ai/rules-and-config.md +23 -15
- package/repo-docs/ai/skills.md +7 -7
- package/repo-docs/ai/verification.md +2 -1
- package/repo-docs/demo.md +12 -0
- package/repo-docs/fullstack/contract-loop-playbook.md +1 -1
- package/repo-docs/fullstack/quickstart.md +1 -1
- package/repo-docs/index.md +3 -0
- package/repo-docs/reference/package-map.md +3 -2
- package/repo-docs/reference/repo-scripts.md +17 -2
- package/scripts/bootstrapAgentGovernance.mjs +81 -0
- package/scripts/init.ts +1 -0
- package/scripts/release.ts +15 -0
- package/scripts/upgrade.ts +66 -7
- package/zova/packages-zova/zova/package.json +2 -2
- package/zova/pnpm-lock.yaml +3 -3
- package/zova/src/suite/a-home/modules/home-passport/src/model/passport.ts +2 -7
- package/zova/src/suite/cabloy-basic/modules/basic-details/src/bean/tableCell.actionOperationsRow.tsx +19 -13
- package/zova/src/suite/cabloy-basic/modules/basic-details/src/component/blockDetails/controller.tsx +11 -0
- package/zova/src/suite/cabloy-basic/modules/basic-details/src/component/blockToolbarBulk/controller.tsx +7 -4
- package/zova/src/suite/cabloy-basic/modules/basic-details/src/component/formFieldDetails/controller.tsx +14 -0
- package/zova/src/suite/cabloy-basic/modules/basic-details/src/lib/detailsPermissions.ts +65 -0
- package/zova/src/suite/cabloy-basic/modules/basic-details/src/lib/index.ts +1 -0
- package/zova/src/suite/cabloy-basic/modules/basic-details/src/lib/utils.ts +3 -3
- package/zova/src/suite/cabloy-basic/modules/basic-details/src/types/details.ts +6 -1
- package/zova/src/suite/cabloy-basic/modules/basic-details/test/lib/detailsPermissions.test.ts +125 -0
- package/zova/src/suite-vendor/a-zova/modules/a-openapi/package.json +1 -1
- package/zova/src/suite-vendor/a-zova/modules/a-openapi/src/types/permissions.ts +2 -8
- package/zova/src/suite-vendor/a-zova/modules/a-table/package.json +1 -1
- package/zova/src/suite-vendor/a-zova/modules/a-table/src/component/table/controller.tsx +2 -1
- package/zova/src/suite-vendor/a-zova/package.json +3 -3
- package/.claude/hooks/contract-loop-gate.ts +0 -421
- package/.claude/scheduled_tasks.lock +0 -1
- package/.claude/skills/cabloy-spec-generation/scripts/generate-implementation-charts.mjs +0 -385
- /package/{.claude → repo-agent-governance/adapters/claude}/settings.json +0 -0
- /package/{.claude → repo-agent-governance}/skills/cabloy-backend-scaffold/SKILL.md +0 -0
- /package/{.claude → repo-agent-governance}/skills/cabloy-backend-scaffold/evals/evals.json +0 -0
- /package/{.claude → repo-agent-governance}/skills/cabloy-backend-scaffold/references/backend-thread-map.md +0 -0
- /package/{.claude → repo-agent-governance}/skills/cabloy-backend-scaffold/references/follow-up-checklist.md +0 -0
- /package/{.claude → repo-agent-governance}/skills/cabloy-contract-loop/SKILL.md +0 -0
- /package/{.claude → repo-agent-governance}/skills/cabloy-contract-loop/evals/evals.json +0 -0
- /package/{.claude → repo-agent-governance}/skills/cabloy-contract-loop/references/resource-custom-state-pattern.md +0 -0
- /package/{.claude → repo-agent-governance}/skills/cabloy-contract-loop/references/verification-checklist.md +0 -0
- /package/{.claude → repo-agent-governance}/skills/cabloy-domain-planning/SKILL.md +0 -0
- /package/{.claude → repo-agent-governance}/skills/cabloy-frontend-scaffold/SKILL.md +0 -0
- /package/{.claude → repo-agent-governance}/skills/cabloy-frontend-scaffold/evals/evals.json +0 -0
- /package/{.claude → repo-agent-governance}/skills/cabloy-frontend-scaffold/references/follow-up-checklist.md +0 -0
- /package/{.claude → repo-agent-governance}/skills/cabloy-frontend-scaffold/references/frontend-thread-map.md +0 -0
- /package/{.claude → repo-agent-governance}/skills/cabloy-resource-field-update/SKILL.md +0 -0
- /package/{.claude → repo-agent-governance}/skills/cabloy-resource-field-update/evals/evals.json +0 -0
- /package/{.claude → repo-agent-governance}/skills/cabloy-resource-field-update/references/custom-renderer-demo-checklist.md +0 -0
- /package/{.claude → repo-agent-governance}/skills/cabloy-resource-field-update/references/field-update-decision-tree.md +0 -0
- /package/{.claude → repo-agent-governance}/skills/cabloy-resource-field-update/references/follow-up-checklist.md +0 -0
- /package/{.claude → repo-agent-governance}/skills/cabloy-resource-field-update/references/verification-checklist.md +0 -0
- /package/{.claude → repo-agent-governance}/skills/cabloy-spec-execution/evals/evals.json +0 -0
- /package/{.claude → repo-agent-governance}/skills/cabloy-spec-generation/evals/evals.json +0 -0
- /package/{.claude → repo-agent-governance}/skills/cabloy-workflow/evals/evals.json +0 -0
- /package/{.claude → repo-agent-governance}/skills/cabloy-workflow/references/cli-strategy.md +0 -0
- /package/{.claude → repo-agent-governance}/skills/cabloy-workflow/references/edition-detection.md +0 -0
- /package/{.claude → repo-agent-governance}/skills/cabloy-worktree-environment/evals/evals.json +0 -0
- /package/{.claude → repo-agent-governance}/skills/cabloy-zova-source-reading/references/analysis-modes.md +0 -0
- /package/{.claude → repo-agent-governance}/skills/cabloy-zova-source-reading/references/core-reading-paths.md +0 -0
package/.cabloy-version
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
5.1.
|
|
1
|
+
5.1.192
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
name: agent-governance
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches:
|
|
6
|
+
- main
|
|
7
|
+
pull_request:
|
|
8
|
+
workflow_dispatch:
|
|
9
|
+
|
|
10
|
+
permissions:
|
|
11
|
+
contents: read
|
|
12
|
+
|
|
13
|
+
jobs:
|
|
14
|
+
verify:
|
|
15
|
+
runs-on: ubuntu-latest
|
|
16
|
+
env:
|
|
17
|
+
PNPM_CONFIG_MINIMUM_RELEASE_AGE: 0
|
|
18
|
+
steps:
|
|
19
|
+
- uses: actions/checkout@v6
|
|
20
|
+
- uses: pnpm/action-setup@v5
|
|
21
|
+
with:
|
|
22
|
+
version: 11.5.2
|
|
23
|
+
- uses: actions/setup-node@v6
|
|
24
|
+
with:
|
|
25
|
+
node-version: 24
|
|
26
|
+
cache: pnpm
|
|
27
|
+
- name: install root dependencies
|
|
28
|
+
run: pnpm install --frozen-lockfile
|
|
29
|
+
- name: install docs dependencies
|
|
30
|
+
run: pnpm --dir repo-docs install --frozen-lockfile
|
|
31
|
+
- name: verify agent-governance assets
|
|
32
|
+
run: |
|
|
33
|
+
npm run test:agent-governance
|
|
34
|
+
npm run agent:governance:check
|
|
35
|
+
npm run agent:governance:pack-check
|
|
36
|
+
npm run test:spec-charts
|
|
37
|
+
npm run spec:charts:check -- a-commerce
|
|
38
|
+
- name: build documentation
|
|
39
|
+
run: npm run docs:build
|
package/.gitignore
CHANGED
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,22 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 5.1.192
|
|
4
|
+
|
|
5
|
+
### Features
|
|
6
|
+
|
|
7
|
+
- Update core functionality.
|
|
8
|
+
- Add agents for Claude Code, Codex, and Cursor.
|
|
9
|
+
|
|
10
|
+
## 5.1.191
|
|
11
|
+
|
|
12
|
+
### Features
|
|
13
|
+
|
|
14
|
+
- Update functionality with the latest enhancements.
|
|
15
|
+
|
|
16
|
+
### Improvements
|
|
17
|
+
|
|
18
|
+
- Refresh the demo and documentation in the README and index pages.
|
|
19
|
+
|
|
3
20
|
## 5.1.190
|
|
4
21
|
|
|
5
22
|
### Features
|
package/README.md
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
[](https://www.npmjs.com/package/cabloy)
|
|
5
5
|
[](https://www.npmjs.com/package/cabloy)
|
|
6
6
|
[](https://cabloy.com)
|
|
7
|
-
[](https://cabloy.com)
|
|
7
|
+
[](https://cabloy.com/demo)
|
|
8
8
|
|
|
9
9
|
Cabloy is a Node.js fullstack framework for AI vibe coding, with AI Spec-Driven Development for traceable, evidence-backed delivery.
|
|
10
10
|
|
|
@@ -12,7 +12,7 @@ Cabloy is a Node.js fullstack framework for AI vibe coding, with AI Spec-Driven
|
|
|
12
12
|
|
|
13
13
|
Instead of stitching separate backend and frontend stacks together, Cabloy keeps their contracts, tooling, and guidance connected in one repository. [AI Spec-Driven Development](https://cabloy.com/ai/ai-spec-driven-development) provides the disciplined path from confirmed Specs to evidence-backed delivery; its precise engineering method is Traceable Spec Delivery. Vona is its backend framework and runtime layer, and Zova is its frontend framework and application layer. Cabloy Basic and Cabloy Start are related, complete edition baselines built on that shared architecture; see [Editions Overview](https://cabloy.com/editions/overview) for their deliberate differences.
|
|
14
14
|
|
|
15
|
-
[Documentation](https://cabloy.com) · [npm](https://www.npmjs.com/package/cabloy) · [
|
|
15
|
+
[Documentation](https://cabloy.com) · [npm](https://www.npmjs.com/package/cabloy) · [Demo](https://cabloy.com/demo) · [GitHub](https://github.com/cabloy/cabloy)
|
|
16
16
|
|
|
17
17
|
## Fullstack Principles
|
|
18
18
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "cabloy",
|
|
3
|
-
"version": "5.1.
|
|
3
|
+
"version": "5.1.192",
|
|
4
4
|
"gitHead": "2c5c19284bab738e492856189acb6fad74b8a7b7",
|
|
5
5
|
"description": "A Node.js fullstack framework",
|
|
6
6
|
"keywords": [
|
|
@@ -57,9 +57,9 @@
|
|
|
57
57
|
"format:fix": "oxfmt --write",
|
|
58
58
|
"lint": "oxlint --disable-nested-config",
|
|
59
59
|
"lint:fix": "oxlint --disable-nested-config --fix",
|
|
60
|
-
"test:spec-charts": "node --test
|
|
61
|
-
"spec:charts": "node
|
|
62
|
-
"spec:charts:check": "node
|
|
60
|
+
"test:spec-charts": "node --test repo-agent-governance/tools/spec-charts/generate-implementation-charts.test.mjs",
|
|
61
|
+
"spec:charts": "node ./repo-agent-governance/tools/spec-charts/generate-implementation-charts.mjs",
|
|
62
|
+
"spec:charts:check": "node ./repo-agent-governance/tools/spec-charts/generate-implementation-charts.mjs --check",
|
|
63
63
|
"docs:dev": "pnpm --dir repo-docs docs:dev",
|
|
64
64
|
"docs:build": "pnpm --dir repo-docs docs:build",
|
|
65
65
|
"docs:preview": "pnpm --dir repo-docs docs:preview",
|
|
@@ -72,7 +72,13 @@
|
|
|
72
72
|
"release:changelog": "node scripts/release.ts --changelog-only",
|
|
73
73
|
"release:publish": "node scripts/release.ts --publish-only",
|
|
74
74
|
"release:github": "node scripts/release.ts --release-only",
|
|
75
|
-
"prepare": "husky"
|
|
75
|
+
"prepare": "husky",
|
|
76
|
+
"agent:governance:render": "node repo-agent-governance/scripts/governance.mjs render",
|
|
77
|
+
"agent:governance:check": "node repo-agent-governance/scripts/governance.mjs check",
|
|
78
|
+
"agent:governance:adopt": "node repo-agent-governance/scripts/governance.mjs adopt",
|
|
79
|
+
"test:agent-governance": "node --test repo-agent-governance/tests/*.test.mjs",
|
|
80
|
+
"contract:gate": "node repo-agent-governance/tools/contract-loop/check.mjs",
|
|
81
|
+
"agent:governance:pack-check": "node repo-agent-governance/scripts/pack-check.mjs"
|
|
76
82
|
},
|
|
77
83
|
"devDependencies": {
|
|
78
84
|
"@cabloy/dotenv": "^1.2.8",
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import type { SpawnSyncReturns } from 'node:child_process';
|
|
3
|
+
|
|
4
|
+
import { spawnSync } from 'node:child_process';
|
|
5
|
+
import { readFileSync, statSync, writeFileSync, existsSync } from 'node:fs';
|
|
6
|
+
import os from 'node:os';
|
|
7
|
+
import path from 'node:path';
|
|
8
|
+
import { fileURLToPath } from 'node:url';
|
|
9
|
+
|
|
10
|
+
import {
|
|
11
|
+
analyze,
|
|
12
|
+
buildMessages,
|
|
13
|
+
isCodeFile,
|
|
14
|
+
isHighConfidenceReverseSource,
|
|
15
|
+
normalizePath,
|
|
16
|
+
resolveEdition,
|
|
17
|
+
toPosixPath,
|
|
18
|
+
} from '../../repo-agent-governance/tools/contract-loop/core.mjs';
|
|
19
|
+
|
|
20
|
+
interface EditionConfig {
|
|
21
|
+
id: 'basic' | 'start';
|
|
22
|
+
label: string;
|
|
23
|
+
reverseAutoSyncCommands: ReadonlyArray<{ args: readonly string[]; display: string }>;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
interface HookPayload {
|
|
27
|
+
tool_input?: {
|
|
28
|
+
file_path?: string;
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
interface SyncStateEntry {
|
|
33
|
+
fingerprint: string;
|
|
34
|
+
timestamp: number;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
type ReverseSyncOutcome =
|
|
38
|
+
| { kind: 'not-applicable'; message: string }
|
|
39
|
+
| { kind: 'skipped'; message: string }
|
|
40
|
+
| { kind: 'success'; message: string }
|
|
41
|
+
| { kind: 'failure'; message: string };
|
|
42
|
+
|
|
43
|
+
type SyncState = Record<string, SyncStateEntry>;
|
|
44
|
+
|
|
45
|
+
const SCRIPT_FILE = fileURLToPath(import.meta.url);
|
|
46
|
+
const ROOT = path.resolve(path.dirname(SCRIPT_FILE), '../..');
|
|
47
|
+
const ROOT_KEY = toPosixPath(ROOT);
|
|
48
|
+
const STATE_FILE = path.join(os.tmpdir(), 'cabloy-contract-loop-gate-state.json');
|
|
49
|
+
const AUTO_SYNC_WINDOW_SECONDS = 300;
|
|
50
|
+
|
|
51
|
+
function readText(filePath: string): string | null {
|
|
52
|
+
try {
|
|
53
|
+
return readFileSync(filePath, 'utf8');
|
|
54
|
+
} catch {
|
|
55
|
+
return null;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
function loadState(): SyncState {
|
|
60
|
+
if (!existsSync(STATE_FILE)) return {};
|
|
61
|
+
try {
|
|
62
|
+
return JSON.parse(readFileSync(STATE_FILE, 'utf8')) as SyncState;
|
|
63
|
+
} catch {
|
|
64
|
+
return {};
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
function saveState(state: SyncState): void {
|
|
69
|
+
try {
|
|
70
|
+
writeFileSync(STATE_FILE, JSON.stringify(state), 'utf8');
|
|
71
|
+
} catch {
|
|
72
|
+
// State prevents duplicate convenience syncs only; it must not block guidance.
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
function syncFingerprint(filePath: string): string {
|
|
77
|
+
try {
|
|
78
|
+
const stats = statSync(filePath, { bigint: true });
|
|
79
|
+
return `${filePath}:${stats.mtimeNs.toString()}`;
|
|
80
|
+
} catch {
|
|
81
|
+
return filePath;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
function shouldSkipAutoSync(filePath: string): boolean {
|
|
86
|
+
const state = loadState();
|
|
87
|
+
const entry = state[ROOT_KEY];
|
|
88
|
+
return Boolean(
|
|
89
|
+
entry &&
|
|
90
|
+
entry.fingerprint === syncFingerprint(filePath) &&
|
|
91
|
+
Date.now() - entry.timestamp <= AUTO_SYNC_WINDOW_SECONDS * 1000,
|
|
92
|
+
);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
function markAutoSync(filePath: string): void {
|
|
96
|
+
const state = loadState();
|
|
97
|
+
state[ROOT_KEY] = { fingerprint: syncFingerprint(filePath), timestamp: Date.now() };
|
|
98
|
+
saveState(state);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
function runNpm(args: readonly string[]): SpawnSyncReturns<string> {
|
|
102
|
+
const command = process.platform === 'win32' ? 'npm.cmd' : 'npm';
|
|
103
|
+
return spawnSync(command, [...args], { cwd: ROOT, encoding: 'utf8' });
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
function summarizeProcess(result: SpawnSyncReturns<string>): string {
|
|
107
|
+
if (result.error) return result.error.message;
|
|
108
|
+
const combined = [result.stdout?.trim(), result.stderr?.trim()].filter(Boolean).join('\n');
|
|
109
|
+
const exitCode = result.status ?? 1;
|
|
110
|
+
if (!combined) return `command exited with code ${exitCode}`;
|
|
111
|
+
return `exit ${exitCode}: ${combined
|
|
112
|
+
.split(/\r?\n/)
|
|
113
|
+
.map(line => line.trim())
|
|
114
|
+
.filter(Boolean)
|
|
115
|
+
.slice(-3)
|
|
116
|
+
.join(' | ')}`;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
function autoSyncReverse(filePath: string, edition: EditionConfig): ReverseSyncOutcome {
|
|
120
|
+
for (const command of edition.reverseAutoSyncCommands) {
|
|
121
|
+
const result = runNpm(command.args);
|
|
122
|
+
if (result.status !== 0) {
|
|
123
|
+
return {
|
|
124
|
+
kind: 'failure',
|
|
125
|
+
message: `Auto-sync failed during \`${command.display}\`: ${summarizeProcess(result)}`,
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
markAutoSync(filePath);
|
|
130
|
+
return {
|
|
131
|
+
kind: 'success',
|
|
132
|
+
message: `Auto-sync ran ${edition.reverseAutoSyncCommands
|
|
133
|
+
.map(command => `\`${command.display}\``)
|
|
134
|
+
.join(' and ')} for this ${edition.label} reverse-chain edit.`,
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
function resolveReverseSyncOutcome(
|
|
139
|
+
filePath: string,
|
|
140
|
+
reverseReason: string | null,
|
|
141
|
+
): ReverseSyncOutcome {
|
|
142
|
+
if (!reverseReason) return { kind: 'not-applicable', message: '' };
|
|
143
|
+
if (!isHighConfidenceReverseSource(filePath)) {
|
|
144
|
+
return {
|
|
145
|
+
kind: 'not-applicable',
|
|
146
|
+
message:
|
|
147
|
+
'Auto-sync did not run because this reverse-chain signal came from the consumer side rather than a high-confidence frontend source edit.',
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
const resolution = resolveEdition(ROOT);
|
|
151
|
+
if (resolution.kind !== 'resolved') {
|
|
152
|
+
return {
|
|
153
|
+
kind: 'not-applicable',
|
|
154
|
+
message: `Auto-sync did not run because ${resolution.kind === 'ambiguous' ? 'both Cabloy edition markers are present' : 'no Cabloy edition marker is present'}.`,
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
if (shouldSkipAutoSync(filePath)) {
|
|
158
|
+
return {
|
|
159
|
+
kind: 'skipped',
|
|
160
|
+
message:
|
|
161
|
+
'Auto-sync skipped because the same reverse-source edit was already synced recently in this repo.',
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
return autoSyncReverse(filePath, resolution.edition);
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
function runClaudeHook(): number {
|
|
168
|
+
let payload: HookPayload;
|
|
169
|
+
try {
|
|
170
|
+
payload = JSON.parse(readFileSync(0, 'utf8')) as HookPayload;
|
|
171
|
+
} catch {
|
|
172
|
+
return 0;
|
|
173
|
+
}
|
|
174
|
+
const filePath = normalizePath(ROOT, payload.tool_input?.file_path);
|
|
175
|
+
if (!filePath || !isCodeFile(filePath)) return 0;
|
|
176
|
+
const content = readText(filePath);
|
|
177
|
+
if (content === null) return 0;
|
|
178
|
+
|
|
179
|
+
const resolution = resolveEdition(ROOT);
|
|
180
|
+
const result = analyze(
|
|
181
|
+
filePath,
|
|
182
|
+
content,
|
|
183
|
+
resolution.kind === 'resolved' ? resolution.edition : null,
|
|
184
|
+
);
|
|
185
|
+
if (!result.forwardReason && !result.reverseReason) return 0;
|
|
186
|
+
|
|
187
|
+
const reverseSyncOutcome = resolveReverseSyncOutcome(filePath, result.reverseReason);
|
|
188
|
+
const message = buildMessages(result, resolution, reverseSyncOutcome);
|
|
189
|
+
// eslint-disable-next-line
|
|
190
|
+
console.log(
|
|
191
|
+
JSON.stringify({
|
|
192
|
+
hookSpecificOutput: { hookEventName: 'PostToolUse', additionalContext: message },
|
|
193
|
+
systemMessage: message,
|
|
194
|
+
}),
|
|
195
|
+
);
|
|
196
|
+
return 0;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
process.exit(runClaudeHook());
|
|
@@ -24,31 +24,31 @@ The release script at `scripts/release.ts` performs 4 steps for the public `cabl
|
|
|
24
24
|
|
|
25
25
|
Only after the Basic preflight above succeeds, use the matching script that exists in the active root `package.json`:
|
|
26
26
|
|
|
27
|
-
| Command
|
|
28
|
-
|
|
29
|
-
| `pnpm release-patch`
|
|
30
|
-
| `pnpm release-minor`
|
|
31
|
-
| `pnpm release-major`
|
|
32
|
-
| `pnpm release`
|
|
33
|
-
| `pnpm release:dry-run`
|
|
34
|
-
| `pnpm release:changelog` | Only generate changelog (no version bump)
|
|
35
|
-
| `pnpm release:publish`
|
|
36
|
-
| `pnpm release:github`
|
|
27
|
+
| Command | Description |
|
|
28
|
+
| ------------------------ | ------------------------------------------- |
|
|
29
|
+
| `pnpm release-patch` | Full release with patch version bump |
|
|
30
|
+
| `pnpm release-minor` | Full release with minor version bump |
|
|
31
|
+
| `pnpm release-major` | Full release with major version bump |
|
|
32
|
+
| `pnpm release` | Full release with default patch bump |
|
|
33
|
+
| `pnpm release:dry-run` | Preview what would happen without executing |
|
|
34
|
+
| `pnpm release:changelog` | Only generate changelog (no version bump) |
|
|
35
|
+
| `pnpm release:publish` | Only publish to npm |
|
|
36
|
+
| `pnpm release:github` | Only create GitHub release |
|
|
37
37
|
|
|
38
38
|
Do not infer equivalent commands in Cabloy Start when this table is absent from its package scripts.
|
|
39
39
|
|
|
40
40
|
## CLI Options
|
|
41
41
|
|
|
42
|
-
| Option
|
|
43
|
-
|
|
44
|
-
| `--dry-run`
|
|
45
|
-
| `--changelog-only` | Only generate changelog (no version bump)
|
|
46
|
-
| `--publish-only`
|
|
47
|
-
| `--release-only`
|
|
48
|
-
| `--skip-changelog` | Skip changelog generation
|
|
49
|
-
| `--skip-publish`
|
|
50
|
-
| `--skip-release`
|
|
51
|
-
| `--no-ai`
|
|
42
|
+
| Option | Description |
|
|
43
|
+
| ------------------ | ----------------------------------------------- |
|
|
44
|
+
| `--dry-run` | Show what would happen without executing |
|
|
45
|
+
| `--changelog-only` | Only generate changelog (no version bump) |
|
|
46
|
+
| `--publish-only` | Only publish to npm |
|
|
47
|
+
| `--release-only` | Only create GitHub release |
|
|
48
|
+
| `--skip-changelog` | Skip changelog generation |
|
|
49
|
+
| `--skip-publish` | Skip npm publish |
|
|
50
|
+
| `--skip-release` | Skip GitHub release |
|
|
51
|
+
| `--no-ai` | Use raw commit list instead of AI for changelog |
|
|
52
52
|
|
|
53
53
|
## Execution
|
|
54
54
|
|