agentsclimarketplace

Tool development

Skill arjunrajlaboratory/NimbusImage/.agents/skills/tool-development

Use when creating a new annotation tool, modifying tool templates in public/config/templates.json, adding tool types to TToolType in model.ts, implementing tool interaction logic in AnnotationViewer.vue, or working with the tool selection UI. Covers: template JSON structure, interface element types (annotation, select, checkbox, radio, tags, dockerImage), submenu patterns, tool type registration, GeoJS interaction layer, mouse event handling, hit testing, and worker-based tool configuration.From its SKILL.md

Install
npx -y skills add arjunrajlaboratory/NimbusImage --skill tool-development

Assembled from the repository path, not quoted from the project. Check it against their README if it does not work.

One thing to look at

  • 20 stars20 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.

SKILL.md

4.7 KB, as published. Nobody here has run it

NimbusImage Tool Development

Tools are configured through JSON templates (public/config/templates.json) and implemented in Vue components. The system supports manual annotation, selection, AI-powered, worker-based, and custom interaction tools.

Template Structure

{
  "name": "Tool Section Name",
  "type": "toolType",
  "shortName": "Optional short name",
  "interface": [
    {
      "name": "Interface Element Name",
      "id": "elementId",
      "type": "elementType",
      "isSubmenu": true,
      "advanced": false,
      "meta": {}
    }
  ]
}

Interface Element Types

TypeComponentPurpose
annotationAnnotationConfigurationShape selection
selectv-selectDropdown options
checkboxv-checkboxBoolean toggle
radiov-radio-groupSingle choice
tagsTagPickerTag selection
dockerImageWorker selectorDocker worker tools
restrictTagsAndLayerTagAndLayerRestrictionFilter annotations

Submenu Interface

One interface element should have isSubmenu: true. This creates tool variants in the selection dialog. For select type submenus, each item in meta.items becomes a separate tool option.

Adding a New Tool

Step 1: Define Template

Add to templates.json:

{
  "name": "My Tool Category",
  "type": "myTool",
  "interface": [
    {
      "name": "Tool Mode",
      "id": "mode",
      "type": "select",
      "isSubmenu": true,
      "meta": {
        "items": [
          {
            "text": "Mode A",
            "value": "mode_a",
            "description": "Brief description of Mode A"
          }
        ]
      }
    }
  ]
}

Step 2: Add Type Definition

In src/store/model.ts, add to TToolType:

export type TToolType =
  | "annotation"
  | "selection"
  // ... existing types
  | "myTool";

Step 3: Implement Logic

In src/components/AnnotationViewer.vue:

Set annotation mode in setNewAnnotationMode():

case "myTool":
  this.interactionLayer.mode("point"); // or null for custom handling
  break;

Handle annotations in handleAnnotationChange():

case "myTool":
  // Process the annotation/interaction
  break;

Tool Descriptions

{
  "text": "Tool Name",
  "value": "tool_value",
  "description": "Brief action-oriented description"
}

Keep descriptions under 50 characters. Use action verbs: "Click to...", "Draw to...", "Select...".

Featured Tools

Configure public/config/featuredTools.json:

{
  "featuredTools": ["Tool Name 1", "Tool Name 2"]
}

Names must match the text field exactly.

Docker Worker Tools

Worker-based tools use the dockerImage interface type. Workers are registered with labels:

  • interfaceName - Display name
  • interfaceCategory - Category for grouping
  • description - Tool description
  • isAnnotationWorker - Must be set for annotation workers
  • annotationShape - Default output shape

Common Patterns

Direct Mouse Handling

For tools that don't create visible annotations during interaction:

case "myTool":
  this.interactionLayer.mode(null);
  this.annotationLayer.geoOn(geojs.event.mouseclick, this.handleMyToolClick);
  break;

Hit Testing

Find annotations at a click location:

const fakeAnnotation = { coordinates: [clickCoords], shape: "point" };
const hits = this.getSelectedAnnotationsFromAnnotation(fakeAnnotation);

Updating Annotations

await annotationStore.updateAnnotationsPerId({
  annotationsById: { [annotationId]: { tags: newTags } },
});

Category Colors

Tools are color-coded by category. To add a new category color, edit ToolTypeSelection.vue:

  1. Add SCSS variable: $color-mycategory: #hexcolor;
  2. Add to categoryClassMap: "My Category": "category-mycategory"
  3. Add class: .category-mycategory { @include category-colors($color-mycategory); }

References

  • For detailed GeoJS interaction patterns: read references/tool-interaction-patterns.md
  • For a complete worked example (combine annotations tool): read references/combine-annotations-example.md
  • For SAM tool architecture: read codebaseDocumentation/SAM2_MIGRATION.md

Keep looking

Skills are one crate of 627,801. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.