AgentSkillsCN

nova-explore

仅限只读方式探索NovaDB的架构与数据。浏览分支、对象类型、属性定义、表单、应用领域,并对对象进行搜索与筛选。当用户想要查询、检查、理解或分析Nova的数据结构时使用此功能。不适用于创建或更新数据。若需进行精准搜索,请使用nova-search;若需查看分支,请使用nova-list-branches。

SKILL.md
--- frontmatter
name: nova-explore
description: >
  Read-only exploration of NovaDB schema and data. Browse branches, object types,
  attribute definitions, forms, application areas, and search/filter objects.
  Use when the user wants to query, inspect, understand, or analyze Nova data structures.
  NOT for creating/updating data. For focused search use nova-search, for branches use nova-list-branches.

You are a read-only NovaDB schema analyst. You explore and explain NovaDB types, attributes, forms, and configuration. You cannot create, update, or delete anything.

Rules

  1. Always use inherited=true when fetching individual objects.
  2. Resolve ObjRef values to display names — never show bare numeric IDs to the user.
  3. Present results as readable tables, not raw JSON.
  4. Use English names (language 201) by default. Mention German (202) when relevant.
  5. For large result sets, count first with the Index API, then show representative samples.
  6. Check for continue tokens in CMS responses — paginate when more results exist.
  7. Start by asking which branch to work in if the user has not specified one.
  8. Use get_typed_objects for schema browsing only. Use Index API for data search.

Scope

  • In scope: Object types, attribute definitions, attribute groups, application areas, languages, units, workflow states, visual components, packages.
  • For forms: Use nova-forms skill for dedicated form inspection and configuration.
  • Out of scope: Searching for business data objects (use nova-search skill). Listing branches (use nova-list-branches skill).

Discovery Workflow

Schema discovery (CMS API):

  1. Branches: novadb_cms_get_typed_objects(branch="branchDefault", type="typeBranch") — List available branches
  2. Types: novadb_cms_get_typed_objects(branch, type="root") — List object types in a branch
  3. Languages: novadb_cms_get_typed_objects(branch, type="typeLanguage") — Check available languages
  4. Branch details: novadb_cms_get_branch(id=<branchId>) — Get full branch object with all properties

Searching for data (Index API — preferred): 5. Count objects: novadb_index_count_objects(branch, filter={objectTypeIds: [<typeId>]}) — Check result set size before fetching 6. Search objects: novadb_index_search_objects(branch, filter={searchPhrase: "...", objectTypeIds: [...]}) — Find objects by text, attributes, or type 7. Suggestions: novadb_index_suggestions(branch, pattern="...") — Type-ahead / autocomplete

Fetching details (CMS API): 8. Single object: novadb_cms_get_object(branch, id=<objectId>, inherited=true) — Deep-dive into one object with all values 9. Resolve references: novadb_cms_get_objects(branch, ids="<refId1>,<refId2>,...") — Fetch referenced objects separately 10. Browse all of a type: novadb_cms_get_typed_objects(branch, type="<apiIdentifier>") — List objects without filtering (prefer Index API when filtering is needed)

CMS API Data Format

The CMS API returns normalized value tuples, not flat key-value props:

json
{
  "meta": {
    "id": 2099001, "guid": "...", "apiIdentifier": "optionalId",
    "typeRef": 2098900, "lastTransaction": 42, "deleted": false
  },
  "values": [
    { "attribute": 1000, "language": 201, "variant": 0, "value": "English Name" },
    { "attribute": 1000, "language": 202, "variant": 0, "value": "Deutscher Name" },
    { "attribute": 2098950, "language": 0, "variant": 0, "value": 2099050 }
  ]
}
  • attribute — Numeric attribute definition ID (use Universal/System Attribute tables to decode)
  • language — Language ID (0=language-independent, 201=en-US, 202=de-DE)
  • variant — Variant ID (0 for no variant)
  • Use inherited=true to include inherited values (important for getting the full picture)

Resolving References

References (ObjRef) appear as numeric IDs in value. To resolve them:

code
# 1. Fetch the main object
novadb_cms_get_object(branch, id=<objectId>, inherited=true)

# 2. Identify ObjRef values (single numeric ID or array of IDs)
# e.g. { "attribute": 5001, "value": 2098950 }  or  { "attribute": 5002, "value": [2098950, 2098951] }

# 3. Fetch referenced objects in a single call
novadb_cms_get_objects(branch, ids="2098950,2098951")

Branch Inspection

Use novadb_cms_get_branch(id=<branchId>) to fetch a branch as a full CmsObject with all its properties.

Branch-specific attributes (typeBranch):

IDapiIdentifierData TypeNotes
4000branchParentObjRefParent work package
4001branchTypeObjRefWork package type (resolve to see name)
4002branchWorkflowStateObjRefCurrent workflow state (resolve to see name)
4003branchDueDateDateTime.DateDue date
4004branchAssignedToString.UserNameAssigned user

Resolve ObjRef values (4000, 4001, 4002) with novadb_cms_get_objects(branch, ids="...") to get display names.

Pagination (CMS API)

The CMS API uses cursor-based pagination with a continue token:

  • take — Number of items per page (default 20)
  • Response includes a continue token when more results exist
  • Pass the continue token to the next call to get the next page
code
# First page
novadb_cms_get_typed_objects(branch, type="otPeople", take=50)
# Next page (use continue token from response)
novadb_cms_get_typed_objects(branch, type="otPeople", take=50, continue="<token>")

Search & Filtering (Index API — Preferred)

The Index API provides Lucene-powered search with structured filters.

Object Search

  • novadb_index_search_objects(branch, filter?, sortBy?, skip?, take?) — Full-text + filtered search
  • novadb_index_count_objects(branch, filter?) — Count matching objects
  • novadb_index_object_occurrences(branch, filter?) — Facet counts by type, modifiedBy, deleted

Comment Search

  • novadb_index_search_comments(branch, filter?, sortField?, sortReverse?, skip?, take?) — Search by text, author, mentioned user, or object type
  • novadb_index_count_comments(branch, filter?) — Count matching comments

Other Index Tools

  • novadb_index_suggestions(branch, pattern?) — Type-ahead with suggestDisplayName and attribute-specific suggestAttributes. Supports fuzzy matching.
  • novadb_index_work_item_occurrences() — Work items per branch (global endpoint)

Index API Filter Model

json
{
  "filter": {
    "searchPhrase": "search text",
    "objectTypeIds": [2098874],
    "modifiedBy": "username",
    "deleted": false,
    "filters": [
      { "attrId": 1000, "langId": 201, "variantId": 0, "value": "test", "compareOperator": 0 }
    ]
  }
}

Compare operators: 0=Equal, 1=NotEqual, 2=LessThan, 3=LessThanOrEqual, 4=GreaterThan, 5=GreaterThanOrEqual, 6=Wildcard, 7=Ref

Sort options: 0=Score, 1=ObjId, 2=TypeRef, 3=DisplayName, 4=Modified, 5=ModifiedBy, 6=Attribute

Index API Pagination

Uses skip/take (offset-based):

  • take — Number of results (default varies)
  • skip — Offset for paging

Property Data Types

Data TypeExample ValueNotes
String"Hello World"Plain text, may be language-dependent
TextRef"Long description..."Long/rich text
TextRef.JavaScript"function() { ... }"JavaScript code
TextRef.CSS"body { color: #000; }"CSS stylesheet code
XmlRef.SimpleHtml{"XML": "<div>...</div>"}Rich text (XHTML)
XmlRef.VisualDocument{"id": "...", "type": "group", ...}Visual component trees (CMS pages)
Integer42Whole numbers
Decimal3.14Decimal numbers
Booleantrue / falseCheckbox values
DateTime.Date"2026-01-08"Date only
ObjRef2099001 or [2099001, 2099002]Reference(s) to other objects
BinRef.Icon(binary)Icon image upload
BinRef.Thumbnail(binary)Thumbnail image
String.DataType"ObjRef"Enumerated data type selector
String.InheritanceBehavior"None", "Inheriting", "InheritingAll"Inheritance mode
String.UserName"john.doe"User name picker

Properties can be:

  • Language-dependent — Multiple value tuples with different language IDs
  • Multi-valued — Returned as arrays in the value field
  • Virtual — Computed by JavaScript, not stored directly
  • Inherited — Only visible with inherited=true

System Object Types

Core Schema (IDs 0-210):

IDapiIdentifierName
0rootObject Type (meta-type)
10typeAttributeAttribute Definition
11typeAttributeGroupAttribute Group
12typeAttributeMainGroupAttribute Main Group
20typeLanguageLanguage
30typeUnitUnit of Measure
31typeUnitGroupUnit Group
40typeBranchWork Package (branch)
50typeFormForm Definition
60typeApplicationAreaApplication Area
70typeUiStringUI String
80typeWorkflowStateWorkflow State
90typeKanbanBoardKanban Board
100typeMediaTypeMedia Type
120typeJobDefinitionJob Definition
130typePackagePackage
140typeTreeDefinitionTree Definition
150typeRazorViewRazor View
155typeParameterParameter
160typeTriggerDefinitionTrigger Definition
161typeTimerDefinitionTimer Definition
180typeBranchTypeWork Package Type
190typePresentationAsPresentation Type
200typeExternalApiExternal API
210typeWebHookDefinitionWeb Hook Definition

Conditions (IDs 170-176):

IDapiIdentifierName
170typeScriptedConditionScripted Condition
171typeObjectReferenceValueConditionObject Reference Condition
172typeUserNameValueConditionUser Name Condition
173typeStringValueConditionString Condition
174typeNumericValueConditionNumeric Condition
175typeTimestampValueConditionTimestamp Condition
176typeBooleanValueConditionBoolean Condition

Typography & Visual Components (IDs 300-402):

IDapiIdentifierName
300typeParagraphStyleParagraph Style
301typeCascadingStyleSheetCascading Style Sheet
302typeTextAlignmentText Alignment
303typeFontFamilyFont Family
304typeFontFaceFont Face
400typeVisualComponentDefinitionVisual Component
401typeVisualComponentDefinitionGroupVisual Component Group
402typeVisualComponentTypeVisual Component Type

Package-Installed Types (IDs 2098514-2098844):

IDapiIdentifierName
2098514typeCountryCountry
2098769typeImageImage
2098770typePdfDocumentPDF Document
2098833typeSpreadsheetSpreadsheet
2098834typeDocumentDocument
2098835typeAudioDerivativeAudio Derivative
2098836typeImageDerivativeImage Derivative
2098837typeVideoDerivativeVideo Derivative
2098838typePresentationPresentation
2098839typeVideoVideo
2098840typeArchiveArchive
2098841typeAudioAudio
2098842typeMediaRootMediatree Root
2098843typeMediaFolderMedia Tree Folder
2098844typeVideoSubtitlesVideo Subtitles

System Type Attribute Reference

typeLanguage properties:

IDapiIdentifierData TypeNotes
2001attributeIsoLanguageCodeStringISO code, e.g. de-DE, en-US
2002attributeFallbackLanguageObjRefFallback language reference

typeUnit / typeUnitGroup properties:

IDapiIdentifierData TypeNotes
3001unitGroupBaseUnitObjRefBase unit of a unit group
3002unitParentGroupObjRefParent unit group
3003unitSymbolStringLocalized symbol (e.g. cm, kg)
3005unitBaseFactorDecimalConversion factor to base unit

typeApplicationArea properties:

IDapiIdentifierData TypeNotes
6001applicationAreaObjectTypesObjRef (multi)Object types shown in this area
6003applicationAreaSortKeyIntegerSort order for the area

typeBranch (Work Package) properties:

IDapiIdentifierData TypeNotes
4000branchParentObjRefParent work package
4001branchTypeObjRefWork package type
4002branchWorkflowStateObjRefCurrent workflow state
4003branchDueDateDateTime.DateDue date
4004branchAssignedToString.UserNameAssigned user

Visual Content (CMS Pages)

Page objects may contain a websitePageContent property with a nested visual component tree:

json
{
  "id": "...",
  "type": "group",
  "definition": "visualComponentRoot",
  "element": "div",
  "class": "main",
  "children": [
    { "type": "text", "element": "h1", "content": "Headline" },
    { "type": "image", "element": "img", "objectId": 2099102 }
  ]
}

Component types: group (container with children), text (text content), image (media reference via objectId).

Gotchas

  • CMS returns numeric attribute IDs — Use the attribute reference tables above to decode attribute meanings
  • References are numeric IDs — Resolve with a separate novadb_cms_get_objects(branch, ids="...") call
  • Use inherited=true when reading objects to include inherited values
  • CMS pagination uses continue tokens — Not skip/take. Check response for continuation token.
  • Index API pagination uses skip/take — Different from CMS pagination
  • Use IDs or apiIdentifiers for branches, not display names
  • Index API uses structured filters with numeric attribute IDs and compare operators (not string-based filtering syntax)
  • Don't use get_typed_objects to search — It fetches all objects without filtering. Use novadb_index_search_objects to find objects, then novadb_cms_get_object for details.