@jam-mcp/server 1.0.0 → 1.0.1

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 CHANGED
@@ -38,22 +38,29 @@ source, that source is what settles the question.
38
38
 
39
39
  ## Running it
40
40
 
41
- Normally you don't run this package directly your coding agent launches
41
+ Don't install this package to use JAM. Your coding agent launches
42
42
  [`@jam-mcp/launcher`](https://www.npmjs.com/package/@jam-mcp/launcher), which
43
- resolves which JAM build this machine runs and dispatches here. Going through
44
- the launcher is what keeps a committed `.mcp.json` free of machine-specific
45
- paths.
43
+ reads your `~/.jam/config.yaml`, decides which JAM build this machine should
44
+ run, and dispatches here. Naming the server directly instead pins one machine
45
+ to one build and bypasses that choice — and it is what keeps a committed
46
+ `.mcp.json` free of machine-specific paths.
46
47
 
47
- The `jam` CLI is the same binary:
48
+ The same binary carries the CLI, and every command below is reachable through
49
+ the launcher:
48
50
 
49
51
  ```text
50
- jam serve Run the MCP server over stdio
51
- jam doctor Diagnose config, credentials and Jira connectivity
52
- jam setup Wire up JAM and verify (personal by default; --shared for the team)
53
- jam auth login Store Jira credentials in this user's OS secret store
54
- jam runtime Show or change which JAM build this machine runs
52
+ serve Run the MCP server over stdio
53
+ doctor Diagnose config, credentials and Jira connectivity
54
+ setup Wire up JAM and verify (personal by default; --shared for the team)
55
+ auth login Store Jira credentials in this user's OS secret store
56
+ runtime Show or change which JAM build this machine runs
55
57
  ```
56
58
 
59
+ Written out, that is `npx --yes @jam-mcp/launcher@1.0.1 doctor`, or just `jam
60
+ doctor` if you took the launcher's optional global install. Starting from
61
+ nothing — no install, no runtime chosen yet — use
62
+ `npx --yes @jam-mcp/bootstrap@1.0.1 init` instead.
63
+
57
64
  Credentials come from the process environment or this user's OS secret store —
58
65
  never from a repository file — and never appear in logs, telemetry, or tool
59
66
  results. `stdout` is reserved for the MCP protocol and for JSON output;
@@ -1,3 +1,4 @@
1
+ import { LAUNCHER_PACKAGE_SPEC } from "@jam-mcp/launcher";
1
2
  /**
2
3
  * The canonical jam entry for a project's `.mcp.json`.
3
4
  *
@@ -9,10 +10,10 @@
9
10
  * Pinned to an exact version. A floating tag would silently change what a
10
11
  * teammate's editor launches.
11
12
  */
12
- export declare const LAUNCHER_PACKAGE_SPEC = "@jam-mcp/launcher@1.0.0";
13
+ export { LAUNCHER_PACKAGE_SPEC };
13
14
  export declare const JAM_MCP_ENTRY: {
14
15
  readonly command: "npx";
15
- readonly args: readonly ["--yes", "@jam-mcp/launcher@1.0.0", "serve"];
16
+ readonly args: readonly ["--yes", "@jam-mcp/launcher@1.0.1", "serve"];
16
17
  };
17
18
  /**
18
19
  * Recognise wiring from before the launcher existed: a hard-coded path to one
@@ -48,11 +49,11 @@ export declare function inspectMcpConfig(root: string): McpInspection;
48
49
  */
49
50
  export declare function writeJamMcpEntry(root: string, entry?: unknown): string;
50
51
  /**
51
- * Merge a PATH-based JAM entry into `.mcp.json`, preserving everything else.
52
+ * Merge the launcher entry into `.mcp.json`, preserving everything else.
52
53
  *
53
- * Deliberately does NOT record an absolute path to this JAM checkout - that
54
- * would break the moment a teammate clones to a different location. `command:
55
- * "jam"` relies on `jam` being on PATH (see `jam setup`'s PATH check), which is
56
- * what keeps this file safe to commit and share.
54
+ * Deliberately records neither an absolute path to a JAM checkout nor a bare
55
+ * `jam` - the first breaks the moment a teammate clones somewhere else, and
56
+ * the second assumes an optional global install every teammate would have to
57
+ * have made. `npx` at an exact launcher version assumes only npm.
57
58
  */
58
59
  export declare function mergeMcpConfig(root: string): McpMergeResult;
@@ -1,6 +1,6 @@
1
1
  import { existsSync, readFileSync, writeFileSync } from "node:fs";
2
2
  import { join } from "node:path";
3
- import { SERVER_VERSION } from "@jam-mcp/launcher";
3
+ import { LAUNCHER_PACKAGE_SPEC } from "@jam-mcp/launcher";
4
4
  /**
5
5
  * The canonical jam entry for a project's `.mcp.json`.
6
6
  *
@@ -12,7 +12,7 @@ import { SERVER_VERSION } from "@jam-mcp/launcher";
12
12
  * Pinned to an exact version. A floating tag would silently change what a
13
13
  * teammate's editor launches.
14
14
  */
15
- export const LAUNCHER_PACKAGE_SPEC = `@jam-mcp/launcher@${SERVER_VERSION}`;
15
+ export { LAUNCHER_PACKAGE_SPEC };
16
16
  export const JAM_MCP_ENTRY = {
17
17
  command: "npx",
18
18
  args: ["--yes", LAUNCHER_PACKAGE_SPEC, "serve"],
@@ -86,12 +86,12 @@ export function writeJamMcpEntry(root, entry = JAM_MCP_ENTRY) {
86
86
  return path;
87
87
  }
88
88
  /**
89
- * Merge a PATH-based JAM entry into `.mcp.json`, preserving everything else.
89
+ * Merge the launcher entry into `.mcp.json`, preserving everything else.
90
90
  *
91
- * Deliberately does NOT record an absolute path to this JAM checkout - that
92
- * would break the moment a teammate clones to a different location. `command:
93
- * "jam"` relies on `jam` being on PATH (see `jam setup`'s PATH check), which is
94
- * what keeps this file safe to commit and share.
91
+ * Deliberately records neither an absolute path to a JAM checkout nor a bare
92
+ * `jam` - the first breaks the moment a teammate clones somewhere else, and
93
+ * the second assumes an optional global install every teammate would have to
94
+ * have made. `npx` at an exact launcher version assumes only npm.
95
95
  */
96
96
  export function mergeMcpConfig(root) {
97
97
  const path = join(root, ".mcp.json");
@@ -57,6 +57,14 @@ export type SetupPlan = {
57
57
  }[];
58
58
  /** Why a requested migration was refused, when status is JAM_MIGRATION_TARGET_UNAVAILABLE. */
59
59
  migrationTarget?: MigrationTarget;
60
+ /**
61
+ * What a person or an agent has to do next.
62
+ *
63
+ * `command` is executable on a machine with nothing installed and no runtime
64
+ * configured - so it is an `npx` bootstrap invocation, never a bare `jam`.
65
+ * A human interface is free to render the short form; this field is the one
66
+ * a script runs, and a script has no PATH to rely on.
67
+ */
60
68
  nextAction?: {
61
69
  type: "authenticate" | "select_project" | "configure_runtime";
62
70
  command?: string;
@@ -3,6 +3,7 @@ import { CONFIG_RELATIVE_PATH } from "../config/load-config.js";
3
3
  import { hostRegistration } from "./host-mcp.js";
4
4
  import { projectBindingsPath } from "./project-bindings.js";
5
5
  import { decideProjectKey } from "./project-config-bootstrapper.js";
6
+ import { portableBootstrapCommand } from "@jam-mcp/launcher";
6
7
  /**
7
8
  * Decide what setup would do, changing nothing.
8
9
  *
@@ -47,7 +48,7 @@ export function computeSetupPlan(state, options = {}) {
47
48
  code: "JAM_PROJECT_SELECTION_REQUIRED",
48
49
  changes: [],
49
50
  requiresUserAction: true,
50
- nextAction: { type: "select_project", command: "jam setup --project <KEY>" },
51
+ nextAction: { type: "select_project", command: portableBootstrapCommand("setup --project <KEY>") },
51
52
  project: { root: state.project.root },
52
53
  };
53
54
  }
@@ -122,7 +123,7 @@ function finish(changes, state, project) {
122
123
  code: "JAM_RUNTIME_CONFIG_MISSING",
123
124
  changes,
124
125
  requiresUserAction: true,
125
- nextAction: { type: "configure_runtime", command: "jam runtime use package" },
126
+ nextAction: { type: "configure_runtime", command: portableBootstrapCommand("runtime use package") },
126
127
  project,
127
128
  };
128
129
  }
@@ -133,7 +133,7 @@ async function chooseRuntime(ui, options) {
133
133
  {
134
134
  value: "package",
135
135
  label: "Use JAM",
136
- hint: "Run the project-pinned package. Recommended for most users.",
136
+ hint: "Run the published JAM release. Recommended for most users.",
137
137
  },
138
138
  { value: "development", label: "Develop JAM", hint: "Run a local source checkout." },
139
139
  ], "Run: jam runtime use package");
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jam-mcp/server",
3
- "version": "1.0.0",
3
+ "version": "1.0.1",
4
4
  "description": "JAM (Jira Agent MCP) - agent-facing Jira access layer: MCP server, setup core, and CLI",
5
5
  "keywords": [
6
6
  "jira",
@@ -22,7 +22,7 @@
22
22
  "author": "colosair (https://github.com/colosair)",
23
23
  "type": "module",
24
24
  "bin": {
25
- "jam": "dist/index.js"
25
+ "jam-server": "dist/index.js"
26
26
  },
27
27
  "main": "dist/index.js",
28
28
  "types": "dist/index.d.ts",
@@ -41,7 +41,7 @@
41
41
  "test:watch": "vitest"
42
42
  },
43
43
  "dependencies": {
44
- "@jam-mcp/launcher": "1.0.0",
44
+ "@jam-mcp/launcher": "1.0.1",
45
45
  "@modelcontextprotocol/sdk": "^1.30.0",
46
46
  "yaml": "^2.9.0",
47
47
  "zod": "^4.4.3"