@sascha384/tic 0.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/LICENSE +21 -0
- package/README.md +221 -0
- package/dist/app.d.ts +17 -0
- package/dist/app.js +27 -0
- package/dist/app.js.map +1 -0
- package/dist/backends/factory.d.ts +5 -0
- package/dist/backends/factory.js +42 -0
- package/dist/backends/factory.js.map +1 -0
- package/dist/backends/github/gh.d.ts +2 -0
- package/dist/backends/github/gh.js +17 -0
- package/dist/backends/github/gh.js.map +1 -0
- package/dist/backends/github/index.d.ts +26 -0
- package/dist/backends/github/index.js +188 -0
- package/dist/backends/github/index.js.map +1 -0
- package/dist/backends/github/mappers.d.ts +33 -0
- package/dist/backends/github/mappers.js +26 -0
- package/dist/backends/github/mappers.js.map +1 -0
- package/dist/backends/gitlab/glab.d.ts +2 -0
- package/dist/backends/gitlab/glab.js +17 -0
- package/dist/backends/gitlab/glab.js.map +1 -0
- package/dist/backends/gitlab/group.d.ts +1 -0
- package/dist/backends/gitlab/group.js +33 -0
- package/dist/backends/gitlab/group.js.map +1 -0
- package/dist/backends/gitlab/index.d.ts +29 -0
- package/dist/backends/gitlab/index.js +296 -0
- package/dist/backends/gitlab/index.js.map +1 -0
- package/dist/backends/gitlab/mappers.d.ts +43 -0
- package/dist/backends/gitlab/mappers.js +44 -0
- package/dist/backends/gitlab/mappers.js.map +1 -0
- package/dist/backends/local/config.d.ts +12 -0
- package/dist/backends/local/config.js +28 -0
- package/dist/backends/local/config.js.map +1 -0
- package/dist/backends/local/index.d.ts +26 -0
- package/dist/backends/local/index.js +212 -0
- package/dist/backends/local/index.js.map +1 -0
- package/dist/backends/local/items.d.ts +6 -0
- package/dist/backends/local/items.js +118 -0
- package/dist/backends/local/items.js.map +1 -0
- package/dist/backends/types.d.ts +56 -0
- package/dist/backends/types.js +39 -0
- package/dist/backends/types.js.map +1 -0
- package/dist/cli/commands/config.d.ts +2 -0
- package/dist/cli/commands/config.js +40 -0
- package/dist/cli/commands/config.js.map +1 -0
- package/dist/cli/commands/init.d.ts +6 -0
- package/dist/cli/commands/init.js +12 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/item.d.ts +41 -0
- package/dist/cli/commands/item.js +80 -0
- package/dist/cli/commands/item.js.map +1 -0
- package/dist/cli/commands/iteration.d.ts +7 -0
- package/dist/cli/commands/iteration.js +10 -0
- package/dist/cli/commands/iteration.js.map +1 -0
- package/dist/cli/commands/mcp.d.ts +85 -0
- package/dist/cli/commands/mcp.js +448 -0
- package/dist/cli/commands/mcp.js.map +1 -0
- package/dist/cli/format.d.ts +3 -0
- package/dist/cli/format.js +10 -0
- package/dist/cli/format.js.map +1 -0
- package/dist/cli/index.d.ts +4 -0
- package/dist/cli/index.js +426 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/components/IterationPicker.d.ts +1 -0
- package/dist/components/IterationPicker.js +18 -0
- package/dist/components/IterationPicker.js.map +1 -0
- package/dist/components/Settings.d.ts +1 -0
- package/dist/components/Settings.js +40 -0
- package/dist/components/Settings.js.map +1 -0
- package/dist/components/WorkItemForm.d.ts +1 -0
- package/dist/components/WorkItemForm.js +270 -0
- package/dist/components/WorkItemForm.js.map +1 -0
- package/dist/components/WorkItemList.d.ts +1 -0
- package/dist/components/WorkItemList.js +219 -0
- package/dist/components/WorkItemList.js.map +1 -0
- package/dist/git.d.ts +38 -0
- package/dist/git.js +115 -0
- package/dist/git.js.map +1 -0
- package/dist/implement.d.ts +25 -0
- package/dist/implement.js +130 -0
- package/dist/implement.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -0
- package/dist/types.d.ts +26 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +66 -0
package/dist/git.js
ADDED
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { execFileSync } from 'node:child_process';
|
|
2
|
+
import fs from 'node:fs';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
/**
|
|
5
|
+
* Convert an item ID and title into a kebab-case branch slug.
|
|
6
|
+
* Example: slugify('42', 'Add User Authentication') => '42-add-user-authentication'
|
|
7
|
+
* Truncated to max 80 characters total.
|
|
8
|
+
*/
|
|
9
|
+
export function slugify(id, title) {
|
|
10
|
+
const slug = title
|
|
11
|
+
.toLowerCase()
|
|
12
|
+
.replace(/[^a-z0-9\s-]/g, '')
|
|
13
|
+
.replace(/[\s-]+/g, '-')
|
|
14
|
+
.replace(/-+$/, '');
|
|
15
|
+
if (!slug) {
|
|
16
|
+
return id;
|
|
17
|
+
}
|
|
18
|
+
const full = `${id}-${slug}`;
|
|
19
|
+
if (full.length <= 80) {
|
|
20
|
+
return full;
|
|
21
|
+
}
|
|
22
|
+
// Truncate and remove any trailing hyphen from the cut
|
|
23
|
+
return full.slice(0, 80).replace(/-+$/, '');
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Check whether `root` is inside a git repository by looking for a .git
|
|
27
|
+
* directory or file (worktrees use a .git file).
|
|
28
|
+
*/
|
|
29
|
+
export function isGitRepo(root) {
|
|
30
|
+
const gitPath = path.join(root, '.git');
|
|
31
|
+
return fs.existsSync(gitPath);
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Check whether a branch exists in the repository.
|
|
35
|
+
*/
|
|
36
|
+
export function branchExists(name, cwd) {
|
|
37
|
+
try {
|
|
38
|
+
execFileSync('git', ['rev-parse', '--verify', `refs/heads/${name}`], {
|
|
39
|
+
cwd,
|
|
40
|
+
encoding: 'utf-8',
|
|
41
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
42
|
+
});
|
|
43
|
+
return true;
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
return false;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Create a new branch (without switching to it).
|
|
51
|
+
*/
|
|
52
|
+
export function createBranch(name, cwd) {
|
|
53
|
+
execFileSync('git', ['branch', name], {
|
|
54
|
+
cwd,
|
|
55
|
+
encoding: 'utf-8',
|
|
56
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Check out an existing branch.
|
|
61
|
+
*/
|
|
62
|
+
export function checkoutBranch(name, cwd) {
|
|
63
|
+
execFileSync('git', ['checkout', name], {
|
|
64
|
+
cwd,
|
|
65
|
+
encoding: 'utf-8',
|
|
66
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Return true if the working directory has uncommitted changes
|
|
71
|
+
* (untracked, modified, or staged files).
|
|
72
|
+
*/
|
|
73
|
+
export function hasUncommittedChanges(cwd) {
|
|
74
|
+
const output = execFileSync('git', ['status', '--porcelain'], {
|
|
75
|
+
cwd,
|
|
76
|
+
encoding: 'utf-8',
|
|
77
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
78
|
+
});
|
|
79
|
+
return output.trim().length > 0;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Create a git worktree. If the branch already exists, checks it out;
|
|
83
|
+
* otherwise creates a new branch with `-b`.
|
|
84
|
+
*/
|
|
85
|
+
export function createWorktree(worktreePath, branch, cwd) {
|
|
86
|
+
if (branchExists(branch, cwd)) {
|
|
87
|
+
execFileSync('git', ['worktree', 'add', worktreePath, branch], {
|
|
88
|
+
cwd,
|
|
89
|
+
encoding: 'utf-8',
|
|
90
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
execFileSync('git', ['worktree', 'add', worktreePath, '-b', branch], {
|
|
95
|
+
cwd,
|
|
96
|
+
encoding: 'utf-8',
|
|
97
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Check whether a path is a git worktree (exists and has a .git file,
|
|
103
|
+
* not a .git directory).
|
|
104
|
+
*/
|
|
105
|
+
export function worktreeExists(worktreePath) {
|
|
106
|
+
const gitPath = path.join(worktreePath, '.git');
|
|
107
|
+
try {
|
|
108
|
+
const stat = fs.statSync(gitPath);
|
|
109
|
+
return stat.isFile();
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
return false;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=git.js.map
|
package/dist/git.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git.js","sourceRoot":"","sources":["../src/git.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { WorkItem, Comment } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Format a work item and its comments as markdown suitable for clipboard.
|
|
4
|
+
*/
|
|
5
|
+
export declare function formatItemForClipboard(item: WorkItem, comments: Comment[]): string;
|
|
6
|
+
/**
|
|
7
|
+
* Copy text to the system clipboard.
|
|
8
|
+
* Returns true on success, false on failure (non-fatal).
|
|
9
|
+
*/
|
|
10
|
+
export declare function copyToClipboard(text: string): boolean;
|
|
11
|
+
export interface ImplementOptions {
|
|
12
|
+
skipShell?: boolean;
|
|
13
|
+
skipClipboard?: boolean;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Begin implementation of a work item by creating a branch (or worktree),
|
|
17
|
+
* copying item details to clipboard, and spawning a shell.
|
|
18
|
+
*/
|
|
19
|
+
export declare function beginImplementation(item: WorkItem, comments: Comment[], config: {
|
|
20
|
+
branchMode: 'worktree' | 'branch';
|
|
21
|
+
}, repoRoot: string, options?: ImplementOptions): {
|
|
22
|
+
resumed: boolean;
|
|
23
|
+
targetDir: string;
|
|
24
|
+
clipboardOk: boolean;
|
|
25
|
+
};
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import { execFileSync, spawnSync } from 'node:child_process';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { slugify, branchExists, createBranch, checkoutBranch, createWorktree, worktreeExists, hasUncommittedChanges, } from './git.js';
|
|
4
|
+
/**
|
|
5
|
+
* Format a work item and its comments as markdown suitable for clipboard.
|
|
6
|
+
*/
|
|
7
|
+
export function formatItemForClipboard(item, comments) {
|
|
8
|
+
const lines = [];
|
|
9
|
+
// Title
|
|
10
|
+
lines.push(`# #${item.id}: ${item.title}`);
|
|
11
|
+
lines.push('');
|
|
12
|
+
// Metadata - always include type and status
|
|
13
|
+
lines.push(`- **Type:** ${item.type}`);
|
|
14
|
+
lines.push(`- **Status:** ${item.status}`);
|
|
15
|
+
if (item.priority) {
|
|
16
|
+
lines.push(`- **Priority:** ${item.priority}`);
|
|
17
|
+
}
|
|
18
|
+
if (item.assignee) {
|
|
19
|
+
lines.push(`- **Assignee:** ${item.assignee}`);
|
|
20
|
+
}
|
|
21
|
+
if (item.labels.length > 0) {
|
|
22
|
+
lines.push(`- **Labels:** ${item.labels.join(', ')}`);
|
|
23
|
+
}
|
|
24
|
+
if (item.parent !== null) {
|
|
25
|
+
lines.push(`- **Parent:** #${item.parent}`);
|
|
26
|
+
}
|
|
27
|
+
if (item.dependsOn.length > 0) {
|
|
28
|
+
lines.push(`- **Depends on:** ${item.dependsOn.map((d) => `#${d}`).join(', ')}`);
|
|
29
|
+
}
|
|
30
|
+
// Description
|
|
31
|
+
if (item.description) {
|
|
32
|
+
lines.push('');
|
|
33
|
+
lines.push('## Description');
|
|
34
|
+
lines.push('');
|
|
35
|
+
lines.push(item.description);
|
|
36
|
+
}
|
|
37
|
+
// Comments
|
|
38
|
+
if (comments.length > 0) {
|
|
39
|
+
lines.push('');
|
|
40
|
+
lines.push('## Comments');
|
|
41
|
+
for (const comment of comments) {
|
|
42
|
+
lines.push('');
|
|
43
|
+
lines.push(`**${comment.author}** (${comment.date}):`);
|
|
44
|
+
lines.push(comment.body);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return lines.join('\n');
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Copy text to the system clipboard.
|
|
51
|
+
* Returns true on success, false on failure (non-fatal).
|
|
52
|
+
*/
|
|
53
|
+
export function copyToClipboard(text) {
|
|
54
|
+
try {
|
|
55
|
+
if (process.platform === 'darwin') {
|
|
56
|
+
execFileSync('pbcopy', [], {
|
|
57
|
+
input: text,
|
|
58
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
59
|
+
});
|
|
60
|
+
return true;
|
|
61
|
+
}
|
|
62
|
+
// Linux: try xclip first, then xsel
|
|
63
|
+
try {
|
|
64
|
+
execFileSync('xclip', ['-selection', 'clipboard'], {
|
|
65
|
+
input: text,
|
|
66
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
67
|
+
});
|
|
68
|
+
return true;
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
execFileSync('xsel', ['--clipboard'], {
|
|
72
|
+
input: text,
|
|
73
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
74
|
+
});
|
|
75
|
+
return true;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
return false;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Begin implementation of a work item by creating a branch (or worktree),
|
|
84
|
+
* copying item details to clipboard, and spawning a shell.
|
|
85
|
+
*/
|
|
86
|
+
export function beginImplementation(item, comments, config, repoRoot, options) {
|
|
87
|
+
const slug = slugify(item.id, item.title);
|
|
88
|
+
const branch = `tic/${slug}`;
|
|
89
|
+
const resumed = branchExists(branch, repoRoot);
|
|
90
|
+
let targetDir;
|
|
91
|
+
if (config.branchMode === 'worktree') {
|
|
92
|
+
const worktreePath = path.join(repoRoot, '.worktrees', slug);
|
|
93
|
+
targetDir = worktreePath;
|
|
94
|
+
if (!worktreeExists(worktreePath)) {
|
|
95
|
+
createWorktree(worktreePath, branch, repoRoot);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
// branch mode
|
|
100
|
+
targetDir = repoRoot;
|
|
101
|
+
if (!resumed) {
|
|
102
|
+
if (hasUncommittedChanges(repoRoot)) {
|
|
103
|
+
throw new Error('Uncommitted changes in working directory. Please commit or stash before switching branches.');
|
|
104
|
+
}
|
|
105
|
+
createBranch(branch, repoRoot);
|
|
106
|
+
}
|
|
107
|
+
checkoutBranch(branch, repoRoot);
|
|
108
|
+
}
|
|
109
|
+
// Copy to clipboard
|
|
110
|
+
let clipboardOk = false;
|
|
111
|
+
if (!options?.skipClipboard) {
|
|
112
|
+
const text = formatItemForClipboard(item, comments);
|
|
113
|
+
clipboardOk = copyToClipboard(text);
|
|
114
|
+
}
|
|
115
|
+
// Spawn shell
|
|
116
|
+
if (!options?.skipShell) {
|
|
117
|
+
const shell = process.env['SHELL'] || '/bin/sh';
|
|
118
|
+
spawnSync(shell, [], {
|
|
119
|
+
cwd: targetDir,
|
|
120
|
+
stdio: 'inherit',
|
|
121
|
+
env: {
|
|
122
|
+
...process.env,
|
|
123
|
+
TIC_ITEM_ID: item.id,
|
|
124
|
+
TIC_ITEM_TITLE: item.title,
|
|
125
|
+
},
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
return { resumed, targetDir, clipboardOk };
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=implement.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"implement.js","sourceRoot":"","sources":["../src/implement.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
package/dist/index.js
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
import { render } from 'ink';
|
|
4
|
+
import { App } from './app.js';
|
|
5
|
+
import { createBackend } from './backends/factory.js';
|
|
6
|
+
import { runCli } from './cli/index.js';
|
|
7
|
+
if (process.argv.length > 2) {
|
|
8
|
+
await runCli(process.argv);
|
|
9
|
+
}
|
|
10
|
+
else {
|
|
11
|
+
const backend = createBackend(process.cwd());
|
|
12
|
+
render(_jsx(App, { backend: backend }));
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.tsx"],"names":[],"mappings":";;AACA,OAAO,EAAE,MAAM,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAExC,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;IAC5B,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AAC7B,CAAC;KAAM,CAAC;IACN,MAAM,OAAO,GAAG,aAAa,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAC7C,MAAM,CAAC,KAAC,GAAG,IAAC,OAAO,EAAE,OAAO,GAAI,CAAC,CAAC;AACpC,CAAC"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export interface Comment {
|
|
2
|
+
author: string;
|
|
3
|
+
date: string;
|
|
4
|
+
body: string;
|
|
5
|
+
}
|
|
6
|
+
export interface WorkItem {
|
|
7
|
+
id: string;
|
|
8
|
+
title: string;
|
|
9
|
+
type: string;
|
|
10
|
+
status: string;
|
|
11
|
+
iteration: string;
|
|
12
|
+
priority: 'low' | 'medium' | 'high' | 'critical';
|
|
13
|
+
assignee: string;
|
|
14
|
+
labels: string[];
|
|
15
|
+
created: string;
|
|
16
|
+
updated: string;
|
|
17
|
+
description: string;
|
|
18
|
+
comments: Comment[];
|
|
19
|
+
parent: string | null;
|
|
20
|
+
dependsOn: string[];
|
|
21
|
+
}
|
|
22
|
+
export type NewWorkItem = Pick<WorkItem, 'title' | 'type' | 'status' | 'iteration' | 'priority' | 'assignee' | 'labels' | 'description' | 'parent' | 'dependsOn'>;
|
|
23
|
+
export interface NewComment {
|
|
24
|
+
author: string;
|
|
25
|
+
body: string;
|
|
26
|
+
}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
package/package.json
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@sascha384/tic",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Terminal UI for issue tracking",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"tic": "./dist/index.js"
|
|
8
|
+
},
|
|
9
|
+
"files": [
|
|
10
|
+
"dist",
|
|
11
|
+
"README.md"
|
|
12
|
+
],
|
|
13
|
+
"scripts": {
|
|
14
|
+
"build": "tsc -p tsconfig.build.json",
|
|
15
|
+
"dev": "tsc --watch",
|
|
16
|
+
"start": "node dist/index.js",
|
|
17
|
+
"test": "vitest run --exclude 'dist/**' --exclude '.worktrees/**'",
|
|
18
|
+
"lint": "eslint src/",
|
|
19
|
+
"lint:fix": "eslint src/ --fix",
|
|
20
|
+
"format": "prettier --write 'src/**/*.{ts,tsx}'",
|
|
21
|
+
"format:check": "prettier --check 'src/**/*.{ts,tsx}'",
|
|
22
|
+
"prepare": "husky"
|
|
23
|
+
},
|
|
24
|
+
"repository": {
|
|
25
|
+
"type": "git",
|
|
26
|
+
"url": "git+https://github.com/fa-krug/tic.git"
|
|
27
|
+
},
|
|
28
|
+
"license": "MIT",
|
|
29
|
+
"publishConfig": {
|
|
30
|
+
"access": "public"
|
|
31
|
+
},
|
|
32
|
+
"dependencies": {
|
|
33
|
+
"@modelcontextprotocol/sdk": "^1.25.3",
|
|
34
|
+
"commander": "^14.0.3",
|
|
35
|
+
"gray-matter": "^4.0.3",
|
|
36
|
+
"ink": "^6.6.0",
|
|
37
|
+
"ink-select-input": "^6.2.0",
|
|
38
|
+
"ink-text-input": "^6.0.0",
|
|
39
|
+
"react": "^19.2.4",
|
|
40
|
+
"yaml": "^2.8.2",
|
|
41
|
+
"zod": "^4.3.6"
|
|
42
|
+
},
|
|
43
|
+
"devDependencies": {
|
|
44
|
+
"@eslint/js": "^9.39.2",
|
|
45
|
+
"@sindresorhus/tsconfig": "^8.1.0",
|
|
46
|
+
"@types/node": "^25.1.0",
|
|
47
|
+
"@types/react": "^19.2.10",
|
|
48
|
+
"eslint": "^9.39.2",
|
|
49
|
+
"eslint-config-prettier": "^10.1.8",
|
|
50
|
+
"husky": "^9.1.7",
|
|
51
|
+
"prettier": "^3.8.1",
|
|
52
|
+
"semantic-release": "^25.0.3",
|
|
53
|
+
"typescript": "^5.9.3",
|
|
54
|
+
"typescript-eslint": "^8.54.0",
|
|
55
|
+
"vitest": "^4.0.18"
|
|
56
|
+
},
|
|
57
|
+
"release": {
|
|
58
|
+
"branches": ["main"],
|
|
59
|
+
"plugins": [
|
|
60
|
+
"@semantic-release/commit-analyzer",
|
|
61
|
+
"@semantic-release/release-notes-generator",
|
|
62
|
+
"@semantic-release/npm",
|
|
63
|
+
"@semantic-release/github"
|
|
64
|
+
]
|
|
65
|
+
}
|
|
66
|
+
}
|