Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
d5c1d6a
chore: update lodash to 4.17.23
harshithad0703 Jan 30, 2026
e068196
chore: update LICENSE year to 2026 and bump version to 1.5.2
harshithad0703 Jan 30, 2026
e9b29de
Merge pull request #107 from contentstack/chore/deps-update-2026-01-30
harshithad0703 Feb 2, 2026
c6dd2e5
Update sca-scan.yml
dhavaljain999 Mar 3, 2026
044ee2a
chore: update version to 1.5.2, add new .gitignore entry, and impleme…
harshithad0703 Apr 1, 2026
dfec75e
feat: add cursor rules and skills
harshithad0703 Apr 1, 2026
2d9528a
docs: update dev-workflow guidelines for branching and releases
harshithad0703 Apr 1, 2026
18bc73e
Merge branch 'master' into feat/dx-5403-cursor-skills-rules
harshithad0703 Apr 1, 2026
65cebbd
upgrade lodash
harshithad0703 Apr 2, 2026
8a73cb8
upgrade lodash
harshithad0703 Apr 2, 2026
a369601
docs: enhance AGENTS.md with comprehensive agent guidance, repository…
harshithad0703 Apr 2, 2026
1c3116b
docs: restructure AGENTS.md and skills documentation, remove outdated…
harshithad0703 Apr 6, 2026
07228a9
feat: add GitHub Actions workflow for automated npm package release
harshithad0703 Apr 6, 2026
937e6ae
Merge pull request #108 from contentstack/feat/dx-5403-cursor-skills-…
harshithad0703 Apr 7, 2026
1b9b49f
issues-jira.yml
Aravind-Kumar-cstk Jun 19, 2026
26a76b3
Delete issues-jira.yml
Aravind-Kumar-cstk Jun 30, 2026
6187b12
sca-scan.yml
Aravind-Kumar-cstk Aug 2, 2026
0d468e2
Updated codeowners
Aravind-Kumar-cstk Sep 8, 2026
ec4d32f
Updated codeowners
Aravind-Kumar-cstk Sep 10, 2026
6ecc168
Updated codeowners
Aravind-Kumar-cstk Oct 6, 2026
5df8936
chore: back-merge master into development
cs-raj Oct 22, 2026
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
5 changes: 5 additions & 0 deletions .cursor/rules/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
# Cursor (optional)

**Cursor** users: start at the repo root **[`AGENTS.md`](../../AGENTS.md)**. All conventions live in **`skills/*/SKILL.md`** (universal for any editor or tool).

This folder only points contributors here so nothing editor-specific duplicates the canonical docs.
79 changes: 79 additions & 0 deletions .github/workflows/check-version-bump.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
# Catches when developers forget to bump package.json for release-affecting changes.
# App code changes (app.js, bin/, config/, routes/, views/, etc.) require a version bump vs latest tag.
# Skips for: test-only, docs, .github (workflows/config), dependency-only bumps without app edits.
name: Check Version Bump

on:
pull_request:

jobs:
version-bump:
name: Version bump
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0

- name: Detect changed files and version bump
id: detect
run: |
if git rev-parse HEAD^2 >/dev/null 2>&1; then
FILES=$(git diff --name-only HEAD^1 HEAD^2)
else
FILES=$(git diff --name-only HEAD~1 HEAD)
fi
VERSION_FILES_CHANGED=false
echo "$FILES" | grep -qx 'package.json' && VERSION_FILES_CHANGED=true
echo "version_files_changed=$VERSION_FILES_CHANGED" >> $GITHUB_OUTPUT
# App source paths for this boilerplate (no lib/webpack/dist); .github/ and test/ do not count
CODE_CHANGED=false
echo "$FILES" | grep -qE '^app\.js$|^bin/|^config/|^middlewares/|^models/|^public/|^routes/|^views/|^schemaNentries/' && CODE_CHANGED=true
echo "$FILES" | grep -qx 'package.json' && CODE_CHANGED=true
echo "code_changed=$CODE_CHANGED" >> $GITHUB_OUTPUT

- name: Skip when only test/docs/.github changed
if: steps.detect.outputs.code_changed != 'true'
run: |
echo "No release-affecting files changed (e.g. only test/docs/.github). Skipping version-bump check."
exit 0

- name: Fail when version bump was missed
if: steps.detect.outputs.code_changed == 'true' && steps.detect.outputs.version_files_changed != 'true'
run: |
echo "::error::This PR has code changes but no version bump. Please bump the version in package.json."
exit 1

- name: Setup Node
if: steps.detect.outputs.code_changed == 'true' && steps.detect.outputs.version_files_changed == 'true'
uses: actions/setup-node@v4
with:
node-version: '22.x'

- name: Check version bump
if: steps.detect.outputs.code_changed == 'true' && steps.detect.outputs.version_files_changed == 'true'
run: |
set -e
PKG_VERSION=$(node -p "require('./package.json').version.replace(/^v/, '')")
if [ -z "$PKG_VERSION" ]; then
echo "::error::Could not read version from package.json"
exit 1
fi
git fetch --tags --force 2>/dev/null || true
LATEST_TAG=$(git describe --tags --abbrev=0 2>/dev/null || true)
if [ -z "$LATEST_TAG" ]; then
echo "No existing tags found. Skipping version-bump check (first release)."
exit 0
fi
LATEST_VERSION="${LATEST_TAG#v}"
LATEST_VERSION="${LATEST_VERSION%%-*}"
if [ "$(printf '%s\n' "$LATEST_VERSION" "$PKG_VERSION" | sort -V | tail -1)" != "$PKG_VERSION" ]; then
echo "::error::Version bump required: package.json version ($PKG_VERSION) is not greater than latest tag ($LATEST_TAG). Please bump the version in package.json."
exit 1
fi
if [ "$PKG_VERSION" = "$LATEST_VERSION" ]; then
echo "::error::Version bump required: package.json version ($PKG_VERSION) equals latest tag ($LATEST_TAG). Please bump the version in package.json."
exit 1
fi
echo "Version bump check passed: package.json is at $PKG_VERSION (latest tag: $LATEST_TAG)."
31 changes: 0 additions & 31 deletions .github/workflows/issues-jira.yml

This file was deleted.

6 changes: 6 additions & 0 deletions .github/workflows/sca-scan.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,9 @@ on:
jobs:
security-sca:
runs-on: ubuntu-latest
permissions:
contents: read
pull-requests: write
steps:
- uses: actions/checkout@master
- name: Run Snyk to check for vulnerabilities
Expand All @@ -13,3 +16,6 @@ jobs:
SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }}
with:
args: --all-projects --fail-on=all
json: true
continue-on-error: true
- uses: contentstack/sca-policy@main
4 changes: 3 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -12,4 +12,6 @@ example/**/*
_old_test_backup

#dist
dist
dist

datasync-boilerplate
40 changes: 40 additions & 0 deletions .husky/post-checkout
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
#!/usr/bin/env sh
# When switching to a branch that doesn't exist on remote (e.g. newly created),
# pull and merge origin/main or origin/master into current branch. Does not push.

# Only run on branch checkout (not file checkout)
if [ "$3" != "1" ]; then
exit 0
fi

# Skip if we don't have a remote
if ! git rev-parse --verify origin 2>/dev/null; then
exit 0
fi

CURRENT_BRANCH=$(git rev-parse --abbrev-ref HEAD)

# Skip main/master - no need to merge base into these
case "$CURRENT_BRANCH" in
main|master) exit 0 ;;
esac

# Only run when current branch does not exist on origin (treat as new local branch)
if git ls-remote --heads origin "$CURRENT_BRANCH" 2>/dev/null | grep -q .; then
echo "post-checkout: $CURRENT_BRANCH exists on origin, skipping merge."
exit 0
fi

# Prefer main, fallback to master
if git rev-parse --verify origin/main 2>/dev/null; then
BASE=origin/main
elif git rev-parse --verify origin/master 2>/dev/null; then
BASE=origin/master
else
exit 0
fi

echo "New branch detected: merging latest $BASE into $CURRENT_BRANCH (local only, not pushing)..."
git fetch origin
git merge "$BASE" --no-edit --no-ff
echo "Done. Merge is local only; push when ready."
49 changes: 49 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
# Contentstack DataSync Filesystem SDK – Agent guide

**Universal entry point** for contributors and AI agents (Cursor, Copilot, CLI tools, or none). Conventions and detailed guidance live in **`skills/*/SKILL.md`**, not in editor-specific config, so the same instructions apply everywhere.

**Flow:** [`.cursor/rules/README.md`](.cursor/rules/README.md) (optional, Cursor only) → **`AGENTS.md`** (this file) → **`skills/<name>/SKILL.md`**

## What this repo is

| Field | Detail |
|-------|--------|
| *Name:* | [`@contentstack/datasync-filesystem-sdk`](https://github.com/contentstack/datasync-filesystem-sdk/) |
| *Purpose:* | TypeScript/JavaScript library to **query locally synced filesystem JSON** produced by [Contentstack DataSync](https://www.contentstack.com/docs/guide/synchronization/contentstack-datasync), typically after sync via `@contentstack/datasync-content-store-filesystem`. |
| *Out of scope (if any):* | **Not** the Contentstack Delivery (CDA) or Management (CMA) HTTP SDK; **no** REST calls for core behavior—reads disk and runs in-process queries (`lodash`, `sift`, `json-mask`). |

## Tech stack (at a glance)

| Area | Details |
|------|---------|
| Language | TypeScript `^4.9.5` (`package.json`); Node.js v20+ recommended (`README.md`) |
| Build | `tsc` → `dist/`; declarations in `typings/`; `tsconfig.json`; `npm run build-ts` / `compile` |
| Tests | Jest + ts-jest; `jest.config.js`; tests under `test/**/*.ts` (see `testMatch` / ignores) |
| Lint / coverage | `npm run lint` (ESLint per `package.json` on `src/**/*.ts`); Jest coverage to `coverage/` |
| Other | Core deps: `lodash`, `sift`, `json-mask`, `mkdirp`; docs: `npm run build-doc` → `docs/` |

## Commands (quick reference)

| Command type | Command |
|--------------|---------|
| Build | `npm run build-ts` (clean + compile) or `npm run compile` (`tsc` only) |
| Test | `npm test` (`pretest` runs `build-ts`, then Jest with coverage) |
| Lint | `npm run lint` |

Optional: CI and automation live under [`.github/workflows/`](.github/workflows/) (e.g. CodeQL, SCA, policy scans, version-bump checks—see each workflow for triggers).

## Where the documentation lives: skills

| Skill | Path | What it covers |
|-------|------|----------------|
| Dev workflow | [`skills/dev-workflow/SKILL.md`](skills/dev-workflow/SKILL.md) | Branches, hooks, build/test/lint, PR and version expectations |
| TypeScript (`src/`) | [`skills/typescript/SKILL.md`](skills/typescript/SKILL.md) | Compiler/lint, layout, JSDoc, dependencies—no HTTP/REST assumptions |
| DataSync filesystem SDK | [`skills/datasync-filesystem/SKILL.md`](skills/datasync-filesystem/SKILL.md) | Stack, config, query surface, DataSync vs CDA/CMA |
| Testing | [`skills/testing/SKILL.md`](skills/testing/SKILL.md) | Jest layout, fixtures, temp dirs, env, coverage |
| Code review | [`skills/code-review/SKILL.md`](skills/code-review/SKILL.md) | PR checklist, semver, terminology, severity labels |

An index with “when to use” hints is in [`skills/README.md`](skills/README.md).

## Using Cursor (optional)

If you use *Cursor*, [`.cursor/rules/README.md`](.cursor/rules/README.md) only points to *[`AGENTS.md`](AGENTS.md)*—same docs as everyone else.
14 changes: 4 additions & 10 deletions CODEOWNERS
Original file line number Diff line number Diff line change
@@ -1,11 +1,5 @@
* @contentstack/devex-pr-reviewers

.github/workflows/sca-scan.yml @contentstack/security-admin

.github/workflows/codeql-anaylsis.yml @contentstack/security-admin

* @contentstack/developer-ecosystem-pr-reviewers
.github/workflows/ @contentstack/security-admin
**/.snyk @contentstack/security-admin

.github/workflows/policy-scan.yml @contentstack/security-admin

.github/workflows/issues-jira.yml @contentstack/security-admin
**/CODEOWNERS @contentstack/security-admin
**/.gitguardian.yaml @contentstack/security-admin
4 changes: 2 additions & 2 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@contentstack/datasync-filesystem-sdk",
"version": "1.5.1",
"version": "1.5.3",
"description": "JavaScript filesystem SDK to query data synced via @contentstack/datasync-content-store-filesystem",
"main": "dist/index.js",
"scripts": {
Expand Down
20 changes: 20 additions & 0 deletions skills/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
# Skills – Contentstack DataSync Filesystem SDK

**This directory is the source of truth** for detailed conventions (workflow, TypeScript/`src/`, DataSync SDK behavior, tests, code review). Read [`AGENTS.md`](../AGENTS.md) at the repo root for the index and quick commands; each skill is a folder with **`SKILL.md`** (YAML frontmatter: `name`, `description`).

## When to use which skill

| Skill folder | Use when |
|--------------|----------|
| [`dev-workflow/`](dev-workflow/SKILL.md) | Branching (`development` / `master`), local hooks, running build/test/lint, releases and version bumps |
| [`typescript/`](typescript/SKILL.md) | TypeScript/`tsconfig`, ESLint, `src/` layout, JSDoc, style in library code |
| [`datasync-filesystem/`](datasync-filesystem/SKILL.md) | Stack, config, query surface, DataSync vs CDA/CMA—behavior in `src/` |
| [`testing/`](testing/SKILL.md) | Writing or debugging Jest tests, fixtures, `test/utils`, coverage |
| [`code-review/`](code-review/SKILL.md) | Reviewing or preparing PRs—API, compatibility, tests, terminology |

Each folder contains `SKILL.md` with YAML frontmatter (`name`, `description`).

## How to use these docs

- **Humans / any AI tool:** Start at **`AGENTS.md`**, then open the relevant **`skills/<name>/SKILL.md`**.
- **Cursor users:** **[`.cursor/rules/README.md`](../.cursor/rules/README.md)** only points to **`AGENTS.md`** so guidance stays universal—no duplicate rule prose required in `.cursor/rules/`.
61 changes: 61 additions & 0 deletions skills/code-review/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
---
name: code-review
description: PR review checklist for DataSync Filesystem SDK—API docs, compatibility, tests, terminology (not CDA/CMA HTTP SDK)
---

# Code review – Contentstack DataSync Filesystem SDK

## When to use

- Reviewing a pull request that touches `src/`, `test/`, or public docs
- Preparing your own PR and self-checking before request for review
- Verifying semver impact or regression risk for query/config behavior

## Instructions

### Scope and terminology

- This package is the **DataSync Filesystem SDK** (local synced content). Do **not** describe it as the **CDA** or **CMA** HTTP client unless the change explicitly documents comparison or migration.
- Distinguish **in-memory/filesystem** queries from **REST** or **CDN** behavior.
- Confirm behavior changes are covered by **filesystem-based** Jest tests, not live API calls.

### Public API and docs

- Exported APIs should have accurate **JSDoc** (`@public`, parameters, return shape).
- **README** and **example/** snippets must match real `Contentstack.Stack` usage and config keys.

### Compatibility

- Avoid breaking query result shape, config schema, or public method signatures without a **semver-major** plan and changelog intent.
- Deprecations: comment + document clearly.

### Errors and messages

- Prefer centralized strings from **`src/messages.ts`** (`ERROR_MESSAGES`, `WARNING_MESSAGES`); keep messages actionable.

### Correctness and null safety

- Guard missing files, empty arrays, and malformed JSON consistently with patterns in `stack.ts` / `fs.ts`.

### Dependencies and security

- New dependencies need justification (bundle size, maintenance). Align with **`package.json`**.
- Consider **Snyk** / org policy — `pretest` does not replace dependency review.

### Tests

- Behavioral changes in **`src/`** need matching updates under **`test/`** with fixtures in **`test/data/`** — not live API calls.

### Optional severity

| Level | Examples |
|-------|----------|
| Blocker | Wrong query results, data loss risk, security issue, broken public API contract |
| Major | Missing tests for core behavior, breaking change without version/docs strategy |
| Minor | Style, non-user-facing refactors, doc nits |

## References

- [`../testing/SKILL.md`](../testing/SKILL.md)
- [`../datasync-filesystem/SKILL.md`](../datasync-filesystem/SKILL.md)
- [`../../AGENTS.md`](../../AGENTS.md)
Loading
Loading