Initial commit
This commit is contained in:
12
.claude-plugin/plugin.json
Normal file
12
.claude-plugin/plugin.json
Normal file
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"name": "writeas",
|
||||
"description": "Interacts with the Write.as API.",
|
||||
"version": "0.0.0-2025.11.28",
|
||||
"author": {
|
||||
"name": "Tim Green",
|
||||
"email": "rawveg@gmail.com"
|
||||
},
|
||||
"skills": [
|
||||
"./skills/writeas"
|
||||
]
|
||||
}
|
||||
56
plugin.lock.json
Normal file
56
plugin.lock.json
Normal file
@@ -0,0 +1,56 @@
|
||||
{
|
||||
"$schema": "internal://schemas/plugin.lock.v1.json",
|
||||
"pluginId": "gh:rawveg/skillsforge-marketplace:writeas",
|
||||
"normalized": {
|
||||
"repo": null,
|
||||
"ref": "refs/tags/v20251128.0",
|
||||
"commit": "cb0f554be411e001f0d9d4e71d99fc97a26341bc",
|
||||
"treeHash": "8446116f4d2d842a586115398c1d91b77e22ba82eb6527ac4cdb744f5476afe1",
|
||||
"generatedAt": "2025-11-28T10:27:55.355166Z",
|
||||
"toolVersion": "publish_plugins.py@0.2.0"
|
||||
},
|
||||
"origin": {
|
||||
"remote": "git@github.com:zhongweili/42plugin-data.git",
|
||||
"branch": "master",
|
||||
"commit": "aa1497ed0949fd50e99e70d6324a29c5b34f9390",
|
||||
"repoRoot": "/Users/zhongweili/projects/openmind/42plugin-data"
|
||||
},
|
||||
"manifest": {
|
||||
"name": "writeas",
|
||||
"description": "Interacts with the Write.as API."
|
||||
},
|
||||
"content": {
|
||||
"files": [
|
||||
{
|
||||
"path": "README.md",
|
||||
"sha256": "7456f2703f0c30a9983512a756708cd294f9fe629c882d9ff1829429a9309038"
|
||||
},
|
||||
{
|
||||
"path": ".claude-plugin/plugin.json",
|
||||
"sha256": "2d067a51a6bbe70d0b33d807d08b895a8cdc5e24c4250dd27ebda1bedb66544f"
|
||||
},
|
||||
{
|
||||
"path": "skills/writeas/plugin.json",
|
||||
"sha256": "1073205bea96106cd8b94ffe116bf9f3be24dbd6f3cb00a6984949717c5f8ce3"
|
||||
},
|
||||
{
|
||||
"path": "skills/writeas/SKILL.md",
|
||||
"sha256": "cd7789dc88205d44fdbe16a94aa36499954e4e302a1181ae8f7bbd84dbbee3f5"
|
||||
},
|
||||
{
|
||||
"path": "skills/writeas/references/api.md",
|
||||
"sha256": "ea62e7733c046a513b833f47b63cbbae288bc66806c58f327d9845911a311f19"
|
||||
},
|
||||
{
|
||||
"path": "skills/writeas/references/index.md",
|
||||
"sha256": "c5d404fc2bde00a7ebe8dadc8804bae7dbcfad5b9f6ae1fa2b047436627eded6"
|
||||
}
|
||||
],
|
||||
"dirSha256": "8446116f4d2d842a586115398c1d91b77e22ba82eb6527ac4cdb744f5476afe1"
|
||||
},
|
||||
"security": {
|
||||
"scannedAt": null,
|
||||
"scannerVersion": null,
|
||||
"flags": []
|
||||
}
|
||||
}
|
||||
349
skills/writeas/SKILL.md
Normal file
349
skills/writeas/SKILL.md
Normal file
@@ -0,0 +1,349 @@
|
||||
---
|
||||
name: writeas
|
||||
description: Write.as API Documentation
|
||||
---
|
||||
|
||||
# Write.as Skill
|
||||
|
||||
Comprehensive assistance with Write.as and WriteFreely API development, based on official API documentation. This skill provides practical guidance for building applications around the Write.as blogging platform and its open-source WriteFreely implementation.
|
||||
|
||||
## When to Use This Skill
|
||||
|
||||
This skill should be triggered when:
|
||||
- Working with the Write.as REST API (`https://write.as/api/`)
|
||||
- Building applications that interact with Write.as or WriteFreely
|
||||
- Implementing blog post creation, updates, or management
|
||||
- Setting up user authentication for Write.as accounts
|
||||
- Creating or managing collections (blogs)
|
||||
- Implementing crossposting to Twitter, Medium, or Tumblr
|
||||
- Integrating Markdown rendering for blog posts
|
||||
- Debugging Write.as API calls or authentication issues
|
||||
- Working with anonymous posts and post claiming
|
||||
- Building self-hosted WriteFreely instances
|
||||
|
||||
## Key Concepts
|
||||
|
||||
### Core Terminology
|
||||
|
||||
**Posts**: Markdown-based articles with metadata. Posts can be created anonymously or associated with a user account.
|
||||
|
||||
**Collections**: Known as "blogs" in the UI. Container for multiple posts with customizable settings. Creating collections requires a Pro account.
|
||||
|
||||
**Users**: Registered accounts with password, email, and resource access. Users can own multiple collections and posts.
|
||||
|
||||
**Tokens**: Used for authentication and post management. Anonymous posts return a `token` for later modifications, while user operations use access tokens via `Authorization: Token {access_token}` header.
|
||||
|
||||
### Authentication
|
||||
|
||||
- **Anonymous**: No authentication required. Store the returned `token` for later updates/deletions.
|
||||
- **User-based**: Login via `/api/auth/login` to get an access token, then pass it in the `Authorization` header.
|
||||
|
||||
## Quick Reference
|
||||
|
||||
### Creating an Anonymous Post
|
||||
|
||||
```json
|
||||
POST https://write.as/api/posts
|
||||
Content-Type: application/json
|
||||
|
||||
{
|
||||
"body": "This is a post.",
|
||||
"title": "My First Post"
|
||||
}
|
||||
```
|
||||
|
||||
**Response:**
|
||||
```json
|
||||
{
|
||||
"code": 201,
|
||||
"data": {
|
||||
"id": "rf3t35fkax0aw",
|
||||
"token": "ozPEuJWYK8L1QsysBUcTUKy9za7yqQ4M",
|
||||
"title": "My First Post",
|
||||
"body": "This is a post."
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**Note**: Save the `token` to update or delete this post later.
|
||||
|
||||
### Updating a Post (Anonymous)
|
||||
|
||||
```json
|
||||
POST https://write.as/api/posts/{POST_ID}
|
||||
Content-Type: application/json
|
||||
|
||||
{
|
||||
"token": "ozPEuJWYK8L1QsysBUcTUKy9za7yqQ4M",
|
||||
"body": "This is an updated post."
|
||||
}
|
||||
```
|
||||
|
||||
### User Authentication
|
||||
|
||||
```json
|
||||
POST https://write.as/api/auth/login
|
||||
Content-Type: application/json
|
||||
|
||||
{
|
||||
"alias": "username",
|
||||
"pass": "password"
|
||||
}
|
||||
```
|
||||
|
||||
**Response:**
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"data": {
|
||||
"access_token": "00000000-0000-0000-0000-000000000000",
|
||||
"user": {
|
||||
"username": "username"
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Creating a Post as Authenticated User
|
||||
|
||||
```json
|
||||
POST https://write.as/api/posts
|
||||
Authorization: Token 00000000-0000-0000-0000-000000000000
|
||||
Content-Type: application/json
|
||||
|
||||
{
|
||||
"body": "# My authenticated post\n\nThis post is linked to my account.",
|
||||
"title": "Authenticated Post"
|
||||
}
|
||||
```
|
||||
|
||||
### Styling Posts with Fonts
|
||||
|
||||
```json
|
||||
POST https://write.as/api/posts
|
||||
Content-Type: application/json
|
||||
|
||||
{
|
||||
"body": "This is a monospace code post.",
|
||||
"font": "code"
|
||||
}
|
||||
```
|
||||
|
||||
**Available fonts:**
|
||||
- `sans` - Sans-serif with word wrap
|
||||
- `serif` or `norm` - Serif with word wrap
|
||||
- `wrap` - Monospace with word wrap
|
||||
- `mono` - Monospace without wrap
|
||||
- `code` - Syntax-highlighted monospace
|
||||
|
||||
### Crossposting to Social Media
|
||||
|
||||
```json
|
||||
POST https://write.as/api/posts
|
||||
Authorization: Token 00000000-0000-0000-0000-000000000000
|
||||
Content-Type: application/json
|
||||
|
||||
{
|
||||
"body": "Check out my new post!",
|
||||
"title": "My Post",
|
||||
"crosspost": [
|
||||
{"twitter": "yourusername"},
|
||||
{"medium": "yourusername"}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
**Supported services**: Twitter, Tumblr, Medium
|
||||
|
||||
### Creating a Collection (Pro Feature)
|
||||
|
||||
```json
|
||||
POST https://write.as/api/collections
|
||||
Authorization: Token 00000000-0000-0000-0000-000000000000
|
||||
Content-Type: application/json
|
||||
|
||||
{
|
||||
"alias": "my-blog",
|
||||
"title": "My Blog"
|
||||
}
|
||||
```
|
||||
|
||||
### Publishing to a Collection
|
||||
|
||||
```json
|
||||
POST https://write.as/api/collections/{ALIAS}/posts
|
||||
Authorization: Token 00000000-0000-0000-0000-000000000000
|
||||
Content-Type: application/json
|
||||
|
||||
{
|
||||
"body": "# First blog post\n\nWelcome to my blog!",
|
||||
"title": "Hello World"
|
||||
}
|
||||
```
|
||||
|
||||
### Moving Anonymous Post to Collection
|
||||
|
||||
```json
|
||||
POST https://write.as/api/collections/{ALIAS}/collect
|
||||
Authorization: Token 00000000-0000-0000-0000-000000000000
|
||||
Content-Type: application/json
|
||||
|
||||
[
|
||||
{
|
||||
"id": "rf3t35fkax0aw",
|
||||
"token": "ozPEuJWYK8L1QsysBUcTUKy9za7yqQ4M"
|
||||
}
|
||||
]
|
||||
```
|
||||
|
||||
### Rendering Markdown to HTML
|
||||
|
||||
```json
|
||||
POST https://write.as/api/markdown
|
||||
Content-Type: application/json
|
||||
|
||||
{
|
||||
"raw_body": "# Hello\n\nThis is **Markdown**."
|
||||
}
|
||||
```
|
||||
|
||||
**Response:**
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"data": {
|
||||
"body": "<h1>Hello</h1>\n<p>This is <strong>Markdown</strong>.</p>"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Error Handling
|
||||
|
||||
All API responses follow this structure:
|
||||
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"data": {}
|
||||
}
|
||||
```
|
||||
|
||||
**Common HTTP status codes:**
|
||||
- `200` - Success
|
||||
- `201` - Created successfully
|
||||
- `400` - Bad request or malformed data
|
||||
- `401` - Missing or invalid authentication
|
||||
- `403` - Insufficient permissions (e.g., creating collection without Pro)
|
||||
- `404` - Resource not found
|
||||
- `410` - Post unpublished (may return later)
|
||||
- `429` - Rate limited
|
||||
|
||||
## Reference Files
|
||||
|
||||
This skill includes comprehensive documentation in `references/`:
|
||||
|
||||
- **api.md** - Complete Write.as API documentation including:
|
||||
- All available endpoints (posts, collections, users, formatting)
|
||||
- Request/response examples
|
||||
- Authentication methods
|
||||
- Crossposting configuration
|
||||
- Error codes and handling
|
||||
|
||||
Use `view` to read the API reference file when detailed information is needed.
|
||||
|
||||
## Working with This Skill
|
||||
|
||||
### For Beginners
|
||||
|
||||
1. **Start with anonymous posts**: No authentication required, perfect for testing
|
||||
2. **Save the token**: Always store the `token` returned when creating anonymous posts
|
||||
3. **Test with single posts**: Create, update, retrieve, and delete one post before scaling
|
||||
4. **Read error responses**: The API provides clear error messages in the response body
|
||||
|
||||
### For Intermediate Users
|
||||
|
||||
1. **Implement user authentication**: Use `/api/auth/login` to get access tokens
|
||||
2. **Work with collections**: Create blogs and organize posts into collections
|
||||
3. **Enable crossposting**: Automatically share posts to Twitter, Medium, or Tumblr
|
||||
4. **Claim anonymous posts**: Convert anonymous posts to user-owned posts with `/api/posts/claim`
|
||||
5. **Use post styling**: Apply different fonts (`code`, `sans`, `mono`) for various content types
|
||||
|
||||
### For Advanced Users
|
||||
|
||||
1. **Build full applications**: Leverage all endpoints for complete blog management
|
||||
2. **Self-host WriteFreely**: Deploy open-source WriteFreely instances
|
||||
3. **Implement rate limiting**: Respect API limits and handle 429 responses
|
||||
4. **Use client libraries**: Leverage official libraries (Go, Swift, Java) or community libraries (PHP, Python, JavaScript, .NET)
|
||||
5. **Handle edge cases**: Implement retry logic, token refresh, and error recovery
|
||||
|
||||
### Navigation Tips
|
||||
|
||||
- **Authentication flow**: See `api.md` → "Users" section
|
||||
- **Post management**: See `api.md` → "Posts" section
|
||||
- **Collection setup**: See `api.md` → "Collections" section
|
||||
- **Crossposting**: See `api.md` → "Crossposting" section
|
||||
- **Error handling**: See `api.md` → "Error Handling" section
|
||||
|
||||
## API Best Practices
|
||||
|
||||
1. **Store tokens securely**: Never commit access tokens or post tokens to version control
|
||||
2. **Handle anonymous posts**: Always save the `token` field when creating anonymous posts
|
||||
3. **Respect rate limits**: Implement exponential backoff on 429 responses
|
||||
4. **Use HTTPS**: All API endpoints require HTTPS
|
||||
5. **Test with small datasets**: Verify your integration with a few posts before scaling
|
||||
6. **Check Pro status**: Collection creation requires a Pro account
|
||||
7. **Validate Markdown**: Test Markdown rendering with `/api/markdown` before posting
|
||||
8. **Handle 410 gracefully**: Unpublished posts may return with 410 status
|
||||
|
||||
## Common Use Cases
|
||||
|
||||
### Building a Blog Publishing Tool
|
||||
Use authenticated user endpoints to create collections, publish posts, and manage content.
|
||||
|
||||
### Creating a Markdown Editor Integration
|
||||
Implement post creation with Markdown preview using `/api/markdown` endpoint.
|
||||
|
||||
### Social Media Cross-Poster
|
||||
Leverage the `crosspost` parameter to automatically share posts to multiple platforms.
|
||||
|
||||
### Anonymous Blogging Platform
|
||||
Build an app using anonymous post creation, storing tokens locally for later management.
|
||||
|
||||
### Content Migration Tool
|
||||
Use `/api/posts/claim` to import anonymous posts into a user account.
|
||||
|
||||
## Client Libraries
|
||||
|
||||
**Official:**
|
||||
- Go: https://github.com/writeas/go-writeas
|
||||
- Swift: https://github.com/writeas/writefreely-swift
|
||||
- Java: https://github.com/writeas/java-writeas
|
||||
|
||||
**Community:**
|
||||
- PHP, Python, JavaScript, Vala, .NET Core (see Write.as documentation)
|
||||
|
||||
## Resources
|
||||
|
||||
### Official Documentation
|
||||
- API Docs: https://developers.write.as/docs/api/
|
||||
- WriteFreely: https://writefreely.org/ (open-source self-hosting)
|
||||
|
||||
### Key Features
|
||||
- **Backwards compatibility**: Endpoints rarely removed; new features added alongside existing
|
||||
- **Flexible authentication**: Works anonymously or with user tokens
|
||||
- **Markdown-first**: All content uses Markdown formatting
|
||||
- **Self-hosting ready**: WriteFreely powers Write.as and independent instances
|
||||
|
||||
## Notes
|
||||
|
||||
- All API requests must use HTTPS
|
||||
- Anonymous posts can be claimed by authenticated users
|
||||
- Collections (blogs) require a Pro subscription on Write.as
|
||||
- Post IDs are permanent and unique
|
||||
- Tokens are sensitive credentials - protect them like passwords
|
||||
- The API maintains backwards compatibility - old integrations continue working
|
||||
|
||||
## Updating
|
||||
|
||||
This skill is based on the official Write.as API documentation. For the latest updates, refer to:
|
||||
- https://developers.write.as/docs/api/
|
||||
15
skills/writeas/plugin.json
Normal file
15
skills/writeas/plugin.json
Normal file
@@ -0,0 +1,15 @@
|
||||
{
|
||||
"name": "writeas",
|
||||
"description": "Provides Write.as integration for Claude Code.",
|
||||
"version": "1.0.0",
|
||||
"author": {
|
||||
"name": "Tim Green",
|
||||
"email": "rawveg@gmail.com"
|
||||
},
|
||||
"homepage": "https://github.com/rawveg/claude-skills-marketplace",
|
||||
"repository": "https://github.com/rawveg/claude-skills-marketplace",
|
||||
"license": "MIT",
|
||||
"keywords": ["writeas", "writeas-api", "writefreely", "writefreely-api", "Claude Code"],
|
||||
"category": "productivity",
|
||||
"strict": false
|
||||
}
|
||||
11
skills/writeas/references/api.md
Normal file
11
skills/writeas/references/api.md
Normal file
@@ -0,0 +1,11 @@
|
||||
# Writeas - Api
|
||||
|
||||
**Pages:** 1
|
||||
|
||||
---
|
||||
|
||||
## Write.as API Documentation
|
||||
|
||||
**URL:** https://developers.write.as/docs/api/
|
||||
|
||||
---
|
||||
7
skills/writeas/references/index.md
Normal file
7
skills/writeas/references/index.md
Normal file
@@ -0,0 +1,7 @@
|
||||
# Writeas Documentation Index
|
||||
|
||||
## Categories
|
||||
|
||||
### Api
|
||||
**File:** `api.md`
|
||||
**Pages:** 1
|
||||
Reference in New Issue
Block a user