@jitera/connect 2.0.0 → 2.1.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/.claude-plugin/plugin.json +1 -1
- package/.codex-plugin/plugin.json +1 -1
- package/README.md +31 -0
- package/dist/bin/cli.js +101 -93
- package/dist/bin/cli.js.map +1 -1
- package/dist/bin/connect.js +3 -0
- package/dist/bin/connect.js.map +1 -1
- package/dist/bin/init.js +122 -119
- package/dist/bin/init.js.map +1 -1
- package/dist/bin/login.js +221 -211
- package/dist/bin/login.js.map +1 -1
- package/dist/bin/proxy.js +2 -1
- package/dist/bin/proxy.js.map +1 -1
- package/dist/bin/set-agent.d.ts +3 -0
- package/dist/bin/set-agent.d.ts.map +1 -0
- package/dist/bin/set-agent.js +165 -0
- package/dist/bin/set-agent.js.map +1 -0
- package/dist/cli-session.d.ts +12 -0
- package/dist/cli-session.d.ts.map +1 -1
- package/dist/cli-session.js +25 -0
- package/dist/cli-session.js.map +1 -1
- package/dist/exit.d.ts +8 -0
- package/dist/exit.d.ts.map +1 -0
- package/dist/exit.js +32 -0
- package/dist/exit.js.map +1 -0
- package/dist/graphql.d.ts +6 -0
- package/dist/graphql.d.ts.map +1 -1
- package/dist/graphql.js +58 -1
- package/dist/graphql.js.map +1 -1
- package/dist/hooks/user-prompt-submit.js +5 -2
- package/dist/hooks/user-prompt-submit.js.map +1 -1
- package/dist/project-marker.d.ts +1 -0
- package/dist/project-marker.d.ts.map +1 -1
- package/dist/project-marker.js +26 -0
- package/dist/project-marker.js.map +1 -1
- package/dist/proxy.d.ts +5 -1
- package/dist/proxy.d.ts.map +1 -1
- package/dist/proxy.js +42 -2
- package/dist/proxy.js.map +1 -1
- package/dist/select.d.ts +17 -0
- package/dist/select.d.ts.map +1 -1
- package/dist/select.js +164 -3
- package/dist/select.js.map +1 -1
- package/package.json +1 -1
- package/skills/jitera-memory/SKILL.md +6 -0
package/README.md
CHANGED
|
@@ -57,6 +57,37 @@ it refuses to run outside a git repository. instructions written above a repo
|
|
|
57
57
|
are invisible to anything that reads AGENTS.md from the repo root, and a
|
|
58
58
|
CLAUDE.md above a repo leaks into every project underneath it.
|
|
59
59
|
|
|
60
|
+
## choosing which agents a repo reads
|
|
61
|
+
|
|
62
|
+
```
|
|
63
|
+
npx @jitera/connect set-agent
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
a project's memory is partitioned per agent. by default a bound repo reads all
|
|
67
|
+
of them, which is right when the project is one thing and wrong when it is
|
|
68
|
+
five: everything the other agents know arrives as noise.
|
|
69
|
+
|
|
70
|
+
`set-agent` lists the project's published agents with checkboxes. move with the
|
|
71
|
+
arrow keys, press space to tick the ones this repo should read, and enter to
|
|
72
|
+
save. the current selection starts ticked, so re-running it shows today's state
|
|
73
|
+
rather than a blank slate. `a` ticks everything, `n` clears it.
|
|
74
|
+
|
|
75
|
+
the choice is written to `.jitera.json` as an `agents` list and committed with
|
|
76
|
+
it, so your teammates read the same agents you do.
|
|
77
|
+
|
|
78
|
+
```
|
|
79
|
+
npx @jitera/connect set-agent --agent=<id> --agent=<id> # skip the prompt
|
|
80
|
+
npx @jitera/connect set-agent --all # read every agent again
|
|
81
|
+
npx @jitera/connect set-agent --dry-run # show, do not write
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
saving nothing means every agent, which is the same as `--all`. memory that
|
|
85
|
+
belongs to no agent — anything written project-wide — is always read, whatever
|
|
86
|
+
you select, so a selection narrows the noise without hiding shared facts.
|
|
87
|
+
|
|
88
|
+
it needs the repo bound to a project first, because that is what says which
|
|
89
|
+
agents exist. run `init` if it is not.
|
|
90
|
+
|
|
60
91
|
## what applies where
|
|
61
92
|
|
|
62
93
|
the api key is global: one per user, per machine, stored by `login --install`.
|
package/dist/bin/cli.js
CHANGED
|
@@ -53,109 +53,117 @@ const USAGE = [
|
|
|
53
53
|
" --skip-skills write mcp config only, no skills or AGENTS.md",
|
|
54
54
|
" --mcp-url=<url> bypass discovery, for air-gapped or self-hosted setups",
|
|
55
55
|
].join("\n");
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
let studioUrl;
|
|
66
|
-
try {
|
|
67
|
-
studioUrl = resolveStudioUrl(args.environment);
|
|
68
|
-
}
|
|
69
|
-
catch (error) {
|
|
70
|
-
if (error instanceof UnknownEnvironmentError) {
|
|
71
|
-
process.stderr.write(`error: ${error.message}\n`);
|
|
72
|
-
process.exit(2);
|
|
56
|
+
// The body returns an exit code rather than calling process.exit(). Exiting
|
|
57
|
+
// while a handle opened by discovery is still closing aborts the process on
|
|
58
|
+
// Windows with a libuv assertion in async.c, so a command that had already
|
|
59
|
+
// printed the right answer still reported a crash to its caller.
|
|
60
|
+
async function main() {
|
|
61
|
+
const args = parseArgs(process.argv.slice(2));
|
|
62
|
+
if (args.help) {
|
|
63
|
+
process.stdout.write(`${USAGE}\n`);
|
|
64
|
+
return 0;
|
|
73
65
|
}
|
|
74
|
-
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
let
|
|
79
|
-
if (args.mcpUrl) {
|
|
80
|
-
mcpUrl = args.mcpUrl;
|
|
81
|
-
apiBaseUrl = "";
|
|
82
|
-
brand = DEFAULT_BRAND;
|
|
83
|
-
}
|
|
84
|
-
else {
|
|
66
|
+
if (args.unknown) {
|
|
67
|
+
process.stderr.write(`error: unrecognised argument "${args.unknown}"\n${USAGE}\n`);
|
|
68
|
+
return 2;
|
|
69
|
+
}
|
|
70
|
+
let studioUrl;
|
|
85
71
|
try {
|
|
86
|
-
|
|
87
|
-
mcpUrl = deployment.mcpUrl;
|
|
88
|
-
apiBaseUrl = deployment.apiBaseUrl;
|
|
89
|
-
brand = deployment.brand;
|
|
72
|
+
studioUrl = resolveStudioUrl(args.environment);
|
|
90
73
|
}
|
|
91
74
|
catch (error) {
|
|
92
|
-
if (error instanceof
|
|
75
|
+
if (error instanceof UnknownEnvironmentError) {
|
|
93
76
|
process.stderr.write(`error: ${error.message}\n`);
|
|
94
|
-
|
|
77
|
+
return 2;
|
|
95
78
|
}
|
|
96
79
|
throw error;
|
|
97
80
|
}
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
home: homedir(),
|
|
106
|
-
cwd: process.cwd(),
|
|
107
|
-
mcpUrl,
|
|
108
|
-
// A committed .jitera.json pins these configs to the repo's project, which is
|
|
109
|
-
// what makes a user-level key work without per-project setup.
|
|
110
|
-
projectUuid: readProjectMarker(process.cwd())?.project,
|
|
111
|
-
dryRun: args.dryRun,
|
|
112
|
-
};
|
|
113
|
-
const detected = ADAPTERS.filter((adapter) => adapter.detect(context));
|
|
114
|
-
if (detected.length === 0) {
|
|
115
|
-
process.stderr.write(`error: no supported assistant detected. Looked for: ${ADAPTERS.map((a) => a.label).join(", ")}.\n` +
|
|
116
|
-
`Claude Code and Codex install through their own plugin marketplaces, see the readme.\n`);
|
|
117
|
-
process.exit(1);
|
|
118
|
-
}
|
|
119
|
-
const results = [];
|
|
120
|
-
for (const adapter of detected) {
|
|
121
|
-
try {
|
|
122
|
-
results.push({
|
|
123
|
-
adapter,
|
|
124
|
-
result: args.uninstall ? adapter.uninstall(context) : adapter.install(context),
|
|
125
|
-
});
|
|
81
|
+
let mcpUrl;
|
|
82
|
+
let apiBaseUrl;
|
|
83
|
+
let brand;
|
|
84
|
+
if (args.mcpUrl) {
|
|
85
|
+
mcpUrl = args.mcpUrl;
|
|
86
|
+
apiBaseUrl = "";
|
|
87
|
+
brand = DEFAULT_BRAND;
|
|
126
88
|
}
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
89
|
+
else {
|
|
90
|
+
try {
|
|
91
|
+
const deployment = await discoverDeployment({ environment: args.environment, studioUrl: process.env["JITERA_STUDIO_URL"] });
|
|
92
|
+
mcpUrl = deployment.mcpUrl;
|
|
93
|
+
apiBaseUrl = deployment.apiBaseUrl;
|
|
94
|
+
brand = deployment.brand;
|
|
95
|
+
}
|
|
96
|
+
catch (error) {
|
|
97
|
+
if (error instanceof DiscoveryError) {
|
|
98
|
+
process.stderr.write(`error: ${error.message}\n`);
|
|
99
|
+
return 1;
|
|
100
|
+
}
|
|
101
|
+
throw error;
|
|
131
102
|
}
|
|
132
|
-
throw error;
|
|
133
103
|
}
|
|
104
|
+
if (args.print) {
|
|
105
|
+
process.stdout.write(`${JSON.stringify({ mcpUrl, apiBaseUrl, studioUrl }, undefined, 2)}\n`);
|
|
106
|
+
return 0;
|
|
107
|
+
}
|
|
108
|
+
const context = {
|
|
109
|
+
scope: args.scope,
|
|
110
|
+
home: homedir(),
|
|
111
|
+
cwd: process.cwd(),
|
|
112
|
+
mcpUrl,
|
|
113
|
+
// A committed .jitera.json pins these configs to the repo's project, which is
|
|
114
|
+
// what makes a user-level key work without per-project setup.
|
|
115
|
+
projectUuid: readProjectMarker(process.cwd())?.project,
|
|
116
|
+
dryRun: args.dryRun,
|
|
117
|
+
};
|
|
118
|
+
const detected = ADAPTERS.filter((adapter) => adapter.detect(context));
|
|
119
|
+
if (detected.length === 0) {
|
|
120
|
+
process.stderr.write(`error: no supported assistant detected. Looked for: ${ADAPTERS.map((a) => a.label).join(", ")}.\n` +
|
|
121
|
+
`Claude Code and Codex install through their own plugin marketplaces, see the readme.\n`);
|
|
122
|
+
return 1;
|
|
123
|
+
}
|
|
124
|
+
const results = [];
|
|
125
|
+
for (const adapter of detected) {
|
|
126
|
+
try {
|
|
127
|
+
results.push({
|
|
128
|
+
adapter,
|
|
129
|
+
result: args.uninstall ? adapter.uninstall(context) : adapter.install(context),
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
catch (error) {
|
|
133
|
+
if (error instanceof MalformedConfigError) {
|
|
134
|
+
process.stderr.write(`error: ${error.message}\n`);
|
|
135
|
+
return 1;
|
|
136
|
+
}
|
|
137
|
+
throw error;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
const theme = createTheme({ env: process.env, isTty: Boolean(process.stdout.isTTY) });
|
|
141
|
+
process.stdout.write(heading(theme, brand, args.uninstall ? "disconnect" : "connect"));
|
|
142
|
+
const verb = args.uninstall ? "removed from" : "written to";
|
|
143
|
+
for (const { adapter, result } of results) {
|
|
144
|
+
process.stdout.write(` ${result.changed ? theme.ok("✓") : theme.dim("–")} ${theme.bold(adapter.label)} ${theme.dim(`${result.changed ? verb : "already up to date in"} ${result.path}`)}\n`);
|
|
145
|
+
}
|
|
146
|
+
if (!args.skipSkills) {
|
|
147
|
+
const values = { BRAND: brand };
|
|
148
|
+
const targetDirs = [...new Set(detected.flatMap((adapter) => adapter.skillsDirs(context)))];
|
|
149
|
+
const skills = args.uninstall
|
|
150
|
+
? uninstallSkills({ packageRoot: PACKAGE_ROOT, targetDirs, dryRun: args.dryRun })
|
|
151
|
+
: installSkills({ packageRoot: PACKAGE_ROOT, targetDirs, values, dryRun: args.dryRun });
|
|
152
|
+
const skillVerb = args.uninstall ? "removed from" : "written to";
|
|
153
|
+
process.stdout.write(skills.changed
|
|
154
|
+
? ` ${theme.ok("✓")} ${theme.bold("Skills")} ${theme.dim(`${skills.skills.length} ${skillVerb} ${targetDirs.join(", ")}`)}\n`
|
|
155
|
+
: ` ${theme.dim("–")} ${theme.bold("Skills")} ${theme.dim(`already up to date in ${targetDirs.join(", ")}`)}\n`);
|
|
156
|
+
}
|
|
157
|
+
if (args.dryRun) {
|
|
158
|
+
process.stdout.write(`\n ${theme.dim("dry run, nothing was written")}\n`);
|
|
159
|
+
}
|
|
160
|
+
else if (!args.uninstall) {
|
|
161
|
+
process.stdout.write(`\n ${theme.dim("endpoint")} ${theme.accent(mcpUrl)}\n`);
|
|
162
|
+
process.stdout.write(` ${theme.dim("export JITERA_API_KEY=<your api key> before starting your assistant")}\n`);
|
|
163
|
+
process.stdout.write(` ${theme.dim("Optional:")} ${theme.accent("npx @jitera/connect init")} ` +
|
|
164
|
+
`${theme.dim("writes committable AGENTS.md instructions at the repo root")}\n`);
|
|
165
|
+
}
|
|
166
|
+
return 0;
|
|
134
167
|
}
|
|
135
|
-
|
|
136
|
-
process.stdout.write(heading(theme, brand, args.uninstall ? "disconnect" : "connect"));
|
|
137
|
-
const verb = args.uninstall ? "removed from" : "written to";
|
|
138
|
-
for (const { adapter, result } of results) {
|
|
139
|
-
process.stdout.write(` ${result.changed ? theme.ok("✓") : theme.dim("–")} ${theme.bold(adapter.label)} ${theme.dim(`${result.changed ? verb : "already up to date in"} ${result.path}`)}\n`);
|
|
140
|
-
}
|
|
141
|
-
if (!args.skipSkills) {
|
|
142
|
-
const values = { BRAND: brand };
|
|
143
|
-
const targetDirs = [...new Set(detected.flatMap((adapter) => adapter.skillsDirs(context)))];
|
|
144
|
-
const skills = args.uninstall
|
|
145
|
-
? uninstallSkills({ packageRoot: PACKAGE_ROOT, targetDirs, dryRun: args.dryRun })
|
|
146
|
-
: installSkills({ packageRoot: PACKAGE_ROOT, targetDirs, values, dryRun: args.dryRun });
|
|
147
|
-
const skillVerb = args.uninstall ? "removed from" : "written to";
|
|
148
|
-
process.stdout.write(skills.changed
|
|
149
|
-
? ` ${theme.ok("✓")} ${theme.bold("Skills")} ${theme.dim(`${skills.skills.length} ${skillVerb} ${targetDirs.join(", ")}`)}\n`
|
|
150
|
-
: ` ${theme.dim("–")} ${theme.bold("Skills")} ${theme.dim(`already up to date in ${targetDirs.join(", ")}`)}\n`);
|
|
151
|
-
}
|
|
152
|
-
if (args.dryRun) {
|
|
153
|
-
process.stdout.write(`\n ${theme.dim("dry run, nothing was written")}\n`);
|
|
154
|
-
}
|
|
155
|
-
else if (!args.uninstall) {
|
|
156
|
-
process.stdout.write(`\n ${theme.dim("endpoint")} ${theme.accent(mcpUrl)}\n`);
|
|
157
|
-
process.stdout.write(` ${theme.dim("export JITERA_API_KEY=<your api key> before starting your assistant")}\n`);
|
|
158
|
-
process.stdout.write(` ${theme.dim("Optional:")} ${theme.accent("npx @jitera/connect init")} ` +
|
|
159
|
-
`${theme.dim("writes committable AGENTS.md instructions at the repo root")}\n`);
|
|
160
|
-
}
|
|
168
|
+
process.exitCode = await main();
|
|
161
169
|
//# sourceMappingURL=cli.js.map
|
package/dist/bin/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/bin/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAC7C,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAE/C,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACtE,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrE,OAAO,EAAE,uBAAuB,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAE/E,MAAM,QAAQ,GAAuB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AACrD,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AAc/E,SAAS,SAAS,CAAC,IAAuB;IACxC,MAAM,IAAI,GAAS,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;IACvH,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC;YAAE,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;aACvE,IAAI,GAAG,KAAK,WAAW;YAAE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;aAC5C,IAAI,GAAG,KAAK,aAAa;YAAE,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;aACjD,IAAI,GAAG,KAAK,QAAQ;YAAE,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC;aAC1C,IAAI,GAAG,KAAK,WAAW;YAAE,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC;aAChD,IAAI,GAAG,KAAK,SAAS;YAAE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;aAC3C,IAAI,GAAG,KAAK,eAAe;YAAE,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;aACpD,IAAI,GAAG,CAAC,UAAU,CAAC,YAAY,CAAC;YAAE,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;aAC7E,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI;YAAE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;;YACvD,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC;IAC1B,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,KAAK,GAAG;IACZ,4DAA4D;IAC5D,EAAE;IACF,gCAAgC;IAChC,uCAAuC;IACvC,6BAA6B;IAC7B,EAAE;IACF,2EAA2E;IAC3E,iEAAiE;IACjE,iDAAiD;IACjD,0DAA0D;IAC1D,sEAAsE;IACtE,+EAA+E;CAChF,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAEb,MAAM,IAAI,GAAG,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/bin/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/bin/connect.js
CHANGED
package/dist/bin/connect.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connect.js","sourceRoot":"","sources":["../../src/bin/connect.ts"],"names":[],"mappings":";AACA,MAAM,CAAC,UAAU,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAE3C,IAAI,UAAU,KAAK,OAAO,EAAE,CAAC;IAC3B,MAAM,MAAM,CAAC,YAAY,CAAC,CAAC;AAC7B,CAAC;KAAM,IAAI,UAAU,KAAK,MAAM,EAAE,CAAC;IACjC,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC;AAC5B,CAAC;KAAM,IAAI,UAAU,KAAK,YAAY,EAAE,CAAC;IACvC,MAAM,MAAM,CAAC,iBAAiB,CAAC,CAAC;AAClC,CAAC;KAAM,CAAC;IACN,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC;AAC3B,CAAC"}
|
|
1
|
+
{"version":3,"file":"connect.js","sourceRoot":"","sources":["../../src/bin/connect.ts"],"names":[],"mappings":";AACA,MAAM,CAAC,UAAU,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAE3C,IAAI,UAAU,KAAK,OAAO,EAAE,CAAC;IAC3B,MAAM,MAAM,CAAC,YAAY,CAAC,CAAC;AAC7B,CAAC;KAAM,IAAI,UAAU,KAAK,MAAM,EAAE,CAAC;IACjC,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC;AAC5B,CAAC;KAAM,IAAI,UAAU,KAAK,WAAW,EAAE,CAAC;IACtC,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAC;AACjC,CAAC;KAAM,IAAI,UAAU,KAAK,YAAY,EAAE,CAAC;IACvC,MAAM,MAAM,CAAC,iBAAiB,CAAC,CAAC;AAClC,CAAC;KAAM,CAAC;IACN,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC;AAC3B,CAAC"}
|
package/dist/bin/init.js
CHANGED
|
@@ -12,6 +12,7 @@ import { resolveGitRoot } from "../install/project-root.js";
|
|
|
12
12
|
import { writeProjectMarker } from "../project-marker.js";
|
|
13
13
|
import { InvalidChoiceError, SelectCancelledError, chooseFrom } from "../select.js";
|
|
14
14
|
import { createTheme } from "../theme.js";
|
|
15
|
+
import { endWith, runCommand } from "../exit.js";
|
|
15
16
|
const PACKAGE_ROOT = join(dirname(fileURLToPath(import.meta.url)), "..", "..");
|
|
16
17
|
const USAGE = [
|
|
17
18
|
"usage: npx @jitera/connect init [--env=<environment>] [--project=<uuid>] [--dry-run]",
|
|
@@ -41,134 +42,136 @@ function parseArgs(argv) {
|
|
|
41
42
|
return args;
|
|
42
43
|
}
|
|
43
44
|
const theme = createTheme({ env: process.env, isTty: Boolean(process.stdout.isTTY) });
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
if (args.unknown) {
|
|
50
|
-
process.stderr.write(`error: unrecognised argument "${args.unknown}"\n${USAGE}\n`);
|
|
51
|
-
process.exit(2);
|
|
52
|
-
}
|
|
53
|
-
const projectRoot = resolveGitRoot(process.cwd());
|
|
54
|
-
if (!projectRoot) {
|
|
55
|
-
process.stderr.write("error: not inside a git repository. Instructions written outside a repository " +
|
|
56
|
-
"are invisible to assistants that read AGENTS.md from the repository root, and " +
|
|
57
|
-
"an out-of-repo CLAUDE.md leaks into every project below it. Run this from " +
|
|
58
|
-
"inside the repository you want to connect.\n");
|
|
59
|
-
process.exit(2);
|
|
60
|
-
}
|
|
61
|
-
let brand = DEFAULT_BRAND;
|
|
62
|
-
try {
|
|
63
|
-
const deployment = await discoverDeployment({
|
|
64
|
-
environment: args.environment,
|
|
65
|
-
studioUrl: process.env["JITERA_STUDIO_URL"],
|
|
66
|
-
});
|
|
67
|
-
brand = deployment.brand;
|
|
68
|
-
}
|
|
69
|
-
catch (error) {
|
|
70
|
-
if (error instanceof UnknownEnvironmentError) {
|
|
71
|
-
process.stderr.write(`error: ${error.message}\n`);
|
|
72
|
-
process.exit(2);
|
|
45
|
+
await runCommand(async () => {
|
|
46
|
+
const args = parseArgs(process.argv.slice(2));
|
|
47
|
+
if (args.help) {
|
|
48
|
+
process.stdout.write(`${USAGE}\n`);
|
|
49
|
+
endWith(0);
|
|
73
50
|
}
|
|
74
|
-
if (
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
51
|
+
if (args.unknown) {
|
|
52
|
+
process.stderr.write(`error: unrecognised argument "${args.unknown}"\n${USAGE}\n`);
|
|
53
|
+
endWith(2);
|
|
54
|
+
}
|
|
55
|
+
const projectRoot = resolveGitRoot(process.cwd());
|
|
56
|
+
if (!projectRoot) {
|
|
57
|
+
process.stderr.write("error: not inside a git repository. Instructions written outside a repository " +
|
|
58
|
+
"are invisible to assistants that read AGENTS.md from the repository root, and " +
|
|
59
|
+
"an out-of-repo CLAUDE.md leaks into every project below it. Run this from " +
|
|
60
|
+
"inside the repository you want to connect.\n");
|
|
61
|
+
endWith(2);
|
|
62
|
+
}
|
|
63
|
+
let brand = DEFAULT_BRAND;
|
|
85
64
|
try {
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
...session,
|
|
97
|
-
accessToken,
|
|
98
|
-
refreshToken: refreshed.refreshToken ?? session.refreshToken,
|
|
99
|
-
expiresAt: refreshed.expiresInSeconds
|
|
100
|
-
? Date.now() + refreshed.expiresInSeconds * 1000
|
|
101
|
-
: undefined,
|
|
102
|
-
});
|
|
103
|
-
}
|
|
104
|
-
const transport = { automationUrl: session.automationUrl, accessToken };
|
|
105
|
-
const organisations = await listOrganisations(transport);
|
|
106
|
-
const organisation = organisations.length > 1
|
|
107
|
-
? await chooseFrom({
|
|
108
|
-
items: organisations,
|
|
109
|
-
prompt: "Which organisation?",
|
|
110
|
-
label: (org) => `${org.name ?? org.slug}${org.personal ? " (personal)" : ""}`,
|
|
111
|
-
theme,
|
|
112
|
-
})
|
|
113
|
-
: organisations[0];
|
|
114
|
-
const projects = await listProjects(transport, organisation);
|
|
115
|
-
if (projects.length === 0) {
|
|
116
|
-
process.stdout.write(` ${theme.dim("this account has no projects here; pass --project=<uuid> to bind one")}\n`);
|
|
65
|
+
const deployment = await discoverDeployment({
|
|
66
|
+
environment: args.environment,
|
|
67
|
+
studioUrl: process.env["JITERA_STUDIO_URL"],
|
|
68
|
+
});
|
|
69
|
+
brand = deployment.brand;
|
|
70
|
+
}
|
|
71
|
+
catch (error) {
|
|
72
|
+
if (error instanceof UnknownEnvironmentError) {
|
|
73
|
+
process.stderr.write(`error: ${error.message}\n`);
|
|
74
|
+
endWith(2);
|
|
117
75
|
}
|
|
118
|
-
|
|
119
|
-
|
|
76
|
+
if (!(error instanceof DiscoveryError))
|
|
77
|
+
throw error;
|
|
78
|
+
process.stdout.write(` ${theme.dim(`offline, using the default brand "${brand}"`)}\n`);
|
|
79
|
+
}
|
|
80
|
+
// A stored login session ("login once") lets init pick the project here, so
|
|
81
|
+
// the binding lands in .jitera.json without another browser round-trip.
|
|
82
|
+
const session = loadCliSession();
|
|
83
|
+
let projectUuid = args.project;
|
|
84
|
+
let projectName;
|
|
85
|
+
if (!projectUuid && session) {
|
|
86
|
+
let accessToken = session.accessToken;
|
|
87
|
+
try {
|
|
88
|
+
if (isExpired(session)) {
|
|
89
|
+
if (!session.refreshToken) {
|
|
90
|
+
throw new DeviceFlowError("expired_token", "the stored sign-in expired. Run login again.");
|
|
91
|
+
}
|
|
92
|
+
const refreshed = await refreshAccessToken({
|
|
93
|
+
automationUrl: session.automationUrl,
|
|
94
|
+
refreshToken: session.refreshToken,
|
|
95
|
+
});
|
|
96
|
+
accessToken = refreshed.accessToken;
|
|
97
|
+
saveCliSession({
|
|
98
|
+
...session,
|
|
99
|
+
accessToken,
|
|
100
|
+
refreshToken: refreshed.refreshToken ?? session.refreshToken,
|
|
101
|
+
expiresAt: refreshed.expiresInSeconds
|
|
102
|
+
? Date.now() + refreshed.expiresInSeconds * 1000
|
|
103
|
+
: undefined,
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
const transport = { automationUrl: session.automationUrl, accessToken };
|
|
107
|
+
const organisations = await listOrganisations(transport);
|
|
108
|
+
const organisation = organisations.length > 1
|
|
120
109
|
? await chooseFrom({
|
|
121
|
-
items:
|
|
122
|
-
prompt: "Which
|
|
123
|
-
label: (
|
|
110
|
+
items: organisations,
|
|
111
|
+
prompt: "Which organisation?",
|
|
112
|
+
label: (org) => `${org.name ?? org.slug}${org.personal ? " (personal)" : ""}`,
|
|
124
113
|
theme,
|
|
125
114
|
})
|
|
126
|
-
:
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
115
|
+
: organisations[0];
|
|
116
|
+
const projects = await listProjects(transport, organisation);
|
|
117
|
+
if (projects.length === 0) {
|
|
118
|
+
process.stdout.write(` ${theme.dim("this account has no projects here; pass --project=<uuid> to bind one")}\n`);
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
const choice = projects.length > 1
|
|
122
|
+
? await chooseFrom({
|
|
123
|
+
items: projects,
|
|
124
|
+
prompt: "Which project does this repository belong to?",
|
|
125
|
+
label: (project) => project.name,
|
|
126
|
+
theme,
|
|
127
|
+
})
|
|
128
|
+
: projects[0];
|
|
129
|
+
projectUuid = choice?.uuid;
|
|
130
|
+
projectName = choice?.name;
|
|
131
|
+
if (projectName) {
|
|
132
|
+
process.stdout.write(` ${theme.dim("Project")} ${projectName}\n`);
|
|
133
|
+
}
|
|
131
134
|
}
|
|
132
135
|
}
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
136
|
+
catch (error) {
|
|
137
|
+
if (error instanceof SelectCancelledError) {
|
|
138
|
+
process.stderr.write(`\n error: cancelled.\n`);
|
|
139
|
+
endWith(130);
|
|
140
|
+
}
|
|
141
|
+
if (error instanceof InvalidChoiceError) {
|
|
142
|
+
process.stderr.write(`error: ${error.message}\n`);
|
|
143
|
+
endWith(2);
|
|
144
|
+
}
|
|
145
|
+
if (error instanceof DeviceFlowError || error instanceof GraphqlError) {
|
|
146
|
+
process.stdout.write(` ${theme.dim(`could not list projects (${error.message}); pass --project=<uuid>`)}\n`);
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
throw error;
|
|
150
|
+
}
|
|
148
151
|
}
|
|
149
152
|
}
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
153
|
+
else if (!projectUuid) {
|
|
154
|
+
process.stdout.write(` ${theme.dim("sign in once with the login command to pick a project here, or pass --project=<uuid>")}\n`);
|
|
155
|
+
}
|
|
156
|
+
const result = writeAgentsMd({
|
|
157
|
+
packageRoot: PACKAGE_ROOT,
|
|
158
|
+
projectRoot,
|
|
159
|
+
values: { BRAND: brand },
|
|
160
|
+
dryRun: args.dryRun,
|
|
161
|
+
});
|
|
162
|
+
process.stdout.write(` ${result.agents.changed ? theme.ok("✓") : theme.dim("–")} ${theme.bold("AGENTS.md")} ${theme.dim(`${result.agents.action} in ${result.agentsPath}`)}\n`);
|
|
163
|
+
process.stdout.write(` ${result.claude.changed ? theme.ok("✓") : theme.dim("–")} ${theme.bold("CLAUDE.md")} ${theme.dim(`${result.claude.action} in ${result.claudePath}`)}\n`);
|
|
164
|
+
const environment = args.environment ?? session?.environment ?? "studio";
|
|
165
|
+
const marker = writeProjectMarker(projectRoot, {
|
|
166
|
+
environment,
|
|
167
|
+
...(projectUuid ? { project: projectUuid } : {}),
|
|
168
|
+
}, args.dryRun);
|
|
169
|
+
process.stdout.write(` ${marker.changed ? theme.ok("✓") : theme.dim("–")} ${theme.bold(".jitera.json")} ${theme.dim(`environment "${environment}"${projectUuid ? `, project ${projectUuid}` : ""}`)}\n`);
|
|
170
|
+
if (args.dryRun) {
|
|
171
|
+
process.stdout.write(`\n ${theme.dim("dry run, nothing was written")}\n`);
|
|
172
|
+
}
|
|
173
|
+
else if (result.changed || marker.changed) {
|
|
174
|
+
process.stdout.write(`\n ${theme.dim("Commit these files so the whole team's assistants read them.")}\n`);
|
|
175
|
+
}
|
|
159
176
|
});
|
|
160
|
-
process.stdout.write(` ${result.agents.changed ? theme.ok("✓") : theme.dim("–")} ${theme.bold("AGENTS.md")} ${theme.dim(`${result.agents.action} in ${result.agentsPath}`)}\n`);
|
|
161
|
-
process.stdout.write(` ${result.claude.changed ? theme.ok("✓") : theme.dim("–")} ${theme.bold("CLAUDE.md")} ${theme.dim(`${result.claude.action} in ${result.claudePath}`)}\n`);
|
|
162
|
-
const environment = args.environment ?? session?.environment ?? "studio";
|
|
163
|
-
const marker = writeProjectMarker(projectRoot, {
|
|
164
|
-
environment,
|
|
165
|
-
...(projectUuid ? { project: projectUuid } : {}),
|
|
166
|
-
}, args.dryRun);
|
|
167
|
-
process.stdout.write(` ${marker.changed ? theme.ok("✓") : theme.dim("–")} ${theme.bold(".jitera.json")} ${theme.dim(`environment "${environment}"${projectUuid ? `, project ${projectUuid}` : ""}`)}\n`);
|
|
168
|
-
if (args.dryRun) {
|
|
169
|
-
process.stdout.write(`\n ${theme.dim("dry run, nothing was written")}\n`);
|
|
170
|
-
}
|
|
171
|
-
else if (result.changed || marker.changed) {
|
|
172
|
-
process.stdout.write(`\n ${theme.dim("Commit these files so the whole team's assistants read them.")}\n`);
|
|
173
|
-
}
|
|
174
177
|
//# sourceMappingURL=init.js.map
|
package/dist/bin/init.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/bin/init.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrE,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAC9E,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACxE,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC9E,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AACpF,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/bin/init.ts"],"names":[],"mappings":"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"}
|