@decibelsystems/tools 2.1.4 → 3.0.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/CHANGELOG.md +160 -0
- package/README.md +1 -1
- package/dist/agentPresence.d.ts +80 -0
- package/dist/agentPresence.d.ts.map +1 -1
- package/dist/agentPresence.js +177 -0
- package/dist/agentPresence.js.map +1 -1
- package/dist/agentic/index.d.ts +18 -8
- package/dist/agentic/index.d.ts.map +1 -1
- package/dist/agentic/index.js +18 -144
- package/dist/agentic/index.js.map +1 -1
- package/dist/agentic/types.d.ts +106 -0
- package/dist/agentic/types.d.ts.map +1 -1
- package/dist/agentic/types.js +77 -1
- package/dist/agentic/types.js.map +1 -1
- package/dist/architectAdrs.d.ts +14 -2
- package/dist/architectAdrs.d.ts.map +1 -1
- package/dist/architectAdrs.js +9 -3
- package/dist/architectAdrs.js.map +1 -1
- package/dist/client/transports.d.ts.map +1 -1
- package/dist/client/transports.js +13 -3
- package/dist/client/transports.js.map +1 -1
- package/dist/daemon.d.ts +19 -0
- package/dist/daemon.d.ts.map +1 -1
- package/dist/daemon.js +181 -38
- package/dist/daemon.js.map +1 -1
- package/dist/daemonConfig.d.ts +30 -0
- package/dist/daemonConfig.d.ts.map +1 -1
- package/dist/daemonConfig.js +56 -9
- package/dist/daemonConfig.js.map +1 -1
- package/dist/decibelPaths.d.ts.map +1 -1
- package/dist/decibelPaths.js +39 -6
- package/dist/decibelPaths.js.map +1 -1
- package/dist/domain/issue.d.ts +77 -0
- package/dist/domain/issue.d.ts.map +1 -0
- package/dist/domain/issue.js +134 -0
- package/dist/domain/issue.js.map +1 -0
- package/dist/domain/issueCodec.d.ts +39 -0
- package/dist/domain/issueCodec.d.ts.map +1 -0
- package/dist/domain/issueCodec.js +298 -0
- package/dist/domain/issueCodec.js.map +1 -0
- package/dist/domain/issueRepository.d.ts +91 -0
- package/dist/domain/issueRepository.d.ts.map +1 -0
- package/dist/domain/issueRepository.js +257 -0
- package/dist/domain/issueRepository.js.map +1 -0
- package/dist/facades/definitions.d.ts +0 -1
- package/dist/facades/definitions.d.ts.map +1 -1
- package/dist/facades/definitions.js +94 -98
- package/dist/facades/definitions.js.map +1 -1
- package/dist/facades/index.d.ts +2 -1
- package/dist/facades/index.d.ts.map +1 -1
- package/dist/facades/index.js +1 -1
- package/dist/facades/index.js.map +1 -1
- package/dist/facades/types.d.ts +17 -0
- package/dist/facades/types.d.ts.map +1 -1
- package/dist/httpArgs.d.ts +11 -0
- package/dist/httpArgs.d.ts.map +1 -0
- package/dist/httpArgs.js +39 -0
- package/dist/httpArgs.js.map +1 -0
- package/dist/httpServer.d.ts +1 -12
- package/dist/httpServer.d.ts.map +1 -1
- package/dist/httpServer.js +173 -98
- package/dist/httpServer.js.map +1 -1
- package/dist/kernel.d.ts +55 -1
- package/dist/kernel.d.ts.map +1 -1
- package/dist/kernel.js +366 -31
- package/dist/kernel.js.map +1 -1
- package/dist/lib/agent-services/assumptions.d.ts.map +1 -1
- package/dist/lib/agent-services/assumptions.js +8 -2
- package/dist/lib/agent-services/assumptions.js.map +1 -1
- package/dist/lib/atomicWrite.d.ts +26 -0
- package/dist/lib/atomicWrite.d.ts.map +1 -0
- package/dist/lib/atomicWrite.js +73 -0
- package/dist/lib/atomicWrite.js.map +1 -0
- package/dist/lib/envelope.d.ts +31 -0
- package/dist/lib/envelope.d.ts.map +1 -0
- package/dist/lib/envelope.js +80 -0
- package/dist/lib/envelope.js.map +1 -0
- package/dist/lib/fileLock.d.ts +38 -0
- package/dist/lib/fileLock.d.ts.map +1 -0
- package/dist/lib/fileLock.js +124 -0
- package/dist/lib/fileLock.js.map +1 -0
- package/dist/lib/recordIdAllocator.d.ts +86 -0
- package/dist/lib/recordIdAllocator.d.ts.map +1 -0
- package/dist/lib/recordIdAllocator.js +161 -0
- package/dist/lib/recordIdAllocator.js.map +1 -0
- package/dist/license.js +3 -3
- package/dist/license.js.map +1 -1
- package/dist/projectRegistry.d.ts +65 -3
- package/dist/projectRegistry.d.ts.map +1 -1
- package/dist/projectRegistry.js +233 -33
- package/dist/projectRegistry.js.map +1 -1
- package/dist/runtime/circuitBreaker.d.ts +95 -0
- package/dist/runtime/circuitBreaker.d.ts.map +1 -0
- package/dist/runtime/circuitBreaker.js +178 -0
- package/dist/runtime/circuitBreaker.js.map +1 -0
- package/dist/runtime/ensureRuntime.d.ts +103 -0
- package/dist/runtime/ensureRuntime.d.ts.map +1 -0
- package/dist/runtime/ensureRuntime.js +281 -0
- package/dist/runtime/ensureRuntime.js.map +1 -0
- package/dist/runtime/extensions.d.ts +57 -0
- package/dist/runtime/extensions.d.ts.map +1 -0
- package/dist/runtime/extensions.js +216 -0
- package/dist/runtime/extensions.js.map +1 -0
- package/dist/runtime/localHttp.d.ts +24 -0
- package/dist/runtime/localHttp.d.ts.map +1 -0
- package/dist/runtime/localHttp.js +84 -0
- package/dist/runtime/localHttp.js.map +1 -0
- package/dist/runtime/projectResolution.d.ts +29 -0
- package/dist/runtime/projectResolution.d.ts.map +1 -0
- package/dist/runtime/projectResolution.js +67 -0
- package/dist/runtime/projectResolution.js.map +1 -0
- package/dist/runtime/protocol.d.ts +62 -0
- package/dist/runtime/protocol.d.ts.map +1 -0
- package/dist/runtime/protocol.js +74 -0
- package/dist/runtime/protocol.js.map +1 -0
- package/dist/sentinelIssues.d.ts +26 -2
- package/dist/sentinelIssues.d.ts.map +1 -1
- package/dist/sentinelIssues.js +163 -76
- package/dist/sentinelIssues.js.map +1 -1
- package/dist/server.js +65 -12
- package/dist/server.js.map +1 -1
- package/dist/setup.d.ts +83 -0
- package/dist/setup.d.ts.map +1 -0
- package/dist/setup.js +445 -0
- package/dist/setup.js.map +1 -0
- package/dist/store/markdown.d.ts +14 -1
- package/dist/store/markdown.d.ts.map +1 -1
- package/dist/store/markdown.js +36 -3
- package/dist/store/markdown.js.map +1 -1
- package/dist/tools/agentic/index.d.ts.map +1 -1
- package/dist/tools/agentic/index.js +28 -2
- package/dist/tools/agentic/index.js.map +1 -1
- package/dist/tools/architect/index.d.ts.map +1 -1
- package/dist/tools/architect/index.js +7 -2
- package/dist/tools/architect/index.js.map +1 -1
- package/dist/tools/conductor/index.d.ts +9 -0
- package/dist/tools/conductor/index.d.ts.map +1 -0
- package/dist/tools/conductor/index.js +242 -0
- package/dist/tools/conductor/index.js.map +1 -0
- package/dist/tools/context.d.ts +10 -5
- package/dist/tools/context.d.ts.map +1 -1
- package/dist/tools/context.js +45 -18
- package/dist/tools/context.js.map +1 -1
- package/dist/tools/coordinator/coordinator.d.ts.map +1 -1
- package/dist/tools/coordinator/coordinator.js +48 -19
- package/dist/tools/coordinator/coordinator.js.map +1 -1
- package/dist/tools/crit.d.ts +2 -1
- package/dist/tools/crit.d.ts.map +1 -1
- package/dist/tools/crit.js +19 -4
- package/dist/tools/crit.js.map +1 -1
- package/dist/tools/designer/index.d.ts.map +1 -1
- package/dist/tools/designer/index.js +4 -3
- package/dist/tools/designer/index.js.map +1 -1
- package/dist/tools/designer/lateral-tools.d.ts.map +1 -1
- package/dist/tools/designer/lateral-tools.js +4 -2
- package/dist/tools/designer/lateral-tools.js.map +1 -1
- package/dist/tools/designer.d.ts +2 -1
- package/dist/tools/designer.d.ts.map +1 -1
- package/dist/tools/designer.js +24 -12
- package/dist/tools/designer.js.map +1 -1
- package/dist/tools/dojo.d.ts +3 -2
- package/dist/tools/dojo.d.ts.map +1 -1
- package/dist/tools/dojo.js +64 -22
- package/dist/tools/dojo.js.map +1 -1
- package/dist/tools/dojoPolicy.js +1 -1
- package/dist/tools/dojoPolicy.js.map +1 -1
- package/dist/tools/friction.d.ts.map +1 -1
- package/dist/tools/friction.js +16 -6
- package/dist/tools/friction.js.map +1 -1
- package/dist/tools/guardian.d.ts +29 -7
- package/dist/tools/guardian.d.ts.map +1 -1
- package/dist/tools/guardian.js +90 -75
- package/dist/tools/guardian.js.map +1 -1
- package/dist/tools/hygiene/oracle-hygiene.d.ts.map +1 -1
- package/dist/tools/hygiene/oracle-hygiene.js +8 -2
- package/dist/tools/hygiene/oracle-hygiene.js.map +1 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +29 -18
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/learnings.d.ts +2 -1
- package/dist/tools/learnings.d.ts.map +1 -1
- package/dist/tools/learnings.js +31 -15
- package/dist/tools/learnings.js.map +1 -1
- package/dist/tools/oracle.d.ts.map +1 -1
- package/dist/tools/oracle.js +19 -6
- package/dist/tools/oracle.js.map +1 -1
- package/dist/tools/policy.d.ts +2 -1
- package/dist/tools/policy.d.ts.map +1 -1
- package/dist/tools/policy.js +28 -9
- package/dist/tools/policy.js.map +1 -1
- package/dist/tools/postoffice/index.d.ts +10 -0
- package/dist/tools/postoffice/index.d.ts.map +1 -0
- package/dist/tools/postoffice/index.js +218 -0
- package/dist/tools/postoffice/index.js.map +1 -0
- package/dist/tools/postoffice.d.ts +78 -0
- package/dist/tools/postoffice.d.ts.map +1 -0
- package/dist/tools/postoffice.js +199 -0
- package/dist/tools/postoffice.js.map +1 -0
- package/dist/tools/provenance.d.ts +7 -0
- package/dist/tools/provenance.d.ts.map +1 -1
- package/dist/tools/provenance.js +42 -16
- package/dist/tools/provenance.js.map +1 -1
- package/dist/tools/registry/index.d.ts.map +1 -1
- package/dist/tools/registry/index.js +41 -12
- package/dist/tools/registry/index.js.map +1 -1
- package/dist/tools/sentinel/index.d.ts +1 -0
- package/dist/tools/sentinel/index.d.ts.map +1 -1
- package/dist/tools/sentinel/index.js +88 -4
- package/dist/tools/sentinel/index.js.map +1 -1
- package/dist/tools/sentinel.d.ts +117 -1
- package/dist/tools/sentinel.d.ts.map +1 -1
- package/dist/tools/sentinel.js +761 -339
- package/dist/tools/sentinel.js.map +1 -1
- package/dist/tools/shared/index.d.ts +2 -1
- package/dist/tools/shared/index.d.ts.map +1 -1
- package/dist/tools/shared/index.js +2 -1
- package/dist/tools/shared/index.js.map +1 -1
- package/dist/tools/shared/response.d.ts +24 -0
- package/dist/tools/shared/response.d.ts.map +1 -1
- package/dist/tools/shared/response.js +61 -7
- package/dist/tools/shared/response.js.map +1 -1
- package/dist/tools/shared/storeRead.d.ts +153 -0
- package/dist/tools/shared/storeRead.d.ts.map +1 -0
- package/dist/tools/shared/storeRead.js +242 -0
- package/dist/tools/shared/storeRead.js.map +1 -0
- package/dist/tools/testSpec.d.ts +3 -2
- package/dist/tools/testSpec.d.ts.map +1 -1
- package/dist/tools/testSpec.js +51 -14
- package/dist/tools/testSpec.js.map +1 -1
- package/dist/tools/vector.d.ts +33 -1
- package/dist/tools/vector.d.ts.map +1 -1
- package/dist/tools/vector.js +31 -5
- package/dist/tools/vector.js.map +1 -1
- package/dist/tools/zoom/index.d.ts +15 -0
- package/dist/tools/zoom/index.d.ts.map +1 -0
- package/dist/tools/zoom/index.js +174 -0
- package/dist/tools/zoom/index.js.map +1 -0
- package/dist/tools/zoom.d.ts +234 -0
- package/dist/tools/zoom.d.ts.map +1 -0
- package/dist/tools/zoom.js +627 -0
- package/dist/tools/zoom.js.map +1 -0
- package/dist/transports/bridge.d.ts +1 -1
- package/dist/transports/bridge.d.ts.map +1 -1
- package/dist/transports/bridge.js +2 -0
- package/dist/transports/bridge.js.map +1 -1
- package/dist/transports/http.d.ts +1 -1
- package/dist/transports/http.d.ts.map +1 -1
- package/dist/transports/http.js +3 -1
- package/dist/transports/http.js.map +1 -1
- package/dist/transports/index.d.ts +1 -0
- package/dist/transports/index.d.ts.map +1 -1
- package/dist/transports/index.js +1 -0
- package/dist/transports/index.js.map +1 -1
- package/dist/transports/mcp.d.ts +1 -1
- package/dist/transports/mcp.d.ts.map +1 -1
- package/dist/transports/mcp.js +7 -3
- package/dist/transports/mcp.js.map +1 -1
- package/dist/transports/stdio.d.ts +1 -1
- package/dist/transports/stdio.d.ts.map +1 -1
- package/dist/transports/stdio.js +2 -0
- package/dist/transports/stdio.js.map +1 -1
- package/dist/transports/thinStdio.d.ts +22 -0
- package/dist/transports/thinStdio.d.ts.map +1 -0
- package/dist/transports/thinStdio.js +218 -0
- package/dist/transports/thinStdio.js.map +1 -0
- package/dist/transports/types.d.ts +8 -1
- package/dist/transports/types.d.ts.map +1 -1
- package/dist/types/agent-services.d.ts +7 -0
- package/dist/types/agent-services.d.ts.map +1 -1
- package/package.json +9 -4
- package/templates/com.decibel.daemon.plist +6 -1
- package/dist/tools/deck.d.ts +0 -11
- package/dist/tools/deck.d.ts.map +0 -1
- package/dist/tools/deck.js +0 -1656
- package/dist/tools/deck.js.map +0 -1
- package/dist/tools/mother.d.ts +0 -11
- package/dist/tools/mother.d.ts.map +0 -1
- package/dist/tools/mother.js +0 -503
- package/dist/tools/mother.js.map +0 -1
- package/dist/tools/registry.d.ts +0 -3
- package/dist/tools/registry.d.ts.map +0 -1
- package/dist/tools/registry.js +0 -189
- package/dist/tools/registry.js.map +0 -1
- package/dist/tools/senken.d.ts +0 -11
- package/dist/tools/senken.d.ts.map +0 -1
- package/dist/tools/senken.js +0 -482
- package/dist/tools/senken.js.map +0 -1
- package/dist/tools/terminal.d.ts +0 -17
- package/dist/tools/terminal.d.ts.map +0 -1
- package/dist/tools/terminal.js +0 -968
- package/dist/tools/terminal.js.map +0 -1
- package/dist/tools/toolsIndex.d.ts +0 -5
- package/dist/tools/toolsIndex.d.ts.map +0 -1
- package/dist/tools/toolsIndex.js +0 -37
- package/dist/tools/toolsIndex.js.map +0 -1
package/dist/setup.d.ts
ADDED
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
export type ClientId = 'claude-desktop' | 'claude-code' | 'cursor';
|
|
2
|
+
export interface ClientTarget {
|
|
3
|
+
id: ClientId;
|
|
4
|
+
label: string;
|
|
5
|
+
configPath: string;
|
|
6
|
+
detected: boolean;
|
|
7
|
+
/** Desktop on macOS needs a login shell to find node. */
|
|
8
|
+
useLoginShell: boolean;
|
|
9
|
+
}
|
|
10
|
+
export interface ServerEntry {
|
|
11
|
+
command: string;
|
|
12
|
+
args: string[];
|
|
13
|
+
}
|
|
14
|
+
export type MergeAction = 'created' | 'added' | 'updated' | 'unchanged';
|
|
15
|
+
export interface MergeResult {
|
|
16
|
+
action: MergeAction;
|
|
17
|
+
content: string;
|
|
18
|
+
}
|
|
19
|
+
export interface ApplyResult {
|
|
20
|
+
client: ClientTarget;
|
|
21
|
+
action: MergeAction | 'skipped';
|
|
22
|
+
backupPath?: string;
|
|
23
|
+
error?: string;
|
|
24
|
+
}
|
|
25
|
+
export interface SetupOptions {
|
|
26
|
+
home?: string;
|
|
27
|
+
platform?: NodeJS.Platform;
|
|
28
|
+
dryRun?: boolean;
|
|
29
|
+
yes?: boolean;
|
|
30
|
+
clients?: ClientId[];
|
|
31
|
+
license?: string;
|
|
32
|
+
installDaemon?: boolean;
|
|
33
|
+
verify?: boolean;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Resolve the config path for each supported client on this platform.
|
|
37
|
+
* `detected` means the client's own directory exists — i.e. it has been run
|
|
38
|
+
* at least once — not that Decibel is already configured.
|
|
39
|
+
*/
|
|
40
|
+
export declare function detectClients(opts?: {
|
|
41
|
+
home?: string;
|
|
42
|
+
platform?: NodeJS.Platform;
|
|
43
|
+
}): ClientTarget[];
|
|
44
|
+
/**
|
|
45
|
+
* The MCP server block to write. Desktop on macOS gets the login-shell
|
|
46
|
+
* wrapper; everything else invokes npx directly.
|
|
47
|
+
*/
|
|
48
|
+
export declare function buildServerEntry(client: ClientTarget): ServerEntry;
|
|
49
|
+
/**
|
|
50
|
+
* Merge the Decibel server entry into an existing config document.
|
|
51
|
+
*
|
|
52
|
+
* Preserves every other top-level key (Claude Desktop keeps a `preferences`
|
|
53
|
+
* blob next to `mcpServers`) and every other configured MCP server. Returns
|
|
54
|
+
* `unchanged` when the entry already matches, so re-running is a no-op.
|
|
55
|
+
*
|
|
56
|
+
* Throws if `raw` is non-empty and not valid JSON — the caller skips rather
|
|
57
|
+
* than destroying a file it does not understand.
|
|
58
|
+
*/
|
|
59
|
+
export declare function mergeConfig(raw: string | null, entry: ServerEntry): MergeResult;
|
|
60
|
+
/**
|
|
61
|
+
* Write the merged config for one client, backing up the original first.
|
|
62
|
+
* `dryRun` computes the action without touching disk.
|
|
63
|
+
*/
|
|
64
|
+
export declare function applyToClient(client: ClientTarget, opts?: {
|
|
65
|
+
dryRun?: boolean;
|
|
66
|
+
}): ApplyResult;
|
|
67
|
+
export interface VerifyResult {
|
|
68
|
+
ok: boolean;
|
|
69
|
+
toolCount?: number;
|
|
70
|
+
serverName?: string;
|
|
71
|
+
error?: string;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Spawn the server exactly as a client would and run initialize + tools/list.
|
|
75
|
+
* This is the difference between "we wrote a file" and "it actually works".
|
|
76
|
+
*/
|
|
77
|
+
export declare function verifyServer(entry: ServerEntry, timeoutMs?: number): Promise<VerifyResult>;
|
|
78
|
+
export declare function parseSetupArgs(args: string[]): SetupOptions;
|
|
79
|
+
/**
|
|
80
|
+
* Run the setup wizard. Returns a process exit code.
|
|
81
|
+
*/
|
|
82
|
+
export declare function runSetup(argv: string[]): Promise<number>;
|
|
83
|
+
//# sourceMappingURL=setup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"AAgCA,MAAM,MAAM,QAAQ,GAAG,gBAAgB,GAAG,aAAa,GAAG,QAAQ,CAAC;AAEnE,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,QAAQ,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,OAAO,CAAC;IAClB,yDAAyD;IACzD,aAAa,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAED,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,GAAG,WAAW,CAAC;AAExE,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,WAAW,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,YAAY,CAAC;IACrB,MAAM,EAAE,WAAW,GAAG,SAAS,CAAC;IAChC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC;IAC3B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,OAAO,CAAC,EAAE,QAAQ,EAAE,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAMD;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,GAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAA;CAAO,GAAG,YAAY,EAAE,CA0CtG;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,YAAY,GAAG,WAAW,CAKlE;AAMD;;;;;;;;;GASG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,EAAE,KAAK,EAAE,WAAW,GAAG,WAAW,CAkC/E;AAUD;;;GAGG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,YAAY,EAAE,IAAI,GAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,WAAW,CAyChG;AAcD,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,OAAO,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,WAAW,EAAE,SAAS,SAAS,GAAG,OAAO,CAAC,YAAY,CAAC,CAsF1F;AAcD,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,YAAY,CA6B3D;AAqBD;;GAEG;AACH,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAsH9D"}
|
package/dist/setup.js
ADDED
|
@@ -0,0 +1,445 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// Setup Wizard — one-command multi-client install (EPIC-0035 Phase 1)
|
|
3
|
+
// ============================================================================
|
|
4
|
+
// Detects installed AI clients and writes the Decibel MCP server entry into
|
|
5
|
+
// each client's config file, idempotently and without clobbering anything the
|
|
6
|
+
// user already had there.
|
|
7
|
+
//
|
|
8
|
+
// npx @decibelsystems/tools setup
|
|
9
|
+
// npx @decibelsystems/tools setup --dry-run
|
|
10
|
+
// npx @decibelsystems/tools setup --yes --clients desktop,cursor
|
|
11
|
+
// npx @decibelsystems/tools setup --license DCB-... --daemon
|
|
12
|
+
//
|
|
13
|
+
// Design notes:
|
|
14
|
+
// - Every write is preceded by a timestamped backup of the original file.
|
|
15
|
+
// - A config we cannot parse is never overwritten — we skip and report.
|
|
16
|
+
// - Claude Desktop on macOS gets the `/bin/zsh -lc` wrapper because Desktop
|
|
17
|
+
// launches with a stripped PATH and cannot find a bare `npx`.
|
|
18
|
+
// ============================================================================
|
|
19
|
+
import { existsSync, readFileSync, writeFileSync, mkdirSync, copyFileSync } from 'fs';
|
|
20
|
+
import { join, dirname } from 'path';
|
|
21
|
+
import { homedir, platform as osPlatform } from 'os';
|
|
22
|
+
import { spawn } from 'child_process';
|
|
23
|
+
import { createInterface } from 'readline/promises';
|
|
24
|
+
const PACKAGE_SPEC = '@decibelsystems/tools';
|
|
25
|
+
const SERVER_KEY = 'decibel-tools';
|
|
26
|
+
// ============================================================================
|
|
27
|
+
// Client Detection
|
|
28
|
+
// ============================================================================
|
|
29
|
+
/**
|
|
30
|
+
* Resolve the config path for each supported client on this platform.
|
|
31
|
+
* `detected` means the client's own directory exists — i.e. it has been run
|
|
32
|
+
* at least once — not that Decibel is already configured.
|
|
33
|
+
*/
|
|
34
|
+
export function detectClients(opts = {}) {
|
|
35
|
+
const home = opts.home ?? homedir();
|
|
36
|
+
const platform = opts.platform ?? osPlatform();
|
|
37
|
+
const isMac = platform === 'darwin';
|
|
38
|
+
const isWin = platform === 'win32';
|
|
39
|
+
const desktopDir = isMac
|
|
40
|
+
? join(home, 'Library', 'Application Support', 'Claude')
|
|
41
|
+
: isWin
|
|
42
|
+
? join(process.env.APPDATA || join(home, 'AppData', 'Roaming'), 'Claude')
|
|
43
|
+
: join(home, '.config', 'Claude');
|
|
44
|
+
// Claude Code keeps global MCP servers in ~/.claude.json — NOT in
|
|
45
|
+
// ~/.claude/settings.json, which holds model/hooks/plugins. Writing to
|
|
46
|
+
// settings.json produces a config Claude Code silently ignores.
|
|
47
|
+
const claudeCodeConfig = join(home, '.claude.json');
|
|
48
|
+
const claudeCodeDir = join(home, '.claude');
|
|
49
|
+
const cursorDir = join(home, '.cursor');
|
|
50
|
+
return [
|
|
51
|
+
{
|
|
52
|
+
id: 'claude-desktop',
|
|
53
|
+
label: 'Claude Desktop',
|
|
54
|
+
configPath: join(desktopDir, 'claude_desktop_config.json'),
|
|
55
|
+
detected: existsSync(desktopDir),
|
|
56
|
+
useLoginShell: isMac,
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
id: 'claude-code',
|
|
60
|
+
label: 'Claude Code',
|
|
61
|
+
configPath: claudeCodeConfig,
|
|
62
|
+
detected: existsSync(claudeCodeConfig) || existsSync(claudeCodeDir),
|
|
63
|
+
useLoginShell: false,
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
id: 'cursor',
|
|
67
|
+
label: 'Cursor',
|
|
68
|
+
configPath: join(cursorDir, 'mcp.json'),
|
|
69
|
+
detected: existsSync(cursorDir),
|
|
70
|
+
useLoginShell: false,
|
|
71
|
+
},
|
|
72
|
+
];
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* The MCP server block to write. Desktop on macOS gets the login-shell
|
|
76
|
+
* wrapper; everything else invokes npx directly.
|
|
77
|
+
*/
|
|
78
|
+
export function buildServerEntry(client) {
|
|
79
|
+
if (client.useLoginShell) {
|
|
80
|
+
return { command: '/bin/zsh', args: ['-lc', `npx -y ${PACKAGE_SPEC}`] };
|
|
81
|
+
}
|
|
82
|
+
return { command: 'npx', args: ['-y', PACKAGE_SPEC] };
|
|
83
|
+
}
|
|
84
|
+
// ============================================================================
|
|
85
|
+
// Idempotent Merge
|
|
86
|
+
// ============================================================================
|
|
87
|
+
/**
|
|
88
|
+
* Merge the Decibel server entry into an existing config document.
|
|
89
|
+
*
|
|
90
|
+
* Preserves every other top-level key (Claude Desktop keeps a `preferences`
|
|
91
|
+
* blob next to `mcpServers`) and every other configured MCP server. Returns
|
|
92
|
+
* `unchanged` when the entry already matches, so re-running is a no-op.
|
|
93
|
+
*
|
|
94
|
+
* Throws if `raw` is non-empty and not valid JSON — the caller skips rather
|
|
95
|
+
* than destroying a file it does not understand.
|
|
96
|
+
*/
|
|
97
|
+
export function mergeConfig(raw, entry) {
|
|
98
|
+
const isNew = raw === null || raw.trim() === '';
|
|
99
|
+
let doc;
|
|
100
|
+
if (isNew) {
|
|
101
|
+
doc = {};
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
const parsed = JSON.parse(raw);
|
|
105
|
+
if (parsed === null || typeof parsed !== 'object' || Array.isArray(parsed)) {
|
|
106
|
+
throw new Error('config root is not a JSON object');
|
|
107
|
+
}
|
|
108
|
+
doc = parsed;
|
|
109
|
+
}
|
|
110
|
+
const existingServers = doc.mcpServers;
|
|
111
|
+
const servers = existingServers && typeof existingServers === 'object' && !Array.isArray(existingServers)
|
|
112
|
+
? { ...existingServers }
|
|
113
|
+
: {};
|
|
114
|
+
const had = Object.prototype.hasOwnProperty.call(servers, SERVER_KEY);
|
|
115
|
+
const same = had && JSON.stringify(servers[SERVER_KEY]) === JSON.stringify(entry);
|
|
116
|
+
if (same) {
|
|
117
|
+
return { action: 'unchanged', content: serialize(doc) };
|
|
118
|
+
}
|
|
119
|
+
servers[SERVER_KEY] = entry;
|
|
120
|
+
const next = { ...doc, mcpServers: servers };
|
|
121
|
+
return {
|
|
122
|
+
action: isNew ? 'created' : had ? 'updated' : 'added',
|
|
123
|
+
content: serialize(next),
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
function serialize(doc) {
|
|
127
|
+
return JSON.stringify(doc, null, 2) + '\n';
|
|
128
|
+
}
|
|
129
|
+
// ============================================================================
|
|
130
|
+
// Apply
|
|
131
|
+
// ============================================================================
|
|
132
|
+
/**
|
|
133
|
+
* Write the merged config for one client, backing up the original first.
|
|
134
|
+
* `dryRun` computes the action without touching disk.
|
|
135
|
+
*/
|
|
136
|
+
export function applyToClient(client, opts = {}) {
|
|
137
|
+
const entry = buildServerEntry(client);
|
|
138
|
+
const exists = existsSync(client.configPath);
|
|
139
|
+
let raw = null;
|
|
140
|
+
if (exists) {
|
|
141
|
+
try {
|
|
142
|
+
raw = readFileSync(client.configPath, 'utf-8');
|
|
143
|
+
}
|
|
144
|
+
catch (err) {
|
|
145
|
+
return { client, action: 'skipped', error: `cannot read config: ${errText(err)}` };
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
let merged;
|
|
149
|
+
try {
|
|
150
|
+
merged = mergeConfig(raw, entry);
|
|
151
|
+
}
|
|
152
|
+
catch (err) {
|
|
153
|
+
return {
|
|
154
|
+
client,
|
|
155
|
+
action: 'skipped',
|
|
156
|
+
error: `existing config is not valid JSON (${errText(err)}) — left untouched, fix it by hand and re-run`,
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
if (merged.action === 'unchanged' || opts.dryRun) {
|
|
160
|
+
return { client, action: merged.action };
|
|
161
|
+
}
|
|
162
|
+
let backupPath;
|
|
163
|
+
try {
|
|
164
|
+
if (exists && raw !== null && raw.trim() !== '') {
|
|
165
|
+
backupPath = `${client.configPath}.decibel-backup-${timestamp()}`;
|
|
166
|
+
copyFileSync(client.configPath, backupPath);
|
|
167
|
+
}
|
|
168
|
+
mkdirSync(dirname(client.configPath), { recursive: true });
|
|
169
|
+
writeFileSync(client.configPath, merged.content, 'utf-8');
|
|
170
|
+
}
|
|
171
|
+
catch (err) {
|
|
172
|
+
return { client, action: 'skipped', backupPath, error: `write failed: ${errText(err)}` };
|
|
173
|
+
}
|
|
174
|
+
return { client, action: merged.action, backupPath };
|
|
175
|
+
}
|
|
176
|
+
function timestamp() {
|
|
177
|
+
return new Date().toISOString().replace(/[:.]/g, '-');
|
|
178
|
+
}
|
|
179
|
+
function errText(err) {
|
|
180
|
+
return err instanceof Error ? err.message : String(err);
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Spawn the server exactly as a client would and run initialize + tools/list.
|
|
184
|
+
* This is the difference between "we wrote a file" and "it actually works".
|
|
185
|
+
*/
|
|
186
|
+
export function verifyServer(entry, timeoutMs = 90_000) {
|
|
187
|
+
return new Promise((resolve) => {
|
|
188
|
+
let child;
|
|
189
|
+
try {
|
|
190
|
+
child = spawn(entry.command, entry.args, { stdio: ['pipe', 'pipe', 'pipe'] });
|
|
191
|
+
}
|
|
192
|
+
catch (err) {
|
|
193
|
+
resolve({ ok: false, error: `spawn failed: ${errText(err)}` });
|
|
194
|
+
return;
|
|
195
|
+
}
|
|
196
|
+
let settled = false;
|
|
197
|
+
let buffer = '';
|
|
198
|
+
let stderr = '';
|
|
199
|
+
let serverName;
|
|
200
|
+
const finish = (result) => {
|
|
201
|
+
if (settled)
|
|
202
|
+
return;
|
|
203
|
+
settled = true;
|
|
204
|
+
clearTimeout(timer);
|
|
205
|
+
child.kill();
|
|
206
|
+
resolve(result);
|
|
207
|
+
};
|
|
208
|
+
const timer = setTimeout(() => {
|
|
209
|
+
finish({
|
|
210
|
+
ok: false,
|
|
211
|
+
error: `timed out after ${Math.round(timeoutMs / 1000)}s${stderr ? ` — ${stderr.trim().split('\n').pop()}` : ''}`,
|
|
212
|
+
});
|
|
213
|
+
}, timeoutMs);
|
|
214
|
+
const send = (msg) => child.stdin?.write(JSON.stringify(msg) + '\n');
|
|
215
|
+
child.stderr?.on('data', (chunk) => { stderr += chunk.toString(); });
|
|
216
|
+
child.on('error', (err) => finish({ ok: false, error: `spawn failed: ${errText(err)}` }));
|
|
217
|
+
child.on('exit', (code) => {
|
|
218
|
+
finish({
|
|
219
|
+
ok: false,
|
|
220
|
+
error: `server exited early (code ${code})${stderr ? ` — ${stderr.trim().split('\n').pop()}` : ''}`,
|
|
221
|
+
});
|
|
222
|
+
});
|
|
223
|
+
child.stdout?.on('data', (chunk) => {
|
|
224
|
+
buffer += chunk.toString();
|
|
225
|
+
const lines = buffer.split('\n');
|
|
226
|
+
buffer = lines.pop() ?? '';
|
|
227
|
+
for (const line of lines) {
|
|
228
|
+
if (!line.trim())
|
|
229
|
+
continue;
|
|
230
|
+
let msg;
|
|
231
|
+
try {
|
|
232
|
+
msg = JSON.parse(line);
|
|
233
|
+
}
|
|
234
|
+
catch {
|
|
235
|
+
continue; // servers may emit non-JSON banner lines on stdout
|
|
236
|
+
}
|
|
237
|
+
if (msg.error) {
|
|
238
|
+
finish({ ok: false, error: msg.error.message ?? 'server returned an error' });
|
|
239
|
+
return;
|
|
240
|
+
}
|
|
241
|
+
if (msg.id === 1 && msg.result) {
|
|
242
|
+
const info = msg.result.serverInfo;
|
|
243
|
+
serverName = info?.name;
|
|
244
|
+
send({ jsonrpc: '2.0', method: 'notifications/initialized' });
|
|
245
|
+
send({ jsonrpc: '2.0', id: 2, method: 'tools/list', params: {} });
|
|
246
|
+
}
|
|
247
|
+
if (msg.id === 2 && msg.result) {
|
|
248
|
+
const tools = msg.result.tools;
|
|
249
|
+
finish({ ok: true, toolCount: Array.isArray(tools) ? tools.length : 0, serverName });
|
|
250
|
+
return;
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
});
|
|
254
|
+
send({
|
|
255
|
+
jsonrpc: '2.0',
|
|
256
|
+
id: 1,
|
|
257
|
+
method: 'initialize',
|
|
258
|
+
params: {
|
|
259
|
+
protocolVersion: '2024-11-05',
|
|
260
|
+
capabilities: {},
|
|
261
|
+
clientInfo: { name: 'decibel-setup', version: '1.0.0' },
|
|
262
|
+
},
|
|
263
|
+
});
|
|
264
|
+
});
|
|
265
|
+
}
|
|
266
|
+
// ============================================================================
|
|
267
|
+
// CLI Entry
|
|
268
|
+
// ============================================================================
|
|
269
|
+
const CLIENT_ALIASES = {
|
|
270
|
+
desktop: 'claude-desktop',
|
|
271
|
+
'claude-desktop': 'claude-desktop',
|
|
272
|
+
code: 'claude-code',
|
|
273
|
+
'claude-code': 'claude-code',
|
|
274
|
+
cursor: 'cursor',
|
|
275
|
+
};
|
|
276
|
+
export function parseSetupArgs(args) {
|
|
277
|
+
const opts = {
|
|
278
|
+
dryRun: args.includes('--dry-run'),
|
|
279
|
+
yes: args.includes('--yes') || args.includes('-y'),
|
|
280
|
+
installDaemon: args.includes('--daemon'),
|
|
281
|
+
verify: !args.includes('--no-verify'),
|
|
282
|
+
};
|
|
283
|
+
const clientsIdx = args.findIndex(a => a === '--clients' || a.startsWith('--clients='));
|
|
284
|
+
if (clientsIdx !== -1) {
|
|
285
|
+
const raw = args[clientsIdx].includes('=')
|
|
286
|
+
? args[clientsIdx].split('=')[1]
|
|
287
|
+
: args[clientsIdx + 1];
|
|
288
|
+
if (raw) {
|
|
289
|
+
opts.clients = raw
|
|
290
|
+
.split(',')
|
|
291
|
+
.map(s => CLIENT_ALIASES[s.trim().toLowerCase()])
|
|
292
|
+
.filter((c) => Boolean(c));
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
const licenseIdx = args.findIndex(a => a === '--license' || a.startsWith('--license='));
|
|
296
|
+
if (licenseIdx !== -1) {
|
|
297
|
+
opts.license = args[licenseIdx].includes('=')
|
|
298
|
+
? args[licenseIdx].split('=')[1]
|
|
299
|
+
: args[licenseIdx + 1];
|
|
300
|
+
}
|
|
301
|
+
return opts;
|
|
302
|
+
}
|
|
303
|
+
const HELP = `
|
|
304
|
+
Decibel Tools — setup
|
|
305
|
+
|
|
306
|
+
npx ${PACKAGE_SPEC} setup [options]
|
|
307
|
+
|
|
308
|
+
Detects Claude Desktop, Claude Code, and Cursor, then writes the Decibel MCP
|
|
309
|
+
server entry into each one's config file. Existing settings are preserved and
|
|
310
|
+
the original file is backed up before any change.
|
|
311
|
+
|
|
312
|
+
Options:
|
|
313
|
+
--dry-run Show what would change, write nothing
|
|
314
|
+
--yes, -y Skip the confirmation prompt
|
|
315
|
+
--clients a,b Limit to: desktop, code, cursor
|
|
316
|
+
--license <key> Write a Pro license key to ~/.decibel/config.yaml
|
|
317
|
+
--daemon Also install the launchd background service (macOS)
|
|
318
|
+
--no-verify Skip the post-install connection check
|
|
319
|
+
--help Show this message
|
|
320
|
+
`.trimStart();
|
|
321
|
+
/**
|
|
322
|
+
* Run the setup wizard. Returns a process exit code.
|
|
323
|
+
*/
|
|
324
|
+
export async function runSetup(argv) {
|
|
325
|
+
if (argv.includes('--help') || argv.includes('-h')) {
|
|
326
|
+
console.log(HELP);
|
|
327
|
+
return 0;
|
|
328
|
+
}
|
|
329
|
+
const opts = parseSetupArgs(argv);
|
|
330
|
+
const all = detectClients();
|
|
331
|
+
const wanted = opts.clients?.length ? all.filter(c => opts.clients.includes(c.id)) : all;
|
|
332
|
+
const targets = wanted.filter(c => c.detected);
|
|
333
|
+
console.log('\nDecibel Tools — setup\n');
|
|
334
|
+
for (const c of all) {
|
|
335
|
+
const included = targets.includes(c);
|
|
336
|
+
const mark = included ? '✓' : '·';
|
|
337
|
+
const note = c.detected
|
|
338
|
+
? included ? c.configPath : 'skipped (--clients)'
|
|
339
|
+
: 'not installed';
|
|
340
|
+
console.log(` ${mark} ${c.label.padEnd(16)} ${note}`);
|
|
341
|
+
}
|
|
342
|
+
if (targets.length === 0) {
|
|
343
|
+
console.log('\nNo supported clients detected. Nothing to do.');
|
|
344
|
+
console.log('Install Claude Desktop, Claude Code, or Cursor and run this again.\n');
|
|
345
|
+
return 1;
|
|
346
|
+
}
|
|
347
|
+
if (opts.dryRun) {
|
|
348
|
+
console.log('\nDry run — no files will be written.\n');
|
|
349
|
+
for (const client of targets) {
|
|
350
|
+
const result = applyToClient(client, { dryRun: true });
|
|
351
|
+
console.log(` ${client.label}: would be ${describe(result.action)}`);
|
|
352
|
+
if (result.error)
|
|
353
|
+
console.log(` ! ${result.error}`);
|
|
354
|
+
}
|
|
355
|
+
console.log('');
|
|
356
|
+
return 0;
|
|
357
|
+
}
|
|
358
|
+
if (!opts.yes) {
|
|
359
|
+
if (!process.stdin.isTTY) {
|
|
360
|
+
console.log('\nRefusing to modify configs without confirmation.');
|
|
361
|
+
console.log('Re-run with --yes (or --dry-run to preview).\n');
|
|
362
|
+
return 1;
|
|
363
|
+
}
|
|
364
|
+
const rl = createInterface({ input: process.stdin, output: process.stdout });
|
|
365
|
+
const answer = (await rl.question(`\nWrite Decibel into ${targets.length} client config(s)? [y/N] `)).trim().toLowerCase();
|
|
366
|
+
rl.close();
|
|
367
|
+
if (answer !== 'y' && answer !== 'yes') {
|
|
368
|
+
console.log('Cancelled. Nothing was written.\n');
|
|
369
|
+
return 1;
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
console.log('');
|
|
373
|
+
const results = [];
|
|
374
|
+
for (const client of targets) {
|
|
375
|
+
const result = applyToClient(client);
|
|
376
|
+
results.push(result);
|
|
377
|
+
if (result.error) {
|
|
378
|
+
console.log(` ✗ ${client.label}: ${result.error}`);
|
|
379
|
+
}
|
|
380
|
+
else {
|
|
381
|
+
console.log(` ✓ ${client.label}: ${describe(result.action)}`);
|
|
382
|
+
if (result.backupPath)
|
|
383
|
+
console.log(` backup: ${result.backupPath}`);
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
// Optional license key
|
|
387
|
+
if (opts.license) {
|
|
388
|
+
try {
|
|
389
|
+
const { writeLicenseKey, getConfigPath } = await import('./daemonConfig.js');
|
|
390
|
+
writeLicenseKey(opts.license);
|
|
391
|
+
console.log(`\n ✓ License key written to ${getConfigPath()}`);
|
|
392
|
+
}
|
|
393
|
+
catch (err) {
|
|
394
|
+
console.log(`\n ✗ Could not write license key: ${errText(err)}`);
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
// Optional launchd service
|
|
398
|
+
if (opts.installDaemon) {
|
|
399
|
+
if (osPlatform() !== 'darwin') {
|
|
400
|
+
console.log('\n · --daemon is macOS-only; skipped.');
|
|
401
|
+
}
|
|
402
|
+
else {
|
|
403
|
+
try {
|
|
404
|
+
const { installLaunchd } = await import('./daemon.js');
|
|
405
|
+
const res = installLaunchd();
|
|
406
|
+
console.log(`\n ${res.installed ? '✓' : '✗'} ${res.message}`);
|
|
407
|
+
}
|
|
408
|
+
catch (err) {
|
|
409
|
+
console.log(`\n ✗ Daemon install failed: ${errText(err)}`);
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
// Verify the thing we just configured actually starts
|
|
414
|
+
if (opts.verify) {
|
|
415
|
+
const entry = buildServerEntry({ ...targets[0], useLoginShell: false });
|
|
416
|
+
process.stdout.write('\n … verifying server starts (first run downloads the package)');
|
|
417
|
+
const check = await verifyServer(entry);
|
|
418
|
+
if (check.ok) {
|
|
419
|
+
console.log(`\r ✓ Server responds — ${check.toolCount} tools available `);
|
|
420
|
+
}
|
|
421
|
+
else {
|
|
422
|
+
console.log(`\r ✗ Verification failed: ${check.error} `);
|
|
423
|
+
console.log(' Config was still written; try launching your client to confirm.');
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
const wrote = results.filter(r => r.action !== 'skipped' && r.action !== 'unchanged');
|
|
427
|
+
const failed = results.filter(r => r.error);
|
|
428
|
+
console.log('\nNext steps:');
|
|
429
|
+
if (wrote.some(r => r.client.id === 'claude-desktop')) {
|
|
430
|
+
console.log(' 1. Fully quit Claude Desktop (⌘Q — closing the window is not enough) and reopen it.');
|
|
431
|
+
}
|
|
432
|
+
console.log(' 2. In your client, ask: "Run registry init with path <your project path>"');
|
|
433
|
+
console.log(' 3. Then try: "What should I work on?"\n');
|
|
434
|
+
return failed.length > 0 ? 1 : 0;
|
|
435
|
+
}
|
|
436
|
+
function describe(action) {
|
|
437
|
+
switch (action) {
|
|
438
|
+
case 'created': return 'config created';
|
|
439
|
+
case 'added': return 'entry added';
|
|
440
|
+
case 'updated': return 'entry updated';
|
|
441
|
+
case 'unchanged': return 'already configured';
|
|
442
|
+
case 'skipped': return 'skipped';
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
//# sourceMappingURL=setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"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"}
|
package/dist/store/markdown.d.ts
CHANGED
|
@@ -1,5 +1,18 @@
|
|
|
1
1
|
import type { IssueRecord } from './types.js';
|
|
2
|
-
/**
|
|
2
|
+
/**
|
|
3
|
+
* Parse a sentinel issue record into an IssueRecord.
|
|
4
|
+
*
|
|
5
|
+
* Handles both on-disk formats. `.md` records are frontmatter fenced with
|
|
6
|
+
* `---`; `.yml`/`.yaml` records are bare YAML with no fence. Previously this
|
|
7
|
+
* only stripped `.md` from the source_key and only read fenced frontmatter,
|
|
8
|
+
* so a bare-YAML record imported as a junk row — title falling back to the
|
|
9
|
+
* filename stem, status defaulting to `open`, and the entire YAML text landing
|
|
10
|
+
* in `details` — while reporting success.
|
|
11
|
+
*
|
|
12
|
+
* source_key is the filename stem with any record extension removed. Stripping
|
|
13
|
+
* only `.md` would let a `.yml` record carry its extension into the key and
|
|
14
|
+
* collide with a later correct import under a different key for the same issue.
|
|
15
|
+
*/
|
|
3
16
|
export declare function parseIssueMarkdown(filename: string, content: string): IssueRecord;
|
|
4
17
|
/** Serialize an IssueRecord to sentinel .md (frontmatter + body), markdown-safe (no YAML round-trip of the body). */
|
|
5
18
|
export declare function serializeIssueMarkdown(projectKey: string, issue: IssueRecord): string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../../src/store/markdown.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,WAAW,EAA6C,MAAM,YAAY,CAAC;AAczF
|
|
1
|
+
{"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../../src/store/markdown.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,WAAW,EAA6C,MAAM,YAAY,CAAC;AAczF;;;;;;;;;;;;;GAaG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,WAAW,CAqDjF;AAED,qHAAqH;AACrH,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,MAAM,CAyBrF;AAOD,MAAM,WAAW,SAAS;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AA8BD,gGAAgG;AAChG,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,SAAS,CAwC7E"}
|
package/dist/store/markdown.js
CHANGED
|
@@ -26,9 +26,22 @@ function asString(v) {
|
|
|
26
26
|
function oneOf(v, allowed) {
|
|
27
27
|
return typeof v === 'string' && allowed.includes(v) ? v : undefined;
|
|
28
28
|
}
|
|
29
|
-
/**
|
|
29
|
+
/**
|
|
30
|
+
* Parse a sentinel issue record into an IssueRecord.
|
|
31
|
+
*
|
|
32
|
+
* Handles both on-disk formats. `.md` records are frontmatter fenced with
|
|
33
|
+
* `---`; `.yml`/`.yaml` records are bare YAML with no fence. Previously this
|
|
34
|
+
* only stripped `.md` from the source_key and only read fenced frontmatter,
|
|
35
|
+
* so a bare-YAML record imported as a junk row — title falling back to the
|
|
36
|
+
* filename stem, status defaulting to `open`, and the entire YAML text landing
|
|
37
|
+
* in `details` — while reporting success.
|
|
38
|
+
*
|
|
39
|
+
* source_key is the filename stem with any record extension removed. Stripping
|
|
40
|
+
* only `.md` would let a `.yml` record carry its extension into the key and
|
|
41
|
+
* collide with a later correct import under a different key for the same issue.
|
|
42
|
+
*/
|
|
30
43
|
export function parseIssueMarkdown(filename, content) {
|
|
31
|
-
const source_key = filename.replace(/\.md$/i, '');
|
|
44
|
+
const source_key = filename.replace(/\.(md|ya?ml)$/i, '');
|
|
32
45
|
let fm = {};
|
|
33
46
|
let body = content;
|
|
34
47
|
const m = content.match(FRONTMATTER_RE);
|
|
@@ -41,6 +54,26 @@ export function parseIssueMarkdown(filename, content) {
|
|
|
41
54
|
}
|
|
42
55
|
body = content.slice(m[0].length);
|
|
43
56
|
}
|
|
57
|
+
else if (!/^---/.test(content.trimStart())) {
|
|
58
|
+
// Bare-YAML record: the whole file is frontmatter and there is no body.
|
|
59
|
+
// If close_issue appended a markdown section (see ISS-0129), parse only
|
|
60
|
+
// the region above the first column-0 heading — the same salvage boundary
|
|
61
|
+
// the reader uses, anchored at column 0 so markdown inside a description
|
|
62
|
+
// block scalar is left intact.
|
|
63
|
+
const lines = content.split('\n');
|
|
64
|
+
const headingIdx = lines.findIndex((l) => /^#{1,6}\s/.test(l));
|
|
65
|
+
const region = headingIdx > 0 ? lines.slice(0, headingIdx).join('\n') : content;
|
|
66
|
+
try {
|
|
67
|
+
const parsed = parseYaml(region);
|
|
68
|
+
if (parsed && typeof parsed === 'object') {
|
|
69
|
+
fm = parsed;
|
|
70
|
+
body = '';
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
fm = {};
|
|
75
|
+
}
|
|
76
|
+
}
|
|
44
77
|
const heading = body.match(/^#\s+(.+)$/m);
|
|
45
78
|
const title = asString(fm.title) ?? (heading ? heading[1].trim() : source_key);
|
|
46
79
|
const tags = Array.isArray(fm.tags)
|
|
@@ -49,7 +82,7 @@ export function parseIssueMarkdown(filename, content) {
|
|
|
49
82
|
return {
|
|
50
83
|
source_key,
|
|
51
84
|
title,
|
|
52
|
-
details: body.trim() || undefined,
|
|
85
|
+
details: body.trim() || asString(fm.description) || undefined,
|
|
53
86
|
severity: oneOf(fm.severity, SEVERITIES),
|
|
54
87
|
status: oneOf(fm.status, STATUSES) ?? 'open',
|
|
55
88
|
priority: oneOf(fm.priority, PRIORITIES),
|