Skip to content
Open
Show file tree
Hide file tree
Changes from 12 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 30 additions & 0 deletions .claude/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
{
"permissions": {
"allow": [
"Bash(npm:*)",
"Bash(yarn:*)",
"Bash(npx:*)",
"Bash(node:*)",
"Bash(curl:*)",
"Bash(gh:*)",
"Bash(jq:*)",
"Bash(mkdir:*)",
"Bash(docker:*)",
"Bash(docker compose:*)",
"Edit",
"Read",
"Write",
"Grep",
"Glob",
"LS"
],
"deny": [
"Read(./.env)",
"Read(./.env.*)",
Copy link

Copilot AI Feb 10, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The deny rule Read(./.env.*) blocks reading .env.development, even though the repo treats it as committed non-secret defaults and the new docs reference copying values from it. Consider narrowing the deny list to only secret-bearing files (for example .env.local and .env*.local) or explicitly allowing reads of .env.development so the assistant can follow the documented workflows.

Suggested change
"Read(./.env.*)",
"Read(./.env*.local)",

Copilot uses AI. Check for mistakes.
"Read(./secrets/**)"
],
Comment on lines +21 to +25
Copy link

Copilot AI Feb 10, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The deny rule Read(./.env.*) also blocks reading .env.development, which this repo uses for non-secret defaults and which is referenced by the documentation. Consider narrowing the deny list to just secret-bearing files (for example .env, .env.local, .env.*.local) so assistants can still read committed defaults while avoiding secrets.

Copilot uses AI. Check for mistakes.
"ask": [
"Bash(git push:*)"
]
}
}
195 changes: 195 additions & 0 deletions .claude/skills/run-tests/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,195 @@
---
name: run-tests
description: Run API tests against InfluxDB 3 Core. Handles service initialization, database setup, and test execution.
author: InfluxData
version: "1.0"
Comment on lines +2 to +5
Copy link

Copilot AI Feb 10, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This skill claims tests run “against InfluxDB 3 Core” and includes DB initialization steps, but the current Jest suite mocks ../lib/influxdb and runs without a real database (__tests__/api.test.js). Either update this skill to describe the mocked test workflow, or convert tests to true integration tests and remove the module mock.

Copilot uses AI. Check for mistakes.
---

# Run Tests Skill

## Purpose

This skill guides running the IoT API test suite against a local InfluxDB 3 Core instance. It covers service setup, database creation, and test execution.

Comment on lines +10 to +13
Copy link

Copilot AI Feb 10, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The skill describes running the test suite “against a local InfluxDB 3 Core instance”, but the only test file (__tests__/api.test.js) mocks the InfluxDB client and can run without any database. Please either (a) adjust this skill to describe the mocked/unit test workflow, or (b) add a separate integration test target and clarify which tests require InfluxDB.

Copilot uses AI. Check for mistakes.
## Quick Reference

| Task | Command |
|------|---------|
| Start InfluxDB 3 | `docker compose up -d influxdb3-core` |
| Check status | `curl -i http://localhost:8181/health` |
| Run tests | `yarn test` |
| View logs | `docker logs influxdb3-core` |

## Complete Setup Workflow

### 1. Initialize InfluxDB 3 Core

```bash
# Create required directories
mkdir -p test/.influxdb3/core/data test/.influxdb3/core/plugins

# Generate admin token (first time only)
openssl rand -hex 32 > test/.influxdb3/core/.token
chmod 600 test/.influxdb3/core/.token

# Start the container
docker compose up -d influxdb3-core

# Wait for healthy status
docker compose ps
```

### 2. Create Databases

```bash
# Get the token
TOKEN=$(cat test/.influxdb3/core/.token)

# Create main database
curl -X POST "http://localhost:8181/api/v3/configure/database" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"db": "iot_center"}'

# Create auth database
curl -X POST "http://localhost:8181/api/v3/configure/database" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"db": "iot_center_auth"}'
Copy link

Copilot AI Feb 10, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This creates the auth database as iot_center_auth, but the repo defaults/README use iot_center_devices for INFLUX_DATABASE_AUTH. Align the database name here (and corresponding env examples) with .env.development to avoid configuration drift.

Suggested change
-d '{"db": "iot_center_auth"}'
-d '{"db": "iot_center_devices"}'

Copilot uses AI. Check for mistakes.

# Verify databases exist
curl "http://localhost:8181/api/v3/configure/database?format=json" \
-H "Authorization: Bearer $TOKEN"
```

### 3. Configure Environment

Create `.env.local` if it doesn't exist:

```bash
cat > .env.local << EOF
INFLUX_HOST=http://localhost:8181
INFLUX_TOKEN=$(cat test/.influxdb3/core/.token)
INFLUX_DATABASE=iot_center
INFLUX_DATABASE_AUTH=iot_center_auth
EOF
Comment on lines +71 to +75
Copy link

Copilot AI Feb 10, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The .env.local template sets INFLUX_DATABASE_AUTH=iot_center_auth, but .env.development/README default to iot_center_devices. Please update the template (or the project defaults) so users don’t end up with mismatched database names.

Copilot uses AI. Check for mistakes.
Comment on lines +54 to +75
Copy link

Copilot AI Feb 10, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The auth database name is inconsistent with the rest of the repo defaults (INFLUX_DATABASE_AUTH=iot_center_devices in .env.development/README). Here it’s iot_center_auth in both the database creation step and the suggested .env.local, which will misconfigure the app unless users also change defaults. Please align on a single name.

Copilot uses AI. Check for mistakes.
```

### 4. Run Tests

```bash
# Install dependencies (if needed)
yarn

# Run the test suite
yarn test

# Run with verbose output
yarn test --verbose

# Run specific test file
yarn test __tests__/api.test.js
```

## Troubleshooting

### Container Won't Start

**Symptom:** Container exits immediately

**Check:**
```bash
# View logs
docker logs influxdb3-core

# Verify directories exist
ls -la test/.influxdb3/core/

# Verify token file exists
cat test/.influxdb3/core/.token
```

**Common fixes:**
- Create missing directories: `mkdir -p test/.influxdb3/core/data test/.influxdb3/core/plugins`
- Generate token: `openssl rand -hex 32 > test/.influxdb3/core/.token`

### 401 Unauthorized

**Symptom:** API calls return 401

**Check:**
```bash
# Verify token matches
echo "Token in file: $(cat test/.influxdb3/core/.token)"
echo "Token in .env.local: $(grep INFLUX_TOKEN .env.local)"
Copy link

Copilot AI Feb 10, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Troubleshooting suggests grep INFLUX_TOKEN .env.local, but .claude/settings.json denies Read(./.env.*)—an agent using Claude Code won’t be permitted to run read operations against .env.local. Either relax the deny rule (for non-secret .env.development at least) or adjust troubleshooting steps to avoid reading .env.* files.

Suggested change
echo "Token in .env.local: $(grep INFLUX_TOKEN .env.local)"
echo "INFLUX_TOKEN env var: ${INFLUX_TOKEN:-'(not set)'}"

Copilot uses AI. Check for mistakes.

# Test with token directly
curl -i http://localhost:8181/api/v3/configure/database \
-H "Authorization: Bearer $(cat test/.influxdb3/core/.token)"
```

### Database Not Found

**Symptom:** Tests fail with "database not found"

**Fix:** Create the required databases:
```bash
TOKEN=$(cat test/.influxdb3/core/.token)
curl -X POST "http://localhost:8181/api/v3/configure/database" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"db": "iot_center"}'
curl -X POST "http://localhost:8181/api/v3/configure/database" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"db": "iot_center_auth"}'
```

### Port Already in Use

**Symptom:** "port is already allocated"

**Fix:**
```bash
# Find what's using the port
lsof -i :8181

# Stop existing container
docker compose down
```

## Clean Slate

To start fresh:

```bash
# Stop and remove containers
docker compose down

# Remove data (WARNING: deletes all data)
rm -rf test/.influxdb3/core/data/*

# Regenerate token
openssl rand -hex 32 > test/.influxdb3/core/.token

# Start fresh
docker compose up -d influxdb3-core
```

## Test Configuration

The test suite uses these environment variables:

| Variable | Default | Description |
|----------|---------|-------------|
| `INFLUX_HOST` | `http://localhost:8181` | InfluxDB 3 API URL |
| `INFLUX_TOKEN` | (from `.env.local`) | Admin token |
| `INFLUX_DATABASE` | `iot_center` | Main data database |
| `INFLUX_DATABASE_AUTH` | `iot_center_auth` | Device auth database |

## Related Files

- **Docker Compose**: `compose.yaml`
- **Test suite**: `__tests__/api.test.js`
- **Environment defaults**: `.env.development`
- **Local overrides**: `.env.local` (gitignored)
52 changes: 52 additions & 0 deletions .github/INSTRUCTIONS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
# AI Instructions Navigation Guide

This repository has multiple instruction files for different AI tools and use cases.

## Quick Navigation

| If you are... | Use this file | Purpose |
|---------------|---------------|---------|
| **GitHub Copilot** | [../AGENTS.md](../AGENTS.md) | Development patterns, code examples |
| **Claude, ChatGPT, Gemini** | [../AGENTS.md](../AGENTS.md) | Comprehensive development guide |
| **Claude with MCP** | [../CLAUDE.md](../CLAUDE.md) | Quick reference with skill pointers |

## File Organization

```
iot-api-js/
├── .claude/
│ ├── settings.json # Claude permissions
│ └── skills/
│ └── run-tests/SKILL.md # Test execution workflow
├── .github/
│ └── INSTRUCTIONS.md # THIS FILE - Navigation guide
├── AGENTS.md # Comprehensive AI assistant guide
├── CLAUDE.md # Claude with MCP quick reference
└── README.md # User-facing documentation
```

## What's in Each File

**[../CLAUDE.md](../CLAUDE.md)** - Quick reference for Claude:
- Project overview
- Quick commands
- Structure summary
- Links to skills

**[../AGENTS.md](../AGENTS.md)** - Comprehensive guide:
- Architecture diagram
- Development workflow
- Code patterns and examples
- Common tasks
- Style guidelines

**[../README.md](../README.md)** - User documentation:
- Setup instructions
- API usage
- Troubleshooting

## Getting Started

1. **New to the repository?** Start with [../README.md](../README.md)
2. **Using AI assistants?** Read [../AGENTS.md](../AGENTS.md)
3. **Using Claude with MCP?** Check [../CLAUDE.md](../CLAUDE.md) and [../.claude/](../.claude/)
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -28,3 +28,6 @@ yarn-error.log*
.env.development.local
.env.test.local
.env.production.local

# InfluxDB 3 local data
test/.influxdb3/
Loading