[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6AD26DAJEKKYFDM37MVFXW2":3,"skill-same:01M6AD26DAJEKKYFDM37MVFXW2":87},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":23,"publishedAt":44,"linkOnly":45,"markdownContent":46,"markdownBody":47,"frontMatter":48,"refName":51,"commitSha":52,"skillDirectory":53,"forksCount":54,"repositoryHtmlUrl":55,"repositoryHomepageUrl":56,"ownerHtmlUrl":57,"ownerBlogUrl":58,"ownerDescription":6,"updatedAt":59,"install":60,"resources":72},"01M6AD26DAJEKKYFDM37MVFXW2","oak-store-document-add-config",null,"Add a new OSGi configuration property to the oak-store-document module. Modifies Configuration.java, DocumentNodeStoreService.java, DocumentNodeStoreBuilder.java, RDBDocumentNodeStoreBuilder.java, Utils.java, and all relevant test files with 90%+ coverage.","apache\u002Fjackrabbit-oak","apache","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F47359?v=4","01M6AC83E6K4FDKK7HZ8WNMQKE","The Apache Software Foundation","01M6AD23DESZ8KJ6BV33XCFQDJ",415,"Apache-2.0","https:\u002F\u002Fgithub.com\u002Fapache\u002Fjackrabbit-oak\u002Fblob\u002Ftrunk\u002Foak-store-document\u002F.claude\u002Fskills\u002Foak-store-document-add-config\u002FSKILL.md",[18],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000002","文档处理","SCENARIO","使用场景",[24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43],"config","store","add","document","oak store document add config","Bash","grep","read","edit","coverage","files","configuration","module","java","test","relevant","with","true","utils","new","2026-11-10 10:12:30",false,"---\nname: oak-store-document-add-config\ndescription: Add a new OSGi configuration property to the oak-store-document module. Modifies Configuration.java, DocumentNodeStoreService.java, DocumentNodeStoreBuilder.java, RDBDocumentNodeStoreBuilder.java, Utils.java, and all relevant test files with 90%+ coverage.\nallowed-tools: Read, Edit, Grep, Glob, Bash\ndisable-model-invocation: true\n---\n\n# oak-add-config Skill\n\nYou are an expert in the Apache Jackrabbit Oak `oak-store-document` module. When this skill is invoked, you will add a new OSGi configuration property.\n\n## Supporting files\n\n- Detailed production code patterns (steps 2–6): [osgi-config-patterns.md](osgi-config-patterns.md)\n- Detailed test patterns (steps 7–10): [test-patterns.md](test-patterns.md)\n- Wiring into usage class + compile\u002Ftest (steps 11–12): [wiring-and-verification.md](wiring-and-verification.md)\n\n---\n\n## REQUIRED INPUT\n\nThe user **must** provide these values when invoking the skill. If any are missing, stop and ask:\n\n| Parameter | Description | Example |\n|-----------|-------------|---------|\n| `configName` | camelCase OSGi attribute method name | `avoidExclusiveMergeLock` |\n| `type` | Java type: `boolean`, `int`, `long`, `String` | `boolean` |\n\n`defaultValue` is **optional** — if not provided, use the Java default for the given type:\n- `boolean` → `false`\n- `int` \u002F `long` → `0`\n- `String` → `\"\"`\n\nThe following are **optional** — derive or infer them if not provided:\n\n| Parameter | Description | How to derive if missing |\n|-----------|-------------|--------------------------|\n| `jiraId` | JIRA ticket ID | **Deduce from current branch name** (see below) |\n| `attrName` | Human-readable OSGi display name | Convert `configName` from camelCase to Title Case |\n| `description` | Full OSGi description text | Ask the user for a brief description, then expand it |\n| `scope` | `both`, `mongo-only`, or `rdb-only` | **Ask the user explicitly. Default is `mongo-only`.** |\n| `featureToggle` | Whether to add a feature toggle (`true` \u002F `false`) | **Ask the user explicitly. Default is `false`.** |\n\n> **Deducing `jiraId` from the branch:**\n> Run `git branch --show-current` and extract the JIRA ID\n> (e.g. `OAK-12139` → `jiraId=OAK-12139`; `issue\u002FOAK-12139` → `jiraId=OAK-12139`).\n> If it differs from a user-supplied value, warn. If none can be deduced, ask.\n\n> **Before proceeding, ask both optional questions in a single prompt:**\n> 1. *\"Which backends does this config apply to? (mongo-only \u002F rdb-only \u002F both, default: mongo-only)\"*\n> 2. *\"Do you want a feature toggle for this config? (yes\u002Fno, default: no)\"*\n\n---\n\n## DERIVED IDENTIFIERS\n\nFrom the inputs, derive:\n\n- `DEFAULT_CONST` → `DEFAULT_` + UPPER_SNAKE_CASE of `configName`\n  e.g. `avoidExclusiveMergeLock` → `DEFAULT_AVOID_EXCLUSIVE_MERGE_LOCK`\n- `setterName` → `set` + PascalCase(configName)\n- `getterName` → same as `configName`\n- `utilsMethod` → `is` + PascalCase(configName stripped of `avoid`\u002F`enable`\u002F`use`) + `Enabled`\n  e.g. `isAvoidMergeLockEnabled`\n\n**featureToggle=true only:**\n- `FT_NAME_CONST` → `FT_NAME_` + UPPER_SNAKE_CASE of configName\n- `FT_VALUE` → `\"FT_\"` + UPPER_SNAKE + `\"_\"` + jiraId\n- `featureField` → `docStore` + PascalCase(configName stripped of trailing `Enabled`) + `Feature`\n\n---\n\n## EXECUTION STEPS\n\nWork through every step in order. Do NOT skip any step.\n\nRead the supporting files as you reach each group of steps.\n\n1. **Read key files** — locate insertion points in all 9 files (listed below)\n2. **Configuration.java** — add `@AttributeDefinition` + import → see [osgi-config-patterns.md](osgi-config-patterns.md)\n3. **DocumentNodeStoreService.java** — DEFAULT constant, FT_NAME, Feature field, activate\u002Fdeactivate, configureBuilder → see [osgi-config-patterns.md](osgi-config-patterns.md)\n4. **DocumentNodeStoreBuilder.java** — value field, getter\u002Fsetter, Feature getter\u002Fsetter → see [osgi-config-patterns.md](osgi-config-patterns.md)\n5. **RDBDocumentNodeStoreBuilder.java** — override to disable (scope=mongo-only) → see [osgi-config-patterns.md](osgi-config-patterns.md)\n6. **Utils.java** — add `isXxxEnabled()` method → see [osgi-config-patterns.md](osgi-config-patterns.md)\n7. **DocumentNodeStoreServiceConfigurationTest.java** → see [test-patterns.md](test-patterns.md)\n8. **MongoDocumentNodeStoreBuilderTest.java** → see [test-patterns.md](test-patterns.md)\n9. **RDBDocumentNodeStoreBuilderTest.java** → see [test-patterns.md](test-patterns.md)\n10. **UtilsTest.java** → see [test-patterns.md](test-patterns.md)\n11. **Wire into usage class** → see [wiring-and-verification.md](wiring-and-verification.md)\n12. **Compile and run tests** → see [wiring-and-verification.md](wiring-and-verification.md)\n\n### Files to read in STEP 1\n\n```\noak-store-document\u002Fsrc\u002Fmain\u002Fjava\u002Forg\u002Fapache\u002Fjackrabbit\u002Foak\u002Fplugins\u002Fdocument\u002FConfiguration.java\noak-store-document\u002Fsrc\u002Fmain\u002Fjava\u002Forg\u002Fapache\u002Fjackrabbit\u002Foak\u002Fplugins\u002Fdocument\u002FDocumentNodeStoreService.java\noak-store-document\u002Fsrc\u002Fmain\u002Fjava\u002Forg\u002Fapache\u002Fjackrabbit\u002Foak\u002Fplugins\u002Fdocument\u002FDocumentNodeStoreBuilder.java\noak-store-document\u002Fsrc\u002Fmain\u002Fjava\u002Forg\u002Fapache\u002Fjackrabbit\u002Foak\u002Fplugins\u002Fdocument\u002Frdb\u002FRDBDocumentNodeStoreBuilder.java\noak-store-document\u002Fsrc\u002Fmain\u002Fjava\u002Forg\u002Fapache\u002Fjackrabbit\u002Foak\u002Fplugins\u002Fdocument\u002Futil\u002FUtils.java\noak-store-document\u002Fsrc\u002Ftest\u002Fjava\u002Forg\u002Fapache\u002Fjackrabbit\u002Foak\u002Fplugins\u002Fdocument\u002FDocumentNodeStoreServiceConfigurationTest.java\noak-store-document\u002Fsrc\u002Ftest\u002Fjava\u002Forg\u002Fapache\u002Fjackrabbit\u002Foak\u002Fplugins\u002Fdocument\u002Fmongo\u002FMongoDocumentNodeStoreBuilderTest.java\noak-store-document\u002Fsrc\u002Ftest\u002Fjava\u002Forg\u002Fapache\u002Fjackrabbit\u002Foak\u002Fplugins\u002Fdocument\u002Frdb\u002FRDBDocumentNodeStoreBuilderTest.java\noak-store-document\u002Fsrc\u002Ftest\u002Fjava\u002Forg\u002Fapache\u002Fjackrabbit\u002Foak\u002Fplugins\u002Fdocument\u002Futil\u002FUtilsTest.java\n```\n\n---\n\n## QUALITY CHECKLIST\n\nBefore finishing, verify:\n\n- [ ] `Configuration.java` has a new `@AttributeDefinition` entry with correct default import\n- [ ] `DocumentNodeStoreService.java` has DEFAULT constant and configureBuilder value setter\n- [ ] _(featureToggle=true)_ `DocumentNodeStoreService.java` has FT_NAME constant, Feature field, activate registration, deactivate cleanup, and feature setter in configureBuilder\n- [ ] `DocumentNodeStoreBuilder.java` has value field + getter\u002Fsetter pair\n- [ ] _(featureToggle=true)_ `DocumentNodeStoreBuilder.java` has Feature field + Feature getter\u002Fsetter pair\n- [ ] `RDBDocumentNodeStoreBuilder.java` overrides value getter\u002Fsetter to disable (scope=mongo-only)\n- [ ] _(featureToggle=true)_ `RDBDocumentNodeStoreBuilder.java` also overrides Feature getter\u002Fsetter (scope=mongo-only)\n- [ ] `Utils.java` has `isXxxEnabled()` with proper javadoc\n- [ ] `DocumentNodeStoreServiceConfigurationTest.java` tests default value + override\n- [ ] `MongoDocumentNodeStoreBuilderTest.java` tests default getter (+ null feature if featureToggle=true)\n- [ ] `RDBDocumentNodeStoreBuilderTest.java` has symmetrical default-value tests (scope=both) or override-disabled tests (scope=mongo-only)\n- [ ] `UtilsTest.java` has correct number of tests for featureToggle + scope combination\n- [ ] `DocumentNodeStore.java` reads the config via `{utilsMethod}(builder)` and stores it as a field\n- [ ] Target class receives and uses the field correctly\n- [ ] All tests pass\n- [ ] No new static imports added to any test file\n\n---\n\n## IMPORTANT CONSTRAINTS\n\n- **Assertion style**: match the existing imports in each file — do NOT add new imports. If the file uses `assertFalse(...)` (static), use that; if it uses `Assert.assertFalse(...)`, use that.\n- **No static imports in new production code**\n- **JUnit 4** only (`@Test` from `org.junit.Test`)\n- **Apply standards only to new code** — never reformat or rename existing code\n- Follow the exact naming and placement patterns shown in the supporting files\n","# oak-add-config Skill\n\nYou are an expert in the Apache Jackrabbit Oak `oak-store-document` module. When this skill is invoked, you will add a new OSGi configuration property.\n\n## Supporting files\n\n- Detailed production code patterns (steps 2–6): [osgi-config-patterns.md](osgi-config-patterns.md)\n- Detailed test patterns (steps 7–10): [test-patterns.md](test-patterns.md)\n- Wiring into usage class + compile\u002Ftest (steps 11–12): [wiring-and-verification.md](wiring-and-verification.md)\n\n---\n\n## REQUIRED INPUT\n\nThe user **must** provide these values when invoking the skill. If any are missing, stop and ask:\n\n| Parameter | Description | Example |\n|-----------|-------------|---------|\n| `configName` | camelCase OSGi attribute method name | `avoidExclusiveMergeLock` |\n| `type` | Java type: `boolean`, `int`, `long`, `String` | `boolean` |\n\n`defaultValue` is **optional** — if not provided, use the Java default for the given type:\n- `boolean` → `false`\n- `int` \u002F `long` → `0`\n- `String` → `\"\"`\n\nThe following are **optional** — derive or infer them if not provided:\n\n| Parameter | Description | How to derive if missing |\n|-----------|-------------|--------------------------|\n| `jiraId` | JIRA ticket ID | **Deduce from current branch name** (see below) |\n| `attrName` | Human-readable OSGi display name | Convert `configName` from camelCase to Title Case |\n| `description` | Full OSGi description text | Ask the user for a brief description, then expand it |\n| `scope` | `both`, `mongo-only`, or `rdb-only` | **Ask the user explicitly. Default is `mongo-only`.** |\n| `featureToggle` | Whether to add a feature toggle (`true` \u002F `false`) | **Ask the user explicitly. Default is `false`.** |\n\n> **Deducing `jiraId` from the branch:**\n> Run `git branch --show-current` and extract the JIRA ID\n> (e.g. `OAK-12139` → `jiraId=OAK-12139`; `issue\u002FOAK-12139` → `jiraId=OAK-12139`).\n> If it differs from a user-supplied value, warn. If none can be deduced, ask.\n\n> **Before proceeding, ask both optional questions in a single prompt:**\n> 1. *\"Which backends does this config apply to? (mongo-only \u002F rdb-only \u002F both, default: mongo-only)\"*\n> 2. *\"Do you want a feature toggle for this config? (yes\u002Fno, default: no)\"*\n\n---\n\n## DERIVED IDENTIFIERS\n\nFrom the inputs, derive:\n\n- `DEFAULT_CONST` → `DEFAULT_` + UPPER_SNAKE_CASE of `configName`\n  e.g. `avoidExclusiveMergeLock` → `DEFAULT_AVOID_EXCLUSIVE_MERGE_LOCK`\n- `setterName` → `set` + PascalCase(configName)\n- `getterName` → same as `configName`\n- `utilsMethod` → `is` + PascalCase(configName stripped of `avoid`\u002F`enable`\u002F`use`) + `Enabled`\n  e.g. `isAvoidMergeLockEnabled`\n\n**featureToggle=true only:**\n- `FT_NAME_CONST` → `FT_NAME_` + UPPER_SNAKE_CASE of configName\n- `FT_VALUE` → `\"FT_\"` + UPPER_SNAKE + `\"_\"` + jiraId\n- `featureField` → `docStore` + PascalCase(configName stripped of trailing `Enabled`) + `Feature`\n\n---\n\n## EXECUTION STEPS\n\nWork through every step in order. Do NOT skip any step.\n\nRead the supporting files as you reach each group of steps.\n\n1. **Read key files** — locate insertion points in all 9 files (listed below)\n2. **Configuration.java** — add `@AttributeDefinition` + import → see [osgi-config-patterns.md](osgi-config-patterns.md)\n3. **DocumentNodeStoreService.java** — DEFAULT constant, FT_NAME, Feature field, activate\u002Fdeactivate, configureBuilder → see [osgi-config-patterns.md](osgi-config-patterns.md)\n4. **DocumentNodeStoreBuilder.java** — value field, getter\u002Fsetter, Feature getter\u002Fsetter → see [osgi-config-patterns.md](osgi-config-patterns.md)\n5. **RDBDocumentNodeStoreBuilder.java** — override to disable (scope=mongo-only) → see [osgi-config-patterns.md](osgi-config-patterns.md)\n6. **Utils.java** — add `isXxxEnabled()` method → see [osgi-config-patterns.md](osgi-config-patterns.md)\n7. **DocumentNodeStoreServiceConfigurationTest.java** → see [test-patterns.md](test-patterns.md)\n8. **MongoDocumentNodeStoreBuilderTest.java** → see [test-patterns.md](test-patterns.md)\n9. **RDBDocumentNodeStoreBuilderTest.java** → see [test-patterns.md](test-patterns.md)\n10. **UtilsTest.java** → see [test-patterns.md](test-patterns.md)\n11. **Wire into usage class** → see [wiring-and-verification.md](wiring-and-verification.md)\n12. **Compile and run tests** → see [wiring-and-verification.md](wiring-and-verification.md)\n\n### Files to read in STEP 1\n\n```\noak-store-document\u002Fsrc\u002Fmain\u002Fjava\u002Forg\u002Fapache\u002Fjackrabbit\u002Foak\u002Fplugins\u002Fdocument\u002FConfiguration.java\noak-store-document\u002Fsrc\u002Fmain\u002Fjava\u002Forg\u002Fapache\u002Fjackrabbit\u002Foak\u002Fplugins\u002Fdocument\u002FDocumentNodeStoreService.java\noak-store-document\u002Fsrc\u002Fmain\u002Fjava\u002Forg\u002Fapache\u002Fjackrabbit\u002Foak\u002Fplugins\u002Fdocument\u002FDocumentNodeStoreBuilder.java\noak-store-document\u002Fsrc\u002Fmain\u002Fjava\u002Forg\u002Fapache\u002Fjackrabbit\u002Foak\u002Fplugins\u002Fdocument\u002Frdb\u002FRDBDocumentNodeStoreBuilder.java\noak-store-document\u002Fsrc\u002Fmain\u002Fjava\u002Forg\u002Fapache\u002Fjackrabbit\u002Foak\u002Fplugins\u002Fdocument\u002Futil\u002FUtils.java\noak-store-document\u002Fsrc\u002Ftest\u002Fjava\u002Forg\u002Fapache\u002Fjackrabbit\u002Foak\u002Fplugins\u002Fdocument\u002FDocumentNodeStoreServiceConfigurationTest.java\noak-store-document\u002Fsrc\u002Ftest\u002Fjava\u002Forg\u002Fapache\u002Fjackrabbit\u002Foak\u002Fplugins\u002Fdocument\u002Fmongo\u002FMongoDocumentNodeStoreBuilderTest.java\noak-store-document\u002Fsrc\u002Ftest\u002Fjava\u002Forg\u002Fapache\u002Fjackrabbit\u002Foak\u002Fplugins\u002Fdocument\u002Frdb\u002FRDBDocumentNodeStoreBuilderTest.java\noak-store-document\u002Fsrc\u002Ftest\u002Fjava\u002Forg\u002Fapache\u002Fjackrabbit\u002Foak\u002Fplugins\u002Fdocument\u002Futil\u002FUtilsTest.java\n```\n\n---\n\n## QUALITY CHECKLIST\n\nBefore finishing, verify:\n\n- [ ] `Configuration.java` has a new `@AttributeDefinition` entry with correct default import\n- [ ] `DocumentNodeStoreService.java` has DEFAULT constant and configureBuilder value setter\n- [ ] _(featureToggle=true)_ `DocumentNodeStoreService.java` has FT_NAME constant, Feature field, activate registration, deactivate cleanup, and feature setter in configureBuilder\n- [ ] `DocumentNodeStoreBuilder.java` has value field + getter\u002Fsetter pair\n- [ ] _(featureToggle=true)_ `DocumentNodeStoreBuilder.java` has Feature field + Feature getter\u002Fsetter pair\n- [ ] `RDBDocumentNodeStoreBuilder.java` overrides value getter\u002Fsetter to disable (scope=mongo-only)\n- [ ] _(featureToggle=true)_ `RDBDocumentNodeStoreBuilder.java` also overrides Feature getter\u002Fsetter (scope=mongo-only)\n- [ ] `Utils.java` has `isXxxEnabled()` with proper javadoc\n- [ ] `DocumentNodeStoreServiceConfigurationTest.java` tests default value + override\n- [ ] `MongoDocumentNodeStoreBuilderTest.java` tests default getter (+ null feature if featureToggle=true)\n- [ ] `RDBDocumentNodeStoreBuilderTest.java` has symmetrical default-value tests (scope=both) or override-disabled tests (scope=mongo-only)\n- [ ] `UtilsTest.java` has correct number of tests for featureToggle + scope combination\n- [ ] `DocumentNodeStore.java` reads the config via `{utilsMethod}(builder)` and stores it as a field\n- [ ] Target class receives and uses the field correctly\n- [ ] All tests pass\n- [ ] No new static imports added to any test file\n\n---\n\n## IMPORTANT CONSTRAINTS\n\n- **Assertion style**: match the existing imports in each file — do NOT add new imports. If the file uses `assertFalse(...)` (static), use that; if it uses `Assert.assertFalse(...)`, use that.\n- **No static imports in new production code**\n- **JUnit 4** only (`@Test` from `org.junit.Test`)\n- **Apply standards only to new code** — never reformat or rename existing code\n- Follow the exact naming and placement patterns shown in the supporting files\n",{"name":5,"description":7,"allowed-tools":49,"disable-model-invocation":50},"Read, Edit, Grep, Glob, Bash",true,"trunk","85d5497b7e134b7a3b4c6444e766eb61ea126d2f","oak-store-document\u002F.claude\u002Fskills\u002Foak-store-document-add-config",438,"https:\u002F\u002Fgithub.com\u002Fapache\u002Fjackrabbit-oak","https:\u002F\u002Fjackrabbit.apache.org\u002Foak\u002F","https:\u002F\u002Fgithub.com\u002Fapache","https:\u002F\u002Fwww.apache.org\u002F","2026-11-14 02:49:57",{"source":8,"skillName":5,"commands":61,"prompt":71,"zipAvailable":50},[62,65,68],{"tool":63,"command":64},"npx","npx skills add apache\u002Fjackrabbit-oak --skill oak-store-document-add-config",{"tool":66,"command":67},"bunx","bunx skills add apache\u002Fjackrabbit-oak --skill oak-store-document-add-config",{"tool":69,"command":70},"pnpm","pnpm dlx skills add apache\u002Fjackrabbit-oak --skill oak-store-document-add-config","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fapache\u002Fjackrabbit-oak\u002Fblob\u002Ftrunk\u002Foak-store-document\u002F.claude\u002Fskills\u002Foak-store-document-add-config\u002FSKILL.md",[73,79,83],{"path":74,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":77,"sourceHtmlUrl":78},"osgi-config-patterns.md","REFERENCE","参考文档",4448,"https:\u002F\u002Fgithub.com\u002Fapache\u002Fjackrabbit-oak\u002Fblob\u002Ftrunk\u002Foak-store-document\u002F.claude\u002Fskills\u002Foak-store-document-add-config\u002Fosgi-config-patterns.md",{"path":80,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":81,"sourceHtmlUrl":82},"test-patterns.md",4784,"https:\u002F\u002Fgithub.com\u002Fapache\u002Fjackrabbit-oak\u002Fblob\u002Ftrunk\u002Foak-store-document\u002F.claude\u002Fskills\u002Foak-store-document-add-config\u002Ftest-patterns.md",{"path":84,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":85,"sourceHtmlUrl":86},"wiring-and-verification.md",2414,"https:\u002F\u002Fgithub.com\u002Fapache\u002Fjackrabbit-oak\u002Fblob\u002Ftrunk\u002Foak-store-document\u002F.claude\u002Fskills\u002Foak-store-document-add-config\u002Fwiring-and-verification.md",[]]