jutell 1.0.1 → 2.0.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/README.md +39 -17
- package/assets/local-admin/index.html +12 -12
- package/assets/mcp-server/index.js +7 -7
- package/assets/skill/SKILL.md +334 -137
- package/assets/skill/references/feature-registry.md +29 -29
- package/assets/skill/references/glossary-ko.md +302 -302
- package/assets/skill/references/report-format.md +209 -203
- package/assets/skill/references/risk-level-guide.md +85 -85
- package/assets/templates/request-builder/BUG_REPORT_REQUEST.md +100 -100
- package/assets/templates/request-builder/CODE_REVIEW_REQUEST.md +93 -93
- package/assets/templates/request-builder/DESIGN_REQUEST.md +111 -111
- package/assets/templates/request-builder/FEATURE_REQUEST.md +93 -93
- package/assets/templates/request-builder/MANUAL_EDIT_GUIDE.md +95 -95
- package/assets/templates/request-builder/PROJECT_PLANNING_REQUEST.md +106 -106
- package/assets/templates/request-builder/README.md +48 -48
- package/assets/version.json +1 -1
- package/dist/commands/default.js +131 -68
- package/dist/commands/provider.js +18 -18
- package/dist/commands/session/index.js +16 -16
- package/dist/installer/agents.js +10 -8
- package/dist/output/format.js +41 -43
- package/dist/process/mcpProbe.js +1 -1
- package/package.json +55 -55
package/README.md
CHANGED
|
@@ -1,17 +1,39 @@
|
|
|
1
|
-
# jutell
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
jutell
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
1
|
+
# jutell
|
|
2
|
+
|
|
3
|
+
**Tell your coding agent what you actually mean — and understand what it actually did.**
|
|
4
|
+
|
|
5
|
+
Before work, JuTell clarifies only the decisions that would actually change the result (at most one concise question) and checks project facts itself. After work, it turns the result into a plain-language report: what changed, what's actually verified, what's still unknown, and what to do next. It never guarantees your agent's answers — it keeps both directions honest.
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install -g jutell
|
|
9
|
+
jutell
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
`jutell` finds the coding agents you already have installed, asks for one approval, connects them, and hands you straight back to your normal session — no per-agent setup command needed for a normal first run.
|
|
13
|
+
|
|
14
|
+
| Agent | Status |
|
|
15
|
+
|---|---|
|
|
16
|
+
| Codex | Supported |
|
|
17
|
+
| Claude Code | Beta |
|
|
18
|
+
| OpenCode | Beta |
|
|
19
|
+
|
|
20
|
+
To connect (or reconnect) one specific agent by hand, use `jutell use codex` / `jutell use claude` / `jutell use opencode` — this is the manual/repair path, not the normal first run.
|
|
21
|
+
|
|
22
|
+
**한국어 사용자라면:** 전체 문서와 한국어 안내는 [GitHub 저장소의 README.ko.md](https://github.com/ju0o/jutell/blob/main/README.ko.md)에 있습니다.
|
|
23
|
+
|
|
24
|
+
Full docs, images, and the complete feature walkthrough live on [GitHub](https://github.com/ju0o/jutell#readme).
|
|
25
|
+
|
|
26
|
+
<details>
|
|
27
|
+
<summary>Build from source instead (contributors / verifying the repo directly)</summary>
|
|
28
|
+
|
|
29
|
+
Most people should use the npm install above.
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
cd packages/cli
|
|
33
|
+
npm install
|
|
34
|
+
npm pack
|
|
35
|
+
npm install -g ./jutell-2.0.0.tgz
|
|
36
|
+
```
|
|
37
|
+
</details>
|
|
38
|
+
|
|
39
|
+
The legacy `beginner-bridge` command is a compatibility alias for the same functionality and tells you to switch to `jutell` when you run it. The CLI does not collect or transmit your project code, prompts, AI answers, Git diffs, or secrets.
|
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
<!doctype html>
|
|
2
|
-
<html lang="ko">
|
|
3
|
-
<head>
|
|
4
|
-
<meta charset="UTF-8" />
|
|
5
|
-
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
|
-
<meta name="description" content="JuTell by Ju0 개인 베타 로컬 관리자" />
|
|
7
|
-
<title>JuTell 개인 베타 관리자</title>
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="ko">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8" />
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
|
+
<meta name="description" content="JuTell by Ju0 개인 베타 로컬 관리자" />
|
|
7
|
+
<title>JuTell 개인 베타 관리자</title>
|
|
8
8
|
<script type="module" crossorigin src="/assets/index-4Pw2ygFb.js"></script>
|
|
9
9
|
<link rel="stylesheet" crossorigin href="/assets/index-CVml-p-C.css">
|
|
10
|
-
</head>
|
|
11
|
-
<body>
|
|
12
|
-
<div id="root"></div>
|
|
13
|
-
</body>
|
|
14
|
-
</html>
|
|
10
|
+
</head>
|
|
11
|
+
<body>
|
|
12
|
+
<div id="root"></div>
|
|
13
|
+
</body>
|
|
14
|
+
</html>
|
|
@@ -5,9 +5,9 @@ import { activeFeatures, beginnerReportRules, bridgeStatus, reportPreferences, s
|
|
|
5
5
|
import { recordToolCall } from './tools/usage-counters.js';
|
|
6
6
|
const server = new McpServer({
|
|
7
7
|
name: 'JuTell',
|
|
8
|
-
version: '
|
|
8
|
+
version: '2.0.0',
|
|
9
9
|
}, {
|
|
10
|
-
instructions: 'JuTell by Ju0 is a local read-only report helper. Read only project configuration and approved report rules. Never access project code, Git diff, prompts, AI answers, secrets, or external networks. Skill mode remains available if this MCP server is disabled or unavailable. When both jutell and beginner_bridge servers are visible, prefer the canonical jutell server; use beginner_bridge only for compatibility. For owner-facing reports, apply the JuTell reporting guidance before composing the final answer.',
|
|
10
|
+
instructions: 'JuTell by Ju0 is a local read-only report helper. Read only project configuration and approved report rules. Never access project code, Git diff, prompts, AI answers, secrets, or external networks. Skill mode remains available if this MCP server is disabled or unavailable. When both jutell and beginner_bridge servers are visible, prefer the canonical jutell server; use beginner_bridge only for compatibility. For owner-facing reports, apply the JuTell reporting guidance before composing the final answer. Prefer these tools over re-reading the JuTell Skill reference files when both are available, since a tool call returns the same project-specific rules in one step. Call get_beginner_report_rules once, at task completion, right before writing the final report — not after every file read, shell command, or edit, and not to verify work that is already done. If these tools are unavailable or blocked, fall back to the JuTell Skill files without interrupting the task, and never tell the user JuTell MCP was used unless a JuTell tool call actually returned a result in this task.',
|
|
11
11
|
});
|
|
12
12
|
const noInput = { inputSchema: {} };
|
|
13
13
|
async function counted(toolName, run) {
|
|
@@ -19,23 +19,23 @@ async function counted(toolName, run) {
|
|
|
19
19
|
await recordToolCall(toolName, characters);
|
|
20
20
|
return result;
|
|
21
21
|
}
|
|
22
|
-
server.registerTool('get_bridge_status', { ...noInput, description: '
|
|
22
|
+
server.registerTool('get_bridge_status', { ...noInput, description: 'Diagnostic only: return whether JuTell is configured and enabled for this project. Use when JuTell setup itself looks wrong (e.g. reports seem to ignore .jutell.json), not as part of a normal report — get_beginner_report_rules already includes what a report needs. Does not read project code or Git.' }, async () => counted('get_bridge_status', async () => {
|
|
23
23
|
const context = await readBridgeContext();
|
|
24
24
|
return { content: [{ type: 'text', text: JSON.stringify(bridgeStatus(context)) }] };
|
|
25
25
|
}));
|
|
26
|
-
server.registerTool('get_active_features', { ...noInput, description: '
|
|
26
|
+
server.registerTool('get_active_features', { ...noInput, description: 'Diagnostic only: list which JuTell report sections are on/off and what each safely omits when off. Use only when you need to explain JuTell\'s own configuration to the user; get_beginner_report_rules already returns the active sections needed to write a report, so call this instead of that only for that narrower question.' }, async () => counted('get_active_features', async () => {
|
|
27
27
|
const context = await readBridgeContext();
|
|
28
28
|
return { content: [{ type: 'text', text: JSON.stringify({ features: activeFeatures(context.config) }) }] };
|
|
29
29
|
}));
|
|
30
|
-
server.registerTool('get_report_preferences', { ...noInput, description: '
|
|
30
|
+
server.registerTool('get_report_preferences', { ...noInput, description: 'Diagnostic only: return the report Profile (minimal/balanced/learning/detailed) and length/file/glossary limits. Use only when asked how JuTell is configured; get_beginner_report_rules already includes these limits for normal report writing.' }, async () => counted('get_report_preferences', async () => {
|
|
31
31
|
const context = await readBridgeContext();
|
|
32
32
|
return { content: [{ type: 'text', text: JSON.stringify(reportPreferences(context.config)) }] };
|
|
33
33
|
}));
|
|
34
|
-
server.registerTool('get_beginner_report_rules', { ...noInput, description: '
|
|
34
|
+
server.registerTool('get_beginner_report_rules', { ...noInput, description: 'The primary report-writing tool: returns this project\'s active report rules (which sections to include, length/voice limits, the evidence/status/diff rules, safety requirements) in one call. Call this once, right before writing the final owner-facing report for a completed task — it replaces reading report-format.md, risk-level-guide.md, and related Skill reference files by hand. Do not call it for non-report answers (plain questions, explanations, plans), and do not call it more than once per task just to double-check.' }, async () => counted('get_beginner_report_rules', async () => {
|
|
35
35
|
const context = await readBridgeContext();
|
|
36
36
|
return { content: [{ type: 'text', text: JSON.stringify(beginnerReportRules(context.config)) }] };
|
|
37
37
|
}));
|
|
38
|
-
server.registerTool('get_safe_report_requirements', { ...noInput, description: 'Return
|
|
38
|
+
server.registerTool('get_safe_report_requirements', { ...noInput, description: 'Return the fixed list of items (failures, unresolved risks, secrets exposure, data loss, out-of-scope changes) that a report must never omit, even when the active Profile would otherwise skip them. Use alongside get_beginner_report_rules only when a report involves a failure, risk, or safety-relevant change — most routine reports do not need a separate call for this.' }, async () => counted('get_safe_report_requirements', async () => {
|
|
39
39
|
return { content: [{ type: 'text', text: JSON.stringify(safeReportRequirements()) }] };
|
|
40
40
|
}));
|
|
41
41
|
const transport = new StdioServerTransport();
|