@sascha384/tic 2.0.0 → 2.1.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/.claude-plugin/plugin.json +1 -1
- package/README.md +17 -63
- package/dist/auth/github.d.ts +27 -0
- package/dist/auth/github.js +96 -0
- package/dist/auth/github.js.map +1 -0
- package/dist/auth/index.d.ts +3 -0
- package/dist/auth/index.js +3 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/keychain.d.ts +14 -0
- package/dist/auth/keychain.js +36 -0
- package/dist/auth/keychain.js.map +1 -0
- package/dist/backends/factory.d.ts +5 -2
- package/dist/backends/factory.js +4 -4
- package/dist/backends/factory.js.map +1 -1
- package/dist/backends/github/api.d.ts +9 -0
- package/dist/backends/github/api.js +117 -0
- package/dist/backends/github/api.js.map +1 -0
- package/dist/backends/github/index.d.ts +9 -5
- package/dist/backends/github/index.js +119 -81
- package/dist/backends/github/index.js.map +1 -1
- package/dist/backends/github/mappers.d.ts +1 -0
- package/dist/backends/github/mappers.js.map +1 -1
- package/dist/backends/shared/api-client.d.ts +16 -0
- package/dist/backends/shared/api-client.js +73 -0
- package/dist/backends/shared/api-client.js.map +1 -0
- package/dist/cli/commands/auth.d.ts +17 -0
- package/dist/cli/commands/auth.js +47 -0
- package/dist/cli/commands/auth.js.map +1 -0
- package/dist/cli/commands/mcp.js +32 -9
- package/dist/cli/commands/mcp.js.map +1 -1
- package/dist/cli/index.js +58 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/components/AutocompleteInput.d.ts +2 -1
- package/dist/components/AutocompleteInput.js +5 -1
- package/dist/components/AutocompleteInput.js.map +1 -1
- package/dist/components/MultiAutocompleteInput.d.ts +2 -1
- package/dist/components/MultiAutocompleteInput.js +5 -1
- package/dist/components/MultiAutocompleteInput.js.map +1 -1
- package/dist/components/WorkItemForm.js +12 -0
- package/dist/components/WorkItemForm.js.map +1 -1
- package/dist/stores/backendDataStore.js +12 -1
- package/dist/stores/backendDataStore.js.map +1 -1
- package/drizzle/0000_next_vance_astro.sql +183 -0
- package/drizzle/meta/0000_snapshot.json +1188 -0
- package/drizzle/meta/_journal.json +13 -0
- package/package.json +4 -1
- package/skills/config/SKILL.md +2 -2
- package/dist/backends/github/gh.d.ts +0 -9
- package/dist/backends/github/gh.js +0 -95
- package/dist/backends/github/gh.js.map +0 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sascha384/tic",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.1.0",
|
|
4
4
|
"description": "Terminal UI for issue tracking",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
},
|
|
9
9
|
"files": [
|
|
10
10
|
"dist",
|
|
11
|
+
"drizzle",
|
|
11
12
|
"README.md",
|
|
12
13
|
".claude-plugin",
|
|
13
14
|
".mcp.json",
|
|
@@ -35,6 +36,7 @@
|
|
|
35
36
|
},
|
|
36
37
|
"dependencies": {
|
|
37
38
|
"@modelcontextprotocol/sdk": "^1.25.3",
|
|
39
|
+
"@napi-rs/keyring": "^1.2.0",
|
|
38
40
|
"better-sqlite3": "^12.6.2",
|
|
39
41
|
"commander": "^14.0.3",
|
|
40
42
|
"drizzle-orm": "^0.45.1",
|
|
@@ -42,6 +44,7 @@
|
|
|
42
44
|
"ink-select-input": "^6.2.0",
|
|
43
45
|
"ink-spinner": "^5.0.0",
|
|
44
46
|
"ink-text-input": "^6.0.0",
|
|
47
|
+
"open": "^11.0.0",
|
|
45
48
|
"react": "^19.2.4",
|
|
46
49
|
"semver": "^7.7.3",
|
|
47
50
|
"turndown": "^7.2.2",
|
package/skills/config/SKILL.md
CHANGED
|
@@ -16,7 +16,7 @@ Creates a `.tic/` directory in the current project. Call this first if other too
|
|
|
16
16
|
### get_config
|
|
17
17
|
|
|
18
18
|
Returns project configuration:
|
|
19
|
-
- `backend` — current backend type (
|
|
19
|
+
- `backend` — current backend type (none, github, gitlab, azure, jira)
|
|
20
20
|
- `statuses` — available status values
|
|
21
21
|
- `types` — available work item types
|
|
22
22
|
- `iterations` — configured iterations
|
|
@@ -27,7 +27,7 @@ Returns project configuration:
|
|
|
27
27
|
|
|
28
28
|
### set_backend
|
|
29
29
|
|
|
30
|
-
Switch between backends: `
|
|
30
|
+
Switch between backends: `none`, `github`, `gitlab`, `azure`, `jira`.
|
|
31
31
|
|
|
32
32
|
The backend is auto-detected from git remotes, but can be overridden.
|
|
33
33
|
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
/** Sync variant — only for constructor use (auth check). */
|
|
2
|
-
export declare function ghSync<T>(args: string[], cwd: string): T;
|
|
3
|
-
/** Sync variant — only for constructor use (auth check). */
|
|
4
|
-
export declare function ghExecSync(args: string[], cwd: string): string;
|
|
5
|
-
export declare function gh<T>(args: string[], cwd: string): Promise<T>;
|
|
6
|
-
export declare function ghExec(args: string[], cwd: string): Promise<string>;
|
|
7
|
-
export declare function ghGraphQL<T>(query: string, variables: Record<string, string | number | null>, cwd: string): Promise<T>;
|
|
8
|
-
/** Sync variant — only for getItemUrl() which must return string synchronously. */
|
|
9
|
-
export declare function ghGraphQLSync<T>(query: string, variables: Record<string, string | number | null>, cwd: string): T;
|
|
@@ -1,95 +0,0 @@
|
|
|
1
|
-
import { execFile, execFileSync } from 'node:child_process';
|
|
2
|
-
import { promisify } from 'node:util';
|
|
3
|
-
const execFileAsync = promisify(execFile);
|
|
4
|
-
/** Sync variant — only for constructor use (auth check). */
|
|
5
|
-
export function ghSync(args, cwd) {
|
|
6
|
-
const result = execFileSync('gh', args, {
|
|
7
|
-
cwd,
|
|
8
|
-
encoding: 'utf-8',
|
|
9
|
-
stdio: ['pipe', 'pipe', 'pipe'],
|
|
10
|
-
});
|
|
11
|
-
return JSON.parse(result);
|
|
12
|
-
}
|
|
13
|
-
/** Sync variant — only for constructor use (auth check). */
|
|
14
|
-
export function ghExecSync(args, cwd) {
|
|
15
|
-
return execFileSync('gh', args, {
|
|
16
|
-
cwd,
|
|
17
|
-
encoding: 'utf-8',
|
|
18
|
-
stdio: ['pipe', 'pipe', 'pipe'],
|
|
19
|
-
});
|
|
20
|
-
}
|
|
21
|
-
export async function gh(args, cwd) {
|
|
22
|
-
const { stdout } = await execFileAsync('gh', args, {
|
|
23
|
-
cwd,
|
|
24
|
-
encoding: 'utf-8',
|
|
25
|
-
});
|
|
26
|
-
return JSON.parse(stdout);
|
|
27
|
-
}
|
|
28
|
-
export async function ghExec(args, cwd) {
|
|
29
|
-
const { stdout } = await execFileAsync('gh', args, {
|
|
30
|
-
cwd,
|
|
31
|
-
encoding: 'utf-8',
|
|
32
|
-
});
|
|
33
|
-
return stdout;
|
|
34
|
-
}
|
|
35
|
-
export async function ghGraphQL(query, variables, cwd) {
|
|
36
|
-
const args = [
|
|
37
|
-
'api',
|
|
38
|
-
'graphql',
|
|
39
|
-
'-H',
|
|
40
|
-
'GraphQL-Features: sub_issues',
|
|
41
|
-
'-f',
|
|
42
|
-
`query=${query}`,
|
|
43
|
-
];
|
|
44
|
-
for (const [key, value] of Object.entries(variables)) {
|
|
45
|
-
if (value === null || value === undefined)
|
|
46
|
-
continue;
|
|
47
|
-
if (typeof value === 'number') {
|
|
48
|
-
args.push('-F', `${key}=${value}`);
|
|
49
|
-
}
|
|
50
|
-
else {
|
|
51
|
-
args.push('-f', `${key}=${value}`);
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
const { stdout } = await execFileAsync('gh', args, {
|
|
55
|
-
cwd,
|
|
56
|
-
encoding: 'utf-8',
|
|
57
|
-
});
|
|
58
|
-
const parsed = JSON.parse(stdout);
|
|
59
|
-
if (parsed.errors?.length) {
|
|
60
|
-
throw new Error(`GraphQL error: ${parsed.errors[0].message}`);
|
|
61
|
-
}
|
|
62
|
-
return parsed.data;
|
|
63
|
-
}
|
|
64
|
-
/** Sync variant — only for getItemUrl() which must return string synchronously. */
|
|
65
|
-
export function ghGraphQLSync(query, variables, cwd) {
|
|
66
|
-
const args = [
|
|
67
|
-
'api',
|
|
68
|
-
'graphql',
|
|
69
|
-
'-H',
|
|
70
|
-
'GraphQL-Features: sub_issues',
|
|
71
|
-
'-f',
|
|
72
|
-
`query=${query}`,
|
|
73
|
-
];
|
|
74
|
-
for (const [key, value] of Object.entries(variables)) {
|
|
75
|
-
if (value === null || value === undefined)
|
|
76
|
-
continue;
|
|
77
|
-
if (typeof value === 'number') {
|
|
78
|
-
args.push('-F', `${key}=${value}`);
|
|
79
|
-
}
|
|
80
|
-
else {
|
|
81
|
-
args.push('-f', `${key}=${value}`);
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
const result = execFileSync('gh', args, {
|
|
85
|
-
cwd,
|
|
86
|
-
encoding: 'utf-8',
|
|
87
|
-
stdio: ['pipe', 'pipe', 'pipe'],
|
|
88
|
-
});
|
|
89
|
-
const parsed = JSON.parse(result);
|
|
90
|
-
if (parsed.errors?.length) {
|
|
91
|
-
throw new Error(`GraphQL error: ${parsed.errors[0].message}`);
|
|
92
|
-
}
|
|
93
|
-
return parsed.data;
|
|
94
|
-
}
|
|
95
|
-
//# sourceMappingURL=gh.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"gh.js","sourceRoot":"","sources":["../../../src/backends/github/gh.ts"],"names":[],"mappings":"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"}
|