@takemo101/mikan 0.0.9 → 0.0.10
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 +4 -1
- package/dist/bin.js +105 -35
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -58,7 +58,7 @@ GitHub Mirror is one-way publication from local Markdown Issues to GitHub Issues
|
|
|
58
58
|
mikan wires into AI coding agents two independent ways. Neither models agents or adds a runtime: mikan stays **stdio MCP only** — no HTTP server, port, auth, scheduler, or workflow engine.
|
|
59
59
|
|
|
60
60
|
- `mikan mcp add --agent <agent>` registers the stdio MCP server in the agent's MCP config. Agents: `pi`, `antigravity`, `jcode`, `claude-code`, `opencode`, `codex`, `copilot-vscode`, `copilot-cli`.
|
|
61
|
-
- `mikan skills add --agent <agent>` installs a small mikan `SKILL.md`
|
|
61
|
+
- `mikan skills add --agent <agent>` installs a small mikan `SKILL.md` using each agent's native Agent Skills convention. Agents: `pi`, `antigravity`, `jcode`, `claude-code`, `opencode`, `codex`, `copilot-vscode`, `copilot-cli`. This is **separate** from MCP registration — installing skills never changes MCP config.
|
|
62
62
|
|
|
63
63
|
```sh
|
|
64
64
|
mikan mcp add --agent claude-code
|
|
@@ -66,7 +66,10 @@ mikan mcp add --agent opencode --no-global
|
|
|
66
66
|
mikan mcp add --agent codex # global only
|
|
67
67
|
mikan mcp add --agent copilot-vscode --no-global # VS Code workspace only
|
|
68
68
|
mikan mcp add --agent copilot-cli # global only
|
|
69
|
+
mikan skills add --agent pi
|
|
70
|
+
mikan skills add --agent antigravity --no-global
|
|
69
71
|
mikan skills add --agent claude-code
|
|
72
|
+
mikan skills add --agent copilot-cli
|
|
70
73
|
mikan mcp llms # incur-backed discovery manifest
|
|
71
74
|
```
|
|
72
75
|
|
package/dist/bin.js
CHANGED
|
@@ -107078,12 +107078,11 @@ function installMcpServerForAgent(agent, options = {}) {
|
|
|
107078
107078
|
return installer.install(options);
|
|
107079
107079
|
}
|
|
107080
107080
|
// ../mcp/src/skills/shared.ts
|
|
107081
|
-
var
|
|
107081
|
+
var skillFrontmatter = `---
|
|
107082
107082
|
name: mikan
|
|
107083
107083
|
description: mikan is a local-first Issue board for AI-assisted development. Use it to read the board; create, update, move, and append to Issues; and explicitly publish GitHub Mirrors through the mikan MCP tools. Trigger when the user wants to see the board, add or change an Issue, move an Issue to another Status, record a Report or Note, publish a GitHub Mirror, or decide what to work on next.
|
|
107084
|
-
|
|
107085
|
-
|
|
107086
|
-
# mikan
|
|
107084
|
+
---`;
|
|
107085
|
+
var instructionDocument = `# mikan
|
|
107087
107086
|
|
|
107088
107087
|
mikan is a tiny, local-first, Markdown-backed Issue board. Each Issue has a
|
|
107089
107088
|
stable Issue ID such as \`MIK-001\`, one current Status (the board Column it
|
|
@@ -107121,6 +107120,9 @@ mikan does not schedule, auto-move, or block Issues on dependencies.
|
|
|
107121
107120
|
Use Issue, Issue ID, Status, Column, Label, Report, Note, and Dependency. Avoid
|
|
107122
107121
|
Task, ticket, profile, and role.
|
|
107123
107122
|
`;
|
|
107123
|
+
var skillDocument = `${skillFrontmatter}
|
|
107124
|
+
|
|
107125
|
+
${instructionDocument}`;
|
|
107124
107126
|
function globalSkillPath(options, ...segments) {
|
|
107125
107127
|
return homePath(options, ...segments);
|
|
107126
107128
|
}
|
|
@@ -107138,6 +107140,19 @@ function createSkillInstaller(adapter) {
|
|
|
107138
107140
|
};
|
|
107139
107141
|
}
|
|
107140
107142
|
|
|
107143
|
+
// ../mcp/src/skills/antigravity.ts
|
|
107144
|
+
var antigravityAdapter2 = {
|
|
107145
|
+
agent: "antigravity",
|
|
107146
|
+
resolveTarget: (options) => isGlobalScope(options) ? {
|
|
107147
|
+
path: globalSkillPath(options, ".gemini", "antigravity-cli", "skills", "mikan", "SKILL.md"),
|
|
107148
|
+
scope: "global"
|
|
107149
|
+
} : {
|
|
107150
|
+
path: workspaceSkillPath(options, ".agents", "skills", "mikan", "SKILL.md"),
|
|
107151
|
+
scope: "workspace"
|
|
107152
|
+
}
|
|
107153
|
+
};
|
|
107154
|
+
var antigravitySkillInstaller = createSkillInstaller(antigravityAdapter2);
|
|
107155
|
+
|
|
107141
107156
|
// ../mcp/src/skills/claude-code.ts
|
|
107142
107157
|
var claudeCodeAdapter2 = {
|
|
107143
107158
|
agent: "claude-code",
|
|
@@ -107166,6 +107181,45 @@ var codexAdapter = {
|
|
|
107166
107181
|
};
|
|
107167
107182
|
var codexSkillInstaller = createSkillInstaller(codexAdapter);
|
|
107168
107183
|
|
|
107184
|
+
// ../mcp/src/skills/copilot-cli.ts
|
|
107185
|
+
var copilotCliAdapter2 = {
|
|
107186
|
+
agent: "copilot-cli",
|
|
107187
|
+
resolveTarget: (options) => isGlobalScope(options) ? {
|
|
107188
|
+
path: globalSkillPath(options, ".copilot", "skills", "mikan", "SKILL.md"),
|
|
107189
|
+
scope: "global"
|
|
107190
|
+
} : {
|
|
107191
|
+
path: workspaceSkillPath(options, ".github", "skills", "mikan", "SKILL.md"),
|
|
107192
|
+
scope: "workspace"
|
|
107193
|
+
}
|
|
107194
|
+
};
|
|
107195
|
+
var copilotCliSkillInstaller = createSkillInstaller(copilotCliAdapter2);
|
|
107196
|
+
|
|
107197
|
+
// ../mcp/src/skills/copilot-vscode.ts
|
|
107198
|
+
var copilotVscodeAdapter2 = {
|
|
107199
|
+
agent: "copilot-vscode",
|
|
107200
|
+
resolveTarget: (options) => isGlobalScope(options) ? {
|
|
107201
|
+
path: globalSkillPath(options, ".copilot", "skills", "mikan", "SKILL.md"),
|
|
107202
|
+
scope: "global"
|
|
107203
|
+
} : {
|
|
107204
|
+
path: workspaceSkillPath(options, ".github", "skills", "mikan", "SKILL.md"),
|
|
107205
|
+
scope: "workspace"
|
|
107206
|
+
}
|
|
107207
|
+
};
|
|
107208
|
+
var copilotVscodeSkillInstaller = createSkillInstaller(copilotVscodeAdapter2);
|
|
107209
|
+
|
|
107210
|
+
// ../mcp/src/skills/jcode.ts
|
|
107211
|
+
var jcodeAdapter2 = {
|
|
107212
|
+
agent: "jcode",
|
|
107213
|
+
resolveTarget: (options) => isGlobalScope(options) ? {
|
|
107214
|
+
path: globalSkillPath(options, ".jcode", "skills", "mikan", "SKILL.md"),
|
|
107215
|
+
scope: "global"
|
|
107216
|
+
} : {
|
|
107217
|
+
path: workspaceSkillPath(options, ".jcode", "skills", "mikan", "SKILL.md"),
|
|
107218
|
+
scope: "workspace"
|
|
107219
|
+
}
|
|
107220
|
+
};
|
|
107221
|
+
var jcodeSkillInstaller = createSkillInstaller(jcodeAdapter2);
|
|
107222
|
+
|
|
107169
107223
|
// ../mcp/src/skills/opencode.ts
|
|
107170
107224
|
var opencodeAdapter2 = {
|
|
107171
107225
|
agent: "opencode",
|
|
@@ -107179,11 +107233,29 @@ var opencodeAdapter2 = {
|
|
|
107179
107233
|
};
|
|
107180
107234
|
var opencodeSkillInstaller = createSkillInstaller(opencodeAdapter2);
|
|
107181
107235
|
|
|
107236
|
+
// ../mcp/src/skills/pi.ts
|
|
107237
|
+
var piAdapter2 = {
|
|
107238
|
+
agent: "pi",
|
|
107239
|
+
resolveTarget: (options) => isGlobalScope(options) ? {
|
|
107240
|
+
path: globalSkillPath(options, ".pi", "agent", "skills", "mikan", "SKILL.md"),
|
|
107241
|
+
scope: "global"
|
|
107242
|
+
} : {
|
|
107243
|
+
path: workspaceSkillPath(options, ".pi", "skills", "mikan", "SKILL.md"),
|
|
107244
|
+
scope: "workspace"
|
|
107245
|
+
}
|
|
107246
|
+
};
|
|
107247
|
+
var piSkillInstaller = createSkillInstaller(piAdapter2);
|
|
107248
|
+
|
|
107182
107249
|
// ../mcp/src/skills/index.ts
|
|
107183
107250
|
var skillAgentInstallers = [
|
|
107251
|
+
piSkillInstaller,
|
|
107252
|
+
antigravitySkillInstaller,
|
|
107253
|
+
jcodeSkillInstaller,
|
|
107184
107254
|
claudeCodeSkillInstaller,
|
|
107185
107255
|
opencodeSkillInstaller,
|
|
107186
|
-
codexSkillInstaller
|
|
107256
|
+
codexSkillInstaller,
|
|
107257
|
+
copilotVscodeSkillInstaller,
|
|
107258
|
+
copilotCliSkillInstaller
|
|
107187
107259
|
];
|
|
107188
107260
|
function installSkillForAgent(agent, options = {}) {
|
|
107189
107261
|
const installer = skillAgentInstallers.find((entry) => entry.agent === agent);
|
|
@@ -107461,7 +107533,7 @@ var import_react20 = __toESM(require_react(), 1);
|
|
|
107461
107533
|
// package.json
|
|
107462
107534
|
var package_default = {
|
|
107463
107535
|
name: "@takemo101/mikan",
|
|
107464
|
-
version: "0.0.
|
|
107536
|
+
version: "0.0.10",
|
|
107465
107537
|
private: false,
|
|
107466
107538
|
type: "module",
|
|
107467
107539
|
bin: {
|
|
@@ -107522,7 +107594,7 @@ function visibleColumnCountForViewport(viewportWidth) {
|
|
|
107522
107594
|
return Math.min(MAX_VISIBLE_COLUMNS, Math.max(MIN_VISIBLE_COLUMNS, fitted));
|
|
107523
107595
|
}
|
|
107524
107596
|
function visibleDetailLineCount(viewportHeight) {
|
|
107525
|
-
return Math.max(1, viewportHeight -
|
|
107597
|
+
return Math.max(1, viewportHeight - 7);
|
|
107526
107598
|
}
|
|
107527
107599
|
function footerText(mode) {
|
|
107528
107600
|
if (mode === "note-modal") {
|
|
@@ -107927,10 +107999,6 @@ function detailTitleContent(page, theme) {
|
|
|
107927
107999
|
fg(theme.base.muted)(" \u2502 "),
|
|
107928
108000
|
fg(theme.base.text)(page.title)
|
|
107929
108001
|
];
|
|
107930
|
-
if (page.lineRangeText) {
|
|
107931
|
-
chunks.push(fg(theme.base.muted)(" \u2502 "));
|
|
107932
|
-
chunks.push(fg(theme.base.muted)(page.lineRangeText));
|
|
107933
|
-
}
|
|
107934
108002
|
return new StyledText(chunks);
|
|
107935
108003
|
}
|
|
107936
108004
|
function detailMetaContent(page, theme) {
|
|
@@ -107979,22 +108047,21 @@ function DetailPage(props) {
|
|
|
107979
108047
|
content: detailTitleContent(page, theme)
|
|
107980
108048
|
}), import_react2.default.createElement("text", {
|
|
107981
108049
|
content: detailMetaContent(page, theme)
|
|
107982
|
-
})), import_react2.default.createElement("
|
|
108050
|
+
})), import_react2.default.createElement("scrollbox", {
|
|
107983
108051
|
id: "detail-markdown-body",
|
|
108052
|
+
ref: props.detailScrollBoxRef,
|
|
108053
|
+
scrollY: true,
|
|
108054
|
+
scrollX: false,
|
|
107984
108055
|
style: {
|
|
107985
|
-
flexDirection: "column",
|
|
107986
108056
|
flexGrow: 1,
|
|
107987
108057
|
minHeight: 0,
|
|
107988
108058
|
overflow: "hidden"
|
|
107989
108059
|
}
|
|
107990
108060
|
}, import_react2.default.createElement("markdown", {
|
|
107991
108061
|
id: "detail-markdown",
|
|
107992
|
-
content: page.
|
|
107993
|
-
`),
|
|
108062
|
+
content: page.markdown,
|
|
107994
108063
|
style: {
|
|
107995
|
-
|
|
107996
|
-
minHeight: 0,
|
|
107997
|
-
overflow: "hidden"
|
|
108064
|
+
width: "100%"
|
|
107998
108065
|
}
|
|
107999
108066
|
})));
|
|
108000
108067
|
}
|
|
@@ -108003,7 +108070,7 @@ function DetailPage(props) {
|
|
|
108003
108070
|
var import_react3 = __toESM(require_react(), 1);
|
|
108004
108071
|
|
|
108005
108072
|
// ../tui/src/navigation.ts
|
|
108006
|
-
function moveSelection(model, selection, direction,
|
|
108073
|
+
function moveSelection(model, selection, direction, _options = {}) {
|
|
108007
108074
|
if (direction === "enter") {
|
|
108008
108075
|
const card = model.columns[selection.columnIndex]?.cards[selection.cardIndex];
|
|
108009
108076
|
if (!card) {
|
|
@@ -108018,10 +108085,7 @@ function moveSelection(model, selection, direction, options = {}) {
|
|
|
108018
108085
|
}
|
|
108019
108086
|
if (selection.detailOpen && !selection.moveOpen && !selection.noteOpen && !selection.labelOpen) {
|
|
108020
108087
|
if (direction === "up" || direction === "down") {
|
|
108021
|
-
return
|
|
108022
|
-
...selection,
|
|
108023
|
-
detailScrollOffset: clamp((selection.detailScrollOffset ?? 0) + (direction === "down" ? 1 : -1), 0, detailScrollMax(model, selection, options))
|
|
108024
|
-
};
|
|
108088
|
+
return selection;
|
|
108025
108089
|
}
|
|
108026
108090
|
if (direction === "left" || direction === "right") {
|
|
108027
108091
|
return selection;
|
|
@@ -108222,14 +108286,6 @@ function keyToTuiAction(keyName2, shift = false, ctrl = false) {
|
|
|
108222
108286
|
return;
|
|
108223
108287
|
}
|
|
108224
108288
|
}
|
|
108225
|
-
function detailScrollMax(model, selection, options = {}) {
|
|
108226
|
-
const details = getSelectedDetails(model, selection);
|
|
108227
|
-
if (!details)
|
|
108228
|
-
return 0;
|
|
108229
|
-
const visibleLineCount = options.viewportHeight ? visibleDetailLineCount(options.viewportHeight) : 40;
|
|
108230
|
-
return Math.max(0, stripFrontmatter(details.markdown).trimEnd().split(`
|
|
108231
|
-
`).length - visibleLineCount);
|
|
108232
|
-
}
|
|
108233
108289
|
|
|
108234
108290
|
// ../tui/src/prompt-view-model.ts
|
|
108235
108291
|
function buildMovePromptViewModel(model, selection) {
|
|
@@ -108921,7 +108977,8 @@ function TuiAppView({
|
|
|
108921
108977
|
viewportWidth,
|
|
108922
108978
|
columns,
|
|
108923
108979
|
noteTextareaRef,
|
|
108924
|
-
onNoteSubmit
|
|
108980
|
+
onNoteSubmit,
|
|
108981
|
+
detailScrollBoxRef
|
|
108925
108982
|
}) {
|
|
108926
108983
|
const details = selection.detailOpen ? getSelectedDetails(model, selection) : undefined;
|
|
108927
108984
|
return import_react20.default.createElement("box", {
|
|
@@ -108939,7 +108996,8 @@ function TuiAppView({
|
|
|
108939
108996
|
model,
|
|
108940
108997
|
selection,
|
|
108941
108998
|
theme,
|
|
108942
|
-
viewportHeight
|
|
108999
|
+
viewportHeight,
|
|
109000
|
+
detailScrollBoxRef
|
|
108943
109001
|
}) : import_react20.default.createElement(BoardView, {
|
|
108944
109002
|
model,
|
|
108945
109003
|
selection,
|
|
@@ -108988,6 +109046,7 @@ async function launchTui(options = {}) {
|
|
|
108988
109046
|
const selectionRef = import_react20.default.useRef(selection);
|
|
108989
109047
|
const githubBusyRef = import_react20.default.useRef(false);
|
|
108990
109048
|
const noteTextareaRef = import_react20.default.useRef(null);
|
|
109049
|
+
const detailScrollBoxRef = import_react20.default.useRef(null);
|
|
108991
109050
|
const submitNote = import_react20.default.useCallback((body) => {
|
|
108992
109051
|
const result = appendSelectedIssueNote({
|
|
108993
109052
|
cwd: options.cwd,
|
|
@@ -109114,6 +109173,10 @@ async function launchTui(options = {}) {
|
|
|
109114
109173
|
}
|
|
109115
109174
|
if (!action)
|
|
109116
109175
|
return;
|
|
109176
|
+
if (selection.detailOpen && !selection.moveOpen && !selection.noteOpen && !selection.labelOpen && (action === "up" || action === "down")) {
|
|
109177
|
+
detailScrollBoxRef.current?.scrollBy(action === "down" ? 1 : -1);
|
|
109178
|
+
return;
|
|
109179
|
+
}
|
|
109117
109180
|
if (action === "quit") {
|
|
109118
109181
|
stop();
|
|
109119
109182
|
return;
|
|
@@ -109197,7 +109260,8 @@ async function launchTui(options = {}) {
|
|
|
109197
109260
|
viewportWidth: renderer.width,
|
|
109198
109261
|
columns: options.columns,
|
|
109199
109262
|
noteTextareaRef,
|
|
109200
|
-
onNoteSubmit: submitNote
|
|
109263
|
+
onNoteSubmit: submitNote,
|
|
109264
|
+
detailScrollBoxRef
|
|
109201
109265
|
});
|
|
109202
109266
|
}
|
|
109203
109267
|
root.render(import_react20.default.createElement(App));
|
|
@@ -110132,17 +110196,23 @@ Usage:
|
|
|
110132
110196
|
mikan skills add --agent <agent> [--no-global]
|
|
110133
110197
|
|
|
110134
110198
|
Options:
|
|
110135
|
-
-a, --agent <agent> Agent to install
|
|
110199
|
+
-a, --agent <agent> Agent to install guidance for: pi, antigravity, jcode, claude-code, opencode, codex, copilot-vscode, copilot-cli
|
|
110136
110200
|
--no-global Install workspace-local guidance instead of global
|
|
110137
110201
|
-h, --help Show this help
|
|
110138
110202
|
|
|
110139
110203
|
Notes:
|
|
110140
110204
|
codex installs the skill globally only; --no-global is rejected for codex.
|
|
110205
|
+
antigravity also has a shared skill location at ~/.gemini/skills/; mikan's global install targets the Antigravity CLI path.
|
|
110141
110206
|
|
|
110142
110207
|
Examples:
|
|
110208
|
+
mikan skills add --agent pi
|
|
110209
|
+
mikan skills add --agent antigravity --no-global
|
|
110210
|
+
mikan skills add --agent jcode
|
|
110143
110211
|
mikan skills add --agent claude-code
|
|
110144
110212
|
mikan skills add --agent opencode --no-global
|
|
110145
110213
|
mikan skills add -a codex
|
|
110214
|
+
mikan skills add --agent copilot-vscode --no-global
|
|
110215
|
+
mikan skills add --agent copilot-cli
|
|
110146
110216
|
`;
|
|
110147
110217
|
}
|
|
110148
110218
|
}
|