@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.
Files changed (3) hide show
  1. package/README.md +4 -1
  2. package/dist/bin.js +113 -40
  3. 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` that teaches the agent to drive the board through the MCP tools, including one-way GitHub Mirror publication tools. Agents: `claude-code`, `opencode`, `codex`. This is **separate** from MCP registration — installing skills never changes MCP config.
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 skillDocument = `---
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.9",
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 - 8);
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("box", {
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.visibleMarkdownLines.join(`
107993
- `),
108064
+ content: page.markdown,
107994
108065
  style: {
107995
- flexGrow: 1,
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, options = {}) {
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: renderer.height,
109197
- viewportWidth: renderer.width,
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 the mikan skill for: claude-code, opencode, codex
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
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@takemo101/mikan",
3
- "version": "0.0.9",
3
+ "version": "0.0.11",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "bin": {