@sayknow-cli/coding-agent 0.2.3 → 0.2.5

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 (159) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/dist/types/cli/migrate-cli.d.ts +20 -0
  3. package/dist/types/cli/update-cli.d.ts +3 -0
  4. package/dist/types/commands/migrate.d.ts +33 -0
  5. package/dist/types/config/keybindings.d.ts +4 -0
  6. package/dist/types/config/model-registry.d.ts +3 -0
  7. package/dist/types/config/models-config-schema.d.ts +5 -0
  8. package/dist/types/config/settings-schema.d.ts +27 -0
  9. package/dist/types/harness-control-plane/storage.d.ts +2 -1
  10. package/dist/types/hooks/skill-state.d.ts +12 -4
  11. package/dist/types/i18n/messages/en.d.ts +14 -0
  12. package/dist/types/lsp/startup-events.d.ts +1 -0
  13. package/dist/types/migrate/action-planner.d.ts +11 -0
  14. package/dist/types/migrate/adapters/claude-code.d.ts +2 -0
  15. package/dist/types/migrate/adapters/codex.d.ts +5 -0
  16. package/dist/types/migrate/adapters/index.d.ts +45 -0
  17. package/dist/types/migrate/adapters/opencode.d.ts +2 -0
  18. package/dist/types/migrate/executor.d.ts +2 -0
  19. package/dist/types/migrate/mcp-mapper.d.ts +20 -0
  20. package/dist/types/migrate/report.d.ts +18 -0
  21. package/dist/types/migrate/skill-normalizer.d.ts +27 -0
  22. package/dist/types/migrate/types.d.ts +126 -0
  23. package/dist/types/modes/components/custom-editor.d.ts +1 -1
  24. package/dist/types/modes/components/welcome.d.ts +3 -1
  25. package/dist/types/modes/interactive-mode.d.ts +3 -0
  26. package/dist/types/modes/prompt-action-autocomplete.d.ts +1 -0
  27. package/dist/types/modes/shared/agent-wire/unattended-audit.d.ts +1 -1
  28. package/dist/types/research-plan/index.d.ts +1 -0
  29. package/dist/types/research-plan/ledger.d.ts +33 -0
  30. package/dist/types/rlm/artifacts.d.ts +1 -1
  31. package/dist/types/runtime-mcp/config-writer.d.ts +26 -0
  32. package/dist/types/skc-runtime/deep-interview-recorder.d.ts +2 -0
  33. package/dist/types/skc-runtime/deep-interview-runtime.d.ts +2 -2
  34. package/dist/types/skc-runtime/goal-mode-request.d.ts +1 -1
  35. package/dist/types/skc-runtime/session-layout.d.ts +59 -0
  36. package/dist/types/skc-runtime/session-resolution.d.ts +47 -0
  37. package/dist/types/skc-runtime/state-graph.d.ts +1 -1
  38. package/dist/types/skc-runtime/state-runtime.d.ts +5 -4
  39. package/dist/types/skc-runtime/state-schema.d.ts +2 -0
  40. package/dist/types/skc-runtime/state-writer.d.ts +36 -7
  41. package/dist/types/skc-runtime/tmux-sessions.d.ts +2 -0
  42. package/dist/types/skc-runtime/ultragoal-runtime.d.ts +7 -4
  43. package/dist/types/skc-runtime/workflow-command-ref.d.ts +1 -1
  44. package/dist/types/skc-runtime/workflow-manifest.d.ts +1 -1
  45. package/dist/types/skill-state/active-state.d.ts +6 -11
  46. package/dist/types/skill-state/canonical-skills.d.ts +3 -0
  47. package/dist/types/skill-state/deep-interview-mutation-guard.d.ts +5 -0
  48. package/dist/types/skill-state/workflow-hud.d.ts +2 -0
  49. package/dist/types/task/spawn-gate.d.ts +1 -10
  50. package/package.json +7 -7
  51. package/scripts/build-binary.ts +0 -7
  52. package/src/cli/migrate-cli.ts +106 -0
  53. package/src/cli/setup-cli.ts +14 -1
  54. package/src/cli/update-cli.ts +53 -3
  55. package/src/cli.ts +1 -0
  56. package/src/commands/deep-interview.ts +2 -2
  57. package/src/commands/launch.ts +1 -1
  58. package/src/commands/migrate.ts +46 -0
  59. package/src/commands/state.ts +2 -1
  60. package/src/commands/team.ts +7 -3
  61. package/src/config/model-registry.ts +9 -2
  62. package/src/config/model-resolver.ts +13 -2
  63. package/src/config/models-config-schema.ts +1 -0
  64. package/src/config/settings-schema.ts +17 -0
  65. package/src/coordinator-mcp/policy.ts +10 -2
  66. package/src/defaults/skc/extensions/grok-cli-vendor/biome.json +0 -1
  67. package/src/defaults/skc/skills/deep-interview/SKILL.md +30 -24
  68. package/src/defaults/skc/skills/ralplan/SKILL.md +10 -4
  69. package/src/defaults/skc/skills/team/SKILL.md +51 -47
  70. package/src/defaults/skc/skills/ultragoal/SKILL.md +17 -13
  71. package/src/exec/bash-executor.ts +3 -1
  72. package/src/extensibility/custom-commands/loader.ts +0 -7
  73. package/src/extensibility/skc-plugins/injection.ts +23 -4
  74. package/src/extensibility/skc-plugins/state.ts +16 -1
  75. package/src/harness-control-plane/storage.ts +14 -4
  76. package/src/hooks/native-skill-hook.ts +38 -12
  77. package/src/hooks/skill-state.ts +178 -83
  78. package/src/i18n/messages/de.ts +14 -0
  79. package/src/i18n/messages/en.ts +14 -0
  80. package/src/i18n/messages/es.ts +14 -0
  81. package/src/i18n/messages/fr.ts +14 -0
  82. package/src/i18n/messages/ja.ts +14 -0
  83. package/src/i18n/messages/ko.ts +14 -0
  84. package/src/i18n/messages/zh.ts +14 -0
  85. package/src/internal-urls/docs-index.generated.ts +11 -9
  86. package/src/lsp/startup-events.ts +24 -0
  87. package/src/migrate/action-planner.ts +318 -0
  88. package/src/migrate/adapters/claude-code.ts +39 -0
  89. package/src/migrate/adapters/codex.ts +70 -0
  90. package/src/migrate/adapters/index.ts +277 -0
  91. package/src/migrate/adapters/opencode.ts +52 -0
  92. package/src/migrate/executor.ts +81 -0
  93. package/src/migrate/mcp-mapper.ts +152 -0
  94. package/src/migrate/report.ts +104 -0
  95. package/src/migrate/skill-normalizer.ts +80 -0
  96. package/src/migrate/types.ts +163 -0
  97. package/src/modes/bridge/bridge-mode.ts +2 -2
  98. package/src/modes/components/custom-editor.ts +30 -20
  99. package/src/modes/components/model-selector.ts +42 -18
  100. package/src/modes/components/welcome.ts +20 -9
  101. package/src/modes/controllers/input-controller.ts +21 -3
  102. package/src/modes/interactive-mode.ts +27 -19
  103. package/src/modes/prompt-action-autocomplete.ts +11 -1
  104. package/src/modes/rpc/rpc-mode.ts +2 -2
  105. package/src/modes/shared/agent-wire/unattended-audit.ts +3 -2
  106. package/src/prompts/agents/init.md +1 -1
  107. package/src/prompts/system/plan-mode-active.md +1 -1
  108. package/src/prompts/tools/ast-grep.md +1 -1
  109. package/src/prompts/tools/search.md +1 -1
  110. package/src/prompts/tools/task.md +1 -2
  111. package/src/research-plan/index.ts +1 -0
  112. package/src/research-plan/ledger.ts +177 -0
  113. package/src/rlm/artifacts.ts +12 -3
  114. package/src/rlm/index.ts +7 -0
  115. package/src/runtime-mcp/config-writer.ts +46 -0
  116. package/src/session/agent-session.ts +43 -41
  117. package/src/session/session-manager.ts +19 -2
  118. package/src/setup/hermes/templates/operator-instructions.v1.md +8 -0
  119. package/src/setup/hermes-setup.ts +1 -1
  120. package/src/skc-runtime/deep-interview-recorder.ts +51 -18
  121. package/src/skc-runtime/deep-interview-runtime.ts +49 -23
  122. package/src/skc-runtime/goal-mode-request.ts +26 -11
  123. package/src/skc-runtime/launch-tmux.ts +68 -15
  124. package/src/skc-runtime/ralplan-runtime.ts +79 -50
  125. package/src/skc-runtime/session-layout.ts +180 -0
  126. package/src/skc-runtime/session-resolution.ts +217 -0
  127. package/src/skc-runtime/state-graph.ts +1 -2
  128. package/src/skc-runtime/state-migrations.ts +1 -0
  129. package/src/skc-runtime/state-runtime.ts +237 -114
  130. package/src/skc-runtime/state-schema.ts +2 -0
  131. package/src/skc-runtime/state-writer.ts +310 -42
  132. package/src/skc-runtime/team-runtime.ts +43 -19
  133. package/src/skc-runtime/tmux-sessions.ts +43 -2
  134. package/src/skc-runtime/ultragoal-guard.ts +45 -2
  135. package/src/skc-runtime/ultragoal-runtime.ts +121 -41
  136. package/src/skc-runtime/workflow-command-ref.ts +1 -2
  137. package/src/skc-runtime/workflow-manifest.ts +1 -2
  138. package/src/skill-state/active-state.ts +116 -129
  139. package/src/skill-state/canonical-skills.ts +4 -0
  140. package/src/skill-state/deep-interview-mutation-guard.ts +238 -111
  141. package/src/skill-state/workflow-hud.ts +4 -2
  142. package/src/skill-state/workflow-state-contract.ts +3 -3
  143. package/src/slash-commands/builtin-registry.ts +8 -4
  144. package/src/system-prompt.ts +11 -9
  145. package/src/task/agents.ts +1 -22
  146. package/src/task/index.ts +1 -41
  147. package/src/task/spawn-gate.ts +1 -38
  148. package/src/task/types.ts +1 -1
  149. package/src/tools/ask.ts +34 -12
  150. package/src/tools/ast-edit.ts +2 -2
  151. package/src/tools/computer.ts +58 -4
  152. package/src/utils/edit-mode.ts +1 -1
  153. package/dist/types/extensibility/custom-commands/bundled/review/index.d.ts +0 -10
  154. package/src/extensibility/custom-commands/bundled/review/index.ts +0 -456
  155. package/src/prompts/agents/explore.md +0 -58
  156. package/src/prompts/agents/plan.md +0 -49
  157. package/src/prompts/agents/reviewer.md +0 -141
  158. package/src/prompts/agents/task.md +0 -16
  159. package/src/prompts/review-request.md +0 -70
package/CHANGELOG.md CHANGED
@@ -4,6 +4,21 @@ Sayknow-CLI is a rebranded fork of [gajae-code](https://github.com/Yeachan-Heo/g
4
4
  This file tracks the **fork's own releases**; upstream's full feature history lives
5
5
  in that project. Each release notes the upstream version it is built on.
6
6
 
7
+ ## [0.2.4] — 2026-06-19
8
+
9
+ ### Added
10
+
11
+ - The model selector is now fully localized — the preset list ("Model presets",
12
+ "Create custom preset", "Browse all models"), the apply/default scope menu,
13
+ action menus, and hints follow the interface language. Model and provider names
14
+ (Claude, Codex, …) stay verbatim.
15
+
16
+ ### Fixed
17
+
18
+ - Release builds no longer fail spuriously on a timing-flaky pi-shell
19
+ process-reaping test: the Rust test runner now retries flaky tests
20
+ (`cargo nextest --retries 2`).
21
+
7
22
  ## [0.2.3] — 2026-06-19
8
23
 
9
24
  ### Fixed
@@ -0,0 +1,20 @@
1
+ import { type MigrateReport, type MigrateSource } from "../migrate/types";
2
+ export interface MigrateCommandArgs {
3
+ from: string[];
4
+ project: boolean;
5
+ force: boolean;
6
+ dryRun: boolean;
7
+ json: boolean;
8
+ /** Test seam: override home dir for source discovery. */
9
+ homeDir?: string;
10
+ /** Test seam: override cwd for project-scope destinations. */
11
+ cwd?: string;
12
+ }
13
+ export declare class MigrateArgsError extends Error {
14
+ }
15
+ /** Expand `all`/repeated `--from`, validate, and return sources in canonical order. */
16
+ export declare function resolveSources(from: string[]): MigrateSource[];
17
+ /** Run the migration and return the report (does not set process.exitCode). */
18
+ export declare function runMigrate(args: MigrateCommandArgs): Promise<MigrateReport>;
19
+ /** CLI entry: run, render, and set the process exit code. */
20
+ export declare function runMigrateCommand(args: MigrateCommandArgs): Promise<void>;
@@ -3,6 +3,8 @@ export interface InstalledVersionVerification {
3
3
  ok: boolean;
4
4
  actual?: string;
5
5
  path?: string;
6
+ smokeTestFailed?: boolean;
7
+ smokeTestOutput?: string;
6
8
  }
7
9
  /** Paths and verifier used while replacing a downloaded binary update. */
8
10
  export interface BinaryReplacementOptions {
@@ -24,6 +26,7 @@ export declare function resolveUpdateMethodForTest(ompPath: string, bunBinDir: s
24
26
  export declare function formatBinaryDownloadFailureMessageForTest(binaryName: string, url: string, status: string | number, platform?: NodeJS.Platform): string;
25
27
  export declare function buildReleaseBinaryUrlForTest(version: string, platform?: NodeJS.Platform, arch?: string): string;
26
28
  export declare function formatManualUpdateInstructionsForTest(platform?: NodeJS.Platform): string;
29
+ export declare function formatVerificationFailureForTest(result: InstalledVersionVerification, expectedVersion: string): string;
27
30
  /**
28
31
  * Atomically replace the installed binary and roll back if version verification fails.
29
32
  */
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Import MCP servers and skills from other coding agents into SKC.
3
+ */
4
+ import { Command } from "@sayknow-cli/utils/cli";
5
+ export default class Migrate extends Command {
6
+ static description: string;
7
+ static examples: string[];
8
+ static flags: {
9
+ from: import("@sayknow-cli/utils/cli").FlagDescriptor<"string"> & {
10
+ description: string;
11
+ multiple: true;
12
+ required: true;
13
+ };
14
+ project: import("@sayknow-cli/utils/cli").FlagDescriptor<"boolean"> & {
15
+ description: string;
16
+ default: boolean;
17
+ };
18
+ force: import("@sayknow-cli/utils/cli").FlagDescriptor<"boolean"> & {
19
+ description: string;
20
+ default: boolean;
21
+ };
22
+ "dry-run": import("@sayknow-cli/utils/cli").FlagDescriptor<"boolean"> & {
23
+ description: string;
24
+ default: boolean;
25
+ };
26
+ json: import("@sayknow-cli/utils/cli").FlagDescriptor<"boolean"> & {
27
+ char: string;
28
+ description: string;
29
+ default: boolean;
30
+ };
31
+ };
32
+ run(): Promise<void>;
33
+ }
@@ -173,6 +173,10 @@ export declare const KEYBINDINGS: {
173
173
  readonly defaultKeys: ["escape", "ctrl+c"];
174
174
  readonly description: "Cancel selection";
175
175
  };
176
+ readonly "tui.global.debug": {
177
+ readonly defaultKeys: "shift+ctrl+d";
178
+ readonly description: "Toggle debug overlay";
179
+ };
176
180
  readonly "app.interrupt": {
177
181
  readonly defaultKeys: "escape";
178
182
  readonly description: "Interrupt current operation";
@@ -51,6 +51,7 @@ export declare const ModelsConfigFile: ConfigFile<{
51
51
  compat?: {
52
52
  supportsStore?: boolean | undefined;
53
53
  supportsDeveloperRole?: boolean | undefined;
54
+ sendSessionHeaders?: boolean | undefined;
54
55
  supportsMultipleSystemMessages?: boolean | undefined;
55
56
  supportsReasoningEffort?: boolean | undefined;
56
57
  reasoningEffortMap?: {
@@ -129,6 +130,7 @@ export declare const ModelsConfigFile: ConfigFile<{
129
130
  compat?: {
130
131
  supportsStore?: boolean | undefined;
131
132
  supportsDeveloperRole?: boolean | undefined;
133
+ sendSessionHeaders?: boolean | undefined;
132
134
  supportsMultipleSystemMessages?: boolean | undefined;
133
135
  supportsReasoningEffort?: boolean | undefined;
134
136
  reasoningEffortMap?: {
@@ -202,6 +204,7 @@ export declare const ModelsConfigFile: ConfigFile<{
202
204
  compat?: {
203
205
  supportsStore?: boolean | undefined;
204
206
  supportsDeveloperRole?: boolean | undefined;
207
+ sendSessionHeaders?: boolean | undefined;
205
208
  supportsMultipleSystemMessages?: boolean | undefined;
206
209
  supportsReasoningEffort?: boolean | undefined;
207
210
  reasoningEffortMap?: {
@@ -2,6 +2,7 @@ import * as z from "zod/v4";
2
2
  export declare const OpenAICompatSchema: z.ZodObject<{
3
3
  supportsStore: z.ZodOptional<z.ZodBoolean>;
4
4
  supportsDeveloperRole: z.ZodOptional<z.ZodBoolean>;
5
+ sendSessionHeaders: z.ZodOptional<z.ZodBoolean>;
5
6
  supportsMultipleSystemMessages: z.ZodOptional<z.ZodBoolean>;
6
7
  supportsReasoningEffort: z.ZodOptional<z.ZodBoolean>;
7
8
  reasoningEffortMap: z.ZodOptional<z.ZodObject<{
@@ -163,6 +164,7 @@ export declare const ModelOverrideSchema: z.ZodObject<{
163
164
  compat: z.ZodOptional<z.ZodObject<{
164
165
  supportsStore: z.ZodOptional<z.ZodBoolean>;
165
166
  supportsDeveloperRole: z.ZodOptional<z.ZodBoolean>;
167
+ sendSessionHeaders: z.ZodOptional<z.ZodBoolean>;
166
168
  supportsMultipleSystemMessages: z.ZodOptional<z.ZodBoolean>;
167
169
  supportsReasoningEffort: z.ZodOptional<z.ZodBoolean>;
168
170
  reasoningEffortMap: z.ZodOptional<z.ZodObject<{
@@ -276,6 +278,7 @@ export declare const ModelsConfigSchema: z.ZodObject<{
276
278
  compat: z.ZodOptional<z.ZodObject<{
277
279
  supportsStore: z.ZodOptional<z.ZodBoolean>;
278
280
  supportsDeveloperRole: z.ZodOptional<z.ZodBoolean>;
281
+ sendSessionHeaders: z.ZodOptional<z.ZodBoolean>;
279
282
  supportsMultipleSystemMessages: z.ZodOptional<z.ZodBoolean>;
280
283
  supportsReasoningEffort: z.ZodOptional<z.ZodBoolean>;
281
284
  reasoningEffortMap: z.ZodOptional<z.ZodObject<{
@@ -442,6 +445,7 @@ export declare const ModelsConfigSchema: z.ZodObject<{
442
445
  compat: z.ZodOptional<z.ZodObject<{
443
446
  supportsStore: z.ZodOptional<z.ZodBoolean>;
444
447
  supportsDeveloperRole: z.ZodOptional<z.ZodBoolean>;
448
+ sendSessionHeaders: z.ZodOptional<z.ZodBoolean>;
445
449
  supportsMultipleSystemMessages: z.ZodOptional<z.ZodBoolean>;
446
450
  supportsReasoningEffort: z.ZodOptional<z.ZodBoolean>;
447
451
  reasoningEffortMap: z.ZodOptional<z.ZodObject<{
@@ -582,6 +586,7 @@ export declare const ModelsConfigSchema: z.ZodObject<{
582
586
  compat: z.ZodOptional<z.ZodObject<{
583
587
  supportsStore: z.ZodOptional<z.ZodBoolean>;
584
588
  supportsDeveloperRole: z.ZodOptional<z.ZodBoolean>;
589
+ sendSessionHeaders: z.ZodOptional<z.ZodBoolean>;
585
590
  supportsMultipleSystemMessages: z.ZodOptional<z.ZodBoolean>;
586
591
  supportsReasoningEffort: z.ZodOptional<z.ZodBoolean>;
587
592
  reasoningEffortMap: z.ZodOptional<z.ZodObject<{
@@ -1238,6 +1238,33 @@ export declare const SETTINGS_SCHEMA: {
1238
1238
  readonly description: "Skip welcome screen and startup status messages";
1239
1239
  };
1240
1240
  };
1241
+ readonly "startup.welcomeBannerMode": {
1242
+ readonly type: "enum";
1243
+ readonly values: readonly ["auto", "unicode", "square", "ascii"];
1244
+ readonly default: "auto";
1245
+ readonly ui: {
1246
+ readonly tab: "interaction";
1247
+ readonly label: "Welcome Banner Mode";
1248
+ readonly description: "Logo style for the startup welcome screen";
1249
+ readonly options: readonly [{
1250
+ readonly value: "auto";
1251
+ readonly label: "Auto";
1252
+ readonly description: "Use the rounded Unicode logo";
1253
+ }, {
1254
+ readonly value: "unicode";
1255
+ readonly label: "Unicode";
1256
+ readonly description: "Force the rounded Unicode logo";
1257
+ }, {
1258
+ readonly value: "square";
1259
+ readonly label: "Square Unicode";
1260
+ readonly description: "Force the square-corner Unicode fallback";
1261
+ }, {
1262
+ readonly value: "ascii";
1263
+ readonly label: "ASCII";
1264
+ readonly description: "Force the ASCII-safe logo";
1265
+ }];
1266
+ };
1267
+ };
1241
1268
  readonly "startup.checkUpdate": {
1242
1269
  readonly type: "boolean";
1243
1270
  readonly default: true;
@@ -29,11 +29,12 @@ export declare class StorageError extends Error {
29
29
  readonly code: string;
30
30
  constructor(message: string, code: string);
31
31
  }
32
- /** Resolve the harness state root from explicit value, env, or cwd default. */
32
+ /** Resolve the harness state root from explicit value, env, or cwd/session default. */
33
33
  export declare function resolveHarnessRoot(opts?: {
34
34
  root?: string;
35
35
  cwd?: string;
36
36
  env?: NodeJS.ProcessEnv;
37
+ skcSessionId?: string;
37
38
  }): string;
38
39
  export declare function assertSafeSessionId(id: string): void;
39
40
  export declare function generateSessionId(prefix?: string): string;
@@ -1,7 +1,9 @@
1
1
  import type { SkillDiscoverySettings } from "../config/skill-settings-defaults";
2
2
  import { type SkillActiveState } from "../skill-state/active-state";
3
+ import { initialPhaseForSkill } from "../skill-state/initial-phase";
4
+ export { initialPhaseForSkill };
3
5
  import { type SkcWorkflowSkill } from "./skill-keywords";
4
- export declare const SKC_STATE_DIR = ".skc/state";
6
+ export declare const SKC_STATE_DIR = ".skc";
5
7
  export declare const SKILL_ACTIVE_STATE_FILE = "skill-active-state.json";
6
8
  export interface EffectiveSkillConfigInput {
7
9
  skillsSettings?: SkillDiscoverySettings;
@@ -55,9 +57,15 @@ export interface UserPromptSubmitStateInput {
55
57
  export declare function detectSkillKeywords(text: string): SkillKeywordMatch[];
56
58
  export declare function detectPrimarySkillKeyword(text: string): SkillKeywordMatch | null;
57
59
  export declare function resolveSkcStateDir(cwd: string, stateDir?: string): string;
58
- import { initialPhaseForSkill } from "../skill-state/initial-phase";
59
- export { initialPhaseForSkill };
60
- export declare function readVisibleSkillActiveState(cwd: string, sessionId?: string, stateDir?: string): Promise<SkillActiveState | null>;
60
+ export interface StateRecoveryDiagnostic {
61
+ kind: "skill-active-state" | "mode-state";
62
+ statePath: string;
63
+ reason: "missing" | "corrupt" | "unreadable";
64
+ skill?: SkcWorkflowSkill;
65
+ }
66
+ export declare function buildStateRecoveryDiagnosticsContext(diagnostics: readonly StateRecoveryDiagnostic[]): string | null;
67
+ export declare function collectUserPromptStateRecoveryDiagnostics(input: UserPromptSubmitStateInput): Promise<StateRecoveryDiagnostic[]>;
68
+ export declare function readVisibleSkillActiveState(cwd: string, sessionId?: string, _stateDir?: string): Promise<SkillActiveState | null>;
61
69
  export declare function recordSkillActivation(input: RecordSkillActivationInput): Promise<SkillActiveState | null>;
62
70
  export interface EnsureWorkflowSkillActivationInput {
63
71
  cwd: string;
@@ -62,5 +62,19 @@ export declare const en: {
62
62
  readonly "cmd.session": "Session management commands";
63
63
  readonly "cmd.clear": "Clear the conversation";
64
64
  readonly "cmd.quit": "Exit Sayknow-CLI";
65
+ readonly "modelSelector.presets": "Model presets";
66
+ readonly "modelSelector.createCustom": "Create custom preset";
67
+ readonly "modelSelector.browseAll": "Browse all models";
68
+ readonly "modelSelector.applySession": "Apply for this session";
69
+ readonly "modelSelector.setDefault": "Set as default";
70
+ readonly "modelSelector.pressEnterApply": "Press Enter to apply this preset";
71
+ readonly "modelSelector.presetPreview": "Preset preview: {name}";
72
+ readonly "modelSelector.showingScoped": "Showing models from --models scope";
73
+ readonly "modelSelector.modelsTab": "Models";
74
+ readonly "modelSelector.noMatching": "No matching models.";
75
+ readonly "modelSelector.modelName": "Model Name: {value}";
76
+ readonly "modelSelector.actionFor": "Action for: {id}";
77
+ readonly "modelSelector.reasoningFor": "Reasoning for {target}: {id}";
78
+ readonly "modelSelector.temporaryModel": "temporary model";
65
79
  };
66
80
  export type MsgKey = keyof typeof en;
@@ -9,3 +9,4 @@ export type LspStartupEvent = {
9
9
  type: "failed";
10
10
  error: string;
11
11
  };
12
+ export declare function getLspStartupWarningMessage(event: LspStartupEvent): string | null;
@@ -0,0 +1,11 @@
1
+ import type { AdapterResult, MigrateAction, MigrateDestinations, MigrateWarning } from "./types";
2
+ export interface PlanInput {
3
+ results: AdapterResult[];
4
+ destinations: MigrateDestinations;
5
+ force: boolean;
6
+ }
7
+ export interface PlanOutput {
8
+ actions: MigrateAction[];
9
+ warnings: MigrateWarning[];
10
+ }
11
+ export declare function planMigration(input: PlanInput): Promise<PlanOutput>;
@@ -0,0 +1,2 @@
1
+ import { type Adapter } from "./index";
2
+ export declare const claudeCodeAdapter: Adapter;
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Codex adapter: reads `~/.codex/config.toml` ([mcp_servers]) and `~/.codex/prompts`.
3
+ */
4
+ import { type Adapter } from "./index";
5
+ export declare const codexAdapter: Adapter;
@@ -0,0 +1,45 @@
1
+ import type { AdapterResult, MigrateSource, SkillCandidate, SourceDiagnostic } from "../types";
2
+ export interface AdapterOptions {
3
+ /** Home directory root; overridable for tests. */
4
+ homeDir: string;
5
+ }
6
+ export interface Adapter {
7
+ source: MigrateSource;
8
+ collect(options: AdapterOptions): Promise<AdapterResult>;
9
+ }
10
+ export declare function getAdapter(source: MigrateSource): Adapter;
11
+ /** Read a text file, classifying absence/IO errors into source diagnostics. */
12
+ export declare function readSourceText(filePath: string, source: MigrateSource, type: SourceDiagnostic["type"]): Promise<{
13
+ text: string;
14
+ } | {
15
+ diagnostic: SourceDiagnostic;
16
+ }>;
17
+ /** Parse JSON text, classifying parse errors into a `failed_invalid_source` diagnostic. */
18
+ export declare function parseSourceJson(text: string, filePath: string, source: MigrateSource, type: SourceDiagnostic["type"]): {
19
+ data: Record<string, unknown>;
20
+ } | {
21
+ diagnostic: SourceDiagnostic;
22
+ };
23
+ /**
24
+ * Collect skill candidates from a directory of `<name>/SKILL.md` entries.
25
+ * A missing directory yields a `skipped_absent_source` diagnostic.
26
+ */
27
+ export declare function collectSkillDir(dir: string, source: MigrateSource): Promise<{
28
+ candidates: SkillCandidate[];
29
+ diagnostics: SourceDiagnostic[];
30
+ }>;
31
+ /**
32
+ * Collect skill candidates from a flat directory of `*.md` prompt/command files.
33
+ */
34
+ export declare function collectMarkdownPrompts(dir: string, source: MigrateSource): Promise<{
35
+ candidates: SkillCandidate[];
36
+ diagnostics: SourceDiagnostic[];
37
+ }>;
38
+ /**
39
+ * Recursively collect skill candidates from any `**​/SKILL.md` under `root`.
40
+ * The slug derives from the directory that directly contains the `SKILL.md`.
41
+ */
42
+ export declare function collectSkillTree(root: string, source: MigrateSource): Promise<{
43
+ candidates: SkillCandidate[];
44
+ diagnostics: SourceDiagnostic[];
45
+ }>;
@@ -0,0 +1,2 @@
1
+ import { type Adapter } from "./index";
2
+ export declare const opencodeAdapter: Adapter;
@@ -0,0 +1,2 @@
1
+ import type { MigrateAction } from "./types";
2
+ export declare function executeActions(actions: MigrateAction[]): Promise<MigrateAction[]>;
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Map raw source MCP server entries onto SKC `MCPServerConfig`.
3
+ *
4
+ * Implements the source-schema compatibility matrix from the consensus plan:
5
+ * preserved (P), transformed (T), omitted-with-warning (OW), skipped (S,
6
+ * `skipped_unmappable`), and failed (F, `failed_invalid_source`). Secret-indirection
7
+ * fields are always omitted-with-warning; their values are never read or emitted.
8
+ */
9
+ import type { MCPServerConfig } from "../runtime-mcp/types";
10
+ import type { MigrateSource } from "./types";
11
+ export type McpMapOutcome = {
12
+ ok: true;
13
+ config: MCPServerConfig;
14
+ warnings: string[];
15
+ } | {
16
+ ok: false;
17
+ status: "skipped_unmappable" | "failed_invalid_source";
18
+ reason: string;
19
+ };
20
+ export declare function mapMcpEntry(source: MigrateSource, name: string, raw: unknown): McpMapOutcome;
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Build the human-readable and `--json` reports for `skc migrate`.
3
+ *
4
+ * Secret values are never read upstream, so the report only ever contains field
5
+ * names in warnings — but rendering still treats action/warning text as opaque.
6
+ */
7
+ import { type MigrateAction, type MigrateDestinations, type MigrateReport, type MigrateSource, type MigrateWarning } from "./types";
8
+ export interface BuildReportInput {
9
+ actions: MigrateAction[];
10
+ warnings: MigrateWarning[];
11
+ sources: MigrateSource[];
12
+ destinations: MigrateDestinations;
13
+ dryRun: boolean;
14
+ project: boolean;
15
+ force: boolean;
16
+ }
17
+ export declare function buildReport(input: BuildReportInput): MigrateReport;
18
+ export declare function renderHuman(report: MigrateReport): string;
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Normalize a skill from another agent into a native SKC `SKILL.md`.
3
+ *
4
+ * SKC derives a skill's loaded name from its directory (`<slug>/SKILL.md`) when no
5
+ * frontmatter `name` is present, and requires a `description`. To guarantee the
6
+ * effective loaded name equals the lowercase-hyphen slug, we drop any frontmatter
7
+ * `name` and place the file at `<slug>/SKILL.md`, synthesizing a `description`
8
+ * when the source lacks one.
9
+ */
10
+ export interface NormalizeSkillInput {
11
+ /** Raw name from the source (filename stem, frontmatter name, etc.). */
12
+ rawName: string;
13
+ /** Full source markdown (may or may not have frontmatter). */
14
+ content: string;
15
+ }
16
+ export interface NormalizedSkill {
17
+ slug: string;
18
+ content: string;
19
+ warnings: string[];
20
+ }
21
+ /** Convert an arbitrary name into a lowercase-hyphen slug. */
22
+ export declare function slugify(name: string): string;
23
+ /**
24
+ * Produce a `{ slug, content }` pair whose effective SKC-loaded name equals `slug`.
25
+ * Throws only on an unusable name (cannot produce a slug).
26
+ */
27
+ export declare function normalizeSkill(input: NormalizeSkillInput): NormalizedSkill;
@@ -0,0 +1,126 @@
1
+ /**
2
+ * Shared types for `skc migrate`.
3
+ *
4
+ * Imports MCP servers and skills from other coding agents (Claude Code, Codex,
5
+ * OpenCode) into native SKC config. See the consensus plan under
6
+ * `.skc/plans/ralplan/` for the full taxonomy and force/collision semantics.
7
+ */
8
+ import type { MCPServerConfig } from "../runtime-mcp/types";
9
+ /** Supported migration sources. */
10
+ export type MigrateSource = "claude-code" | "codex" | "opencode";
11
+ export declare const MIGRATE_SOURCES: readonly MigrateSource[];
12
+ /** Canonical, deterministic ordering used when expanding `--from all` / repeated `--from`. */
13
+ export declare const CANONICAL_SOURCE_ORDER: readonly MigrateSource[];
14
+ /** What kind of thing an action/coverage row is about. */
15
+ export type MigrateItemType = "mcp" | "skill" | "source";
16
+ /**
17
+ * Per-item outcome taxonomy.
18
+ *
19
+ * `skipped_*` outcomes are non-fatal (exit 0). Any `failed_*` outcome sets
20
+ * `ok=false` and a non-zero process exit code.
21
+ */
22
+ export type MigrationStatus = "imported" | "updated" | "skipped_exists" | "skipped_absent_source" | "skipped_unmappable" | "failed_invalid_source" | "failed_invalid_destination" | "failed_io";
23
+ export declare const MIGRATION_STATUSES: readonly MigrationStatus[];
24
+ /** Statuses that represent a hard failure (drive `ok=false` + non-zero exit). */
25
+ export declare const FAILURE_STATUSES: ReadonlySet<MigrationStatus>;
26
+ export declare function isFailureStatus(status: MigrationStatus): boolean;
27
+ /** Operation the planner decided for an item. */
28
+ export type MigrateOperation = "create" | "update" | "skip" | "fail";
29
+ /** A raw MCP server candidate parsed from a source, before mapping/destination planning. */
30
+ export interface McpCandidate {
31
+ source: MigrateSource;
32
+ name: string;
33
+ /** The raw, unmapped server entry from the source config (mapped by the planner). */
34
+ raw: unknown;
35
+ }
36
+ /** A raw skill candidate parsed from a source, before normalization/destination planning. */
37
+ export interface SkillCandidate {
38
+ source: MigrateSource;
39
+ /** Slug used as the destination directory and effective loaded name. */
40
+ slug: string;
41
+ /** Full SKILL.md content (frontmatter already normalized so loaded name == slug). */
42
+ content: string;
43
+ warnings: string[];
44
+ }
45
+ /**
46
+ * Source-level diagnostic for a single source/type pair (e.g. "codex mcp config
47
+ * was malformed"). Distinct from per-item actions so absent/unreadable sources
48
+ * are reported once instead of per item.
49
+ */
50
+ export interface SourceDiagnostic {
51
+ source: MigrateSource;
52
+ type: Exclude<MigrateItemType, "source"> | "source";
53
+ status: Extract<MigrationStatus, "skipped_absent_source" | "failed_invalid_source" | "failed_io">;
54
+ message: string;
55
+ }
56
+ /** Normalized candidates + diagnostics returned by an adapter. */
57
+ export interface AdapterResult {
58
+ mcpCandidates: McpCandidate[];
59
+ skillCandidates: SkillCandidate[];
60
+ diagnostics: SourceDiagnostic[];
61
+ }
62
+ /** A single planned action consumed identically by dry-run and live execution. */
63
+ export interface MigrateAction {
64
+ source: MigrateSource;
65
+ type: MigrateItemType;
66
+ name?: string;
67
+ /** For skills: the effective SKC-loaded name (== slug). */
68
+ effectiveName?: string;
69
+ /** Absolute destination path (mcp.json for MCP, <skillsDir>/<slug>/SKILL.md for skills). */
70
+ destination?: string;
71
+ operation: MigrateOperation;
72
+ status: MigrationStatus;
73
+ reason?: string;
74
+ warnings?: string[];
75
+ /** Resolved payload the executor needs; never serialized to the report. */
76
+ mcp?: {
77
+ config: MCPServerConfig;
78
+ force: boolean;
79
+ };
80
+ skill?: {
81
+ content: string;
82
+ };
83
+ }
84
+ export interface MigrateWarning {
85
+ source: MigrateSource;
86
+ type: string;
87
+ name?: string;
88
+ message: string;
89
+ }
90
+ export type StatusCounts = Record<MigrationStatus, number>;
91
+ export interface MigrateDestinations {
92
+ mcpConfigPath: string;
93
+ skillsDir: string;
94
+ }
95
+ /** The full machine-readable report emitted with `--json`. */
96
+ export interface MigrateReport {
97
+ ok: boolean;
98
+ dryRun: boolean;
99
+ project: boolean;
100
+ force: boolean;
101
+ sources: MigrateSource[];
102
+ destinations: MigrateDestinations;
103
+ summary: {
104
+ total: StatusCounts;
105
+ byType: {
106
+ mcp: StatusCounts;
107
+ skill: StatusCounts;
108
+ source: StatusCounts;
109
+ };
110
+ bySource: Record<MigrateSource, StatusCounts>;
111
+ };
112
+ actions: Array<{
113
+ source: MigrateSource;
114
+ type: MigrateItemType;
115
+ name?: string;
116
+ effectiveName?: string;
117
+ destination?: string;
118
+ operation: MigrateOperation;
119
+ status: MigrationStatus;
120
+ reason?: string;
121
+ warnings?: string[];
122
+ }>;
123
+ warnings: MigrateWarning[];
124
+ }
125
+ /** Create a zeroed status-count record. */
126
+ export declare function emptyStatusCounts(): StatusCounts;
@@ -1,5 +1,5 @@
1
1
  import { Editor, type KeyId } from "@sayknow-cli/tui";
2
- import type { AppKeybinding } from "../../config/keybindings";
2
+ import { type AppKeybinding } from "../../config/keybindings";
3
3
  type ConfigurableEditorAction = Extract<AppKeybinding, "app.interrupt" | "app.clear" | "app.exit" | "app.suspend" | "app.thinking.cycle" | "app.model.cycleForward" | "app.model.cycleBackward" | "app.model.select" | "app.model.selectTemporary" | "app.tools.expand" | "app.thinking.toggle" | "app.editor.external" | "app.history.search" | "app.message.dequeue" | "app.message.queue" | "app.clipboard.pasteImage" | "app.clipboard.copyPrompt">;
4
4
  type PastePendingClearReason = "timeout" | "queue-limit";
5
5
  /**
@@ -8,6 +8,7 @@ export interface LspServerInfo {
8
8
  status: "ready" | "error" | "connecting";
9
9
  fileTypes: string[];
10
10
  }
11
+ export type WelcomeLogoMode = "unicode" | "square" | "ascii";
11
12
  /**
12
13
  * Sayknow-CLI launch surface: a blue-gradient SAYKNOW wordmark, compact
13
14
  * command affordances, and project signals — a distinct identity, not a
@@ -20,7 +21,8 @@ export declare class WelcomeComponent implements Component {
20
21
  private providerName;
21
22
  private recentSessions;
22
23
  private lspServers;
23
- constructor(version: string, modelName: string, providerName: string, recentSessions?: RecentSession[], lspServers?: LspServerInfo[]);
24
+ private readonly logoMode;
25
+ constructor(version: string, modelName: string, providerName: string, recentSessions?: RecentSession[], lspServers?: LspServerInfo[], logoMode?: WelcomeLogoMode);
24
26
  invalidate(): void;
25
27
  /**
26
28
  * Play a one-shot intro that sweeps the gradient through every phase
@@ -23,9 +23,12 @@ import type { HookInputComponent } from "./components/hook-input";
23
23
  import type { HookSelectorComponent } from "./components/hook-selector";
24
24
  import { StatusLineComponent } from "./components/status-line";
25
25
  import type { ToolExecutionHandle } from "./components/tool-execution";
26
+ import { type WelcomeLogoMode } from "./components/welcome";
26
27
  import { OAuthManualInputManager } from "./oauth-manual-input";
27
28
  import type { Theme } from "./theme/theme";
28
29
  import type { CompactionQueuedMessage, InteractiveModeContext, SubmittedUserInput, TodoItem, TodoPhase } from "./types";
30
+ export type WelcomeBannerSettingMode = "auto" | "unicode" | "square" | "ascii";
31
+ export declare function resolveWelcomeLogoMode(mode: WelcomeBannerSettingMode, env?: Record<string, string | undefined>, platform?: NodeJS.Platform): WelcomeLogoMode;
29
32
  /** Options for creating an InteractiveMode instance (for future API use) */
30
33
  export interface InteractiveModeOptions {
31
34
  /** Providers that were migrated during startup */
@@ -13,6 +13,7 @@ interface PromptActionAutocompleteOptions {
13
13
  keybindings: KeybindingsManager;
14
14
  copyCurrentLine: () => void;
15
15
  copyPrompt: () => void;
16
+ pasteImage: () => void;
16
17
  undo: (prefix: string) => void;
17
18
  moveCursorToMessageEnd: () => void;
18
19
  moveCursorToMessageStart: () => void;
@@ -41,7 +41,7 @@ export interface AuditLogOptions {
41
41
  now?(): number;
42
42
  nextId?(): string;
43
43
  }
44
- export declare function defaultAuditPath(runId: string, root?: string): string;
44
+ export declare function defaultAuditPath(runId: string, root?: string, skcSessionId?: string): string;
45
45
  /** Append-only audit log writer + reader for one unattended run. */
46
46
  export declare class UnattendedAuditLog {
47
47
  private readonly filePath;
@@ -0,0 +1 @@
1
+ export * from "./ledger";
@@ -0,0 +1,33 @@
1
+ export type ResearchPlanConfidence = "low" | "medium" | "high";
2
+ export type ResearchEvidenceVerdict = "support" | "contradict" | "uncertain";
3
+ export interface ResearchPlanItem {
4
+ claim: string;
5
+ confidence: ResearchPlanConfidence;
6
+ unknowns: string[];
7
+ evidenceNeeded: string[];
8
+ counterexampleQueries: string[];
9
+ sourceConflictPolicy: string;
10
+ dropCondition: string;
11
+ verifierChecks: string[];
12
+ }
13
+ export interface ResearchEvidenceEntry {
14
+ claim: string;
15
+ source: string;
16
+ confidence: ResearchPlanConfidence;
17
+ verdict: ResearchEvidenceVerdict;
18
+ notes?: string;
19
+ }
20
+ export interface ResearchLedgerVerdict {
21
+ claim: string;
22
+ finalVerdict: "accepted" | "rejected" | "uncertain";
23
+ survivingSources: ResearchEvidenceEntry[];
24
+ rejectReason?: string;
25
+ unresolvedUnknowns: string[];
26
+ }
27
+ export interface ResearchPlanValidationResult {
28
+ valid: boolean;
29
+ errors: string[];
30
+ }
31
+ export declare function validateResearchPlanItem(item: Partial<ResearchPlanItem>): ResearchPlanValidationResult;
32
+ export declare function validateResearchEvidenceEntry(entry: Partial<ResearchEvidenceEntry>): ResearchPlanValidationResult;
33
+ export declare function evaluateResearchLedger(item: ResearchPlanItem, evidence: readonly ResearchEvidenceEntry[]): ResearchLedgerVerdict;