@tenonhq/dovetail-core 0.0.121 → 0.0.122
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/README.md +1 -1
- package/dist/allScopesCommands.js +8 -0
- package/dist/claudeSession.js +58 -0
- package/dist/commander.js +11 -1
- package/dist/tests/claudeSession.test.js +42 -0
- package/dist/tests/watchHidden.test.js +146 -0
- package/package.json +1 -1
- package/release-manifest.json +246 -292
- package/skills/dove-manage-update-sets.md +4 -4
- package/skills/dove-setup-project.md +12 -6
- package/skills/dove-troubleshoot-sync.md +3 -3
package/README.md
CHANGED
|
@@ -24,7 +24,7 @@ The full command surface is documented in the [root CLAUDE.md](../../CLAUDE.md#e
|
|
|
24
24
|
Quick reference:
|
|
25
25
|
|
|
26
26
|
```bash
|
|
27
|
-
npx dove watch # multi-scope watch + dashboard
|
|
27
|
+
npx dove watch # HUMAN-ONLY local dev: multi-scope watch + dashboard (hidden from --help; stop before git checkout — see #155)
|
|
28
28
|
npx dove push # build + push current files
|
|
29
29
|
npx dove refresh # pull manifest + new files (aliases: pull, r)
|
|
30
30
|
npx dove build # local build only
|
|
@@ -47,6 +47,7 @@ const AppUtils = __importStar(require("./appUtils"));
|
|
|
47
47
|
const wizard_1 = require("./wizard");
|
|
48
48
|
const snClient_1 = require("./snClient");
|
|
49
49
|
const commands_1 = require("./commands");
|
|
50
|
+
const claudeSession_1 = require("./claudeSession");
|
|
50
51
|
const path = __importStar(require("path"));
|
|
51
52
|
const fs = __importStar(require("fs"));
|
|
52
53
|
const child_process_1 = require("child_process");
|
|
@@ -371,6 +372,13 @@ async function initScopesCommand(args) {
|
|
|
371
372
|
}
|
|
372
373
|
async function watchAllScopesCommand(args) {
|
|
373
374
|
(0, commands_1.setLogLevel)(args);
|
|
375
|
+
// Soft guard, not a hard fail: `watch` is a human-only local-dev tool and a
|
|
376
|
+
// branch switch mid-watch overwrites instance records. Warn an agent off it
|
|
377
|
+
// but leave the human path untouched. See TenonHQ/Dovetail#155.
|
|
378
|
+
if ((0, claudeSession_1.isClaudeCodeSession)()) {
|
|
379
|
+
Logger_1.logger.warn(claudeSession_1.WATCH_HUMAN_ONLY_WARNING);
|
|
380
|
+
FileLogger_1.fileLogger.warn("dove watch started inside a Claude Code session (TenonHQ/Dovetail#155)");
|
|
381
|
+
}
|
|
374
382
|
var dashboardProcess = null;
|
|
375
383
|
try {
|
|
376
384
|
// First check if we have environment variables set. SN_USER stays
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Claude Code session detection for human-only CLI surfaces.
|
|
4
|
+
*
|
|
5
|
+
* `dove watch` auto-syncs the working tree to the instance, and a git branch
|
|
6
|
+
* switch mid-watch pushes the post-switch file state over live records. An
|
|
7
|
+
* agent can't guarantee it stops the watcher before every branch operation, so
|
|
8
|
+
* the command is hidden from `--help` and warns when it detects it is running
|
|
9
|
+
* inside a Claude Code session. See TenonHQ/Dovetail#155.
|
|
10
|
+
*
|
|
11
|
+
* Pure functions — no I/O — so the detection is unit-testable without touching
|
|
12
|
+
* `process.env` directly.
|
|
13
|
+
*/
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.WATCH_HUMAN_ONLY_WARNING = void 0;
|
|
16
|
+
exports.isClaudeCodeSession = isClaudeCodeSession;
|
|
17
|
+
// Claude Code exports `CLAUDECODE=1` into every tool shell, plus a family of
|
|
18
|
+
// `CLAUDE_CODE_*` variables (e.g. `CLAUDE_CODE_SESSION_ID`, which claude-plans
|
|
19
|
+
// already keys on). Any one of them set to a non-empty value is a session.
|
|
20
|
+
var CLAUDE_SESSION_FLAG = "CLAUDECODE";
|
|
21
|
+
var CLAUDE_SESSION_PREFIX = "CLAUDE_CODE_";
|
|
22
|
+
/**
|
|
23
|
+
* @description Human-only warning printed when `dove watch` starts inside a
|
|
24
|
+
* Claude Code session. Non-blocking by design (TenonHQ/Dovetail#155).
|
|
25
|
+
*/
|
|
26
|
+
exports.WATCH_HUMAN_ONLY_WARNING = "⚠ `dove watch` is a human-only local-dev tool — it auto-syncs to the " +
|
|
27
|
+
"instance and a branch switch mid-watch overwrites records. Don't run this " +
|
|
28
|
+
"inside Claude Code. Use `npx dove push --diff <branch>` / `npx dove refresh` / " +
|
|
29
|
+
"`npx dove status` instead. See TenonHQ/Dovetail#155.";
|
|
30
|
+
/**
|
|
31
|
+
* @description Reports whether the given environment looks like a Claude Code
|
|
32
|
+
* session: `CLAUDECODE` is set, or any `CLAUDE_CODE_*` variable is set, to a
|
|
33
|
+
* non-empty value. Empty strings do not count — an unset-but-declared variable
|
|
34
|
+
* is not a session.
|
|
35
|
+
* @param {NodeJS.ProcessEnv} env - Environment to inspect (defaults to `process.env`).
|
|
36
|
+
* @returns {boolean} True when a Claude Code session is detected.
|
|
37
|
+
*/
|
|
38
|
+
function isClaudeCodeSession(env = process.env) {
|
|
39
|
+
if (!env || typeof env !== "object")
|
|
40
|
+
return false;
|
|
41
|
+
if (hasValue(env[CLAUDE_SESSION_FLAG]))
|
|
42
|
+
return true;
|
|
43
|
+
var keys = Object.keys(env);
|
|
44
|
+
for (var i = 0; i < keys.length; i++) {
|
|
45
|
+
var key = keys[i];
|
|
46
|
+
if (key.indexOf(CLAUDE_SESSION_PREFIX) === 0 && hasValue(env[key]))
|
|
47
|
+
return true;
|
|
48
|
+
}
|
|
49
|
+
return false;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* @description True when an env value is a non-empty string.
|
|
53
|
+
* @param {string|undefined} value - Raw env value.
|
|
54
|
+
* @returns {boolean} Whether the value counts as "set".
|
|
55
|
+
*/
|
|
56
|
+
function hasValue(value) {
|
|
57
|
+
return typeof value === "string" && value.trim().length > 0;
|
|
58
|
+
}
|
package/dist/commander.js
CHANGED
|
@@ -49,7 +49,17 @@ function configureCli(cli) {
|
|
|
49
49
|
describe: "Write a dovetail-debug-*.log file for this command (off by default; also enabled by DOVETAIL_DEBUG=1).",
|
|
50
50
|
})
|
|
51
51
|
.global("debug")
|
|
52
|
-
|
|
52
|
+
// INTENTIONAL: 'watch' is hidden from help + Claude-facing docs. It
|
|
53
|
+
// auto-syncs to the instance and a branch switch mid-watch silently
|
|
54
|
+
// overwrites records. Human-only local-dev tool. Do not re-document for
|
|
55
|
+
// Claude. See TenonHQ/Dovetail#155.
|
|
56
|
+
//
|
|
57
|
+
// A `false` description is yargs' hidden-command pattern: the command stays
|
|
58
|
+
// fully wired (a human typing `dove watch` / `w` / `watchAllScopes` still
|
|
59
|
+
// gets it, and `dove watch --help` still prints its flags) but it is omitted
|
|
60
|
+
// from the `dove --help` command index. The handler itself prints a
|
|
61
|
+
// human-only warning when it detects a Claude Code session (claudeSession.ts).
|
|
62
|
+
.command(["watch", "w", "watchAllScopes"], false, (cmdArgs) => {
|
|
53
63
|
cmdArgs.options({
|
|
54
64
|
...sharedOptions,
|
|
55
65
|
noDashboard: {
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Tests for the Claude Code session detector behind the `dove watch` soft
|
|
3
|
+
// guard (claudeSession.ts, TenonHQ/Dovetail#155). Pure-function tests — an
|
|
4
|
+
// explicit env object is passed so the real process.env never leaks in.
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const claudeSession_1 = require("../claudeSession");
|
|
7
|
+
describe("isClaudeCodeSession", function () {
|
|
8
|
+
it("returns false for an empty environment", function () {
|
|
9
|
+
expect((0, claudeSession_1.isClaudeCodeSession)({})).toBe(false);
|
|
10
|
+
});
|
|
11
|
+
it("returns false when only unrelated variables are set", function () {
|
|
12
|
+
expect((0, claudeSession_1.isClaudeCodeSession)({ HOME: "/tmp", SN_INSTANCE: "x.service-now.com" })).toBe(false);
|
|
13
|
+
});
|
|
14
|
+
it("returns true when CLAUDECODE is set", function () {
|
|
15
|
+
expect((0, claudeSession_1.isClaudeCodeSession)({ CLAUDECODE: "1" })).toBe(true);
|
|
16
|
+
});
|
|
17
|
+
it("returns true when any CLAUDE_CODE_* variable is set", function () {
|
|
18
|
+
expect((0, claudeSession_1.isClaudeCodeSession)({ CLAUDE_CODE_SESSION_ID: "abc123" })).toBe(true);
|
|
19
|
+
expect((0, claudeSession_1.isClaudeCodeSession)({ CLAUDE_CODE_ENTRYPOINT: "cli" })).toBe(true);
|
|
20
|
+
});
|
|
21
|
+
it("treats empty or whitespace-only values as unset", function () {
|
|
22
|
+
expect((0, claudeSession_1.isClaudeCodeSession)({ CLAUDECODE: "" })).toBe(false);
|
|
23
|
+
expect((0, claudeSession_1.isClaudeCodeSession)({ CLAUDE_CODE_SESSION_ID: " " })).toBe(false);
|
|
24
|
+
});
|
|
25
|
+
it("does not match look-alike prefixes", function () {
|
|
26
|
+
expect((0, claudeSession_1.isClaudeCodeSession)({ CLAUDE: "1", CLAUDECODEX: "1", MY_CLAUDE_CODE_X: "1" })).toBe(false);
|
|
27
|
+
});
|
|
28
|
+
it("defaults to process.env and agrees with an explicit copy of it", function () {
|
|
29
|
+
expect((0, claudeSession_1.isClaudeCodeSession)()).toBe((0, claudeSession_1.isClaudeCodeSession)({ ...process.env }));
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
describe("WATCH_HUMAN_ONLY_WARNING", function () {
|
|
33
|
+
it("names the hazard, the safe headless verbs, and the tracking issue", function () {
|
|
34
|
+
expect(claudeSession_1.WATCH_HUMAN_ONLY_WARNING).toContain("human-only");
|
|
35
|
+
expect(claudeSession_1.WATCH_HUMAN_ONLY_WARNING).toContain("branch switch");
|
|
36
|
+
expect(claudeSession_1.WATCH_HUMAN_ONLY_WARNING).toContain("Claude Code");
|
|
37
|
+
expect(claudeSession_1.WATCH_HUMAN_ONLY_WARNING).toContain("dove push");
|
|
38
|
+
expect(claudeSession_1.WATCH_HUMAN_ONLY_WARNING).toContain("dove refresh");
|
|
39
|
+
expect(claudeSession_1.WATCH_HUMAN_ONLY_WARNING).toContain("dove status");
|
|
40
|
+
expect(claudeSession_1.WATCH_HUMAN_ONLY_WARNING).toContain("TenonHQ/Dovetail#155");
|
|
41
|
+
});
|
|
42
|
+
});
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// `dove watch` is hidden from the `--help` command index but stays wired for
|
|
3
|
+
// humans (TenonHQ/Dovetail#155). These tests pin both halves: the help text
|
|
4
|
+
// never lists `watch` / `w` / `watchAllScopes`, and all three spellings still
|
|
5
|
+
// route to the watch handler. Mocks mirror commanderStrict.test.ts — the parser
|
|
6
|
+
// is under test, not the commands, which would hit ServiceNow.
|
|
7
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
8
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
9
|
+
};
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
jest.mock("../commands", () => ({
|
|
12
|
+
refreshCommand: jest.fn(),
|
|
13
|
+
pushCommand: jest.fn(),
|
|
14
|
+
downloadCommand: jest.fn(),
|
|
15
|
+
initCommand: jest.fn(),
|
|
16
|
+
buildCommand: jest.fn(),
|
|
17
|
+
deployCommand: jest.fn(),
|
|
18
|
+
statusCommand: jest.fn(),
|
|
19
|
+
taskClearCommand: jest.fn(),
|
|
20
|
+
}));
|
|
21
|
+
jest.mock("../allScopesCommands", () => ({
|
|
22
|
+
initScopesCommand: jest.fn(),
|
|
23
|
+
watchAllScopesCommand: jest.fn(),
|
|
24
|
+
}));
|
|
25
|
+
jest.mock("../updateSetCommands", () => ({
|
|
26
|
+
createUpdateSetCommand: jest.fn(),
|
|
27
|
+
switchUpdateSetCommand: jest.fn(),
|
|
28
|
+
listUpdateSetsCommand: jest.fn(),
|
|
29
|
+
showCurrentUpdateSetCommand: jest.fn(),
|
|
30
|
+
changeScopeCommand: jest.fn(),
|
|
31
|
+
showCurrentScopeCommand: jest.fn(),
|
|
32
|
+
}));
|
|
33
|
+
jest.mock("../dashboardCommand", () => ({ dashboardCommand: jest.fn() }));
|
|
34
|
+
jest.mock("../schemaCommand", () => ({
|
|
35
|
+
schemaPullCommand: jest.fn(),
|
|
36
|
+
schemaDiffCommand: jest.fn(),
|
|
37
|
+
schemaSnapshotsCommand: jest.fn(),
|
|
38
|
+
}));
|
|
39
|
+
jest.mock("../claudeCommand", () => ({ initClaudeCommand: jest.fn() }));
|
|
40
|
+
jest.mock("../createRecordCommand", () => ({ createRecordCommand: jest.fn() }));
|
|
41
|
+
jest.mock("../deleteRecordCommand", () => ({ deleteRecordCommand: jest.fn() }));
|
|
42
|
+
jest.mock("../reconcileCommand", () => ({ reconcileCommand: jest.fn() }));
|
|
43
|
+
jest.mock("../migrateCommand", () => ({ migrateCommand: jest.fn() }));
|
|
44
|
+
jest.mock("../loginCommand", () => ({ loginCommand: jest.fn() }));
|
|
45
|
+
jest.mock("../knowledgeDiffCommand", () => ({ knowledgeDiffCommand: jest.fn() }));
|
|
46
|
+
jest.mock("../clickupCommands", () => ({
|
|
47
|
+
clickupTasksCommand: jest.fn(),
|
|
48
|
+
clickupTaskCommand: jest.fn(),
|
|
49
|
+
clickupCreateCommand: jest.fn(),
|
|
50
|
+
clickupUpdateCommand: jest.fn(),
|
|
51
|
+
clickupCommentCommand: jest.fn(),
|
|
52
|
+
clickupSetupCommand: jest.fn(),
|
|
53
|
+
clickupTeamsCommand: jest.fn(),
|
|
54
|
+
clickupSpacesCommand: jest.fn(),
|
|
55
|
+
clickupListsCommand: jest.fn(),
|
|
56
|
+
}));
|
|
57
|
+
// --- Imports (after mocks) ---
|
|
58
|
+
const yargs_1 = __importDefault(require("yargs/yargs"));
|
|
59
|
+
const commander_1 = require("../commander");
|
|
60
|
+
const allScopesCommands_1 = require("../allScopesCommands");
|
|
61
|
+
/**
|
|
62
|
+
* @description Runs a fake `dove` invocation through a fresh, non-exiting parser.
|
|
63
|
+
* @param {string[]} args - Argv as the user would type it, minus the binary name.
|
|
64
|
+
* @returns {Promise<ParseResult>} The parse error (if any) and yargs' captured output.
|
|
65
|
+
*/
|
|
66
|
+
async function run(args) {
|
|
67
|
+
const cli = (0, commander_1.configureCli)((0, yargs_1.default)([])).exitProcess(false);
|
|
68
|
+
const result = await new Promise(function (resolve) {
|
|
69
|
+
cli.parse(args, {}, function (error, _argv, output) {
|
|
70
|
+
resolve({
|
|
71
|
+
error: error === null ? undefined : error,
|
|
72
|
+
output: output || "",
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
await new Promise(function (resolve) {
|
|
77
|
+
setImmediate(resolve);
|
|
78
|
+
});
|
|
79
|
+
return result;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* @description Extracts the `dove <cmd>` command names listed in a yargs help
|
|
83
|
+
* body (the "Commands:" index), so assertions target the index rather than
|
|
84
|
+
* incidental prose in option descriptions.
|
|
85
|
+
* @param {string} help - Captured `--help` output.
|
|
86
|
+
* @returns {string[]} Command tokens exactly as the index prints them.
|
|
87
|
+
*/
|
|
88
|
+
function listedCommands(help) {
|
|
89
|
+
const names = [];
|
|
90
|
+
const lines = help.split("\n");
|
|
91
|
+
for (let i = 0; i < lines.length; i++) {
|
|
92
|
+
const match = /^\s*dove\s+(\S+)/.exec(lines[i]);
|
|
93
|
+
if (match)
|
|
94
|
+
names.push(match[1]);
|
|
95
|
+
}
|
|
96
|
+
return names;
|
|
97
|
+
}
|
|
98
|
+
beforeEach(function () {
|
|
99
|
+
jest.clearAllMocks();
|
|
100
|
+
});
|
|
101
|
+
describe("dove --help hides watch", function () {
|
|
102
|
+
it("does not list watch, w, or watchAllScopes in the command index", async function () {
|
|
103
|
+
const { output } = await run(["--help"]);
|
|
104
|
+
const commands = listedCommands(output);
|
|
105
|
+
expect(commands.length).toBeGreaterThan(0);
|
|
106
|
+
expect(commands).not.toContain("watch");
|
|
107
|
+
expect(commands).not.toContain("w");
|
|
108
|
+
expect(commands).not.toContain("watchAllScopes");
|
|
109
|
+
expect(output).not.toMatch(/\bwatchAllScopes\b/);
|
|
110
|
+
expect(output).not.toMatch(/\bdove\s+w(atch)?\b/);
|
|
111
|
+
});
|
|
112
|
+
it("still lists the safe headless verbs", async function () {
|
|
113
|
+
const { output } = await run(["--help"]);
|
|
114
|
+
const commands = listedCommands(output);
|
|
115
|
+
expect(commands).toContain("refresh");
|
|
116
|
+
expect(commands).toContain("push");
|
|
117
|
+
expect(commands).toContain("status");
|
|
118
|
+
});
|
|
119
|
+
it("does not surface watch in the bare-invocation help either", async function () {
|
|
120
|
+
const { output, error } = await run([]);
|
|
121
|
+
expect(error).toBeDefined();
|
|
122
|
+
expect(output + String(error)).not.toMatch(/\bwatchAllScopes\b/);
|
|
123
|
+
expect(listedCommands(output)).not.toContain("watch");
|
|
124
|
+
});
|
|
125
|
+
});
|
|
126
|
+
describe("dove watch stays wired for humans", function () {
|
|
127
|
+
it("routes `watch` to the watch handler", async function () {
|
|
128
|
+
const { error } = await run(["watch"]);
|
|
129
|
+
expect(error).toBeUndefined();
|
|
130
|
+
expect(allScopesCommands_1.watchAllScopesCommand).toHaveBeenCalledTimes(1);
|
|
131
|
+
});
|
|
132
|
+
it("routes the `w` and `watchAllScopes` aliases too", async function () {
|
|
133
|
+
await run(["w"]);
|
|
134
|
+
expect(allScopesCommands_1.watchAllScopesCommand).toHaveBeenCalledTimes(1);
|
|
135
|
+
await run(["watchAllScopes"]);
|
|
136
|
+
expect(allScopesCommands_1.watchAllScopesCommand).toHaveBeenCalledTimes(2);
|
|
137
|
+
});
|
|
138
|
+
it("passes watch flags through", async function () {
|
|
139
|
+
await run(["watch", "--noDashboard", "--port", "4000"]);
|
|
140
|
+
expect(allScopesCommands_1.watchAllScopesCommand).toHaveBeenCalledTimes(1);
|
|
141
|
+
const mock = allScopesCommands_1.watchAllScopesCommand;
|
|
142
|
+
const args = mock.mock.calls[0][0];
|
|
143
|
+
expect(args.noDashboard).toBe(true);
|
|
144
|
+
expect(args.port).toBe(4000);
|
|
145
|
+
});
|
|
146
|
+
});
|
package/package.json
CHANGED
package/release-manifest.json
CHANGED
|
@@ -1,7 +1,252 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "dovetail-manifest/v1",
|
|
3
|
-
"generated_at": "2026-10-
|
|
3
|
+
"generated_at": "2026-10-05T19:26:26.993Z",
|
|
4
4
|
"events": [
|
|
5
|
+
{
|
|
6
|
+
"$schema": "dovetail-release-event/v1",
|
|
7
|
+
"event_id": "dovetail-types@0.0.22",
|
|
8
|
+
"package": "@tenonhq/dovetail-types",
|
|
9
|
+
"version": "0.0.22",
|
|
10
|
+
"prev_version": "0.0.21",
|
|
11
|
+
"published_at": "2026-10-05T19:26:26.940Z",
|
|
12
|
+
"git": {
|
|
13
|
+
"sha": "7e59c1a9e074a0e2cb73bc68ff2ddfd423be2c90",
|
|
14
|
+
"tag": "dovetail-types@0.0.22"
|
|
15
|
+
},
|
|
16
|
+
"semver_bump": "patch",
|
|
17
|
+
"commits": [
|
|
18
|
+
{
|
|
19
|
+
"sha": "7e59c1a9e",
|
|
20
|
+
"subject": "feat(sync): scopeQuery + nameTemplate table options — sync sys_choice/sys_dictionary per scope (#295)",
|
|
21
|
+
"pr": 295
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
"sha": "4576c072f",
|
|
25
|
+
"subject": "chore(release): publish 15 packages [skip ci]"
|
|
26
|
+
}
|
|
27
|
+
],
|
|
28
|
+
"exports_delta": null,
|
|
29
|
+
"narrative": null
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
"$schema": "dovetail-release-event/v1",
|
|
33
|
+
"event_id": "dovetail-babel-plugin@0.0.14",
|
|
34
|
+
"package": "@tenonhq/dovetail-babel-plugin",
|
|
35
|
+
"version": "0.0.14",
|
|
36
|
+
"prev_version": "0.0.13",
|
|
37
|
+
"published_at": "2026-10-05T19:26:26.940Z",
|
|
38
|
+
"git": {
|
|
39
|
+
"sha": "7e59c1a9e074a0e2cb73bc68ff2ddfd423be2c90",
|
|
40
|
+
"tag": "dovetail-babel-plugin@0.0.14"
|
|
41
|
+
},
|
|
42
|
+
"semver_bump": "patch",
|
|
43
|
+
"commits": [
|
|
44
|
+
{
|
|
45
|
+
"sha": "4576c072f",
|
|
46
|
+
"subject": "chore(release): publish 15 packages [skip ci]"
|
|
47
|
+
}
|
|
48
|
+
],
|
|
49
|
+
"exports_delta": null,
|
|
50
|
+
"narrative": null
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
"$schema": "dovetail-release-event/v1",
|
|
54
|
+
"event_id": "dovetail-babel-plugin-remove-modules@0.0.14",
|
|
55
|
+
"package": "@tenonhq/dovetail-babel-plugin-remove-modules",
|
|
56
|
+
"version": "0.0.14",
|
|
57
|
+
"prev_version": "0.0.13",
|
|
58
|
+
"published_at": "2026-10-05T19:26:26.940Z",
|
|
59
|
+
"git": {
|
|
60
|
+
"sha": "7e59c1a9e074a0e2cb73bc68ff2ddfd423be2c90",
|
|
61
|
+
"tag": "dovetail-babel-plugin-remove-modules@0.0.14"
|
|
62
|
+
},
|
|
63
|
+
"semver_bump": "patch",
|
|
64
|
+
"commits": [
|
|
65
|
+
{
|
|
66
|
+
"sha": "4576c072f",
|
|
67
|
+
"subject": "chore(release): publish 15 packages [skip ci]"
|
|
68
|
+
}
|
|
69
|
+
],
|
|
70
|
+
"exports_delta": null,
|
|
71
|
+
"narrative": null
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
"$schema": "dovetail-release-event/v1",
|
|
75
|
+
"event_id": "dovetail-babel-preset-servicenow@0.0.14",
|
|
76
|
+
"package": "@tenonhq/dovetail-babel-preset-servicenow",
|
|
77
|
+
"version": "0.0.14",
|
|
78
|
+
"prev_version": "0.0.13",
|
|
79
|
+
"published_at": "2026-10-05T19:26:26.940Z",
|
|
80
|
+
"git": {
|
|
81
|
+
"sha": "7e59c1a9e074a0e2cb73bc68ff2ddfd423be2c90",
|
|
82
|
+
"tag": "dovetail-babel-preset-servicenow@0.0.14"
|
|
83
|
+
},
|
|
84
|
+
"semver_bump": "patch",
|
|
85
|
+
"commits": [
|
|
86
|
+
{
|
|
87
|
+
"sha": "4576c072f",
|
|
88
|
+
"subject": "chore(release): publish 15 packages [skip ci]"
|
|
89
|
+
}
|
|
90
|
+
],
|
|
91
|
+
"exports_delta": null,
|
|
92
|
+
"narrative": null
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
"$schema": "dovetail-release-event/v1",
|
|
96
|
+
"event_id": "dovetail-schema@0.0.15",
|
|
97
|
+
"package": "@tenonhq/dovetail-schema",
|
|
98
|
+
"version": "0.0.15",
|
|
99
|
+
"prev_version": "0.0.14",
|
|
100
|
+
"published_at": "2026-10-05T19:26:26.940Z",
|
|
101
|
+
"git": {
|
|
102
|
+
"sha": "7e59c1a9e074a0e2cb73bc68ff2ddfd423be2c90",
|
|
103
|
+
"tag": "dovetail-schema@0.0.15"
|
|
104
|
+
},
|
|
105
|
+
"semver_bump": "patch",
|
|
106
|
+
"commits": [
|
|
107
|
+
{
|
|
108
|
+
"sha": "b46e30a86",
|
|
109
|
+
"subject": "chore(release): publish 7 packages [skip ci]"
|
|
110
|
+
}
|
|
111
|
+
],
|
|
112
|
+
"exports_delta": null,
|
|
113
|
+
"narrative": null
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
"$schema": "dovetail-release-event/v1",
|
|
117
|
+
"event_id": "dovetail-core@0.0.121",
|
|
118
|
+
"package": "@tenonhq/dovetail-core",
|
|
119
|
+
"version": "0.0.121",
|
|
120
|
+
"prev_version": "0.0.120",
|
|
121
|
+
"published_at": "2026-10-05T19:26:26.940Z",
|
|
122
|
+
"git": {
|
|
123
|
+
"sha": "7e59c1a9e074a0e2cb73bc68ff2ddfd423be2c90",
|
|
124
|
+
"tag": "dovetail-core@0.0.121"
|
|
125
|
+
},
|
|
126
|
+
"semver_bump": "patch",
|
|
127
|
+
"commits": [
|
|
128
|
+
{
|
|
129
|
+
"sha": "7e59c1a9e",
|
|
130
|
+
"subject": "feat(sync): scopeQuery + nameTemplate table options — sync sys_choice/sys_dictionary per scope (#295)",
|
|
131
|
+
"pr": 295
|
|
132
|
+
},
|
|
133
|
+
{
|
|
134
|
+
"sha": "3c380428b",
|
|
135
|
+
"subject": "chore(release): publish 2 packages [skip ci]"
|
|
136
|
+
},
|
|
137
|
+
{
|
|
138
|
+
"sha": "b46e30a86",
|
|
139
|
+
"subject": "chore(release): publish 7 packages [skip ci]"
|
|
140
|
+
}
|
|
141
|
+
],
|
|
142
|
+
"exports_delta": null,
|
|
143
|
+
"narrative": null
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
"$schema": "dovetail-release-event/v1",
|
|
147
|
+
"event_id": "dovetail-eslint-plugin@0.0.16",
|
|
148
|
+
"package": "@tenonhq/dovetail-eslint-plugin",
|
|
149
|
+
"version": "0.0.16",
|
|
150
|
+
"prev_version": "0.0.15",
|
|
151
|
+
"published_at": "2026-10-05T19:26:26.940Z",
|
|
152
|
+
"git": {
|
|
153
|
+
"sha": "7e59c1a9e074a0e2cb73bc68ff2ddfd423be2c90",
|
|
154
|
+
"tag": "dovetail-eslint-plugin@0.0.16"
|
|
155
|
+
},
|
|
156
|
+
"semver_bump": "patch",
|
|
157
|
+
"commits": [
|
|
158
|
+
{
|
|
159
|
+
"sha": "4576c072f",
|
|
160
|
+
"subject": "chore(release): publish 15 packages [skip ci]"
|
|
161
|
+
}
|
|
162
|
+
],
|
|
163
|
+
"exports_delta": null,
|
|
164
|
+
"narrative": null
|
|
165
|
+
},
|
|
166
|
+
{
|
|
167
|
+
"$schema": "dovetail-release-event/v1",
|
|
168
|
+
"event_id": "dovetail-prettier-plugin@0.0.14",
|
|
169
|
+
"package": "@tenonhq/dovetail-prettier-plugin",
|
|
170
|
+
"version": "0.0.14",
|
|
171
|
+
"prev_version": "0.0.13",
|
|
172
|
+
"published_at": "2026-10-05T19:26:26.940Z",
|
|
173
|
+
"git": {
|
|
174
|
+
"sha": "7e59c1a9e074a0e2cb73bc68ff2ddfd423be2c90",
|
|
175
|
+
"tag": "dovetail-prettier-plugin@0.0.14"
|
|
176
|
+
},
|
|
177
|
+
"semver_bump": "patch",
|
|
178
|
+
"commits": [
|
|
179
|
+
{
|
|
180
|
+
"sha": "4576c072f",
|
|
181
|
+
"subject": "chore(release): publish 15 packages [skip ci]"
|
|
182
|
+
}
|
|
183
|
+
],
|
|
184
|
+
"exports_delta": null,
|
|
185
|
+
"narrative": null
|
|
186
|
+
},
|
|
187
|
+
{
|
|
188
|
+
"$schema": "dovetail-release-event/v1",
|
|
189
|
+
"event_id": "dovetail-sass-plugin@0.0.14",
|
|
190
|
+
"package": "@tenonhq/dovetail-sass-plugin",
|
|
191
|
+
"version": "0.0.14",
|
|
192
|
+
"prev_version": "0.0.13",
|
|
193
|
+
"published_at": "2026-10-05T19:26:26.940Z",
|
|
194
|
+
"git": {
|
|
195
|
+
"sha": "7e59c1a9e074a0e2cb73bc68ff2ddfd423be2c90",
|
|
196
|
+
"tag": "dovetail-sass-plugin@0.0.14"
|
|
197
|
+
},
|
|
198
|
+
"semver_bump": "patch",
|
|
199
|
+
"commits": [
|
|
200
|
+
{
|
|
201
|
+
"sha": "4576c072f",
|
|
202
|
+
"subject": "chore(release): publish 15 packages [skip ci]"
|
|
203
|
+
}
|
|
204
|
+
],
|
|
205
|
+
"exports_delta": null,
|
|
206
|
+
"narrative": null
|
|
207
|
+
},
|
|
208
|
+
{
|
|
209
|
+
"$schema": "dovetail-release-event/v1",
|
|
210
|
+
"event_id": "dovetail-typescript-plugin@0.0.14",
|
|
211
|
+
"package": "@tenonhq/dovetail-typescript-plugin",
|
|
212
|
+
"version": "0.0.14",
|
|
213
|
+
"prev_version": "0.0.13",
|
|
214
|
+
"published_at": "2026-10-05T19:26:26.940Z",
|
|
215
|
+
"git": {
|
|
216
|
+
"sha": "7e59c1a9e074a0e2cb73bc68ff2ddfd423be2c90",
|
|
217
|
+
"tag": "dovetail-typescript-plugin@0.0.14"
|
|
218
|
+
},
|
|
219
|
+
"semver_bump": "patch",
|
|
220
|
+
"commits": [
|
|
221
|
+
{
|
|
222
|
+
"sha": "4576c072f",
|
|
223
|
+
"subject": "chore(release): publish 15 packages [skip ci]"
|
|
224
|
+
}
|
|
225
|
+
],
|
|
226
|
+
"exports_delta": null,
|
|
227
|
+
"narrative": null
|
|
228
|
+
},
|
|
229
|
+
{
|
|
230
|
+
"$schema": "dovetail-release-event/v1",
|
|
231
|
+
"event_id": "dovetail-webpack-plugin@0.0.13",
|
|
232
|
+
"package": "@tenonhq/dovetail-webpack-plugin",
|
|
233
|
+
"version": "0.0.13",
|
|
234
|
+
"prev_version": "0.0.12",
|
|
235
|
+
"published_at": "2026-10-05T19:26:26.940Z",
|
|
236
|
+
"git": {
|
|
237
|
+
"sha": "7e59c1a9e074a0e2cb73bc68ff2ddfd423be2c90",
|
|
238
|
+
"tag": "dovetail-webpack-plugin@0.0.13"
|
|
239
|
+
},
|
|
240
|
+
"semver_bump": "patch",
|
|
241
|
+
"commits": [
|
|
242
|
+
{
|
|
243
|
+
"sha": "4576c072f",
|
|
244
|
+
"subject": "chore(release): publish 15 packages [skip ci]"
|
|
245
|
+
}
|
|
246
|
+
],
|
|
247
|
+
"exports_delta": null,
|
|
248
|
+
"narrative": null
|
|
249
|
+
},
|
|
5
250
|
{
|
|
6
251
|
"$schema": "dovetail-release-event/v1",
|
|
7
252
|
"event_id": "dovetail-gmail@0.0.13",
|
|
@@ -1044,297 +1289,6 @@
|
|
|
1044
1289
|
],
|
|
1045
1290
|
"exports_delta": null,
|
|
1046
1291
|
"narrative": null
|
|
1047
|
-
},
|
|
1048
|
-
{
|
|
1049
|
-
"$schema": "dovetail-release-event/v1",
|
|
1050
|
-
"event_id": "dovetail-prettier-plugin@0.0.13",
|
|
1051
|
-
"package": "@tenonhq/dovetail-prettier-plugin",
|
|
1052
|
-
"version": "0.0.13",
|
|
1053
|
-
"prev_version": "0.0.12",
|
|
1054
|
-
"published_at": "2026-08-31T21:34:20.896Z",
|
|
1055
|
-
"git": {
|
|
1056
|
-
"sha": "81ab50a4e0fc105445ffc6d6983bc93a1483859d",
|
|
1057
|
-
"tag": "dovetail-prettier-plugin@0.0.13"
|
|
1058
|
-
},
|
|
1059
|
-
"semver_bump": "patch",
|
|
1060
|
-
"commits": [
|
|
1061
|
-
{
|
|
1062
|
-
"sha": "17624b238",
|
|
1063
|
-
"subject": "chore(release): publish 11 packages [skip ci]"
|
|
1064
|
-
}
|
|
1065
|
-
],
|
|
1066
|
-
"exports_delta": null,
|
|
1067
|
-
"narrative": null
|
|
1068
|
-
},
|
|
1069
|
-
{
|
|
1070
|
-
"$schema": "dovetail-release-event/v1",
|
|
1071
|
-
"event_id": "dovetail-sass-plugin@0.0.13",
|
|
1072
|
-
"package": "@tenonhq/dovetail-sass-plugin",
|
|
1073
|
-
"version": "0.0.13",
|
|
1074
|
-
"prev_version": "0.0.12",
|
|
1075
|
-
"published_at": "2026-08-31T21:34:20.896Z",
|
|
1076
|
-
"git": {
|
|
1077
|
-
"sha": "81ab50a4e0fc105445ffc6d6983bc93a1483859d",
|
|
1078
|
-
"tag": "dovetail-sass-plugin@0.0.13"
|
|
1079
|
-
},
|
|
1080
|
-
"semver_bump": "patch",
|
|
1081
|
-
"commits": [
|
|
1082
|
-
{
|
|
1083
|
-
"sha": "17624b238",
|
|
1084
|
-
"subject": "chore(release): publish 11 packages [skip ci]"
|
|
1085
|
-
}
|
|
1086
|
-
],
|
|
1087
|
-
"exports_delta": null,
|
|
1088
|
-
"narrative": null
|
|
1089
|
-
},
|
|
1090
|
-
{
|
|
1091
|
-
"$schema": "dovetail-release-event/v1",
|
|
1092
|
-
"event_id": "dovetail-sawmill@0.0.9",
|
|
1093
|
-
"package": "@tenonhq/dovetail-sawmill",
|
|
1094
|
-
"version": "0.0.9",
|
|
1095
|
-
"prev_version": "0.0.8",
|
|
1096
|
-
"published_at": "2026-08-31T21:34:20.896Z",
|
|
1097
|
-
"git": {
|
|
1098
|
-
"sha": "81ab50a4e0fc105445ffc6d6983bc93a1483859d",
|
|
1099
|
-
"tag": "dovetail-sawmill@0.0.9"
|
|
1100
|
-
},
|
|
1101
|
-
"semver_bump": "patch",
|
|
1102
|
-
"commits": [
|
|
1103
|
-
{
|
|
1104
|
-
"sha": "81ab50a4e",
|
|
1105
|
-
"subject": "feat: SN_API_KEY inbound API-key auth mode across all ServiceNow clients (#264)",
|
|
1106
|
-
"pr": 264
|
|
1107
|
-
},
|
|
1108
|
-
{
|
|
1109
|
-
"sha": "4bc78bc61",
|
|
1110
|
-
"subject": "chore(release): publish 2 packages [skip ci]"
|
|
1111
|
-
},
|
|
1112
|
-
{
|
|
1113
|
-
"sha": "c82439b30",
|
|
1114
|
-
"subject": "chore(deps): bump js-yaml, jest and ts-jest (#183)",
|
|
1115
|
-
"pr": 183
|
|
1116
|
-
},
|
|
1117
|
-
{
|
|
1118
|
-
"sha": "958f4fcd7",
|
|
1119
|
-
"subject": "chore(release): publish 3 packages [skip ci]"
|
|
1120
|
-
}
|
|
1121
|
-
],
|
|
1122
|
-
"exports_delta": null,
|
|
1123
|
-
"narrative": null
|
|
1124
|
-
},
|
|
1125
|
-
{
|
|
1126
|
-
"$schema": "dovetail-release-event/v1",
|
|
1127
|
-
"event_id": "dovetail-typescript-plugin@0.0.13",
|
|
1128
|
-
"package": "@tenonhq/dovetail-typescript-plugin",
|
|
1129
|
-
"version": "0.0.13",
|
|
1130
|
-
"prev_version": "0.0.12",
|
|
1131
|
-
"published_at": "2026-08-31T21:34:20.896Z",
|
|
1132
|
-
"git": {
|
|
1133
|
-
"sha": "81ab50a4e0fc105445ffc6d6983bc93a1483859d",
|
|
1134
|
-
"tag": "dovetail-typescript-plugin@0.0.13"
|
|
1135
|
-
},
|
|
1136
|
-
"semver_bump": "patch",
|
|
1137
|
-
"commits": [
|
|
1138
|
-
{
|
|
1139
|
-
"sha": "17624b238",
|
|
1140
|
-
"subject": "chore(release): publish 11 packages [skip ci]"
|
|
1141
|
-
}
|
|
1142
|
-
],
|
|
1143
|
-
"exports_delta": null,
|
|
1144
|
-
"narrative": null
|
|
1145
|
-
},
|
|
1146
|
-
{
|
|
1147
|
-
"$schema": "dovetail-release-event/v1",
|
|
1148
|
-
"event_id": "dovetail-webpack-plugin@0.0.12",
|
|
1149
|
-
"package": "@tenonhq/dovetail-webpack-plugin",
|
|
1150
|
-
"version": "0.0.12",
|
|
1151
|
-
"prev_version": "0.0.11",
|
|
1152
|
-
"published_at": "2026-08-31T21:34:20.896Z",
|
|
1153
|
-
"git": {
|
|
1154
|
-
"sha": "81ab50a4e0fc105445ffc6d6983bc93a1483859d",
|
|
1155
|
-
"tag": "dovetail-webpack-plugin@0.0.12"
|
|
1156
|
-
},
|
|
1157
|
-
"semver_bump": "patch",
|
|
1158
|
-
"commits": [
|
|
1159
|
-
{
|
|
1160
|
-
"sha": "17624b238",
|
|
1161
|
-
"subject": "chore(release): publish 11 packages [skip ci]"
|
|
1162
|
-
}
|
|
1163
|
-
],
|
|
1164
|
-
"exports_delta": null,
|
|
1165
|
-
"narrative": null
|
|
1166
|
-
},
|
|
1167
|
-
{
|
|
1168
|
-
"$schema": "dovetail-release-event/v1",
|
|
1169
|
-
"event_id": "dovetail-servicenow@0.0.35",
|
|
1170
|
-
"package": "@tenonhq/dovetail-servicenow",
|
|
1171
|
-
"version": "0.0.35",
|
|
1172
|
-
"prev_version": "0.0.34",
|
|
1173
|
-
"published_at": "2026-07-28T22:07:08.734Z",
|
|
1174
|
-
"git": {
|
|
1175
|
-
"sha": "44c5d85d6b3232119e47397da43344b4185f94ff",
|
|
1176
|
-
"tag": "dovetail-servicenow@0.0.35"
|
|
1177
|
-
},
|
|
1178
|
-
"semver_bump": "patch",
|
|
1179
|
-
"commits": [
|
|
1180
|
-
{
|
|
1181
|
-
"sha": "44c5d85d6",
|
|
1182
|
-
"subject": "feat(servicenow): remove-choices verb — soft-delete choice values (DEV-511) (#237)",
|
|
1183
|
-
"pr": 237
|
|
1184
|
-
},
|
|
1185
|
-
{
|
|
1186
|
-
"sha": "c80d5cc24",
|
|
1187
|
-
"subject": "feat(servicenow): S1 execution-context gate + WRITE_DESTRUCTIVE tier (DEV-507) (#239)",
|
|
1188
|
-
"pr": 239
|
|
1189
|
-
},
|
|
1190
|
-
{
|
|
1191
|
-
"sha": "1749ba4f0",
|
|
1192
|
-
"subject": "chore(release): publish 2 packages [skip ci]"
|
|
1193
|
-
}
|
|
1194
|
-
],
|
|
1195
|
-
"exports_delta": null,
|
|
1196
|
-
"narrative": null
|
|
1197
|
-
},
|
|
1198
|
-
{
|
|
1199
|
-
"$schema": "dovetail-release-event/v1",
|
|
1200
|
-
"event_id": "dovetail-mcp@0.0.32",
|
|
1201
|
-
"package": "@tenonhq/dovetail-mcp",
|
|
1202
|
-
"version": "0.0.32",
|
|
1203
|
-
"prev_version": "0.0.31",
|
|
1204
|
-
"published_at": "2026-07-28T22:07:08.734Z",
|
|
1205
|
-
"git": {
|
|
1206
|
-
"sha": "44c5d85d6b3232119e47397da43344b4185f94ff",
|
|
1207
|
-
"tag": "dovetail-mcp@0.0.32"
|
|
1208
|
-
},
|
|
1209
|
-
"semver_bump": "patch",
|
|
1210
|
-
"commits": [
|
|
1211
|
-
{
|
|
1212
|
-
"sha": "1749ba4f0",
|
|
1213
|
-
"subject": "chore(release): publish 2 packages [skip ci]"
|
|
1214
|
-
}
|
|
1215
|
-
],
|
|
1216
|
-
"exports_delta": null,
|
|
1217
|
-
"narrative": null
|
|
1218
|
-
},
|
|
1219
|
-
{
|
|
1220
|
-
"$schema": "dovetail-release-event/v1",
|
|
1221
|
-
"event_id": "dovetail-core@0.0.118",
|
|
1222
|
-
"package": "@tenonhq/dovetail-core",
|
|
1223
|
-
"version": "0.0.118",
|
|
1224
|
-
"prev_version": "0.0.117",
|
|
1225
|
-
"published_at": "2026-07-28T07:09:33.080Z",
|
|
1226
|
-
"git": {
|
|
1227
|
-
"sha": "e4193968a18d54df70f599a15e2b7b940fa491b9",
|
|
1228
|
-
"tag": "dovetail-core@0.0.118"
|
|
1229
|
-
},
|
|
1230
|
-
"semver_bump": "patch",
|
|
1231
|
-
"commits": [
|
|
1232
|
-
{
|
|
1233
|
-
"sha": "e4193968a",
|
|
1234
|
-
"subject": "fix(core): close review findings from the metaData work (#251)",
|
|
1235
|
-
"pr": 251
|
|
1236
|
-
},
|
|
1237
|
-
{
|
|
1238
|
-
"sha": "f245dd850",
|
|
1239
|
-
"subject": "chore(release): @tenonhq/dovetail-core@0.0.117 [skip ci]"
|
|
1240
|
-
}
|
|
1241
|
-
],
|
|
1242
|
-
"exports_delta": null,
|
|
1243
|
-
"narrative": null
|
|
1244
|
-
},
|
|
1245
|
-
{
|
|
1246
|
-
"$schema": "dovetail-release-event/v1",
|
|
1247
|
-
"event_id": "dovetail-core@0.0.117",
|
|
1248
|
-
"package": "@tenonhq/dovetail-core",
|
|
1249
|
-
"version": "0.0.117",
|
|
1250
|
-
"prev_version": "0.0.116",
|
|
1251
|
-
"published_at": "2026-07-28T06:44:03.528Z",
|
|
1252
|
-
"git": {
|
|
1253
|
-
"sha": "47199bcf436db3be5b8fd6728265444e72a96bc0",
|
|
1254
|
-
"tag": "dovetail-core@0.0.117"
|
|
1255
|
-
},
|
|
1256
|
-
"semver_bump": "patch",
|
|
1257
|
-
"commits": [
|
|
1258
|
-
{
|
|
1259
|
-
"sha": "47199bcf4",
|
|
1260
|
-
"subject": "fix(core): keep informative display_value, drop only the churning kinds (#250)",
|
|
1261
|
-
"pr": 250
|
|
1262
|
-
},
|
|
1263
|
-
{
|
|
1264
|
-
"sha": "afd387889",
|
|
1265
|
-
"subject": "chore(release): @tenonhq/dovetail-core@0.0.116 [skip ci]"
|
|
1266
|
-
}
|
|
1267
|
-
],
|
|
1268
|
-
"exports_delta": null,
|
|
1269
|
-
"narrative": null
|
|
1270
|
-
},
|
|
1271
|
-
{
|
|
1272
|
-
"$schema": "dovetail-release-event/v1",
|
|
1273
|
-
"event_id": "dovetail-core@0.0.116",
|
|
1274
|
-
"package": "@tenonhq/dovetail-core",
|
|
1275
|
-
"version": "0.0.116",
|
|
1276
|
-
"prev_version": "0.0.115",
|
|
1277
|
-
"published_at": "2026-07-28T06:17:01.130Z",
|
|
1278
|
-
"git": {
|
|
1279
|
-
"sha": "ab33183076fdb0eb18a8fc1c8e79b607af3893c4",
|
|
1280
|
-
"tag": "dovetail-core@0.0.116"
|
|
1281
|
-
},
|
|
1282
|
-
"semver_bump": "patch",
|
|
1283
|
-
"commits": [
|
|
1284
|
-
{
|
|
1285
|
-
"sha": "ab3318307",
|
|
1286
|
-
"subject": "fix(core): --metadata-only must not write the scope manifest (#249)",
|
|
1287
|
-
"pr": 249
|
|
1288
|
-
},
|
|
1289
|
-
{
|
|
1290
|
-
"sha": "f77cab2e5",
|
|
1291
|
-
"subject": "chore(release): @tenonhq/dovetail-core@0.0.115 [skip ci]"
|
|
1292
|
-
}
|
|
1293
|
-
],
|
|
1294
|
-
"exports_delta": null,
|
|
1295
|
-
"narrative": null
|
|
1296
|
-
},
|
|
1297
|
-
{
|
|
1298
|
-
"$schema": "dovetail-release-event/v1",
|
|
1299
|
-
"event_id": "dovetail-core@0.0.115",
|
|
1300
|
-
"package": "@tenonhq/dovetail-core",
|
|
1301
|
-
"version": "0.0.115",
|
|
1302
|
-
"prev_version": "0.0.114",
|
|
1303
|
-
"published_at": "2026-07-28T03:15:38.018Z",
|
|
1304
|
-
"git": {
|
|
1305
|
-
"sha": "4a8d2cc328b7fd09f56d2ab6cd66203d28e5b1ae",
|
|
1306
|
-
"tag": "dovetail-core@0.0.115"
|
|
1307
|
-
},
|
|
1308
|
-
"semver_bump": "patch",
|
|
1309
|
-
"commits": [
|
|
1310
|
-
{
|
|
1311
|
-
"sha": "4a8d2cc32",
|
|
1312
|
-
"subject": "fix(core): make metaData.json deterministic on every write path (#246)",
|
|
1313
|
-
"pr": 246
|
|
1314
|
-
},
|
|
1315
|
-
{
|
|
1316
|
-
"sha": "1749ba4f0",
|
|
1317
|
-
"subject": "chore(release): publish 2 packages [skip ci]"
|
|
1318
|
-
},
|
|
1319
|
-
{
|
|
1320
|
-
"sha": "8d886d43d",
|
|
1321
|
-
"subject": "chore(release): publish 2 packages [skip ci]"
|
|
1322
|
-
},
|
|
1323
|
-
{
|
|
1324
|
-
"sha": "b79555b25",
|
|
1325
|
-
"subject": "chore(release): publish 2 packages [skip ci]"
|
|
1326
|
-
},
|
|
1327
|
-
{
|
|
1328
|
-
"sha": "02f562c32",
|
|
1329
|
-
"subject": "chore(release): publish 2 packages [skip ci]"
|
|
1330
|
-
},
|
|
1331
|
-
{
|
|
1332
|
-
"sha": "05e406b06",
|
|
1333
|
-
"subject": "chore(release): @tenonhq/dovetail-core@0.0.114 [skip ci]"
|
|
1334
|
-
}
|
|
1335
|
-
],
|
|
1336
|
-
"exports_delta": null,
|
|
1337
|
-
"narrative": null
|
|
1338
1292
|
}
|
|
1339
1293
|
]
|
|
1340
1294
|
}
|
|
@@ -68,9 +68,9 @@ The dashboard reads scopes from `dove.config.js` and stores selections in `.dove
|
|
|
68
68
|
|
|
69
69
|
`createUpdateSet`, `switchUpdateSet`, and `push --updateSet` now write the affected scope's entry into `.dove-update-sets.json` as part of activating the set, so the routing file, the active set, and the push destination stay consistent. Each prints the resolved destination, e.g. `Push routing updated: x_cadso_core -> FEAT-123 (sys_id)`, and every push prints `Update set routing (from .dove-update-sets.json): <scope> -> <name> (<sys_id>)` so you can see exactly where captures land. If you edit `.dove-update-sets.json` by hand, that entry wins until you switch sets again.
|
|
70
70
|
|
|
71
|
-
### Multi-Scope Update Set
|
|
71
|
+
### Multi-Scope Update Set Check
|
|
72
72
|
|
|
73
|
-
|
|
73
|
+
Before every push, run `npx dove currentUpdateSet` for each scope you are about to touch (or open the dashboard with `npx dove dashboard`). A scope still on its DEFAULT update set is a common mistake that puts changes in the wrong place — `push` also prints the resolved routing per scope so you can catch it in the output.
|
|
74
74
|
|
|
75
75
|
### Recommended Workflow
|
|
76
76
|
|
|
@@ -79,7 +79,7 @@ When using `npx dove watchAllScopes`, update set status is automatically checked
|
|
|
79
79
|
npx dove createUpdateSet --name "FEAT-123 Add User Dashboard" --scope x_cadso_core
|
|
80
80
|
```
|
|
81
81
|
|
|
82
|
-
2. **During development:**
|
|
82
|
+
2. **During development:** Edit locally, then `npx dove push --diff <branch>`. Changes go into the active update set for each file's scope.
|
|
83
83
|
|
|
84
84
|
3. **Check status:** `npx dove currentUpdateSet` to verify you are in the right update set.
|
|
85
85
|
|
|
@@ -90,5 +90,5 @@ When using `npx dove watchAllScopes`, update set status is automatically checked
|
|
|
90
90
|
### Common Issues
|
|
91
91
|
|
|
92
92
|
- **"No update set selected"** -- You are using the Default update set. Create or switch to a named one.
|
|
93
|
-
- **Changes going to wrong scope** --
|
|
93
|
+
- **Changes going to wrong scope** -- `npx dove push` routes each record by its scope's entry in `.dove-update-sets.json`; a scope with no entry falls back to the session's current scope/set. Map every scope you touch (`createUpdateSet` / `switchUpdateSet --scope <scope>`) before a multi-scope push, and check the file sits under the right scope's `sourceDirectory` and in that scope's `dove.manifest.<scope>.json`.
|
|
94
94
|
- **Update set not found** -- Check the scope filter. Update sets are scope-specific.
|
|
@@ -69,8 +69,12 @@ dovetail-debug-*.log
|
|
|
69
69
|
|
|
70
70
|
#### Start development
|
|
71
71
|
```bash
|
|
72
|
-
npx dove
|
|
72
|
+
npx dove status # confirm instance, scope, user
|
|
73
|
+
npx dove refresh # pull the manifest + files
|
|
74
|
+
# ...edit files...
|
|
75
|
+
npx dove push --diff main # push only what changed vs the branch
|
|
73
76
|
```
|
|
77
|
+
Sync is headless and explicit: `refresh` before you start, `push` when you are done. There is no always-on sync step in this flow.
|
|
74
78
|
|
|
75
79
|
### Scenario 2: Add a New Scope (Multi-Scope Setup)
|
|
76
80
|
|
|
@@ -102,11 +106,13 @@ If hitting rate limits:
|
|
|
102
106
|
npx dove initScopes --delay 1000
|
|
103
107
|
```
|
|
104
108
|
|
|
105
|
-
####
|
|
109
|
+
#### Sync across all scopes
|
|
106
110
|
```bash
|
|
107
|
-
npx dove
|
|
111
|
+
npx dove refresh # all declared scopes
|
|
112
|
+
npx dove refresh -s x_cadso_work # one scope
|
|
113
|
+
npx dove push --diff main # one command for a multi-scope change
|
|
108
114
|
```
|
|
109
|
-
|
|
115
|
+
`push` reads each file's scope from its manifest and, when `.dove-update-sets.json` maps that scope to an update set (`createUpdateSet` / `switchUpdateSet` write the mapping), routes the record into that scope's set server-side. Map every scope you are about to touch first — the server session scope is only swapped once, to the first file's scope, so an unmapped second scope is the thing to avoid. Confirm with `npx dove currentUpdateSet --scope <scope>` before pushing.
|
|
110
116
|
|
|
111
117
|
#### Download a single scope
|
|
112
118
|
```bash
|
|
@@ -150,6 +156,6 @@ project/
|
|
|
150
156
|
| `npx dove initScopes` | Download all configured scopes |
|
|
151
157
|
| `npx dove download <scope>` | Download a specific scope (destructive) |
|
|
152
158
|
| `npx dove refresh` | Refresh manifest, download new files only |
|
|
153
|
-
| `npx dove
|
|
154
|
-
| `npx dove
|
|
159
|
+
| `npx dove push --diff <branch>` | Push only the files changed vs a branch (all scopes) |
|
|
160
|
+
| `npx dove push` | Push every local file (all scopes) |
|
|
155
161
|
| `npx dove status` | Show connected instance, scope, user |
|
|
@@ -32,11 +32,11 @@ Ask the user which symptom they are experiencing (if not already clear):
|
|
|
32
32
|
|
|
33
33
|
### Diagnostic A: Files Not Pushing
|
|
34
34
|
|
|
35
|
-
1. **
|
|
35
|
+
1. **Push explicitly:** saving a file does not sync it on its own. Run `npx dove push --diff <branch>` (or `npx dove push` for everything) and read the per-file output.
|
|
36
36
|
2. **Check the file is in the manifest:** Look in `dove.manifest.json` or `dove.manifest.<scope>.json` for the table/record/field entry. If missing, run `npx dove refresh`.
|
|
37
37
|
3. **Check file extension matches a rule:** The file extension must match a `match` regex in `dove.config.js` rules. If no rule matches, the file content is pushed as-is (no build).
|
|
38
38
|
4. **Check debug logs:** Re-run the command with `--debug` (or `DOVETAIL_DEBUG=1`) to write a `dovetail-debug-*.log` file in the project root, then inspect it. Debug logs are opt-in — without the flag no log file is produced.
|
|
39
|
-
5. **
|
|
39
|
+
5. **Confirm on the instance:** `npx dove status` for the connection, then verify the record changed on the instance — never infer success from the push exit code alone.
|
|
40
40
|
|
|
41
41
|
### Diagnostic B: Authentication/Connection Failure
|
|
42
42
|
|
|
@@ -63,7 +63,7 @@ Dovetail checks that your local manifest scope matches the active scope on the S
|
|
|
63
63
|
|
|
64
64
|
1. **Check current scope:** `npx dove currentScope`
|
|
65
65
|
2. **Change scope:** `npx dove changeScope --scope x_cadso_core`
|
|
66
|
-
3. **For multi-scope
|
|
66
|
+
3. **For multi-scope pushes:** `npx dove push` swaps the server session scope once (to the first file's scope) and routes each record through its scope's update set from `.dove-update-sets.json`. Make sure every scope in the push has a mapping (`npx dove switchUpdateSet --scope <scope> ...`), or push one scope at a time with a path target (`npx dove push src/x_cadso_core`).
|
|
67
67
|
4. **Force scope swap on push:** `npx dove push --scopeSwap`
|
|
68
68
|
|
|
69
69
|
### Diagnostic D: Build/Transform Errors
|