@ethlete/agent-rules 0.1.0-next.8 → 0.1.0-next.9

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.
@@ -0,0 +1,110 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.timetrackAddWorklog = exports.timetrackCreateIssue = exports.timetrackRepoProject = exports.timetrackSearch = exports.timetrackIssue = exports.timetrackStatus = exports.askTimetrack = exports.timetrackDiscoveryPath = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const fs_1 = require("fs");
6
+ const os_1 = require("os");
7
+ const path_1 = require("path");
8
+ /** The Timetrack app's bundle identifier, which is also the name of its data directory. */
9
+ const IDENTIFIER = 'io.ethlete.timetrack';
10
+ const DISCOVERY_FILENAME = 'agent.json';
11
+ /**
12
+ * The contract version this client speaks. The app writes its own into the discovery file, and a
13
+ * mismatch stops here rather than at a field that is missing for a reason nobody can see.
14
+ */
15
+ const PROTOCOL_VERSION = 1;
16
+ /** A Jira search behind a slow instance is the long case; the app's own deadline is 60 seconds. */
17
+ const TIMEOUT_MS = 70000;
18
+ const PATH = '/agent';
19
+ const NOT_RUNNING = [
20
+ 'Timetrack is not running, so no Jira credentials are reachable.',
21
+ 'Start the app — it holds the token for every repository on this machine — then try again.',
22
+ ].join('\n');
23
+ /**
24
+ * Where the app writes the port and the token, which is its data directory on each platform.
25
+ *
26
+ * `TIMETRACK_AGENT_DISCOVERY` names the file directly, for a machine whose app data lives somewhere
27
+ * else and for a test.
28
+ */
29
+ const timetrackDiscoveryPath = () => {
30
+ var _a, _b, _c;
31
+ const override = (_a = process.env['TIMETRACK_AGENT_DISCOVERY']) === null || _a === void 0 ? void 0 : _a.trim();
32
+ if (override)
33
+ return override;
34
+ const home = (0, os_1.homedir)();
35
+ if ((0, os_1.platform)() === 'darwin')
36
+ return (0, path_1.join)(home, 'Library', 'Application Support', IDENTIFIER, DISCOVERY_FILENAME);
37
+ if ((0, os_1.platform)() === 'win32') {
38
+ const appData = (_b = process.env['APPDATA']) === null || _b === void 0 ? void 0 : _b.trim();
39
+ return (0, path_1.join)(appData || (0, path_1.join)(home, 'AppData', 'Roaming'), IDENTIFIER, DISCOVERY_FILENAME);
40
+ }
41
+ const dataHome = (_c = process.env['XDG_DATA_HOME']) === null || _c === void 0 ? void 0 : _c.trim();
42
+ return (0, path_1.join)(dataHome || (0, path_1.join)(home, '.local', 'share'), IDENTIFIER, DISCOVERY_FILENAME);
43
+ };
44
+ exports.timetrackDiscoveryPath = timetrackDiscoveryPath;
45
+ const readDiscovery = () => {
46
+ const path = (0, exports.timetrackDiscoveryPath)();
47
+ if (!(0, fs_1.existsSync)(path))
48
+ throw new Error(NOT_RUNNING);
49
+ let parsed;
50
+ try {
51
+ parsed = JSON.parse((0, fs_1.readFileSync)(path, 'utf8'));
52
+ }
53
+ catch (_a) {
54
+ throw new Error(`${path} is not readable JSON. Restart Timetrack, which rewrites it at every start.`);
55
+ }
56
+ const discovery = parsed;
57
+ if (typeof discovery.port !== 'number' || typeof discovery.token !== 'string') {
58
+ throw new Error(`${path} names no port and token. Restart Timetrack, which rewrites it at every start.`);
59
+ }
60
+ if (discovery.version !== PROTOCOL_VERSION) {
61
+ throw new Error(`Timetrack speaks version ${discovery.version} of the agent contract and this CLI speaks ${PROTOCOL_VERSION}. Update whichever is older.`);
62
+ }
63
+ return { version: discovery.version, port: discovery.port, token: discovery.token };
64
+ };
65
+ /**
66
+ * Asks the running Timetrack app to carry out one operation.
67
+ *
68
+ * It is the only way this package reaches Jira. The token lives in the app's keychain entry and in no
69
+ * repository, so a checkout an agent works in holds nothing worth stealing and nothing to rotate.
70
+ */
71
+ const askTimetrack = (request) => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
72
+ const discovery = readDiscovery();
73
+ let response;
74
+ try {
75
+ response = yield fetch(`http://127.0.0.1:${discovery.port}${PATH}`, {
76
+ method: 'POST',
77
+ headers: { authorization: `Bearer ${discovery.token}`, 'content-type': 'application/json' },
78
+ body: JSON.stringify(request),
79
+ signal: AbortSignal.timeout(TIMEOUT_MS),
80
+ });
81
+ }
82
+ catch (_a) {
83
+ // The file is there and the socket is not, which is what a discovery file left behind by an app
84
+ // that has since stopped looks like.
85
+ throw new Error(NOT_RUNNING);
86
+ }
87
+ if (response.status === 401) {
88
+ throw new Error('Timetrack refused the token. It writes a new one at every start — restart the app.');
89
+ }
90
+ if (!response.ok)
91
+ throw new Error(`Timetrack answered ${response.status} ${response.statusText}.`);
92
+ const answer = (yield response.json());
93
+ if (!answer.ok)
94
+ throw new Error(answer.message);
95
+ return answer.value;
96
+ });
97
+ exports.askTimetrack = askTimetrack;
98
+ const timetrackStatus = () => (0, exports.askTimetrack)({ op: 'status' });
99
+ exports.timetrackStatus = timetrackStatus;
100
+ const timetrackIssue = (key) => tslib_1.__awaiter(void 0, void 0, void 0, function* () { return (yield (0, exports.askTimetrack)({ op: 'jira.issue', key })).issue; });
101
+ exports.timetrackIssue = timetrackIssue;
102
+ const timetrackSearch = (options) => tslib_1.__awaiter(void 0, void 0, void 0, function* () { return (yield (0, exports.askTimetrack)(Object.assign({ op: 'jira.search' }, options))).issues; });
103
+ exports.timetrackSearch = timetrackSearch;
104
+ const timetrackRepoProject = (repoPath) => (0, exports.askTimetrack)({ op: 'repo.project', repoPath });
105
+ exports.timetrackRepoProject = timetrackRepoProject;
106
+ const timetrackCreateIssue = (options) => tslib_1.__awaiter(void 0, void 0, void 0, function* () { return (yield (0, exports.askTimetrack)(Object.assign({ op: 'jira.create' }, options))).issue; });
107
+ exports.timetrackCreateIssue = timetrackCreateIssue;
108
+ const timetrackAddWorklog = (options) => tslib_1.__awaiter(void 0, void 0, void 0, function* () { return (yield (0, exports.askTimetrack)(Object.assign({ op: 'worklog.add' }, options))).worklog; });
109
+ exports.timetrackAddWorklog = timetrackAddWorklog;
110
+ //# sourceMappingURL=timetrack.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timetrack.js","sourceRoot":"","sources":["../../../../../libs/agent-rules/src/lib/timetrack.ts"],"names":[],"mappings":"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"}
package/src/lib/jira.d.ts DELETED
@@ -1,28 +0,0 @@
1
- import { JiraSettings } from './config';
2
- export type JiraCredentials = {
3
- host: string;
4
- email: string;
5
- token: string;
6
- };
7
- export type JiraIssue = {
8
- key: string;
9
- summary: string;
10
- issueType: string;
11
- /** The parent issue, when the instance reports one — a Task under its Story. */
12
- parentKey?: string;
13
- /** The configured subject field's value, when the instance has one and this issue sets it. */
14
- subject?: string;
15
- };
16
- /**
17
- * The host may also be committed in `ethlete-agents.config.json` (it is not a secret); the email and
18
- * token may only come from the environment or the gitignored local config.
19
- */
20
- export declare const resolveJiraCredentials: (options: {
21
- root: string;
22
- settings: JiraSettings;
23
- }) => JiraCredentials;
24
- export declare const fetchJiraIssue: (options: {
25
- key: string;
26
- credentials: JiraCredentials;
27
- settings: JiraSettings;
28
- }) => Promise<JiraIssue>;
package/src/lib/jira.js DELETED
@@ -1,83 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.fetchJiraIssue = exports.resolveJiraCredentials = void 0;
4
- const tslib_1 = require("tslib");
5
- const config_1 = require("./config");
6
- const TIMEOUT_MS = 15000;
7
- const readEnv = (name) => {
8
- var _a;
9
- const value = (_a = process.env[name]) === null || _a === void 0 ? void 0 : _a.trim();
10
- return value ? value : undefined;
11
- };
12
- const normalizeHost = (host) => {
13
- const withScheme = /^https?:\/\//.test(host) ? host : `https://${host}`;
14
- return withScheme.replace(/\/+$/, '');
15
- };
16
- const CREDENTIAL_HELP = [
17
- `Set JIRA_HOST, JIRA_EMAIL and JIRA_API_TOKEN, or add a "jira" block to ${config_1.LOCAL_CONFIG_FILE_NAME} (gitignored):`,
18
- ' { "jira": { "host": "https://your-team.atlassian.net", "email": "you@example.com", "token": "…" } }',
19
- 'Create a token at https://id.atlassian.com/manage-profile/security/api-tokens.',
20
- ].join('\n');
21
- /**
22
- * The host may also be committed in `ethlete-agents.config.json` (it is not a secret); the email and
23
- * token may only come from the environment or the gitignored local config.
24
- */
25
- const resolveJiraCredentials = (options) => {
26
- var _a, _b, _c, _d, _e;
27
- const local = (0, config_1.readLocalConfig)(options.root);
28
- const localJira = (_a = (local.exists && local.valid ? local.config.jira : undefined)) !== null && _a !== void 0 ? _a : {};
29
- const host = (_c = (_b = readEnv('JIRA_HOST')) !== null && _b !== void 0 ? _b : localJira.host) !== null && _c !== void 0 ? _c : options.settings.host;
30
- const email = (_d = readEnv('JIRA_EMAIL')) !== null && _d !== void 0 ? _d : localJira.email;
31
- const token = (_e = readEnv('JIRA_API_TOKEN')) !== null && _e !== void 0 ? _e : localJira.token;
32
- const missing = [...(host ? [] : ['host']), ...(email ? [] : ['email']), ...(token ? [] : ['API token'])];
33
- if (!host || !email || !token) {
34
- throw new Error(`Jira is not configured — missing ${missing.join(', ')}.\n${CREDENTIAL_HELP}`);
35
- }
36
- return { host: normalizeHost(host), email, token };
37
- };
38
- exports.resolveJiraCredentials = resolveJiraCredentials;
39
- const request = (options) => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
40
- const { url, credentials, describe } = options;
41
- const authorization = Buffer.from(`${credentials.email}:${credentials.token}`).toString('base64');
42
- const response = yield fetch(url, {
43
- headers: { authorization: `Basic ${authorization}`, accept: 'application/json' },
44
- signal: AbortSignal.timeout(TIMEOUT_MS),
45
- });
46
- if (response.status === 401 || response.status === 403) {
47
- throw new Error(`Jira rejected the credentials (${response.status}).\n${CREDENTIAL_HELP}`);
48
- }
49
- if (response.status === 404)
50
- throw new Error(`Jira has no ${describe}, or the token cannot see it.`);
51
- if (!response.ok)
52
- throw new Error(`Jira responded ${response.status} ${response.statusText} for ${describe}.`);
53
- return (yield response.json());
54
- });
55
- /**
56
- * A branch subject must be a plain string. A rich-text or select field configured as the subject
57
- * field yields an object, which is a misconfiguration to report rather than something to stringify.
58
- */
59
- const readSubjectField = (fields, field) => {
60
- if (!field)
61
- return undefined;
62
- const value = fields[field];
63
- return typeof value === 'string' && value.trim() ? value.trim() : undefined;
64
- };
65
- const fetchJiraIssue = (options) => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
66
- var _a, _b, _c, _d, _e, _f, _g, _h, _j;
67
- const { key, credentials, settings } = options;
68
- const fields = ['summary', 'issuetype', 'parent', ...(settings.subjectField ? [settings.subjectField] : [])];
69
- const issue = (yield request({
70
- url: `${credentials.host}/rest/api/3/issue/${encodeURIComponent(key)}?fields=${fields.join(',')}`,
71
- credentials,
72
- describe: `issue ${key}`,
73
- }));
74
- return {
75
- key: (_a = issue.key) !== null && _a !== void 0 ? _a : key,
76
- summary: (_c = (_b = issue.fields) === null || _b === void 0 ? void 0 : _b.summary) !== null && _c !== void 0 ? _c : '',
77
- issueType: (_f = (_e = (_d = issue.fields) === null || _d === void 0 ? void 0 : _d.issuetype) === null || _e === void 0 ? void 0 : _e.name) !== null && _f !== void 0 ? _f : '',
78
- parentKey: (_h = (_g = issue.fields) === null || _g === void 0 ? void 0 : _g.parent) === null || _h === void 0 ? void 0 : _h.key,
79
- subject: readSubjectField((_j = issue.fields) !== null && _j !== void 0 ? _j : {}, settings.subjectField),
80
- };
81
- });
82
- exports.fetchJiraIssue = fetchJiraIssue;
83
- //# sourceMappingURL=jira.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"jira.js","sourceRoot":"","sources":["../../../../../libs/agent-rules/src/lib/jira.ts"],"names":[],"mappings":"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"}