@takemo101/mikan 0.0.9 → 0.0.11
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 +113 -40
- 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.11",
|
|
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") {
|
|
@@ -107850,7 +107922,7 @@ function Footer(props) {
|
|
|
107850
107922
|
const theme = props.theme ?? buildTuiTheme();
|
|
107851
107923
|
return import_react.default.createElement("text", {
|
|
107852
107924
|
id: "mikan-footer",
|
|
107853
|
-
style: { color: theme.base.muted, marginTop: "auto" },
|
|
107925
|
+
style: { color: theme.base.muted, flexShrink: 0, marginTop: "auto" },
|
|
107854
107926
|
content: [footerText(props.mode ?? "board"), props.message].filter(Boolean).join(" ")
|
|
107855
107927
|
});
|
|
107856
107928
|
}
|
|
@@ -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) {
|
|
@@ -107966,6 +108034,8 @@ function DetailPage(props) {
|
|
|
107966
108034
|
borderColor: theme.interactive.accent,
|
|
107967
108035
|
flexDirection: "column",
|
|
107968
108036
|
flexGrow: 1,
|
|
108037
|
+
flexShrink: 1,
|
|
108038
|
+
minHeight: 0,
|
|
107969
108039
|
overflow: "hidden"
|
|
107970
108040
|
}
|
|
107971
108041
|
}, import_react2.default.createElement("box", {
|
|
@@ -107979,22 +108049,21 @@ function DetailPage(props) {
|
|
|
107979
108049
|
content: detailTitleContent(page, theme)
|
|
107980
108050
|
}), import_react2.default.createElement("text", {
|
|
107981
108051
|
content: detailMetaContent(page, theme)
|
|
107982
|
-
})), import_react2.default.createElement("
|
|
108052
|
+
})), import_react2.default.createElement("scrollbox", {
|
|
107983
108053
|
id: "detail-markdown-body",
|
|
108054
|
+
ref: props.detailScrollBoxRef,
|
|
108055
|
+
scrollY: true,
|
|
108056
|
+
scrollX: false,
|
|
107984
108057
|
style: {
|
|
107985
|
-
flexDirection: "column",
|
|
107986
108058
|
flexGrow: 1,
|
|
107987
108059
|
minHeight: 0,
|
|
107988
108060
|
overflow: "hidden"
|
|
107989
108061
|
}
|
|
107990
108062
|
}, import_react2.default.createElement("markdown", {
|
|
107991
108063
|
id: "detail-markdown",
|
|
107992
|
-
content: page.
|
|
107993
|
-
`),
|
|
108064
|
+
content: page.markdown,
|
|
107994
108065
|
style: {
|
|
107995
|
-
|
|
107996
|
-
minHeight: 0,
|
|
107997
|
-
overflow: "hidden"
|
|
108066
|
+
width: "100%"
|
|
107998
108067
|
}
|
|
107999
108068
|
})));
|
|
108000
108069
|
}
|
|
@@ -108003,7 +108072,7 @@ function DetailPage(props) {
|
|
|
108003
108072
|
var import_react3 = __toESM(require_react(), 1);
|
|
108004
108073
|
|
|
108005
108074
|
// ../tui/src/navigation.ts
|
|
108006
|
-
function moveSelection(model, selection, direction,
|
|
108075
|
+
function moveSelection(model, selection, direction, _options = {}) {
|
|
108007
108076
|
if (direction === "enter") {
|
|
108008
108077
|
const card = model.columns[selection.columnIndex]?.cards[selection.cardIndex];
|
|
108009
108078
|
if (!card) {
|
|
@@ -108018,10 +108087,7 @@ function moveSelection(model, selection, direction, options = {}) {
|
|
|
108018
108087
|
}
|
|
108019
108088
|
if (selection.detailOpen && !selection.moveOpen && !selection.noteOpen && !selection.labelOpen) {
|
|
108020
108089
|
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
|
-
};
|
|
108090
|
+
return selection;
|
|
108025
108091
|
}
|
|
108026
108092
|
if (direction === "left" || direction === "right") {
|
|
108027
108093
|
return selection;
|
|
@@ -108222,14 +108288,6 @@ function keyToTuiAction(keyName2, shift = false, ctrl = false) {
|
|
|
108222
108288
|
return;
|
|
108223
108289
|
}
|
|
108224
108290
|
}
|
|
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
108291
|
|
|
108234
108292
|
// ../tui/src/prompt-view-model.ts
|
|
108235
108293
|
function buildMovePromptViewModel(model, selection) {
|
|
@@ -108921,7 +108979,8 @@ function TuiAppView({
|
|
|
108921
108979
|
viewportWidth,
|
|
108922
108980
|
columns,
|
|
108923
108981
|
noteTextareaRef,
|
|
108924
|
-
onNoteSubmit
|
|
108982
|
+
onNoteSubmit,
|
|
108983
|
+
detailScrollBoxRef
|
|
108925
108984
|
}) {
|
|
108926
108985
|
const details = selection.detailOpen ? getSelectedDetails(model, selection) : undefined;
|
|
108927
108986
|
return import_react20.default.createElement("box", {
|
|
@@ -108939,7 +108998,8 @@ function TuiAppView({
|
|
|
108939
108998
|
model,
|
|
108940
108999
|
selection,
|
|
108941
109000
|
theme,
|
|
108942
|
-
viewportHeight
|
|
109001
|
+
viewportHeight,
|
|
109002
|
+
detailScrollBoxRef
|
|
108943
109003
|
}) : import_react20.default.createElement(BoardView, {
|
|
108944
109004
|
model,
|
|
108945
109005
|
selection,
|
|
@@ -108963,13 +109023,13 @@ function Header(props) {
|
|
|
108963
109023
|
const theme = props.theme ?? buildTuiTheme();
|
|
108964
109024
|
return import_react20.default.createElement("text", {
|
|
108965
109025
|
id: "mikan-header",
|
|
108966
|
-
style: { color: theme.interactive.accent },
|
|
109026
|
+
style: { color: theme.interactive.accent, flexShrink: 0 },
|
|
108967
109027
|
content: `\uD83C\uDF4A mikan v${TUI_VERSION}`
|
|
108968
109028
|
});
|
|
108969
109029
|
}
|
|
108970
109030
|
async function launchTui(options = {}) {
|
|
108971
109031
|
const { createCliRenderer: createCliRenderer2 } = await init_core3().then(() => exports_core3);
|
|
108972
|
-
const { createRoot: createRoot2, useKeyboard: useKeyboard2 } = await init_react().then(() => exports_react);
|
|
109032
|
+
const { createRoot: createRoot2, useKeyboard: useKeyboard2, useTerminalDimensions: useTerminalDimensions2 } = await init_react().then(() => exports_react);
|
|
108973
109033
|
const renderer = await createCliRenderer2();
|
|
108974
109034
|
const pollMs = options.pollMs ?? 1000;
|
|
108975
109035
|
const root = createRoot2(renderer);
|
|
@@ -108978,6 +109038,7 @@ async function launchTui(options = {}) {
|
|
|
108978
109038
|
renderer.destroy();
|
|
108979
109039
|
};
|
|
108980
109040
|
function App() {
|
|
109041
|
+
const dimensions = useTerminalDimensions2();
|
|
108981
109042
|
const [model, setModel] = import_react20.default.useState(() => loadTuiModel(options.cwd));
|
|
108982
109043
|
const [selection, setSelection] = import_react20.default.useState({
|
|
108983
109044
|
columnIndex: 0,
|
|
@@ -108988,6 +109049,7 @@ async function launchTui(options = {}) {
|
|
|
108988
109049
|
const selectionRef = import_react20.default.useRef(selection);
|
|
108989
109050
|
const githubBusyRef = import_react20.default.useRef(false);
|
|
108990
109051
|
const noteTextareaRef = import_react20.default.useRef(null);
|
|
109052
|
+
const detailScrollBoxRef = import_react20.default.useRef(null);
|
|
108991
109053
|
const submitNote = import_react20.default.useCallback((body) => {
|
|
108992
109054
|
const result = appendSelectedIssueNote({
|
|
108993
109055
|
cwd: options.cwd,
|
|
@@ -109114,6 +109176,10 @@ async function launchTui(options = {}) {
|
|
|
109114
109176
|
}
|
|
109115
109177
|
if (!action)
|
|
109116
109178
|
return;
|
|
109179
|
+
if (selection.detailOpen && !selection.moveOpen && !selection.noteOpen && !selection.labelOpen && (action === "up" || action === "down")) {
|
|
109180
|
+
detailScrollBoxRef.current?.scrollBy(action === "down" ? 1 : -1);
|
|
109181
|
+
return;
|
|
109182
|
+
}
|
|
109117
109183
|
if (action === "quit") {
|
|
109118
109184
|
stop();
|
|
109119
109185
|
return;
|
|
@@ -109193,11 +109259,12 @@ async function launchTui(options = {}) {
|
|
|
109193
109259
|
return createTuiAppElement({
|
|
109194
109260
|
model,
|
|
109195
109261
|
selection,
|
|
109196
|
-
viewportHeight:
|
|
109197
|
-
viewportWidth:
|
|
109262
|
+
viewportHeight: dimensions.height,
|
|
109263
|
+
viewportWidth: dimensions.width,
|
|
109198
109264
|
columns: options.columns,
|
|
109199
109265
|
noteTextareaRef,
|
|
109200
|
-
onNoteSubmit: submitNote
|
|
109266
|
+
onNoteSubmit: submitNote,
|
|
109267
|
+
detailScrollBoxRef
|
|
109201
109268
|
});
|
|
109202
109269
|
}
|
|
109203
109270
|
root.render(import_react20.default.createElement(App));
|
|
@@ -110132,17 +110199,23 @@ Usage:
|
|
|
110132
110199
|
mikan skills add --agent <agent> [--no-global]
|
|
110133
110200
|
|
|
110134
110201
|
Options:
|
|
110135
|
-
-a, --agent <agent> Agent to install
|
|
110202
|
+
-a, --agent <agent> Agent to install guidance for: pi, antigravity, jcode, claude-code, opencode, codex, copilot-vscode, copilot-cli
|
|
110136
110203
|
--no-global Install workspace-local guidance instead of global
|
|
110137
110204
|
-h, --help Show this help
|
|
110138
110205
|
|
|
110139
110206
|
Notes:
|
|
110140
110207
|
codex installs the skill globally only; --no-global is rejected for codex.
|
|
110208
|
+
antigravity also has a shared skill location at ~/.gemini/skills/; mikan's global install targets the Antigravity CLI path.
|
|
110141
110209
|
|
|
110142
110210
|
Examples:
|
|
110211
|
+
mikan skills add --agent pi
|
|
110212
|
+
mikan skills add --agent antigravity --no-global
|
|
110213
|
+
mikan skills add --agent jcode
|
|
110143
110214
|
mikan skills add --agent claude-code
|
|
110144
110215
|
mikan skills add --agent opencode --no-global
|
|
110145
110216
|
mikan skills add -a codex
|
|
110217
|
+
mikan skills add --agent copilot-vscode --no-global
|
|
110218
|
+
mikan skills add --agent copilot-cli
|
|
110146
110219
|
`;
|
|
110147
110220
|
}
|
|
110148
110221
|
}
|