tonedial 0.1.1 → 0.1.2
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/dist/cli.js +1 -1
- package/dist/commands/create.js +7 -7
- package/dist/commands/doctor.js +21 -14
- package/dist/commands/edit.js +3 -3
- package/dist/commands/init.js +6 -12
- package/dist/commands/save.js +2 -10
- package/dist/commands/set.js +17 -54
- package/dist/commands/show.js +1 -5
- package/dist/commands/transfer.js +0 -1
- package/dist/commands/update.js +89 -42
- package/dist/commands/use.js +3 -4
- package/dist/commands/wire.js +1 -1
- package/dist/core/combos.js +6 -38
- package/dist/core/config.js +0 -1
- package/dist/core/i18n.js +58 -60
- package/dist/core/locales/es.js +29 -30
- package/dist/core/locales/ja.js +29 -30
- package/dist/core/locales/zh.js +29 -30
- package/dist/core/seeds.js +3 -3
- package/dist/core/selfupdate.js +47 -2
- package/dist/core/skill.js +4 -5
- package/dist/ui/format.js +3 -6
- package/package.json +1 -1
package/dist/commands/wire.js
CHANGED
|
@@ -453,7 +453,7 @@ function summary(ctx, reason, tools, action = "connect") {
|
|
|
453
453
|
return receiptLines(action === "disconnect" ? ctx.t.wiring.alreadyDisconnected(named) : ctx.t.wiring.alreadyMatch(named), ctx.ui.width - 2)
|
|
454
454
|
.map((line) => ` ${ctx.ui.bold(line)}`);
|
|
455
455
|
if (reason === "dry-run")
|
|
456
|
-
return [` ${ctx.ui.
|
|
456
|
+
return [` ${ctx.ui.dim(ctx.t.wiring.dryRun)}`];
|
|
457
457
|
if (reason === "declined")
|
|
458
458
|
return [` ${ctx.t.wiring.declined}`];
|
|
459
459
|
return [
|
package/dist/core/combos.js
CHANGED
|
@@ -30,45 +30,13 @@ const COMPOSITES = [
|
|
|
30
30
|
export function composites(axes) {
|
|
31
31
|
return COMPOSITES.filter((c) => c.fires(axes)).map((c) => c.line);
|
|
32
32
|
}
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
const w = [];
|
|
39
|
-
const add = (layer, rule, id) => w.push({ layer, rule, id });
|
|
40
|
-
if (axes.refusal >= 4 && axes.compliance >= 4) {
|
|
41
|
-
add("forbidden", "refusal≥4 × compliance≥4", "refusalCompliance");
|
|
42
|
-
}
|
|
43
|
-
if (persona) {
|
|
44
|
-
const selfRef = persona.address?.self_ref ?? null;
|
|
45
|
-
const userRef = persona.address?.user_ref ?? null;
|
|
46
|
-
if (axes.formality === 5 && selfRef && INFORMAL_SELF.test(selfRef)) {
|
|
47
|
-
add("awkward", "formality 5 × informal self_ref", "formalSelfRef");
|
|
48
|
-
}
|
|
49
|
-
if (axes.formality <= 2 && speechLevel === "plain" && userRef && DEFERENTIAL_USER.test(userRef)) {
|
|
50
|
-
add("awkward", "formality≤2 × deferential user_ref", "casualUserRef");
|
|
51
|
-
}
|
|
52
|
-
if (persona.age === "teens" && axes.formality === 5) {
|
|
53
|
-
add("awkward", "age: teens × formality 5", "teensFormal");
|
|
54
|
-
}
|
|
55
|
-
if (persona.age === "50s+" && selfRef && INFORMAL_SELF.test(selfRef)) {
|
|
56
|
-
add("awkward", "age: 50s+ with a junior self_ref", "seniorJuniorSelfRef");
|
|
57
|
-
}
|
|
58
|
-
// The spec's eighth awkward rule — `age` contradicting the relative age implied by
|
|
59
|
-
// `address` — is **not implemented**. It needs a kinship lexicon that maps 형 or 누나 to a
|
|
60
|
-
// relative age, in a design that takes address terms as free-form text in any language.
|
|
61
|
-
// Recorded rather than dropped: the rule is right and the input it needs does not exist.
|
|
62
|
-
// Measured, not predicted: across five `terse-operator` runs the configured address never
|
|
63
|
-
// surfaced once, because a maximally terse reply has no natural slot for a vocative.
|
|
64
|
-
// The user is told rather than obeyed, since the alternative is forcing unnatural output.
|
|
65
|
-
if ((selfRef || userRef) && (axes.warmth <= 2 || axes.verbosity <= 2)) {
|
|
66
|
-
add("ineffective", "address set while warmth≤2 or verbosity≤2", "addressUnlikely");
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
return w;
|
|
33
|
+
/** Independent persona choices are valid; warn only when axis instructions conflict. */
|
|
34
|
+
export function check(axes) {
|
|
35
|
+
return axes.refusal >= 4 && axes.compliance >= 4
|
|
36
|
+
? [{ layer: "forbidden", rule: "refusal≥4 × compliance≥4", id: "refusalCompliance" }]
|
|
37
|
+
: [];
|
|
70
38
|
}
|
|
71
|
-
/** The axes a preset moves off their default
|
|
39
|
+
/** The axes a preset moves off their default; custom profiles have no count restriction. */
|
|
72
40
|
export function nonDefaultAxes(axes, defaults) {
|
|
73
41
|
// Walks AXIS_ORDER rather than Object.keys: map iteration order follows the JSON file, and a
|
|
74
42
|
// hand-edited config carrying a stray key would otherwise be reported as a non-default axis.
|
package/dist/core/config.js
CHANGED
|
@@ -11,7 +11,6 @@ export const LEGACY_CONFIG_SCHEMA = 1;
|
|
|
11
11
|
export const AGE_BANDS = ["unspecified", "teens", "20s", "30s", "40s", "50s+"];
|
|
12
12
|
export const GENDERS = ["unspecified", "masculine", "feminine", "neutral"];
|
|
13
13
|
export const SPEECH_LEVELS = ["auto", "polite", "plain"];
|
|
14
|
-
export const NOTE_MAX = 200;
|
|
15
14
|
export const WIRING_SCOPES = ["global", "project"];
|
|
16
15
|
export const RESOURCE_KINDS = ["hook", "skill", "shell", "reader", "command"];
|
|
17
16
|
export const RESOURCE_TYPES = ["file", "directory", "symlink"];
|
package/dist/core/i18n.js
CHANGED
|
@@ -72,7 +72,6 @@ const enMessages = {
|
|
|
72
72
|
`Run tonedial use ${was}, then save it as ${tried}.`,
|
|
73
73
|
noLatin: (name) => `"${name}": no Latin letters or digits for a slug`,
|
|
74
74
|
nameTooLong: (given, cap) => `display name: ${given} characters · maximum ${cap}`,
|
|
75
|
-
sparsity: (slug, count) => `${slug}: ${count} changed axes · recommended 3–7 (5±2). Fewer extremes reduce conflicts`,
|
|
76
75
|
replaced: (slug) => `${slug}: existing preset replaced`,
|
|
77
76
|
imported: (slug, replaced) => `${slug}: ${replaced ? "replaced" : "imported"}`,
|
|
78
77
|
unreadable: (path, reason) => `${path}\ncannot read: ${reason}`,
|
|
@@ -151,8 +150,6 @@ const enMessages = {
|
|
|
151
150
|
addressNone: "currently unset · Enter keeps it unset",
|
|
152
151
|
age: (given, bands) => `persona.age=${given} · available: ${bands.join(", ")}`,
|
|
153
152
|
gender: (options) => `persona.gender · available: ${options.join(", ")}`,
|
|
154
|
-
noteOverCap: (given, cap) => `persona.note: ${given} characters · over ${cap} recommended`,
|
|
155
|
-
noteNamesAxis: (axes) => `persona.note overlaps the ${axes.join(", ")} axes. Axes have anchors, so they win any conflict.`,
|
|
156
153
|
callsYou: (term) => `user name ${term}`,
|
|
157
154
|
callsItself: (term) => `self name ${term}`,
|
|
158
155
|
noteChars: (count) => `note ${count} chars`,
|
|
@@ -269,14 +266,14 @@ const enMessages = {
|
|
|
269
266
|
inspectScope: "To keep using these connections, inspect this scope:",
|
|
270
267
|
disconnectScope: "If no longer needed, disconnect all agents in this scope:",
|
|
271
268
|
scope: "Inspection scope: project",
|
|
272
|
-
toLookAt: (count) => `${count}
|
|
269
|
+
toLookAt: (count) => `${count} ${count === 1 ? "check needs" : "checks need"} attention`,
|
|
273
270
|
needsAPerson: "manual review required · see details above",
|
|
274
271
|
toneMatches: "matches config.json",
|
|
275
272
|
toneNotWritten: "not written",
|
|
276
273
|
toneDisagrees: "differs from config.json · edited directly or write interrupted",
|
|
274
|
+
seedsHeading: "Bundled files",
|
|
277
275
|
seedsOk: (version) => `version ${version}`,
|
|
278
276
|
seedsNotRun: "no bundled files · init has not run here",
|
|
279
|
-
seedsStale: (labels) => `${labels.length} need refresh: ${labels.join(", ")}`,
|
|
280
277
|
seedsAttention: "bundled files need attention",
|
|
281
278
|
recoveryPending: "An operation is active or needs recovery. Nothing was changed. Run tonedial doctor --json to inspect IDs. A recorded rollback uses doctor --fix --rollback ID; a stopped valid operation can be explicitly selected for app rebuild with doctor --fix --from-operation ID. Live or ambiguous owners stay protected.",
|
|
282
279
|
contextCurrent: "AGENTS.md and TONE.md layout is current.",
|
|
@@ -312,13 +309,12 @@ const enMessages = {
|
|
|
312
309
|
rollbackAction: { applied: "restore", "already-reverted": "already restored", changed: "changed · preserve", unsupported: "unsupported · preserve" },
|
|
313
310
|
rollbackQuestion: "Restore the selected operation?",
|
|
314
311
|
seedReason: {
|
|
315
|
-
missing: "
|
|
316
|
-
stale: "
|
|
317
|
-
modified: "
|
|
318
|
-
foreign: "Not owned by ToneDial
|
|
319
|
-
unreadable: "Cannot read safely
|
|
312
|
+
missing: "Missing bundled file",
|
|
313
|
+
stale: "Bundled file update available",
|
|
314
|
+
modified: "Locally modified · review before replacement",
|
|
315
|
+
foreign: "Not owned by ToneDial · preserved",
|
|
316
|
+
unreadable: "Cannot read safely · check path and permissions",
|
|
320
317
|
},
|
|
321
|
-
seedsBehind: (had, has) => `home bundled-file version ${had} · package version ${has}. An npm update does not refresh existing home files`,
|
|
322
318
|
skillLinked: "linked to bundled copy",
|
|
323
319
|
skillCopied: "copied · platform does not support links",
|
|
324
320
|
skillForeign: (path) => `${path}: not installed by ToneDial, so it will not be replaced`,
|
|
@@ -335,9 +331,7 @@ const enMessages = {
|
|
|
335
331
|
},
|
|
336
332
|
hookSettingScope: "Hook status is read from the inspected settings file only; host overrides and session delivery are unverified.",
|
|
337
333
|
hookGroupHeading: "Agent hooks",
|
|
338
|
-
hookGroupUnknown: (tools) => `
|
|
339
|
-
hookGroupMissing: "No managed ToneDial hook is registered for these agents in this scope.",
|
|
340
|
-
hookGroupAction: "To connect ToneDial, run init in this scope and select these agents.",
|
|
334
|
+
hookGroupUnknown: (tools) => `Not connected: ${tools.join(", ")}.`,
|
|
341
335
|
hookNotConnected: "No managed ToneDial hook to inspect. To connect, run init with this agent selected in the same scope.",
|
|
342
336
|
hookNeedsInspection: "Resolve the reported hook settings or program issue before checking enablement in the app.",
|
|
343
337
|
hookGuidance: {
|
|
@@ -381,24 +375,36 @@ const enMessages = {
|
|
|
381
375
|
"Find the global prefix: npm prefix -g\nAdd its bin directory (macOS/Linux) to PATH.",
|
|
382
376
|
},
|
|
383
377
|
notice: {
|
|
384
|
-
modelExpectation: "The model may not produce the tone you expect.",
|
|
385
378
|
riskIntro: "For fun, not recommended for production. Risky tone can distort judgments and work reports through falsehood, omission or exaggeration. ! marks advisory levels, not measured probabilities.",
|
|
386
379
|
riskAxes: (axes) => `! ${axes.join(", ")} · ${[
|
|
387
380
|
axes.some(axis => axis === "profanity" || axis === "critique") ? "harsh language" : null,
|
|
388
381
|
axes.some(axis => axis === "flattery" || axis === "conviction" || axis === "bravado") ? "biased judgments or exaggerated reports" : null,
|
|
389
382
|
axes.some(axis => axis === "compliance" || axis === "refusal") ? "hasty action or refusal" : null,
|
|
390
383
|
].filter(Boolean).join("; ")}`,
|
|
391
|
-
personaUnanchored: "persona has no fixed anchors; axes take precedence. Text may affect content. " +
|
|
392
|
-
"Roleplay does not verify credentials or grant permissions.",
|
|
393
384
|
roleplay: "High playfulness requests frequent, exaggerated role idioms and slang, such as 'your lowly servant' or 'take that function off the books'. They may sound rude or violent; ToneDial does not filter these expressions.",
|
|
394
385
|
risk: "for fun, and not recommended for production use",
|
|
395
386
|
},
|
|
396
387
|
update: {
|
|
397
388
|
running: (version) => `tonedial ${version}`,
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
389
|
+
toUpdate: "Package update:",
|
|
390
|
+
thenRefresh: "Refresh application files:",
|
|
391
|
+
setupNeeded: "Set up ToneDial:",
|
|
392
|
+
refreshFiles: (count) => `Bundled file updates available: ${count}`,
|
|
393
|
+
reviewState: "Inspect the affected application files:",
|
|
394
|
+
npmQuestion: " Run this npm update?",
|
|
395
|
+
npmComplete: (version) => `npm update complete · installed ${version}`,
|
|
396
|
+
npmMissing: "npm was not found on PATH. Use the Node/npm installation that owns this ToneDial copy.",
|
|
397
|
+
npmScopeUnknown: "Cannot verify npm's global installation directory. Check npm prefix -g and npm root -g before retrying.",
|
|
398
|
+
npmScopeMismatch: "This ToneDial copy is not the global package managed by the selected npm. Use the matching Node/npm installation; no update was run.",
|
|
399
|
+
npmFailed: "npm update failed. Check npm's access and registry settings, then retry the displayed command for npm's diagnostics.",
|
|
400
|
+
versionUnknown: "The installed ToneDial version could not be verified. Check the package installation before retrying.",
|
|
401
|
+
stateIssue: {
|
|
402
|
+
missing: "Saved settings are missing.",
|
|
403
|
+
unsafe: "Saved settings cannot be read safely. Check links and file types.",
|
|
404
|
+
changed: "Saved settings changed during inspection. Retry after changes stop.",
|
|
405
|
+
invalid: "Saved settings are invalid.",
|
|
406
|
+
unreadable: "Application state could not be read. Check the path and permissions.",
|
|
407
|
+
},
|
|
402
408
|
fetching: (registry) => `checking · ${registry}`,
|
|
403
409
|
found: (version, bytes) => `${version}, ${bytes.toLocaleString("en")} bytes`,
|
|
404
410
|
already: (version) => `${version} already installed`,
|
|
@@ -406,11 +412,10 @@ const enMessages = {
|
|
|
406
412
|
question: (version) => ` Replace this install with ${version}?`,
|
|
407
413
|
replaced: (version) => `updated · ${version}`,
|
|
408
414
|
declined: "cancelled · existing install kept",
|
|
409
|
-
onlyCurl: (shape) => `${shape} install · use its own update path`,
|
|
410
415
|
noTar: "tar is required for updates but is not on PATH",
|
|
411
416
|
notAPackage: "download is not a ToneDial package",
|
|
412
417
|
linkInPackage: "release contains a symbolic link, but published files need none",
|
|
413
|
-
needsApproval: "
|
|
418
|
+
needsApproval: "Update not run · approval required. Rerun tonedial update --auto to approve.",
|
|
414
419
|
integrityMismatch: "download hash differs from the registry",
|
|
415
420
|
notOurs: (dir) => `${dir}: not created by ToneDial; remove it yourself`,
|
|
416
421
|
swapFailed: (reason) => `installation stopped: ${reason}. Check recovery details before retrying.`,
|
|
@@ -474,14 +479,8 @@ const enMessages = {
|
|
|
474
479
|
},
|
|
475
480
|
combos: {
|
|
476
481
|
contradiction: (rule) => `${rule} contradicts itself.`,
|
|
477
|
-
reads: (rule) => `${rule}:`,
|
|
478
482
|
refusalCompliance: "One axis requires a declared strike; the other requires immediate action without comment. Lower one.",
|
|
479
|
-
formalSelfRef: "Ceremonious wording and a familiar self-name create a contrast.",
|
|
480
|
-
casualUserRef: "Familiar wording and an honorific address create a contrast.",
|
|
481
|
-
teensFormal: "A teenage persona with ceremonious wording can sound theatrical.",
|
|
482
|
-
seniorJuniorSelfRef: "The stated age and self-name imply different standing.",
|
|
483
483
|
nothingBlocked: "Nothing is blocked.",
|
|
484
|
-
addressUnlikely: "Brief or unemotional replies may omit names; strong roleplay may make them more frequent.",
|
|
485
484
|
},
|
|
486
485
|
errors: {
|
|
487
486
|
notACommand: (name, known, nearest) => `${name} is not a command.${nearest ? ` Did you mean ${nearest}?` : ""} ` +
|
|
@@ -645,7 +644,7 @@ const en = {
|
|
|
645
644
|
"persona.gender": "gender the model may associate with",
|
|
646
645
|
"persona.self_ref": "agent's self-name",
|
|
647
646
|
"persona.user_ref": "agent's name for the user",
|
|
648
|
-
"persona.note": "role the axes cannot express
|
|
647
|
+
"persona.note": "role or manner the axes cannot express",
|
|
649
648
|
"persona.user": "user context · maximum 200 characters",
|
|
650
649
|
"persona.agent": "fictional agent role · maximum 200 characters · credentials are unverified; grants no capability or permission",
|
|
651
650
|
},
|
|
@@ -720,7 +719,6 @@ const koMessages = {
|
|
|
720
719
|
`tonedial use ${was} 명령을 실행한 뒤 저장할 새 이름을 지정하세요: ${tried}`,
|
|
721
720
|
noLatin: (name) => `"${name}": 슬러그로 쓸 라틴 문자나 숫자가 없습니다`,
|
|
722
721
|
nameTooLong: (given, cap) => `표시 이름: ${given}자 · 최대 ${cap}자`,
|
|
723
|
-
sparsity: (slug, count) => `${slug}: 변경 축 ${count}개 · 권장 3~7개(5±2). 극단값이 적으면 충돌도 줄어듭니다`,
|
|
724
722
|
replaced: (slug) => `${slug}: 기존 프리셋 교체됨`,
|
|
725
723
|
imported: (slug, replaced) => `${slug}: ${replaced ? "교체됨" : "가져옴"}`,
|
|
726
724
|
unreadable: (path, reason) => `${path}\n읽을 수 없습니다: ${reason}`,
|
|
@@ -799,8 +797,6 @@ const koMessages = {
|
|
|
799
797
|
addressNone: "현재 설정 없음 · 엔터를 누르면 유지",
|
|
800
798
|
age: (given, bands) => `persona.age=${given} · 사용 가능: ${bands.join(", ")}`,
|
|
801
799
|
gender: (options) => `persona.gender · 사용 가능: ${options.join(", ")}`,
|
|
802
|
-
noteOverCap: (given, cap) => `persona.note: ${given}자 · 권장 ${cap}자 초과`,
|
|
803
|
-
noteNamesAxis: (axes) => `persona.note가 ${axes.join(", ")} 축과 겹칩니다. 축에는 앵커가 있으므로 충돌하면 축이 우선합니다`,
|
|
804
800
|
// Labels rather than clauses, for the same reason as `autoChose` above: an address is
|
|
805
801
|
// free-form user text in any language, and `전하이라고` is what attaching `이라고` to it
|
|
806
802
|
// produced — 전하 ends in a vowel and takes `라고`.
|
|
@@ -920,14 +916,14 @@ const koMessages = {
|
|
|
920
916
|
inspectScope: "계속 사용하려면 이 범위를 검사하세요:",
|
|
921
917
|
disconnectScope: "더 이상 필요 없으면 이 범위의 모든 에이전트 연결을 해제하세요:",
|
|
922
918
|
scope: "검사 범위: 프로젝트",
|
|
923
|
-
toLookAt: (count) =>
|
|
919
|
+
toLookAt: (count) => `점검 필요 ${count}건`,
|
|
924
920
|
needsAPerson: "직접 확인 필요 · 위 세부 내용을 확인해 주세요",
|
|
925
921
|
toneMatches: "config.json과 일치",
|
|
926
922
|
toneNotWritten: "파일 없음",
|
|
927
923
|
toneDisagrees: "config.json과 다름 · 직접 수정했거나 저장이 중단됨",
|
|
924
|
+
seedsHeading: "기본 파일",
|
|
928
925
|
seedsOk: (version) => `버전 ${version}`,
|
|
929
926
|
seedsNotRun: "기본 파일 없음 · init으로 준비하세요",
|
|
930
|
-
seedsStale: (labels) => `갱신 필요 ${labels.length}개: ${labels.join(", ")}`,
|
|
931
927
|
seedsAttention: "기본 파일 확인 필요",
|
|
932
928
|
recoveryPending: "진행 중이거나 복구가 필요한 작업이 있습니다. 아무것도 바꾸지 않았습니다. tonedial doctor --json으로 ID를 확인하세요. 기록된 롤백은 doctor --fix --rollback ID로, 중단된 유효한 작업을 선택해 앱을 다시 만들 때는 doctor --fix --from-operation ID로 진행하세요. 실행 중이거나 소유자가 불확실한 작업은 유지합니다.",
|
|
933
929
|
contextCurrent: "AGENTS.md와 TONE.md 구성이 최신입니다.",
|
|
@@ -963,13 +959,12 @@ const koMessages = {
|
|
|
963
959
|
rollbackAction: { applied: "복구", "already-reverted": "이미 복구됨", changed: "변경됨 · 보존", unsupported: "지원하지 않음 · 보존" },
|
|
964
960
|
rollbackQuestion: "선택한 작업을 복구할까요?",
|
|
965
961
|
seedReason: {
|
|
966
|
-
missing: "파일 없음
|
|
967
|
-
stale: "
|
|
968
|
-
modified: "직접 수정한 파일 ·
|
|
969
|
-
foreign: "ToneDial
|
|
970
|
-
unreadable: "안전하게 읽을 수
|
|
962
|
+
missing: "기본 파일 없음",
|
|
963
|
+
stale: "기본 파일 업데이트 가능",
|
|
964
|
+
modified: "직접 수정한 파일 · 교체 전 확인 필요",
|
|
965
|
+
foreign: "ToneDial 관리 파일 아님 · 보존됨",
|
|
966
|
+
unreadable: "안전하게 읽을 수 없음 · 경로와 접근 권한 확인 필요",
|
|
971
967
|
},
|
|
972
|
-
seedsBehind: (had, has) => `홈 기본 파일 버전 ${had} · 패키지 버전 ${has}. npm 업데이트만으로는 홈의 기존 파일이 갱신되지 않습니다`,
|
|
973
968
|
skillLinked: "기본 파일 사본에 연결됨",
|
|
974
969
|
skillCopied: "복사됨 · 이 플랫폼은 링크를 쓰지 않음",
|
|
975
970
|
skillForeign: (path) => `${path}: ToneDial이 설치한 스킬이 아니므로 교체하지 않습니다`,
|
|
@@ -986,9 +981,7 @@ const koMessages = {
|
|
|
986
981
|
},
|
|
987
982
|
hookSettingScope: "훅 상태는 검사한 설정 파일만 읽어 표시합니다. 앱의 설정 덮어쓰기와 세션 전달 여부는 확인하지 않습니다.",
|
|
988
983
|
hookGroupHeading: "에이전트 훅",
|
|
989
|
-
hookGroupUnknown: (tools) =>
|
|
990
|
-
hookGroupMissing: "이 검사 범위에는 ToneDial 관리 훅이 등록되어 있지 않습니다.",
|
|
991
|
-
hookGroupAction: "ToneDial을 연결하려면 같은 범위에서 init을 실행하고 이 에이전트들을 선택하세요.",
|
|
984
|
+
hookGroupUnknown: (tools) => `연결 안 됨: ${tools.join(", ")}`,
|
|
992
985
|
hookNotConnected: "검사할 ToneDial 관리 훅이 없습니다. 연결하려면 같은 범위에서 init을 실행하고 이 에이전트를 선택해 주세요.",
|
|
993
986
|
hookNeedsInspection: "위에 나온 훅 설정이나 실행 프로그램 문제를 먼저 확인한 뒤 앱에서 활성화 여부를 확인해 주세요.",
|
|
994
987
|
hookGuidance: {
|
|
@@ -1032,24 +1025,36 @@ const koMessages = {
|
|
|
1032
1025
|
"전역 경로 확인: npm prefix -g\n그 경로의 bin 폴더(macOS/Linux)를 PATH에 추가하세요.",
|
|
1033
1026
|
},
|
|
1034
1027
|
notice: {
|
|
1035
|
-
modelExpectation: "사용하는 모델에 따라 기대한 말투가 나오지 않을 수 있습니다.",
|
|
1036
1028
|
riskIntro: "재미를 위한 도구로 실무 사용은 권장하지 않습니다. 위험한 말투에 거짓·누락·과장이 섞여 판단과 작업 보고가 왜곡될 수 있습니다. !는 주의 표시이며 측정한 확률이 아닙니다.",
|
|
1037
1029
|
riskAxes: (axes) => `! ${axes.join(", ")} · ${[
|
|
1038
1030
|
axes.some(axis => axis === "profanity" || axis === "critique") ? "거친 표현" : null,
|
|
1039
1031
|
axes.some(axis => axis === "flattery" || axis === "conviction" || axis === "bravado") ? "치우친 판단·과장된 보고" : null,
|
|
1040
1032
|
axes.some(axis => axis === "compliance" || axis === "refusal") ? "성급한 실행·거절" : null,
|
|
1041
1033
|
].filter(Boolean).join(" · ")}`,
|
|
1042
|
-
personaUnanchored: "페르소나에는 고정된 행동 규칙이 없으며 축 설정이 우선합니다. 설명은 내용에도 영향을 줄 수 있습니다. " +
|
|
1043
|
-
"역할극은 자격이나 권한을 주지 않습니다.",
|
|
1044
1034
|
roleplay: "playfulness가 높으면 '아뢰옵기 황송하오나', '이 함수, 장부에서 지울까요?' 같은 역할 어휘와 은어를 더 자주, 과장해서 쓰도록 요청합니다. 무례하거나 거칠게 들릴 수 있으며, ToneDial은 이런 표현을 걸러내지 않습니다.",
|
|
1045
1035
|
risk: "재미를 위한 도구이며 실무 사용은 권장하지 않습니다",
|
|
1046
1036
|
},
|
|
1047
1037
|
update: {
|
|
1048
1038
|
running: (version) => `tonedial ${version}`,
|
|
1049
|
-
|
|
1050
|
-
|
|
1051
|
-
|
|
1052
|
-
|
|
1039
|
+
toUpdate: "패키지 업데이트:",
|
|
1040
|
+
thenRefresh: "앱 파일을 업데이트하려면:",
|
|
1041
|
+
setupNeeded: "ToneDial 초기 설정:",
|
|
1042
|
+
refreshFiles: (count) => `업데이트 가능한 기본 파일 ${count}개`,
|
|
1043
|
+
reviewState: "문제가 있는 앱 파일을 검사하려면:",
|
|
1044
|
+
npmQuestion: " npm으로 업데이트할까요?",
|
|
1045
|
+
npmComplete: (version) => `npm 업데이트 완료 · 설치 버전 ${version}`,
|
|
1046
|
+
npmMissing: "PATH에서 npm을 찾지 못했습니다. 현재 ToneDial을 설치한 Node/npm 환경을 사용해 주세요.",
|
|
1047
|
+
npmScopeUnknown: "npm의 전역 설치 경로를 확인할 수 없습니다. npm prefix -g와 npm root -g를 확인한 뒤 다시 시도해 주세요.",
|
|
1048
|
+
npmScopeMismatch: "현재 ToneDial은 선택한 npm이 관리하는 전역 패키지가 아닙니다. 설치할 때 사용한 Node/npm 환경을 선택해 주세요. 업데이트는 실행하지 않았습니다.",
|
|
1049
|
+
npmFailed: "npm 업데이트에 실패했습니다. npm의 접근 권한과 레지스트리 설정을 확인해 주세요. 표시된 명령을 직접 실행하면 npm의 오류 내용을 볼 수 있습니다.",
|
|
1050
|
+
versionUnknown: "설치된 ToneDial 버전을 확인할 수 없습니다. 패키지 설치 상태를 확인한 뒤 다시 시도해 주세요.",
|
|
1051
|
+
stateIssue: {
|
|
1052
|
+
missing: "저장된 설정이 없습니다.",
|
|
1053
|
+
unsafe: "저장된 설정을 안전하게 읽을 수 없습니다. 링크와 파일 형식을 확인해 주세요.",
|
|
1054
|
+
changed: "검사 중 저장된 설정이 바뀌었습니다. 변경이 끝난 뒤 다시 시도해 주세요.",
|
|
1055
|
+
invalid: "저장된 설정이 올바르지 않습니다.",
|
|
1056
|
+
unreadable: "앱 상태를 읽지 못했습니다. 경로와 접근 권한을 확인해 주세요.",
|
|
1057
|
+
},
|
|
1053
1058
|
fetching: (registry) => `확인 중 · ${registry}`,
|
|
1054
1059
|
found: (version, bytes) => `${version}, ${bytes.toLocaleString("ko")}바이트`,
|
|
1055
1060
|
already: (version) => `설치 버전 ${version} · 이미 설치됨`,
|
|
@@ -1057,11 +1062,10 @@ const koMessages = {
|
|
|
1057
1062
|
question: (version) => ` 대상 버전 ${version} · 이 설치를 바꿀까요?`,
|
|
1058
1063
|
replaced: (version) => `업데이트됨 · ${version}`,
|
|
1059
1064
|
declined: "취소됨 · 기존 설치 유지",
|
|
1060
|
-
onlyCurl: (shape) => `${shape} 설치 · 자체 업데이트 경로 사용`,
|
|
1061
1065
|
noTar: "업데이트에 필요한 tar를 PATH에서 찾지 못했습니다",
|
|
1062
1066
|
notAPackage: "다운로드한 파일이 ToneDial 패키지가 아닙니다",
|
|
1063
1067
|
linkInPackage: "릴리스에 심볼릭 링크가 있지만 배포물에는 필요하지 않습니다",
|
|
1064
|
-
needsApproval: "
|
|
1068
|
+
needsApproval: "업데이트 승인 필요 · 실행하지 않았습니다. 승인하려면 tonedial update --auto를 실행하세요.",
|
|
1065
1069
|
integrityMismatch: "다운로드한 파일의 해시가 레지스트리와 다릅니다",
|
|
1066
1070
|
notOurs: (dir) => `${dir}: ToneDial이 만든 항목이 아니므로 직접 치워 주세요`,
|
|
1067
1071
|
swapFailed: (reason) => `설치를 중단했습니다: ${reason}. 다시 시도하기 전에 복구 안내를 확인하세요.`,
|
|
@@ -1125,14 +1129,8 @@ const koMessages = {
|
|
|
1125
1129
|
},
|
|
1126
1130
|
combos: {
|
|
1127
1131
|
contradiction: (rule) => `${rule}: 서로 모순됩니다.`,
|
|
1128
|
-
reads: (rule) => `${rule}:`,
|
|
1129
1132
|
refusalCompliance: "한 축은 거절 선언을 요구하고 다른 축은 군말 없는 실행을 요구합니다. 한쪽을 낮춰 주세요.",
|
|
1130
|
-
formalSelfRef: "의례적인 표현과 친근한 자칭이 대비를 만듭니다.",
|
|
1131
|
-
casualUserRef: "친근한 표현과 깍듯한 호칭이 대비를 만듭니다.",
|
|
1132
|
-
teensFormal: "십대 캐릭터가 의례적인 표현을 쓰면 연극처럼 들릴 수 있습니다.",
|
|
1133
|
-
seniorJuniorSelfRef: "설정한 나이와 자칭이 서로 다른 지위를 나타냅니다.",
|
|
1134
1133
|
nothingBlocked: "막지는 않습니다.",
|
|
1135
|
-
addressUnlikely: "짧거나 감정 없는 답변에서는 호칭이 생략될 수 있습니다. 역할극이 강하면 더 자주 나올 수 있습니다.",
|
|
1136
1134
|
},
|
|
1137
1135
|
errors: {
|
|
1138
1136
|
notACommand: (name, known, nearest) => `${name}: 명령이 아닙니다.${nearest ? ` ${nearest} 말씀이신가요?` : ""} ` +
|
|
@@ -1300,7 +1298,7 @@ const ko = {
|
|
|
1300
1298
|
"persona.gender": "모델이 연상할 성별",
|
|
1301
1299
|
"persona.self_ref": "에이전트의 자칭",
|
|
1302
1300
|
"persona.user_ref": "에이전트가 쓰는 사용자 호칭",
|
|
1303
|
-
"persona.note": "축으로 표현할 수 없는
|
|
1301
|
+
"persona.note": "축으로 표현할 수 없는 역할이나 말투",
|
|
1304
1302
|
"persona.user": "사용자 배경 설명 · 최대 200자",
|
|
1305
1303
|
"persona.agent": "가상 에이전트 역할 · 최대 200자 · 경력은 확인하지 않으며 능력·권한을 부여하지 않음",
|
|
1306
1304
|
},
|
package/dist/core/locales/es.js
CHANGED
|
@@ -61,7 +61,6 @@ const messages = {
|
|
|
61
61
|
`Ejecuta tonedial use ${was} y guárdalo como ${tried}.`,
|
|
62
62
|
noLatin: (name) => `«${name}»: no contiene letras latinas ni dígitos para el identificador`,
|
|
63
63
|
nameTooLong: (given, cap) => `Nombre visible: ${given} caracteres · máximo ${cap}`,
|
|
64
|
-
sparsity: (slug, count) => `${slug}: ${count} ejes cambiados · se recomiendan 3–7 (5±2). Menos extremos reducen conflictos`,
|
|
65
64
|
replaced: (slug) => `${slug}: se reemplazó el preajuste existente`,
|
|
66
65
|
imported: (slug, replaced) => `${slug}: ${replaced ? "reemplazado" : "importado"}`,
|
|
67
66
|
unreadable: (path, reason) => `${path}\nNo se puede leer: ${reason}`,
|
|
@@ -140,8 +139,6 @@ const messages = {
|
|
|
140
139
|
addressNone: "Sin definir · Enter lo mantiene así",
|
|
141
140
|
age: (given, bands) => `persona.age=${given} · disponibles: ${bands.join(", ")}`,
|
|
142
141
|
gender: (options) => `persona.gender · disponibles: ${options.join(", ")}`,
|
|
143
|
-
noteOverCap: (given, cap) => `persona.note: ${given} caracteres · supera los ${cap} recomendados`,
|
|
144
|
-
noteNamesAxis: (axes) => `persona.note se solapa con los ejes ${axes.join(", ")}. Los criterios de los ejes prevalecen en caso de conflicto.`,
|
|
145
142
|
callsYou: (term) => `nombre del usuario ${term}`,
|
|
146
143
|
callsItself: (term) => `nombre propio ${term}`,
|
|
147
144
|
noteChars: (count) => `nota de ${count} caracteres`,
|
|
@@ -258,14 +255,14 @@ const messages = {
|
|
|
258
255
|
inspectScope: "Para seguir usando estas conexiones, inspecciona este ámbito:",
|
|
259
256
|
disconnectScope: "Si ya no se necesitan, desconecta todos los agentes de este ámbito:",
|
|
260
257
|
scope: "Ámbito de inspección: proyecto",
|
|
261
|
-
toLookAt: (count) => `${count}
|
|
258
|
+
toLookAt: (count) => `${count} ${count === 1 ? "comprobación requiere" : "comprobaciones requieren"} atención`,
|
|
262
259
|
needsAPerson: "revisión manual necesaria · consulta los detalles anteriores",
|
|
263
260
|
toneMatches: "coincide con config.json",
|
|
264
261
|
toneNotWritten: "sin escribir",
|
|
265
262
|
toneDisagrees: "difiere de config.json · edición directa o escritura interrumpida",
|
|
263
|
+
seedsHeading: "Archivos incluidos",
|
|
266
264
|
seedsOk: (version) => `versión ${version}`,
|
|
267
265
|
seedsNotRun: "sin archivos incluidos · aquí no se ha ejecutado init",
|
|
268
|
-
seedsStale: (labels) => `${labels.length} necesitan actualizarse: ${labels.join(", ")}`,
|
|
269
266
|
seedsAttention: "los archivos incluidos requieren atención",
|
|
270
267
|
recoveryPending: "Hay una operación activa o pendiente de recuperación. No se cambió nada. Consulta los ID con tonedial doctor --json. Revierte con doctor --fix --rollback ID o reconstruye desde una operación válida detenida con doctor --fix --from-operation ID. Los propietarios activos o ambiguos siguen protegidos.",
|
|
271
268
|
contextCurrent: "La estructura de AGENTS.md y TONE.md está al día.",
|
|
@@ -301,13 +298,12 @@ const messages = {
|
|
|
301
298
|
rollbackAction: { applied: "restaurar", "already-reverted": "ya restaurado", changed: "cambiado · conservar", unsupported: "no admitido · conservar" },
|
|
302
299
|
rollbackQuestion: "¿Restaurar la operación elegida?",
|
|
303
300
|
seedReason: {
|
|
304
|
-
missing: "
|
|
305
|
-
stale: "archivo incluido
|
|
306
|
-
modified: "
|
|
307
|
-
foreign: "No
|
|
308
|
-
unreadable: "No se puede leer con seguridad
|
|
301
|
+
missing: "Falta un archivo incluido",
|
|
302
|
+
stale: "Actualización de archivo incluido disponible",
|
|
303
|
+
modified: "Modificado localmente · revisar antes de reemplazar",
|
|
304
|
+
foreign: "No gestionado por ToneDial · conservado",
|
|
305
|
+
unreadable: "No se puede leer con seguridad · comprobar ruta y permisos",
|
|
309
306
|
},
|
|
310
|
-
seedsBehind: (had, has) => `versión local ${had} · versión del paquete ${has}. Actualizar npm no renueva los archivos locales existentes`,
|
|
311
307
|
skillLinked: "enlazado a la copia incluida",
|
|
312
308
|
skillCopied: "copiado · la plataforma no admite enlaces",
|
|
313
309
|
skillForeign: (path) => `${path}: no lo instaló ToneDial; no se reemplazará`,
|
|
@@ -324,9 +320,7 @@ const messages = {
|
|
|
324
320
|
},
|
|
325
321
|
hookSettingScope: "El estado del hook solo procede del archivo inspeccionado; no se verificaron las anulaciones del cliente ni la entrega a la sesión.",
|
|
326
322
|
hookGroupHeading: "Hooks de agentes",
|
|
327
|
-
hookGroupUnknown: (tools) => `
|
|
328
|
-
hookGroupMissing: "No hay hooks de ToneDial gestionados para estos agentes en este ámbito.",
|
|
329
|
-
hookGroupAction: "Para conectar ToneDial, ejecuta init en este ámbito y elige estos agentes.",
|
|
323
|
+
hookGroupUnknown: (tools) => `Sin conectar: ${tools.join(", ")}.`,
|
|
330
324
|
hookNotConnected: "No hay un hook gestionado que inspeccionar. Para conectar, ejecuta init en el mismo ámbito y elige este agente.",
|
|
331
325
|
hookNeedsInspection: "Resuelve el problema de ajustes o del programa del hook antes de comprobar su activación en la aplicación.",
|
|
332
326
|
hookGuidance: {
|
|
@@ -370,20 +364,32 @@ const messages = {
|
|
|
370
364
|
"Busca el prefijo global: npm prefix -g\nAñade su directorio bin (macOS/Linux) a PATH.",
|
|
371
365
|
},
|
|
372
366
|
notice: {
|
|
373
|
-
modelExpectation: "El modelo podría no producir el tono esperado.",
|
|
374
367
|
riskIntro: "Para divertirse; no se recomienda en producción. Los tonos de riesgo pueden distorsionar juicios e informes con falsedades, omisiones o exageraciones. ! es una advertencia, no una probabilidad medida.",
|
|
375
368
|
riskAxes: (axes) => `! ${axes.join(", ")} · ${[axes.some(axis => axis === "profanity" || axis === "critique") ? "lenguaje duro" : null, axes.some(axis => axis === "flattery" || axis === "conviction" || axis === "bravado") ? "juicios sesgados o informes exagerados" : null, axes.some(axis => axis === "compliance" || axis === "refusal") ? "acción precipitada o rechazo" : null].filter(Boolean).join("; ")}`,
|
|
376
|
-
personaUnanchored: "La personalidad no tiene criterios fijos; prevalecen los ejes. El texto puede afectar al contenido. " +
|
|
377
|
-
"Interpretar un rol no verifica credenciales ni concede permisos.",
|
|
378
369
|
roleplay: "Un playfulness alto pide expresiones frecuentes y exageradas, como «su humilde servidor» o «sacar esa función de las cuentas». Pueden sonar groseras o violentas; ToneDial no las filtra.",
|
|
379
370
|
risk: "para divertirse; no se recomienda en producción",
|
|
380
371
|
},
|
|
381
372
|
update: {
|
|
382
373
|
running: (version) => `tonedial ${version}`,
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
374
|
+
toUpdate: "Actualización del paquete:",
|
|
375
|
+
thenRefresh: "Actualizar los archivos de la aplicación:",
|
|
376
|
+
setupNeeded: "Configurar ToneDial:",
|
|
377
|
+
refreshFiles: (count) => `Archivos incluidos con actualizaciones: ${count}`,
|
|
378
|
+
reviewState: "Inspeccionar los archivos afectados:",
|
|
379
|
+
npmQuestion: " ¿Ejecutar esta actualización de npm?",
|
|
380
|
+
npmComplete: (version) => `Actualización de npm completada · instalado ${version}`,
|
|
381
|
+
npmMissing: "No se encontró npm en PATH. Usa la instalación de Node/npm que gestiona esta copia de ToneDial.",
|
|
382
|
+
npmScopeUnknown: "No se puede verificar el directorio global de npm. Comprueba npm prefix -g y npm root -g antes de reintentar.",
|
|
383
|
+
npmScopeMismatch: "Esta copia de ToneDial no es el paquete global gestionado por el npm seleccionado. Usa la instalación de Node/npm correspondiente. No se ejecutó la actualización.",
|
|
384
|
+
npmFailed: "La actualización de npm falló. Comprueba los permisos y el registro, y ejecuta el comando mostrado para ver el diagnóstico de npm.",
|
|
385
|
+
versionUnknown: "No se pudo verificar la versión instalada de ToneDial. Comprueba la instalación del paquete antes de reintentar.",
|
|
386
|
+
stateIssue: {
|
|
387
|
+
missing: "Faltan los ajustes guardados.",
|
|
388
|
+
unsafe: "No se pueden leer los ajustes con seguridad. Comprueba los enlaces y los tipos de archivo.",
|
|
389
|
+
changed: "Los ajustes cambiaron durante la inspección. Reintenta cuando terminen los cambios.",
|
|
390
|
+
invalid: "Los ajustes guardados no son válidos.",
|
|
391
|
+
unreadable: "No se pudo leer el estado de la aplicación. Comprueba la ruta y los permisos.",
|
|
392
|
+
},
|
|
387
393
|
fetching: (registry) => `consultando · ${registry}`,
|
|
388
394
|
found: (version, bytes) => `${version}, ${bytes.toLocaleString("es")} bytes`,
|
|
389
395
|
already: (version) => `${version} ya está instalado`,
|
|
@@ -391,11 +397,10 @@ const messages = {
|
|
|
391
397
|
question: (version) => ` ¿Reemplazar esta instalación por ${version}?`,
|
|
392
398
|
replaced: (version) => `actualizado · ${version}`,
|
|
393
399
|
declined: "cancelado · se conserva la instalación existente",
|
|
394
|
-
onlyCurl: (shape) => `instalación de ${shape} · usa su método de actualización`,
|
|
395
400
|
noTar: "La actualización necesita tar, pero no está en PATH",
|
|
396
401
|
notAPackage: "La descarga no es un paquete de ToneDial",
|
|
397
402
|
linkInPackage: "La publicación contiene un enlace simbólico, innecesario en los archivos publicados",
|
|
398
|
-
needsApproval: "
|
|
403
|
+
needsApproval: "La actualización requiere aprobación y no se ha ejecutado. Ejecuta tonedial update --auto para aprobarla.",
|
|
399
404
|
integrityMismatch: "El hash de la descarga no coincide con el del registro",
|
|
400
405
|
notOurs: (dir) => `${dir}: no lo creó ToneDial; elimínalo manualmente`,
|
|
401
406
|
swapFailed: (reason) => `Instalación detenida: ${reason}. Revisa la recuperación antes de reintentar.`,
|
|
@@ -459,14 +464,8 @@ const messages = {
|
|
|
459
464
|
},
|
|
460
465
|
combos: {
|
|
461
466
|
contradiction: (rule) => `${rule} se contradice.`,
|
|
462
|
-
reads: (rule) => `${rule}:`,
|
|
463
467
|
refusalCompliance: "Un eje pide declarar una negativa; el otro, actuar sin comentarios. Reduce uno de los dos.",
|
|
464
|
-
formalSelfRef: "El lenguaje ceremonial contrasta con un nombre propio familiar.",
|
|
465
|
-
casualUserRef: "El lenguaje familiar contrasta con una forma de trato honorífica.",
|
|
466
|
-
teensFormal: "Una personalidad adolescente con lenguaje ceremonial puede sonar teatral.",
|
|
467
|
-
seniorJuniorSelfRef: "La edad y el nombre propio sugieren posiciones distintas.",
|
|
468
468
|
nothingBlocked: "No se bloquea nada.",
|
|
469
|
-
addressUnlikely: "Las respuestas breves o poco emotivas pueden omitir nombres; un rol intenso puede usarlos más.",
|
|
470
469
|
},
|
|
471
470
|
errors: {
|
|
472
471
|
notACommand: (name, known, nearest) => `${name} no es un comando.${nearest ? ` ¿Querías decir ${nearest}?` : ""} ` +
|
|
@@ -628,7 +627,7 @@ export const es = {
|
|
|
628
627
|
"persona.gender": "género que puede asociar el modelo",
|
|
629
628
|
"persona.self_ref": "cómo se llama el agente a sí mismo",
|
|
630
629
|
"persona.user_ref": "cómo llama el agente al usuario",
|
|
631
|
-
"persona.note": "rol que los ejes no expresan
|
|
630
|
+
"persona.note": "rol o manera de hablar que los ejes no expresan",
|
|
632
631
|
"persona.user": "contexto del usuario · máximo 200 caracteres",
|
|
633
632
|
"persona.agent": "rol ficticio del agente · máximo 200 caracteres · credenciales sin verificar; no concede capacidad ni permisos",
|
|
634
633
|
},
|