@renxqoo/renx-code 0.0.9 → 0.0.12
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 +31 -143
- package/bin/renx.cjs +79 -42
- package/bin/renx.exe +0 -0
- package/package.json +10 -28
- package/src/App.tsx +0 -297
- package/src/agent/runtime/event-format.ts +0 -258
- package/src/agent/runtime/model-types.ts +0 -13
- package/src/agent/runtime/runtime.context-usage.test.ts +0 -192
- package/src/agent/runtime/runtime.error-handling.test.ts +0 -235
- package/src/agent/runtime/runtime.simple.test.ts +0 -16
- package/src/agent/runtime/runtime.test.ts +0 -296
- package/src/agent/runtime/runtime.ts +0 -875
- package/src/agent/runtime/runtime.usage-forwarding.test.ts +0 -228
- package/src/agent/runtime/source-modules.test.ts +0 -38
- package/src/agent/runtime/source-modules.ts +0 -370
- package/src/agent/runtime/tool-call-buffer.test.ts +0 -65
- package/src/agent/runtime/tool-call-buffer.ts +0 -60
- package/src/agent/runtime/tool-confirmation.test.ts +0 -56
- package/src/agent/runtime/tool-confirmation.ts +0 -15
- package/src/agent/runtime/types.ts +0 -99
- package/src/commands/slash-commands.test.ts +0 -216
- package/src/commands/slash-commands.ts +0 -64
- package/src/components/chat/assistant-reply.test.tsx +0 -47
- package/src/components/chat/assistant-reply.tsx +0 -136
- package/src/components/chat/assistant-segment.test.ts +0 -99
- package/src/components/chat/assistant-segment.tsx +0 -125
- package/src/components/chat/assistant-tool-group.tsx +0 -900
- package/src/components/chat/code-block.test.tsx +0 -206
- package/src/components/chat/code-block.tsx +0 -313
- package/src/components/chat/prompt-card.tsx +0 -81
- package/src/components/chat/segment-groups.test.ts +0 -52
- package/src/components/chat/segment-groups.ts +0 -106
- package/src/components/chat/turn-item.tsx +0 -39
- package/src/components/conversation-panel.tsx +0 -43
- package/src/components/file-mention-menu.tsx +0 -77
- package/src/components/file-picker-dialog.tsx +0 -206
- package/src/components/footer-hints.tsx +0 -75
- package/src/components/model-picker-dialog.tsx +0 -248
- package/src/components/prompt.tsx +0 -233
- package/src/components/slash-command-menu.tsx +0 -65
- package/src/components/tool-confirm-dialog-content.test.ts +0 -103
- package/src/components/tool-confirm-dialog-content.ts +0 -186
- package/src/components/tool-confirm-dialog.tsx +0 -187
- package/src/components/tool-display-config.ts +0 -119
- package/src/context-usage-regressions.test.ts +0 -26
- package/src/files/attachment-capabilities.test.ts +0 -30
- package/src/files/attachment-capabilities.ts +0 -50
- package/src/files/attachment-content.ts +0 -153
- package/src/files/file-mention-query.test.ts +0 -34
- package/src/files/file-mention-query.ts +0 -32
- package/src/files/prompt-display.ts +0 -13
- package/src/files/types.ts +0 -5
- package/src/files/workspace-files.ts +0 -61
- package/src/hooks/agent-event-handlers.test.ts +0 -207
- package/src/hooks/agent-event-handlers.ts +0 -196
- package/src/hooks/chat-local-replies.fixed.test.ts +0 -119
- package/src/hooks/chat-local-replies.test.ts +0 -153
- package/src/hooks/chat-local-replies.ts +0 -63
- package/src/hooks/turn-updater.test.ts +0 -70
- package/src/hooks/turn-updater.ts +0 -166
- package/src/hooks/use-agent-chat.context.test.ts +0 -10
- package/src/hooks/use-agent-chat.status.test.ts +0 -14
- package/src/hooks/use-agent-chat.test.ts +0 -80
- package/src/hooks/use-agent-chat.ts +0 -621
- package/src/hooks/use-file-mention-menu.ts +0 -196
- package/src/hooks/use-file-picker.ts +0 -185
- package/src/hooks/use-model-picker.ts +0 -196
- package/src/hooks/use-slash-command-menu.ts +0 -154
- package/src/index.tsx +0 -55
- package/src/runtime/clipboard.test.ts +0 -43
- package/src/runtime/clipboard.ts +0 -89
- package/src/runtime/exit.test.ts +0 -177
- package/src/runtime/exit.ts +0 -98
- package/src/runtime/runtime-support.test.ts +0 -31
- package/src/runtime/terminal-theme.test.ts +0 -55
- package/src/runtime/terminal-theme.ts +0 -196
- package/src/types/chat.ts +0 -32
- package/src/types/message-content.ts +0 -48
- package/src/ui/open-code-theme.ts +0 -176
- package/src/ui/opencode-markdown.ts +0 -211
- package/src/ui/theme.simple.test.ts +0 -52
- package/src/ui/theme.test.ts +0 -151
- package/src/ui/theme.ts +0 -152
- package/src/utils/time.test.ts +0 -144
- package/src/utils/time.ts +0 -7
- package/tsconfig.json +0 -30
- package/vendor/agent-root/src/agent/ENTERPRISE_ACCEPTANCE_CHECKLIST.md +0 -95
- package/vendor/agent-root/src/agent/ENTERPRISE_REALTIME.html +0 -1345
- package/vendor/agent-root/src/agent/ENTERPRISE_REALTIME.md +0 -1353
- package/vendor/agent-root/src/agent/ERROR_CONTRACT.md +0 -60
- package/vendor/agent-root/src/agent/TEST_COVERAGE_ANALYSIS.md +0 -278
- package/vendor/agent-root/src/agent/__test__/error-contract.test.ts +0 -72
- package/vendor/agent-root/src/agent/__test__/types.test.ts +0 -137
- package/vendor/agent-root/src/agent/agent/__test__/abort-runtime.test.ts +0 -83
- package/vendor/agent-root/src/agent/agent/__test__/callback-safety.test.ts +0 -34
- package/vendor/agent-root/src/agent/agent/__test__/compaction.test.ts +0 -323
- package/vendor/agent-root/src/agent/agent/__test__/concurrency.test.ts +0 -290
- package/vendor/agent-root/src/agent/agent/__test__/error-normalizer.test.ts +0 -377
- package/vendor/agent-root/src/agent/agent/__test__/error.test.ts +0 -212
- package/vendor/agent-root/src/agent/agent/__test__/fault-injection.test.ts +0 -295
- package/vendor/agent-root/src/agent/agent/__test__/index.test.ts +0 -3607
- package/vendor/agent-root/src/agent/agent/__test__/logger.test.ts +0 -35
- package/vendor/agent-root/src/agent/agent/__test__/message-utils.test.ts +0 -517
- package/vendor/agent-root/src/agent/agent/__test__/telemetry.test.ts +0 -97
- package/vendor/agent-root/src/agent/agent/__test__/timeout-budget.test.ts +0 -479
- package/vendor/agent-root/src/agent/agent/__test__/tool-call-merge.test.ts +0 -80
- package/vendor/agent-root/src/agent/agent/__test__/tool-execution-ledger.test.ts +0 -76
- package/vendor/agent-root/src/agent/agent/__test__/write-buffer.test.ts +0 -173
- package/vendor/agent-root/src/agent/agent/__test__/write-file-session.test.ts +0 -109
- package/vendor/agent-root/src/agent/agent/abort-runtime.ts +0 -71
- package/vendor/agent-root/src/agent/agent/callback-safety.ts +0 -33
- package/vendor/agent-root/src/agent/agent/compaction.ts +0 -291
- package/vendor/agent-root/src/agent/agent/concurrency.ts +0 -103
- package/vendor/agent-root/src/agent/agent/error-normalizer.ts +0 -190
- package/vendor/agent-root/src/agent/agent/error.ts +0 -198
- package/vendor/agent-root/src/agent/agent/index.ts +0 -1772
- package/vendor/agent-root/src/agent/agent/logger.ts +0 -65
- package/vendor/agent-root/src/agent/agent/message-utils.ts +0 -101
- package/vendor/agent-root/src/agent/agent/stream-events.ts +0 -61
- package/vendor/agent-root/src/agent/agent/telemetry.ts +0 -123
- package/vendor/agent-root/src/agent/agent/timeout-budget.ts +0 -227
- package/vendor/agent-root/src/agent/agent/tool-call-merge.ts +0 -111
- package/vendor/agent-root/src/agent/agent/tool-execution-ledger.ts +0 -164
- package/vendor/agent-root/src/agent/agent/write-buffer.ts +0 -188
- package/vendor/agent-root/src/agent/agent/write-file-session.ts +0 -238
- package/vendor/agent-root/src/agent/app/__test__/agent-app-service.test.ts +0 -1053
- package/vendor/agent-root/src/agent/app/__test__/minimal-agent-application.test.ts +0 -158
- package/vendor/agent-root/src/agent/app/__test__/sqlite-agent-app-store.test.ts +0 -437
- package/vendor/agent-root/src/agent/app/agent-app-service.ts +0 -748
- package/vendor/agent-root/src/agent/app/contracts.ts +0 -109
- package/vendor/agent-root/src/agent/app/index.ts +0 -5
- package/vendor/agent-root/src/agent/app/minimal-agent-application.ts +0 -151
- package/vendor/agent-root/src/agent/app/ports.ts +0 -72
- package/vendor/agent-root/src/agent/app/sqlite-agent-app-store.ts +0 -1182
- package/vendor/agent-root/src/agent/app/sqlite-client.ts +0 -177
- package/vendor/agent-root/src/agent/docs/cli-app-layer/00-README.md +0 -36
- package/vendor/agent-root/src/agent/docs/cli-app-layer/01-scope-and-goals.md +0 -33
- package/vendor/agent-root/src/agent/docs/cli-app-layer/02-architecture-overview.md +0 -40
- package/vendor/agent-root/src/agent/docs/cli-app-layer/03-domain-model-and-contracts.md +0 -91
- package/vendor/agent-root/src/agent/docs/cli-app-layer/04-ports-and-interfaces.md +0 -116
- package/vendor/agent-root/src/agent/docs/cli-app-layer/05-run-orchestration-and-state-machine.md +0 -52
- package/vendor/agent-root/src/agent/docs/cli-app-layer/06-cli-commands-and-ux.md +0 -53
- package/vendor/agent-root/src/agent/docs/cli-app-layer/07-storage-design-local.md +0 -52
- package/vendor/agent-root/src/agent/docs/cli-app-layer/08-error-and-observability.md +0 -40
- package/vendor/agent-root/src/agent/docs/cli-app-layer/09-security-and-policy-boundary.md +0 -19
- package/vendor/agent-root/src/agent/docs/cli-app-layer/10-test-plan-and-acceptance.md +0 -28
- package/vendor/agent-root/src/agent/docs/cli-app-layer/11-implementation-phases.md +0 -26
- package/vendor/agent-root/src/agent/docs/cli-app-layer/12-open-questions-and-risks.md +0 -30
- package/vendor/agent-root/src/agent/docs/cli-app-layer/13-sqlite-schema-fields-and-rationale.md +0 -567
- package/vendor/agent-root/src/agent/docs/cli-app-layer/14-project-flow-mermaid.md +0 -583
- package/vendor/agent-root/src/agent/docs/cli-app-layer/15-openclaw-style-project-blueprint.md +0 -972
- package/vendor/agent-root/src/agent/error-contract.ts +0 -154
- package/vendor/agent-root/src/agent/prompts/system.ts +0 -246
- package/vendor/agent-root/src/agent/prompts/system1.ts +0 -208
- package/vendor/agent-root/src/agent/storage/__test__/file-history-store.test.ts +0 -98
- package/vendor/agent-root/src/agent/storage/file-history-store.ts +0 -313
- package/vendor/agent-root/src/agent/storage/file-storage-config.ts +0 -94
- package/vendor/agent-root/src/agent/storage/file-system.ts +0 -31
- package/vendor/agent-root/src/agent/storage/file-write-service.ts +0 -21
- package/vendor/agent-root/src/agent/tool/__test__/base-tool.test.ts +0 -413
- package/vendor/agent-root/src/agent/tool/__test__/bash-policy.test.ts +0 -356
- package/vendor/agent-root/src/agent/tool/__test__/bash.mocked-coverage.test.ts +0 -375
- package/vendor/agent-root/src/agent/tool/__test__/bash.test.ts +0 -372
- package/vendor/agent-root/src/agent/tool/__test__/error.test.ts +0 -108
- package/vendor/agent-root/src/agent/tool/__test__/file-edit-tool.test.ts +0 -258
- package/vendor/agent-root/src/agent/tool/__test__/file-history-tools.test.ts +0 -121
- package/vendor/agent-root/src/agent/tool/__test__/file-read-tool.test.ts +0 -210
- package/vendor/agent-root/src/agent/tool/__test__/glob.test.ts +0 -139
- package/vendor/agent-root/src/agent/tool/__test__/grep.mocked-coverage.test.ts +0 -456
- package/vendor/agent-root/src/agent/tool/__test__/grep.test.ts +0 -192
- package/vendor/agent-root/src/agent/tool/__test__/lsp.test.ts +0 -300
- package/vendor/agent-root/src/agent/tool/__test__/outside-workspace-confirmation.test.ts +0 -214
- package/vendor/agent-root/src/agent/tool/__test__/path-security.test.ts +0 -336
- package/vendor/agent-root/src/agent/tool/__test__/skill-loader.test.ts +0 -494
- package/vendor/agent-root/src/agent/tool/__test__/skill-parser.test.ts +0 -543
- package/vendor/agent-root/src/agent/tool/__test__/skill-tool.test.ts +0 -172
- package/vendor/agent-root/src/agent/tool/__test__/task-concurrency-and-version.test.ts +0 -116
- package/vendor/agent-root/src/agent/tool/__test__/task-create-get-list-update.test.ts +0 -267
- package/vendor/agent-root/src/agent/tool/__test__/task-create.test.ts +0 -519
- package/vendor/agent-root/src/agent/tool/__test__/task-errors.test.ts +0 -225
- package/vendor/agent-root/src/agent/tool/__test__/task-output-blocking.test.ts +0 -223
- package/vendor/agent-root/src/agent/tool/__test__/task-output.test.ts +0 -184
- package/vendor/agent-root/src/agent/tool/__test__/task-parent-abort.test.ts +0 -287
- package/vendor/agent-root/src/agent/tool/__test__/task-real-runner-adapter.test.ts +0 -190
- package/vendor/agent-root/src/agent/tool/__test__/task-run-lifecycle.test.ts +0 -352
- package/vendor/agent-root/src/agent/tool/__test__/task-store-runner-branches.test.ts +0 -395
- package/vendor/agent-root/src/agent/tool/__test__/task-store.test.ts +0 -391
- package/vendor/agent-root/src/agent/tool/__test__/task-subagent-config-integration.test.ts +0 -176
- package/vendor/agent-root/src/agent/tool/__test__/task-subagent-config.test.ts +0 -68
- package/vendor/agent-root/src/agent/tool/__test__/task-tools-core-edges.test.ts +0 -630
- package/vendor/agent-root/src/agent/tool/__test__/task-tools-runtime-edges.test.ts +0 -732
- package/vendor/agent-root/src/agent/tool/__test__/task-types.test.ts +0 -494
- package/vendor/agent-root/src/agent/tool/__test__/task-utils-branches.test.ts +0 -175
- package/vendor/agent-root/src/agent/tool/__test__/tool-manager.test.ts +0 -505
- package/vendor/agent-root/src/agent/tool/__test__/types.test.ts +0 -55
- package/vendor/agent-root/src/agent/tool/__test__/web-fetch.test.ts +0 -244
- package/vendor/agent-root/src/agent/tool/__test__/web-search.test.ts +0 -290
- package/vendor/agent-root/src/agent/tool/__test__/write-file.test.ts +0 -368
- package/vendor/agent-root/src/agent/tool/base-tool.ts +0 -345
- package/vendor/agent-root/src/agent/tool/bash-policy.ts +0 -636
- package/vendor/agent-root/src/agent/tool/bash.ts +0 -688
- package/vendor/agent-root/src/agent/tool/error.ts +0 -131
- package/vendor/agent-root/src/agent/tool/file-edit-tool.ts +0 -264
- package/vendor/agent-root/src/agent/tool/file-history-list.ts +0 -103
- package/vendor/agent-root/src/agent/tool/file-history-restore.ts +0 -149
- package/vendor/agent-root/src/agent/tool/file-read-tool.ts +0 -211
- package/vendor/agent-root/src/agent/tool/glob.ts +0 -171
- package/vendor/agent-root/src/agent/tool/grep.ts +0 -496
- package/vendor/agent-root/src/agent/tool/lsp.ts +0 -481
- package/vendor/agent-root/src/agent/tool/path-security.ts +0 -117
- package/vendor/agent-root/src/agent/tool/search/common.ts +0 -153
- package/vendor/agent-root/src/agent/tool/skill/index.ts +0 -13
- package/vendor/agent-root/src/agent/tool/skill/loader.ts +0 -229
- package/vendor/agent-root/src/agent/tool/skill/parser.ts +0 -124
- package/vendor/agent-root/src/agent/tool/skill/types.ts +0 -27
- package/vendor/agent-root/src/agent/tool/skill-tool.ts +0 -143
- package/vendor/agent-root/src/agent/tool/task-create.ts +0 -186
- package/vendor/agent-root/src/agent/tool/task-errors.ts +0 -42
- package/vendor/agent-root/src/agent/tool/task-get.ts +0 -116
- package/vendor/agent-root/src/agent/tool/task-graph.ts +0 -78
- package/vendor/agent-root/src/agent/tool/task-list.ts +0 -141
- package/vendor/agent-root/src/agent/tool/task-mock-runner-adapter.ts +0 -232
- package/vendor/agent-root/src/agent/tool/task-output.ts +0 -223
- package/vendor/agent-root/src/agent/tool/task-parent-abort.ts +0 -115
- package/vendor/agent-root/src/agent/tool/task-real-runner-adapter.ts +0 -336
- package/vendor/agent-root/src/agent/tool/task-runner-adapter.ts +0 -55
- package/vendor/agent-root/src/agent/tool/task-stop.ts +0 -187
- package/vendor/agent-root/src/agent/tool/task-store.ts +0 -217
- package/vendor/agent-root/src/agent/tool/task-subagent-config.ts +0 -149
- package/vendor/agent-root/src/agent/tool/task-types.ts +0 -264
- package/vendor/agent-root/src/agent/tool/task-update.ts +0 -315
- package/vendor/agent-root/src/agent/tool/task.ts +0 -209
- package/vendor/agent-root/src/agent/tool/tool-manager.ts +0 -361
- package/vendor/agent-root/src/agent/tool/tool-prompts.ts +0 -242
- package/vendor/agent-root/src/agent/tool/types.ts +0 -116
- package/vendor/agent-root/src/agent/tool/web-fetch.ts +0 -227
- package/vendor/agent-root/src/agent/tool/web-search.ts +0 -208
- package/vendor/agent-root/src/agent/tool/write-file.ts +0 -497
- package/vendor/agent-root/src/agent/types.ts +0 -232
- package/vendor/agent-root/src/agent/utils/__tests__/index.test.ts +0 -18
- package/vendor/agent-root/src/agent/utils/__tests__/message-utils.test.ts +0 -610
- package/vendor/agent-root/src/agent/utils/__tests__/message.test.ts +0 -223
- package/vendor/agent-root/src/agent/utils/__tests__/token.test.ts +0 -42
- package/vendor/agent-root/src/agent/utils/index.ts +0 -16
- package/vendor/agent-root/src/agent/utils/message.ts +0 -171
- package/vendor/agent-root/src/agent/utils/token.ts +0 -28
- package/vendor/agent-root/src/config/__tests__/load-config-to-env.test.ts +0 -238
- package/vendor/agent-root/src/config/__tests__/loader.test.ts +0 -361
- package/vendor/agent-root/src/config/__tests__/runtime.test.ts +0 -88
- package/vendor/agent-root/src/config/index.ts +0 -55
- package/vendor/agent-root/src/config/loader.ts +0 -494
- package/vendor/agent-root/src/config/paths.ts +0 -30
- package/vendor/agent-root/src/config/runtime.ts +0 -163
- package/vendor/agent-root/src/config/types.ts +0 -96
- package/vendor/agent-root/src/logger/index.ts +0 -57
- package/vendor/agent-root/src/logger/logger.ts +0 -819
- package/vendor/agent-root/src/logger/types.ts +0 -150
- package/vendor/agent-root/src/providers/__tests__/errors.test.ts +0 -441
- package/vendor/agent-root/src/providers/__tests__/index.test.ts +0 -16
- package/vendor/agent-root/src/providers/__tests__/openai-compatible.options.test.ts +0 -318
- package/vendor/agent-root/src/providers/__tests__/openai-compatible.test.ts +0 -600
- package/vendor/agent-root/src/providers/__tests__/registry.test.ts +0 -523
- package/vendor/agent-root/src/providers/__tests__/responses-adapter.test.ts +0 -298
- package/vendor/agent-root/src/providers/adapters/__tests__/anthropic.test.ts +0 -354
- package/vendor/agent-root/src/providers/adapters/__tests__/kimi.test.ts +0 -58
- package/vendor/agent-root/src/providers/adapters/__tests__/standard.test.ts +0 -261
- package/vendor/agent-root/src/providers/adapters/anthropic.ts +0 -572
- package/vendor/agent-root/src/providers/adapters/base.ts +0 -131
- package/vendor/agent-root/src/providers/adapters/kimi.ts +0 -48
- package/vendor/agent-root/src/providers/adapters/responses.ts +0 -732
- package/vendor/agent-root/src/providers/adapters/standard.ts +0 -120
- package/vendor/agent-root/src/providers/http/__tests__/client.timeout.test.ts +0 -313
- package/vendor/agent-root/src/providers/http/client.ts +0 -289
- package/vendor/agent-root/src/providers/http/stream-parser.ts +0 -109
- package/vendor/agent-root/src/providers/index.ts +0 -76
- package/vendor/agent-root/src/providers/kimi-headers.ts +0 -177
- package/vendor/agent-root/src/providers/openai-compatible.ts +0 -387
- package/vendor/agent-root/src/providers/registry/model-config.ts +0 -477
- package/vendor/agent-root/src/providers/registry/provider-factory.ts +0 -127
- package/vendor/agent-root/src/providers/registry.ts +0 -135
- package/vendor/agent-root/src/providers/types/api.ts +0 -284
- package/vendor/agent-root/src/providers/types/config.ts +0 -58
- package/vendor/agent-root/src/providers/types/errors.ts +0 -323
- package/vendor/agent-root/src/providers/types/index.ts +0 -72
- package/vendor/agent-root/src/providers/types/provider.ts +0 -45
- package/vendor/agent-root/src/providers/types/registry.ts +0 -68
|
@@ -1,543 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it } from 'vitest';
|
|
2
|
-
import {
|
|
3
|
-
parseFrontmatter,
|
|
4
|
-
stripFrontmatter,
|
|
5
|
-
extractFileRefs,
|
|
6
|
-
extractShellCommands,
|
|
7
|
-
deriveDescriptionFromMarkdown,
|
|
8
|
-
formatSkillForContext,
|
|
9
|
-
isValidSkillName,
|
|
10
|
-
} from '../skill/parser';
|
|
11
|
-
|
|
12
|
-
describe('parseFrontmatter', () => {
|
|
13
|
-
it('parses valid frontmatter', () => {
|
|
14
|
-
const content = `---
|
|
15
|
-
name: test-skill
|
|
16
|
-
description: A test skill
|
|
17
|
-
license: MIT
|
|
18
|
-
version: 1.0.0
|
|
19
|
-
author: Test Author
|
|
20
|
-
---
|
|
21
|
-
# Test Skill
|
|
22
|
-
This is a test skill.`;
|
|
23
|
-
|
|
24
|
-
const result = parseFrontmatter(content);
|
|
25
|
-
expect(result).toEqual({
|
|
26
|
-
name: 'test-skill',
|
|
27
|
-
description: 'A test skill',
|
|
28
|
-
license: 'MIT',
|
|
29
|
-
version: '1.0.0',
|
|
30
|
-
author: 'Test Author',
|
|
31
|
-
});
|
|
32
|
-
});
|
|
33
|
-
|
|
34
|
-
it('parses frontmatter with quoted values', () => {
|
|
35
|
-
const content = `---
|
|
36
|
-
name: "test-skill"
|
|
37
|
-
description: 'A test skill'
|
|
38
|
-
---
|
|
39
|
-
Content`;
|
|
40
|
-
|
|
41
|
-
const result = parseFrontmatter(content);
|
|
42
|
-
expect(result).toEqual({
|
|
43
|
-
name: 'test-skill',
|
|
44
|
-
description: 'A test skill',
|
|
45
|
-
});
|
|
46
|
-
});
|
|
47
|
-
|
|
48
|
-
it('returns null for missing frontmatter', () => {
|
|
49
|
-
const content = `# Test Skill
|
|
50
|
-
This is a test skill.`;
|
|
51
|
-
|
|
52
|
-
const result = parseFrontmatter(content);
|
|
53
|
-
expect(result).toBeNull();
|
|
54
|
-
});
|
|
55
|
-
|
|
56
|
-
it('returns null for incomplete frontmatter', () => {
|
|
57
|
-
const content = `---
|
|
58
|
-
name: test-skill
|
|
59
|
-
---
|
|
60
|
-
Content`;
|
|
61
|
-
|
|
62
|
-
const result = parseFrontmatter(content);
|
|
63
|
-
expect(result).toBeNull();
|
|
64
|
-
});
|
|
65
|
-
|
|
66
|
-
it('returns null for frontmatter without name', () => {
|
|
67
|
-
const content = `---
|
|
68
|
-
description: A test skill
|
|
69
|
-
---
|
|
70
|
-
Content`;
|
|
71
|
-
|
|
72
|
-
const result = parseFrontmatter(content);
|
|
73
|
-
expect(result).toBeNull();
|
|
74
|
-
});
|
|
75
|
-
|
|
76
|
-
it('returns null for frontmatter without description', () => {
|
|
77
|
-
const content = `---
|
|
78
|
-
name: test-skill
|
|
79
|
-
---
|
|
80
|
-
Content`;
|
|
81
|
-
|
|
82
|
-
const result = parseFrontmatter(content);
|
|
83
|
-
expect(result).toBeNull();
|
|
84
|
-
});
|
|
85
|
-
|
|
86
|
-
it('handles frontmatter with extra whitespace', () => {
|
|
87
|
-
const content = `---
|
|
88
|
-
name: test-skill
|
|
89
|
-
description: A test skill
|
|
90
|
-
---
|
|
91
|
-
Content`;
|
|
92
|
-
|
|
93
|
-
const result = parseFrontmatter(content);
|
|
94
|
-
expect(result).toEqual({
|
|
95
|
-
name: 'test-skill',
|
|
96
|
-
description: 'A test skill',
|
|
97
|
-
});
|
|
98
|
-
});
|
|
99
|
-
|
|
100
|
-
it('handles frontmatter with empty lines', () => {
|
|
101
|
-
const content = `---
|
|
102
|
-
name: test-skill
|
|
103
|
-
|
|
104
|
-
description: A test skill
|
|
105
|
-
---
|
|
106
|
-
Content`;
|
|
107
|
-
|
|
108
|
-
const result = parseFrontmatter(content);
|
|
109
|
-
expect(result).toEqual({
|
|
110
|
-
name: 'test-skill',
|
|
111
|
-
description: 'A test skill',
|
|
112
|
-
});
|
|
113
|
-
});
|
|
114
|
-
|
|
115
|
-
it('handles frontmatter with colons in values', () => {
|
|
116
|
-
const content = `---
|
|
117
|
-
name: test-skill
|
|
118
|
-
description: A test skill: with colons
|
|
119
|
-
---
|
|
120
|
-
Content`;
|
|
121
|
-
|
|
122
|
-
const result = parseFrontmatter(content);
|
|
123
|
-
expect(result).toEqual({
|
|
124
|
-
name: 'test-skill',
|
|
125
|
-
description: 'A test skill: with colons',
|
|
126
|
-
});
|
|
127
|
-
});
|
|
128
|
-
|
|
129
|
-
it('handles frontmatter with special characters', () => {
|
|
130
|
-
const content = `---
|
|
131
|
-
name: test-skill
|
|
132
|
-
description: A test skill with special chars: !@#$%^&*()
|
|
133
|
-
---
|
|
134
|
-
Content`;
|
|
135
|
-
|
|
136
|
-
const result = parseFrontmatter(content);
|
|
137
|
-
expect(result).toEqual({
|
|
138
|
-
name: 'test-skill',
|
|
139
|
-
description: 'A test skill with special chars: !@#$%^&*()',
|
|
140
|
-
});
|
|
141
|
-
});
|
|
142
|
-
});
|
|
143
|
-
|
|
144
|
-
describe('stripFrontmatter', () => {
|
|
145
|
-
it('strips frontmatter from content', () => {
|
|
146
|
-
const content = `---
|
|
147
|
-
name: test-skill
|
|
148
|
-
description: A test skill
|
|
149
|
-
---
|
|
150
|
-
# Test Skill
|
|
151
|
-
This is a test skill.`;
|
|
152
|
-
|
|
153
|
-
const result = stripFrontmatter(content);
|
|
154
|
-
expect(result).toBe(`# Test Skill
|
|
155
|
-
This is a test skill.`);
|
|
156
|
-
});
|
|
157
|
-
|
|
158
|
-
it('returns original content when no frontmatter', () => {
|
|
159
|
-
const content = `# Test Skill
|
|
160
|
-
This is a test skill.`;
|
|
161
|
-
|
|
162
|
-
const result = stripFrontmatter(content);
|
|
163
|
-
expect(result).toBe(content);
|
|
164
|
-
});
|
|
165
|
-
|
|
166
|
-
it('handles frontmatter with trailing newline', () => {
|
|
167
|
-
const content = `---
|
|
168
|
-
name: test-skill
|
|
169
|
-
description: A test skill
|
|
170
|
-
---
|
|
171
|
-
|
|
172
|
-
# Test Skill`;
|
|
173
|
-
|
|
174
|
-
const result = stripFrontmatter(content);
|
|
175
|
-
expect(result).toBe(`# Test Skill`);
|
|
176
|
-
});
|
|
177
|
-
|
|
178
|
-
it('handles frontmatter without trailing newline', () => {
|
|
179
|
-
const content = `---
|
|
180
|
-
name: test-skill
|
|
181
|
-
description: A test skill
|
|
182
|
-
---
|
|
183
|
-
# Test Skill`;
|
|
184
|
-
|
|
185
|
-
const result = stripFrontmatter(content);
|
|
186
|
-
expect(result).toBe(`# Test Skill`);
|
|
187
|
-
});
|
|
188
|
-
|
|
189
|
-
it('handles empty content', () => {
|
|
190
|
-
const result = stripFrontmatter('');
|
|
191
|
-
expect(result).toBe('');
|
|
192
|
-
});
|
|
193
|
-
|
|
194
|
-
it('handles content with only frontmatter', () => {
|
|
195
|
-
const content = `---
|
|
196
|
-
name: test-skill
|
|
197
|
-
description: A test skill
|
|
198
|
-
---`;
|
|
199
|
-
|
|
200
|
-
const result = stripFrontmatter(content);
|
|
201
|
-
expect(result).toBe('');
|
|
202
|
-
});
|
|
203
|
-
});
|
|
204
|
-
|
|
205
|
-
describe('extractFileRefs', () => {
|
|
206
|
-
it('extracts file references', () => {
|
|
207
|
-
const content = `Check @file.txt and @./path/to/file.js for details.`;
|
|
208
|
-
const result = extractFileRefs(content);
|
|
209
|
-
expect(result).toEqual(['file.txt', './path/to/file.js']);
|
|
210
|
-
});
|
|
211
|
-
|
|
212
|
-
it('extracts file references with different extensions', () => {
|
|
213
|
-
const content = `Files: @file.txt, @file.js, @file.ts, @file.json, @file.md`;
|
|
214
|
-
const result = extractFileRefs(content);
|
|
215
|
-
expect(result).toEqual(['file.txt', 'file.js', 'file.ts', 'file.json', 'file.md']);
|
|
216
|
-
});
|
|
217
|
-
|
|
218
|
-
it('extracts file references with paths', () => {
|
|
219
|
-
const content = `Files: @./relative/path.txt, @../parent/path.txt, @/absolute/path.txt`;
|
|
220
|
-
const result = extractFileRefs(content);
|
|
221
|
-
expect(result).toEqual(['./relative/path.txt', '../parent/path.txt', '/absolute/path.txt']);
|
|
222
|
-
});
|
|
223
|
-
|
|
224
|
-
it('extracts file references with backslashes', () => {
|
|
225
|
-
const content = `Files: @.\\relative\\path.txt, @..\\parent\\path.txt`;
|
|
226
|
-
const result = extractFileRefs(content);
|
|
227
|
-
expect(result).toEqual(['.\\relative\\path.txt', '..\\parent\\path.txt']);
|
|
228
|
-
});
|
|
229
|
-
|
|
230
|
-
it('does not extract file references in code blocks', () => {
|
|
231
|
-
const content = `\`@file.txt\` is in code block.`;
|
|
232
|
-
const result = extractFileRefs(content);
|
|
233
|
-
expect(result).toEqual([]);
|
|
234
|
-
});
|
|
235
|
-
|
|
236
|
-
it('does not extract file references in words', () => {
|
|
237
|
-
const content = `email@example.com is not a file reference.`;
|
|
238
|
-
const result = extractFileRefs(content);
|
|
239
|
-
expect(result).toEqual([]);
|
|
240
|
-
});
|
|
241
|
-
|
|
242
|
-
it('handles empty content', () => {
|
|
243
|
-
const result = extractFileRefs('');
|
|
244
|
-
expect(result).toEqual([]);
|
|
245
|
-
});
|
|
246
|
-
|
|
247
|
-
it('handles content with no file references', () => {
|
|
248
|
-
const content = `This is just text without any file references.`;
|
|
249
|
-
const result = extractFileRefs(content);
|
|
250
|
-
expect(result).toEqual([]);
|
|
251
|
-
});
|
|
252
|
-
|
|
253
|
-
it('deduplicates file references', () => {
|
|
254
|
-
const content = `@file.txt and @file.txt again.`;
|
|
255
|
-
const result = extractFileRefs(content);
|
|
256
|
-
expect(result).toEqual(['file.txt']);
|
|
257
|
-
});
|
|
258
|
-
|
|
259
|
-
it('extracts file references with complex paths', () => {
|
|
260
|
-
const content = `@./path/to/file-name_123.txt and @../other/path/file.name.js`;
|
|
261
|
-
const result = extractFileRefs(content);
|
|
262
|
-
expect(result).toEqual(['./path/to/file-name_123.txt', '../other/path/file.name.js']);
|
|
263
|
-
});
|
|
264
|
-
});
|
|
265
|
-
|
|
266
|
-
describe('extractShellCommands', () => {
|
|
267
|
-
it('extracts shell commands', () => {
|
|
268
|
-
const content = `Run !\`ls -la\` and !\`pwd\` commands.`;
|
|
269
|
-
const result = extractShellCommands(content);
|
|
270
|
-
expect(result).toEqual(['ls -la', 'pwd']);
|
|
271
|
-
});
|
|
272
|
-
|
|
273
|
-
it('extracts shell commands with arguments', () => {
|
|
274
|
-
const content = `Run !\`git status\` and !\`npm install --save\`.`;
|
|
275
|
-
const result = extractShellCommands(content);
|
|
276
|
-
expect(result).toEqual(['git status', 'npm install --save']);
|
|
277
|
-
});
|
|
278
|
-
|
|
279
|
-
it('extracts shell commands with pipes', () => {
|
|
280
|
-
const content = `Run !\`ls -la | grep test\`.`;
|
|
281
|
-
const result = extractShellCommands(content);
|
|
282
|
-
expect(result).toEqual(['ls -la | grep test']);
|
|
283
|
-
});
|
|
284
|
-
|
|
285
|
-
it('extracts shell commands with redirections', () => {
|
|
286
|
-
const content = `Run !\`echo "test" > file.txt\`.`;
|
|
287
|
-
const result = extractShellCommands(content);
|
|
288
|
-
expect(result).toEqual(['echo "test" > file.txt']);
|
|
289
|
-
});
|
|
290
|
-
|
|
291
|
-
it('does not extract shell commands in regular backticks', () => {
|
|
292
|
-
const content = `\`ls -la\` is not a shell command.`;
|
|
293
|
-
const result = extractShellCommands(content);
|
|
294
|
-
expect(result).toEqual([]);
|
|
295
|
-
});
|
|
296
|
-
|
|
297
|
-
it('handles empty content', () => {
|
|
298
|
-
const result = extractShellCommands('');
|
|
299
|
-
expect(result).toEqual([]);
|
|
300
|
-
});
|
|
301
|
-
|
|
302
|
-
it('handles content with no shell commands', () => {
|
|
303
|
-
const content = `This is just text without any shell commands.`;
|
|
304
|
-
const result = extractShellCommands(content);
|
|
305
|
-
expect(result).toEqual([]);
|
|
306
|
-
});
|
|
307
|
-
|
|
308
|
-
it('deduplicates shell commands', () => {
|
|
309
|
-
const content = `!\`ls -la\` and !\`ls -la\` again.`;
|
|
310
|
-
const result = extractShellCommands(content);
|
|
311
|
-
expect(result).toEqual(['ls -la']);
|
|
312
|
-
});
|
|
313
|
-
|
|
314
|
-
it('extracts shell commands with special characters', () => {
|
|
315
|
-
const content = `Run !\`echo "Hello, World!"\` and !\`ls -la | grep "test"\`.`;
|
|
316
|
-
const result = extractShellCommands(content);
|
|
317
|
-
expect(result).toEqual(['echo "Hello, World!"', 'ls -la | grep "test"']);
|
|
318
|
-
});
|
|
319
|
-
});
|
|
320
|
-
|
|
321
|
-
describe('deriveDescriptionFromMarkdown', () => {
|
|
322
|
-
it('derives description from first non-heading line', () => {
|
|
323
|
-
const content = `# Test Skill
|
|
324
|
-
This is a test skill description.
|
|
325
|
-
More content here.`;
|
|
326
|
-
|
|
327
|
-
const result = deriveDescriptionFromMarkdown(content);
|
|
328
|
-
expect(result).toBe('This is a test skill description.');
|
|
329
|
-
});
|
|
330
|
-
|
|
331
|
-
it('skips heading lines', () => {
|
|
332
|
-
const content = `# Test Skill
|
|
333
|
-
## Subheading
|
|
334
|
-
This is the actual description.`;
|
|
335
|
-
|
|
336
|
-
const result = deriveDescriptionFromMarkdown(content);
|
|
337
|
-
expect(result).toBe('This is the actual description.');
|
|
338
|
-
});
|
|
339
|
-
|
|
340
|
-
it('truncates long descriptions', () => {
|
|
341
|
-
const longText = 'A'.repeat(200);
|
|
342
|
-
const content = `# Test Skill
|
|
343
|
-
${longText}`;
|
|
344
|
-
|
|
345
|
-
const result = deriveDescriptionFromMarkdown(content);
|
|
346
|
-
expect(result).toBe('A'.repeat(177) + '...');
|
|
347
|
-
});
|
|
348
|
-
|
|
349
|
-
it('handles empty content', () => {
|
|
350
|
-
const result = deriveDescriptionFromMarkdown('');
|
|
351
|
-
expect(result).toBe('No description provided');
|
|
352
|
-
});
|
|
353
|
-
|
|
354
|
-
it('handles content with only headings', () => {
|
|
355
|
-
const content = `# Test Skill
|
|
356
|
-
## Subheading
|
|
357
|
-
### Another heading`;
|
|
358
|
-
|
|
359
|
-
const result = deriveDescriptionFromMarkdown(content);
|
|
360
|
-
expect(result).toBe('No description provided');
|
|
361
|
-
});
|
|
362
|
-
|
|
363
|
-
it('handles content with frontmatter', () => {
|
|
364
|
-
const content = `---
|
|
365
|
-
name: test-skill
|
|
366
|
-
description: A test skill
|
|
367
|
-
---
|
|
368
|
-
# Test Skill
|
|
369
|
-
This is the actual content.`;
|
|
370
|
-
|
|
371
|
-
const result = deriveDescriptionFromMarkdown(content);
|
|
372
|
-
expect(result).toBe('This is the actual content.');
|
|
373
|
-
});
|
|
374
|
-
|
|
375
|
-
it('handles content with empty lines', () => {
|
|
376
|
-
const content = `# Test Skill
|
|
377
|
-
|
|
378
|
-
This is the description after empty lines.`;
|
|
379
|
-
|
|
380
|
-
const result = deriveDescriptionFromMarkdown(content);
|
|
381
|
-
expect(result).toBe('This is the description after empty lines.');
|
|
382
|
-
});
|
|
383
|
-
|
|
384
|
-
it('handles content with whitespace', () => {
|
|
385
|
-
const content = `# Test Skill
|
|
386
|
-
|
|
387
|
-
This is the description with whitespace.`;
|
|
388
|
-
|
|
389
|
-
const result = deriveDescriptionFromMarkdown(content);
|
|
390
|
-
expect(result).toBe('This is the description with whitespace.');
|
|
391
|
-
});
|
|
392
|
-
});
|
|
393
|
-
|
|
394
|
-
describe('formatSkillForContext', () => {
|
|
395
|
-
it('formats skill with all fields', () => {
|
|
396
|
-
const skill = {
|
|
397
|
-
metadata: {
|
|
398
|
-
name: 'test-skill',
|
|
399
|
-
description: 'A test skill',
|
|
400
|
-
path: '/path/to/skill',
|
|
401
|
-
},
|
|
402
|
-
content: 'Skill content here.',
|
|
403
|
-
fileRefs: ['file1.txt', 'file2.js'],
|
|
404
|
-
shellCommands: ['ls -la', 'pwd'],
|
|
405
|
-
};
|
|
406
|
-
|
|
407
|
-
const result = formatSkillForContext(skill);
|
|
408
|
-
expect(result).toContain('## Skill: test-skill');
|
|
409
|
-
expect(result).toContain('Description: A test skill');
|
|
410
|
-
expect(result).toContain('Base directory: /path/to/skill');
|
|
411
|
-
expect(result).toContain('Referenced files:');
|
|
412
|
-
expect(result).toContain('- file1.txt');
|
|
413
|
-
expect(result).toContain('- file2.js');
|
|
414
|
-
expect(result).toContain('Shell commands:');
|
|
415
|
-
expect(result).toContain('- !`ls -la`');
|
|
416
|
-
expect(result).toContain('- !`pwd`');
|
|
417
|
-
expect(result).toContain('Skill content here.');
|
|
418
|
-
});
|
|
419
|
-
|
|
420
|
-
it('formats skill without file refs', () => {
|
|
421
|
-
const skill = {
|
|
422
|
-
metadata: {
|
|
423
|
-
name: 'test-skill',
|
|
424
|
-
description: 'A test skill',
|
|
425
|
-
path: '/path/to/skill',
|
|
426
|
-
},
|
|
427
|
-
content: 'Skill content here.',
|
|
428
|
-
fileRefs: [],
|
|
429
|
-
shellCommands: ['ls -la'],
|
|
430
|
-
};
|
|
431
|
-
|
|
432
|
-
const result = formatSkillForContext(skill);
|
|
433
|
-
expect(result).not.toContain('Referenced files:');
|
|
434
|
-
expect(result).toContain('Shell commands:');
|
|
435
|
-
});
|
|
436
|
-
|
|
437
|
-
it('formats skill without shell commands', () => {
|
|
438
|
-
const skill = {
|
|
439
|
-
metadata: {
|
|
440
|
-
name: 'test-skill',
|
|
441
|
-
description: 'A test skill',
|
|
442
|
-
path: '/path/to/skill',
|
|
443
|
-
},
|
|
444
|
-
content: 'Skill content here.',
|
|
445
|
-
fileRefs: ['file1.txt'],
|
|
446
|
-
shellCommands: [],
|
|
447
|
-
};
|
|
448
|
-
|
|
449
|
-
const result = formatSkillForContext(skill);
|
|
450
|
-
expect(result).toContain('Referenced files:');
|
|
451
|
-
expect(result).not.toContain('Shell commands:');
|
|
452
|
-
});
|
|
453
|
-
|
|
454
|
-
it('formats skill without file refs and shell commands', () => {
|
|
455
|
-
const skill = {
|
|
456
|
-
metadata: {
|
|
457
|
-
name: 'test-skill',
|
|
458
|
-
description: 'A test skill',
|
|
459
|
-
path: '/path/to/skill',
|
|
460
|
-
},
|
|
461
|
-
content: 'Skill content here.',
|
|
462
|
-
fileRefs: [],
|
|
463
|
-
shellCommands: [],
|
|
464
|
-
};
|
|
465
|
-
|
|
466
|
-
const result = formatSkillForContext(skill);
|
|
467
|
-
expect(result).not.toContain('Referenced files:');
|
|
468
|
-
expect(result).not.toContain('Shell commands:');
|
|
469
|
-
});
|
|
470
|
-
});
|
|
471
|
-
|
|
472
|
-
describe('isValidSkillName', () => {
|
|
473
|
-
it('returns true for valid skill names', () => {
|
|
474
|
-
expect(isValidSkillName('test-skill')).toBe(true);
|
|
475
|
-
expect(isValidSkillName('test.skill')).toBe(true);
|
|
476
|
-
expect(isValidSkillName('test_skill')).toBe(true);
|
|
477
|
-
expect(isValidSkillName('test123')).toBe(true);
|
|
478
|
-
expect(isValidSkillName('test-skill-123')).toBe(true);
|
|
479
|
-
expect(isValidSkillName('test.skill.123')).toBe(true);
|
|
480
|
-
expect(isValidSkillName('test_skill_123')).toBe(true);
|
|
481
|
-
});
|
|
482
|
-
|
|
483
|
-
it('returns false for empty name', () => {
|
|
484
|
-
expect(isValidSkillName('')).toBe(false);
|
|
485
|
-
});
|
|
486
|
-
|
|
487
|
-
it('returns false for name longer than 64 characters', () => {
|
|
488
|
-
const longName = 'a'.repeat(65);
|
|
489
|
-
expect(isValidSkillName(longName)).toBe(false);
|
|
490
|
-
});
|
|
491
|
-
|
|
492
|
-
it('returns false for name with invalid characters', () => {
|
|
493
|
-
expect(isValidSkillName('Test-Skill')).toBe(false); // uppercase
|
|
494
|
-
expect(isValidSkillName('test skill')).toBe(false); // space
|
|
495
|
-
expect(isValidSkillName('test@skill')).toBe(false); // @
|
|
496
|
-
expect(isValidSkillName('test#skill')).toBe(false); // #
|
|
497
|
-
expect(isValidSkillName('test$skill')).toBe(false); // $
|
|
498
|
-
expect(isValidSkillName('test%skill')).toBe(false); // %
|
|
499
|
-
expect(isValidSkillName('test^skill')).toBe(false); // ^
|
|
500
|
-
expect(isValidSkillName('test&skill')).toBe(false); // &
|
|
501
|
-
expect(isValidSkillName('test*skill')).toBe(false); // *
|
|
502
|
-
expect(isValidSkillName('test(skill')).toBe(false); // (
|
|
503
|
-
expect(isValidSkillName('test)skill')).toBe(false); // )
|
|
504
|
-
expect(isValidSkillName('test+skill')).toBe(false); // +
|
|
505
|
-
expect(isValidSkillName('test=skill')).toBe(false); // =
|
|
506
|
-
expect(isValidSkillName('test[skill')).toBe(false); // [
|
|
507
|
-
expect(isValidSkillName('test]skill')).toBe(false); // ]
|
|
508
|
-
expect(isValidSkillName('test{skill')).toBe(false); // {
|
|
509
|
-
expect(isValidSkillName('test}skill')).toBe(false); // }
|
|
510
|
-
expect(isValidSkillName('test|skill')).toBe(false); // |
|
|
511
|
-
expect(isValidSkillName('test\\skill')).toBe(false); // \
|
|
512
|
-
expect(isValidSkillName('test/skill')).toBe(false); // /
|
|
513
|
-
expect(isValidSkillName('test:skill')).toBe(false); // :
|
|
514
|
-
expect(isValidSkillName('test;skill')).toBe(false); // ;
|
|
515
|
-
expect(isValidSkillName('test"skill')).toBe(false); // "
|
|
516
|
-
expect(isValidSkillName("test'skill")).toBe(false); // '
|
|
517
|
-
expect(isValidSkillName('test<skill')).toBe(false); // <
|
|
518
|
-
expect(isValidSkillName('test>skill')).toBe(false); // >
|
|
519
|
-
expect(isValidSkillName('test,skill')).toBe(false); // ,
|
|
520
|
-
expect(isValidSkillName('test--skill')).toBe(false); // double dash
|
|
521
|
-
});
|
|
522
|
-
|
|
523
|
-
it('returns false for name starting or ending with special characters', () => {
|
|
524
|
-
expect(isValidSkillName('-test-skill')).toBe(false); // leading dash
|
|
525
|
-
expect(isValidSkillName('test-skill-')).toBe(false); // trailing dash
|
|
526
|
-
// Note: dots and underscores are allowed at start/end
|
|
527
|
-
expect(isValidSkillName('.test.skill')).toBe(true); // leading dot is allowed
|
|
528
|
-
expect(isValidSkillName('test.skill.')).toBe(true); // trailing dot is allowed
|
|
529
|
-
expect(isValidSkillName('_test_skill')).toBe(true); // leading underscore is allowed
|
|
530
|
-
expect(isValidSkillName('test_skill_')).toBe(true); // trailing underscore is allowed
|
|
531
|
-
});
|
|
532
|
-
|
|
533
|
-
it('returns true for name with exactly 64 characters', () => {
|
|
534
|
-
const validName = 'a'.repeat(64);
|
|
535
|
-
expect(isValidSkillName(validName)).toBe(true);
|
|
536
|
-
});
|
|
537
|
-
|
|
538
|
-
it('returns true for name with mixed valid characters', () => {
|
|
539
|
-
expect(isValidSkillName('test-skill_123.456')).toBe(true);
|
|
540
|
-
expect(isValidSkillName('test.skill-123_456')).toBe(true);
|
|
541
|
-
expect(isValidSkillName('test_skill-123.456')).toBe(true);
|
|
542
|
-
});
|
|
543
|
-
});
|